Raise default agent token budget for reasoning models

The tracker mapping, common-pattern enrichment, and third-party
disambiguation agents default to a small max-tokens budget on the
premise that their final output is tiny structured JSON. On
reasoning models such as the GPT-5 family, reasoning tokens count
against max_tokens, so a small budget is consumed by reasoning and
the JSON is truncated, surfacing as "unexpected end of JSON input".

Raise the defaults to 4096 (1024 -> 4096 for tracker mapping, 512
-> 4096 for disambiguation) to leave headroom for the reasoning
phase. Update the bootstrap builder default, its test, and the
production values example to match.

Signed-off-by: Émile Ré <emile@probo.com>
This commit is contained in:
Émile Ré
2026-05-29 17:42:40 +02:00
parent b6d0b64224
commit 7360c6eb27
5 changed files with 23 additions and 14 deletions

View File

@@ -174,7 +174,7 @@ probo:
# provider: "openai"
# modelName: "gpt-4o-mini"
# temperature: "0.1"
# maxTokens: "1024"
# maxTokens: "4096"
# Tracker mapping worker tuning (optional; seconds for interval/agentTimeout).
# Keep concurrency modest to stay under OpenAI/Firecrawl limits and the DB pool.

View File

@@ -209,11 +209,12 @@ func (b *Builder) Build() (*probodconfig.FullConfig, error) {
TrackerMapping: probodconfig.LLMAgentConfig{
Provider: b.getEnvOrDefault("AGENT_TRACKER_MAPPING_PROVIDER", ""),
ModelName: b.getEnvOrDefault("AGENT_TRACKER_MAPPING_MODEL_NAME", ""),
// The tracker agents emit tiny structured JSON, so
// they default to a smaller token budget than the
// shared default rather than inheriting it.
// The tracker agents emit tiny structured JSON, but
// the budget must leave headroom for reasoning
// models whose reasoning tokens count against
// max_tokens; too small a budget truncates the JSON.
Temperature: b.getEnvFloatPtr("AGENT_TRACKER_MAPPING_TEMPERATURE"),
MaxTokens: new(b.getEnvIntOrDefault("AGENT_TRACKER_MAPPING_MAX_TOKENS", 1024)),
MaxTokens: new(b.getEnvIntOrDefault("AGENT_TRACKER_MAPPING_MAX_TOKENS", 4096)),
},
Tools: probodconfig.AgentToolsConfig{
FirecrawlAPIKey: b.getEnv("FIRECRAWL_API_KEY"),

View File

@@ -218,7 +218,7 @@ func TestBuilder_Build_Defaults(t *testing.T) {
assert.Empty(t, cfg.Probod.Agents.TrackerMapping.Provider)
assert.Empty(t, cfg.Probod.Agents.TrackerMapping.ModelName)
assert.Nil(t, cfg.Probod.Agents.TrackerMapping.Temperature)
assert.Equal(t, new(1024), cfg.Probod.Agents.TrackerMapping.MaxTokens)
assert.Equal(t, new(4096), cfg.Probod.Agents.TrackerMapping.MaxTokens)
// Tracker worker tuning — defaults
assert.Equal(t, 10, cfg.Probod.TrackerMappingWorker.Interval)

View File

@@ -40,10 +40,14 @@ const (
defaultMappingMaxTurns = 4
defaultEnrichmentMaxTurns = 3
// defaultAgentMaxTokens caps the structured output of the mapping
// and enrichment agents when the agent config carries no max-tokens
// budget. Both outputs are tiny structured JSON.
defaultAgentMaxTokens = 1024
// defaultAgentMaxTokens caps the output of the mapping and
// enrichment agents when the agent config carries no max-tokens
// budget. Both final outputs are tiny structured JSON, but the
// budget must leave ample headroom for reasoning models (e.g. the
// GPT-5 family): their reasoning tokens count against max_tokens,
// so too small a budget gets consumed by reasoning and truncates
// the JSON, surfacing as "unexpected end of JSON input".
defaultAgentMaxTokens = 4096
agentThirdPartyConfidenceThreshold = 0.6
// agentSourceConfidence is the fixed confidence stored on catalog

View File

@@ -44,10 +44,14 @@ const (
// provider, not a real budget.
defaultDisambiguationTimeout = 45 * time.Second
// defaultDisambiguationMaxTokens caps the agent's structured
// output when the config carries no max-tokens budget. The output
// is a single id plus a one-sentence rationale.
defaultDisambiguationMaxTokens = 512
// defaultDisambiguationMaxTokens caps the agent's output when the
// config carries no max-tokens budget. The final output is tiny (a
// single id plus a one-sentence rationale), but the budget must
// leave ample headroom for reasoning models (e.g. the GPT-5
// family): their reasoning tokens count against max_tokens, so too
// small a budget gets consumed by reasoning and truncates the JSON,
// surfacing as "unexpected end of JSON input".
defaultDisambiguationMaxTokens = 4096
)
// DisambiguationConfig configures the third-party disambiguation