5697b92ab8
Se propaga *slog.Logger a todos los componentes impuros del shell: - shell/bus/ — logs de subscribe, send, reply, timeout, unsubscribe - shell/effects/ — duración y resultado de cada action ejecutada - shell/llm/ (anthropic, openai, factory) — request/response con tokens, duración, fallback - shell/memory/sqlite — open, save, recall, close con detalles - shell/ssh/ — inicio, fin, errores y duración de comandos SSH - tools/registry — registro, ejecución y errores de herramientas Se usa el paquete shell/logger para field names consistentes (FieldDurationMS, FieldTokensUsed, etc.). Cada componente recibe el logger por inyección de dependencias, sin globals. Las firmas de New/FromConfig se actualizan para aceptar *slog.Logger. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
|
|
"github.com/enmanuel/agents/internal/config"
|
|
coretypes "github.com/enmanuel/agents/pkg/llm"
|
|
)
|
|
|
|
// FromConfig builds a CompleteFunc from an LLMProviderCfg.
|
|
func FromConfig(cfg config.LLMProviderCfg, log *slog.Logger) (coretypes.CompleteFunc, error) {
|
|
log.Info("llm_provider_init", "provider", cfg.Provider, "model", cfg.Model)
|
|
switch cfg.Provider {
|
|
case "anthropic":
|
|
return NewAnthropicComplete(cfg.APIKeyEnv, cfg.BaseURL, log), nil
|
|
case "openai":
|
|
return NewOpenAIComplete(cfg.APIKeyEnv, cfg.BaseURL, log), nil
|
|
case "ollama":
|
|
base := cfg.BaseURL
|
|
if base == "" {
|
|
base = "http://localhost:11434/v1"
|
|
}
|
|
return NewOpenAIComplete("OLLAMA_API_KEY", base, log), nil
|
|
default:
|
|
return nil, fmt.Errorf("unknown LLM provider: %s", cfg.Provider)
|
|
}
|
|
}
|
|
|
|
// WithFallback wraps primary with a fallback CompleteFunc.
|
|
// If primary returns an error, fallback is tried.
|
|
func WithFallback(primary, fallback coretypes.CompleteFunc, log *slog.Logger) coretypes.CompleteFunc {
|
|
return func(ctx context.Context, req coretypes.CompletionRequest) (coretypes.CompletionResponse, error) {
|
|
resp, err := primary(ctx, req)
|
|
if err != nil {
|
|
log.Warn("llm_fallback_triggered", "primary_err", err)
|
|
return fallback(ctx, req)
|
|
}
|
|
return resp, nil
|
|
}
|
|
}
|