Add support for multiple providers

This commit is contained in:
dwrz
2026-06-19 14:31:41 +00:00
parent c71300b1bf
commit f5e72b1c7a
12 changed files with 948 additions and 869 deletions

View File

@@ -20,8 +20,6 @@ import (
type Config struct {
// Key is the API key for authentication.
Key string `yaml:"key"`
// Model is the model identifier.
Model string `yaml:"model"`
// SystemMessage is prepended to all conversations.
SystemMessage string `yaml:"system_message"`
// Timeout is the maximum duration for a query (e.g., "5m").
@@ -33,9 +31,6 @@ type Config struct {
// Validate checks that required configuration values are present and valid.
func (cfg Config) Validate() error {
if cfg.Model == "" {
return fmt.Errorf("missing model")
}
if cfg.Timeout != "" {
if _, err := time.ParseDuration(cfg.Timeout); err != nil {
return fmt.Errorf("invalid timeout: %w", err)
@@ -51,7 +46,6 @@ func (cfg Config) Validate() error {
type Client struct {
client *openai.Client
log *slog.Logger
model string
registry *tool.Registry
systemMessage string
timeout time.Duration
@@ -71,7 +65,6 @@ func NewClient(
llm := &Client{
log: log,
model: cfg.Model,
systemMessage: cfg.SystemMessage,
registry: registry,
}
@@ -115,17 +108,11 @@ func (c *Client) ListModels(ctx context.Context) ([]openai.Model, error) {
return res.Models, nil
}
// DefaultModel returns the configured default model.
func (c *Client) DefaultModel() string {
return c.model
}
// ErrMaxIterations is returned when the agent loop exceeds the configured
// maximum number of iterations.
var ErrMaxIterations = fmt.Errorf("max iterations exceeded")
// Query sends messages to the LLM using the specified model.
// If model is empty, uses the default configured model.
// If systemMessage is non-empty, it overrides the configured system message.
// maxIterations caps the number of agent loop iterations; a value of 0
// means unlimited (no cap).
@@ -141,11 +128,6 @@ func (c *Client) Query(
ctx, cancel := context.WithTimeout(ctx, c.timeout)
defer cancel()
// Fallback to the default model.
if model == "" {
model = c.model
}
// Use per-request system message if provided, otherwise fall back to config.
effectiveMessage := c.systemMessage
if systemMessage != "" {
@@ -273,11 +255,6 @@ func (c *Client) QueryStream(
ctx, cancel := context.WithTimeout(ctx, c.timeout)
defer cancel()
// Fallback to the default model.
if model == "" {
model = c.model
}
// Use per-request system message if provided, otherwise fall back to config.
effectiveMessage := c.systemMessage
if systemMessage != "" {
@@ -412,11 +389,6 @@ func (c *Client) QueryStream(
result = fmt.Sprintf(
`{"ok": false, "error": %q}`, err,
)
} else {
c.log.Info(
"called tool",
slog.String("name", tc.Function.Name),
)
}
// Content cannot be empty.
if strings.TrimSpace(result) == "" {