From d2294daa852aad182034a036e88f19a49c3e74ba Mon Sep 17 00:00:00 2001 From: optman Date: Sat, 21 Mar 2026 22:25:38 +0800 Subject: [PATCH] feat(config): add context_window field to decouple input/output token limits Adds a new `context_window` field to AgentDefaults that separates the context window (used for summarization threshold calculation) from max_tokens (used for output length limit). Changes: - pkg/config/config.go: Add ContextWindow field with JSON/env support - pkg/config/defaults.go: Set default to 131072 (128K) - pkg/agent/instance.go: Use context_window with fallback to max_tokens - config/config.example.json: Add example configuration - README.md, docs/docker.md, docs/providers.md: Update documentation Backward compatibility: If context_window is not set, it defaults to max_tokens. Co-Authored-By: Claude Opus 4.6 --- README.md | 4 +++- config/config.example.json | 1 + docs/docker.md | 1 + docs/providers.md | 4 +++- pkg/agent/instance.go | 8 +++++++- pkg/config/config.go | 1 + pkg/config/defaults.go | 1 + 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 652792d83..61cd03abf 100644 --- a/README.md +++ b/README.md @@ -274,6 +274,7 @@ picoclaw onboard "workspace": "~/.picoclaw/workspace", "model_name": "gpt-5.4", "max_tokens": 8192, + "context_window": 131072, "temperature": 0.7, "max_tool_iterations": 20 } @@ -1019,6 +1020,7 @@ picoclaw onboard "workspace": "~/.picoclaw/workspace", "model_name": "gpt-5.4", "max_tokens": 8192, + "context_window": 131072, "temperature": 0.7, "max_tool_iterations": 20 } @@ -1492,7 +1494,7 @@ User Groups: discord: -PicoClaw +PicoClaw ## ClawdChat Join the Agent Social Network diff --git a/config/config.example.json b/config/config.example.json index 81c9014ec..9c584042e 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -5,6 +5,7 @@ "restrict_to_workspace": true, "model_name": "gpt-5.4", "max_tokens": 8192, + "context_window": 131072, "temperature": 0.7, "max_tool_iterations": 20, "summarize_message_threshold": 20, diff --git a/docs/docker.md b/docs/docker.md index f868d4a42..3ffd01ba0 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -84,6 +84,7 @@ picoclaw onboard "workspace": "~/.picoclaw/workspace", "model_name": "gpt-5.4", "max_tokens": 8192, + "context_window": 131072, "temperature": 0.7, "max_tool_iterations": 20 } diff --git a/docs/providers.md b/docs/providers.md index dde1814fb..5a806947d 100644 --- a/docs/providers.md +++ b/docs/providers.md @@ -95,7 +95,9 @@ This design also enables **multi-agent support** with flexible provider selectio ], "agents": { "defaults": { - "model_name": "gpt-5.4" + "model_name": "gpt-5.4", + "max_tokens": 8192, + "context_window": 131072 } } } diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index 355e78a33..5e4086f41 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -130,6 +130,12 @@ func NewAgentInstance( maxTokens = 8192 } + // Resolve context window: use context_window if set, otherwise fall back to max_tokens + contextWindow := defaults.ContextWindow + if contextWindow == 0 { + contextWindow = maxTokens + } + temperature := 0.7 if defaults.Temperature != nil { temperature = *defaults.Temperature @@ -182,7 +188,7 @@ func NewAgentInstance( MaxTokens: maxTokens, Temperature: temperature, ThinkingLevel: thinkingLevel, - ContextWindow: maxTokens, + ContextWindow: contextWindow, SummarizeMessageThreshold: summarizeMessageThreshold, SummarizeTokenPercent: summarizeTokenPercent, Provider: provider, diff --git a/pkg/config/config.go b/pkg/config/config.go index 235cb0641..c421d02e8 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -238,6 +238,7 @@ type AgentDefaults struct { ImageModel string `json:"image_model,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_IMAGE_MODEL"` ImageModelFallbacks []string `json:"image_model_fallbacks,omitempty"` MaxTokens int `json:"max_tokens" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOKENS"` + ContextWindow int `json:"context_window" env:"PICOCLAW_AGENTS_DEFAULTS_CONTEXT_WINDOW"` Temperature *float64 `json:"temperature,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_TEMPERATURE"` MaxToolIterations int `json:"max_tool_iterations" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS"` SummarizeMessageThreshold int `json:"summarize_message_threshold" env:"PICOCLAW_AGENTS_DEFAULTS_SUMMARIZE_MESSAGE_THRESHOLD"` diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 0d2141ae1..777ef312c 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -31,6 +31,7 @@ func DefaultConfig() *Config { Provider: "", Model: "", MaxTokens: 32768, + ContextWindow: 131072, Temperature: nil, // nil means use provider default MaxToolIterations: 50, SummarizeMessageThreshold: 20,