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.
This commit is contained in:
Ollie Agent 2026-08-09 01:05:32 +02:00
parent 5c81eefe0a
commit 5b11e8afcb
3 changed files with 26 additions and 60 deletions

View File

@ -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,
}
}

View File

@ -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)

View File

@ -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.