From 5b11e8afcb8a1fbbc2660ec156d782023df01327 Mon Sep 17 00:00:00 2001 From: Ollie Agent Date: Sun, 9 Aug 2026 01:05:32 +0200 Subject: [PATCH] agent: embed GenerationParams in AgentConfig, remove GenParams() Add JSON tags to backend.GenerationParams and embed it directly in AgentConfig. The 14 duplicated sampling fields and the field-by-field copy method disappear. Callers use cfg.GenerationParams directly. --- agent/agent_config.go | 54 ++++++++----------------------------------- agent/runtime.go | 2 +- backend/backend.go | 30 ++++++++++++------------ 3 files changed, 26 insertions(+), 60 deletions(-) diff --git a/agent/agent_config.go b/agent/agent_config.go index 09d96a4..4dbd45a 100644 --- a/agent/agent_config.go +++ b/agent/agent_config.go @@ -30,32 +30,19 @@ func (p Prompt) MarshalJSON() ([]byte, error) { } type AgentConfig struct { - Prompt Prompt `json:"prompt,omitempty"` - Backend string `json:"backend,omitempty"` - Model string `json:"model,omitempty"` - Tools *bool `json:"tools,omitempty"` - AllowTools []string `json:"allowTools,omitempty"` - AutoLoad []string `json:"autoLoad,omitempty"` - MaxTokens int `json:"maxTokens,omitempty"` - MaxCompletionTokens int `json:"maxCompletionTokens,omitempty"` + Prompt Prompt `json:"prompt,omitempty"` + Backend string `json:"backend,omitempty"` + Model string `json:"model,omitempty"` + Tools *bool `json:"tools,omitempty"` + AllowTools []string `json:"allowTools,omitempty"` + AutoLoad []string `json:"autoLoad,omitempty"` // MaxSteps caps the number of tool-call rounds per turn. 0 means unlimited. - MaxSteps int `json:"maxSteps,omitempty"` - Temperature *float64 `json:"temperature,omitempty"` - TopP *float64 `json:"topP,omitempty"` - TopK *int `json:"topK,omitempty"` - MinP *float64 `json:"minP,omitempty"` - TopA *float64 `json:"topA,omitempty"` - FrequencyPenalty *float64 `json:"frequencyPenalty,omitempty"` - PresencePenalty *float64 `json:"presencePenalty,omitempty"` - RepetitionPenalty *float64 `json:"repetitionPenalty,omitempty"` - Reasoning int `json:"reasoning,omitempty"` - ReasoningEffort string `json:"reasoningEffort,omitempty"` - IncludeReasoning *bool `json:"includeReasoning,omitempty"` - ResponseFormat string `json:"responseFormat,omitempty"` - Stop []string `json:"stop,omitempty"` - CompactionModel string `json:"compactionModel,omitempty"` + MaxSteps int `json:"maxSteps,omitempty"` + CompactionModel string `json:"compactionModel,omitempty"` // SystemPrompt overrides the embedded system prompt with a file path. SystemPrompt string `json:"systemPrompt,omitempty"` + + backend.GenerationParams } // Load parses a Config from r. @@ -72,24 +59,3 @@ func Load(r io.Reader) (*AgentConfig, error) { func (c *AgentConfig) ToolsEnabled() bool { return c.Tools == nil || *c.Tools } - -// GenParams returns the generation parameters derived from this config. -func (c *AgentConfig) GenParams() backend.GenerationParams { - return backend.GenerationParams{ - MaxTokens: c.MaxTokens, - MaxCompletionTokens: c.MaxCompletionTokens, - Temperature: c.Temperature, - TopP: c.TopP, - TopK: c.TopK, - MinP: c.MinP, - TopA: c.TopA, - FrequencyPenalty: c.FrequencyPenalty, - PresencePenalty: c.PresencePenalty, - RepetitionPenalty: c.RepetitionPenalty, - ThinkingBudget: c.Reasoning, - ReasoningEffort: c.ReasoningEffort, - IncludeReasoning: c.IncludeReasoning, - ResponseFormat: c.ResponseFormat, - Stop: c.Stop, - } -} diff --git a/agent/runtime.go b/agent/runtime.go index cefcdeb..b5eb535 100644 --- a/agent/runtime.go +++ b/agent/runtime.go @@ -172,7 +172,7 @@ func BuildRuntime(cfg *AgentConfig, srv *toolsrv.Conn, cwd string, env []string, } else { agentPrompt = resolved } - genParams = cfg.GenParams() + genParams = cfg.GenerationParams maxSteps = cfg.MaxSteps if len(cfg.AllowTools) > 0 && srv != nil { srv.SetAllowTools(cfg.AllowTools) diff --git a/backend/backend.go b/backend/backend.go index cc29cfb..f22d6b9 100644 --- a/backend/backend.go +++ b/backend/backend.go @@ -123,21 +123,21 @@ func (e *ToolUnsupportedError) Error() string { return e.Message } // GenerationParams controls sampling behaviour for a single ChatStream call. // Zero values mean "use the API default". type GenerationParams struct { - MaxTokens int // 0 = no limit - MaxCompletionTokens int // OpenAI o-series; 0 = use MaxTokens - Temperature *float64 // nil = API default - TopP *float64 // nil = API default - TopK *int // nil = API default (Anthropic, Ollama) - MinP *float64 // nil = API default (Ollama) - TopA *float64 // nil = API default (Ollama) - FrequencyPenalty *float64 // nil = API default - PresencePenalty *float64 // nil = API default - RepetitionPenalty *float64 // nil = API default (Ollama) - ThinkingBudget int // Anthropic extended thinking token budget; 0 = disabled - ReasoningEffort string // OpenAI o-series: "low", "medium", "high" - IncludeReasoning *bool // include reasoning in response (OpenRouter) - ResponseFormat string // "json_object", "text", etc. - Stop []string // stop sequences + MaxTokens int `json:"maxTokens,omitempty"` + MaxCompletionTokens int `json:"maxCompletionTokens,omitempty"` + Temperature *float64 `json:"temperature,omitempty"` + TopP *float64 `json:"topP,omitempty"` + TopK *int `json:"topK,omitempty"` + MinP *float64 `json:"minP,omitempty"` + TopA *float64 `json:"topA,omitempty"` + FrequencyPenalty *float64 `json:"frequencyPenalty,omitempty"` + PresencePenalty *float64 `json:"presencePenalty,omitempty"` + RepetitionPenalty *float64 `json:"repetitionPenalty,omitempty"` + ThinkingBudget int `json:"reasoning,omitempty"` + ReasoningEffort string `json:"reasoningEffort,omitempty"` + IncludeReasoning *bool `json:"includeReasoning,omitempty"` + ResponseFormat string `json:"responseFormat,omitempty"` + Stop []string `json:"stop,omitempty"` } // Backend is the interface all LLM providers must implement.