feat(llm): 模型配置新增输出上限,支持 max_completion_tokens 字段名
llm_profiles 加两列:max_tokens(单次回复输出上限,0=不发送该字段,由服务端 默认值决定)与 max_tokens_field(上限发哪个键)。后者仅对 format=openai 生效: 空(默认)= max_tokens;'max_completion_tokens' = 新键。OpenAI 推理模型 (o 系列/GPT-5)拒收 max_tokens、只认新键,而多数兼容网关反过来只认旧键, 故做成显式开关而非自动推断。anthropic 与 openai-responses 自带字段名, 存下来只会误导,保存时一并清空。 顺带补上一处从未接通的链路:planner/worker/chat/mainagent/goals 五个 agentcore.Options 都没设过 MaxTokens,恒为 0——openai 系因 omitempty 压根 不发上限,anthropic 走 norma 的 8192 兜底。光加配置项而不接这条线,用户在 后台填了数字也不会生效,故本次一并接通,取值与 streaming 一样按 profile 每轮解析,故障转移切换后下一轮即生效。 task_llm.go 里 nonStreaming() 的来源优先级(agent 绑定 → 任务链激活 profile → 全局)抽成共用的 activeCfg(),避免 maxTokens() 再抄一份同样的三级回退。 norma 升到 v0.3.3(该版本提供 Config.MaxTokensField)。go.mod 只动 norma 这 一行:仓库此前未 tidy 过,跑 go mod tidy 会顺带升 x/crypto、x/net 等一批无关 依赖,不混进本次改动。 迁移:新列走 ADD COLUMN IF NOT EXISTS + 默认 0/'',旧库升级后行为完全不变; CHECK 约束限定取值,每次启动先删后建保持幂等。
This commit is contained in:
1 parent
338e77c064
commit
7cc467c159
20 files changed
+364
-33
No files matched your search
@@ -58,6 +58,15 @@ type Config struct {
|
||||
// 某些网关糟糕的 SSE 实现(空帧、思考字段丢帧),代价是失去运行中的实时进度/实时
|
||||
// token 计数。映射为 agentcore.Options.NonStreaming = !Stream。
|
||||
Stream bool
|
||||
// MaxTokens 是单次回复的输出上限(token)。0 = 不发送该字段,由服务端默认值决定
|
||||
// (历史行为)。与 ContextWindowK 不同:后者是模型总容量,只在本地用来算压缩阈值,
|
||||
// 不出现在请求里;本值随每次请求发出。映射为 agentcore.Options.MaxTokens。
|
||||
MaxTokens int
|
||||
// MaxTokensField 选择 MaxTokens 用哪个请求字段名,仅对 format=openai 生效:
|
||||
// "" = max_tokens(默认); "max_completion_tokens" = 新字段。
|
||||
// OpenAI 推理模型(o 系列/GPT-5)只认后者,收到 max_tokens 会直接报
|
||||
// unsupported_parameter;而多数兼容网关只认前者,故不做自动推断,交由用户按端点选。
|
||||
MaxTokensField string
|
||||
}
|
||||
|
||||
// compaction window resolution bounds (in K tokens). Below the floor the
|
||||
@@ -230,6 +239,9 @@ func (c Config) NewProvider() (llm.Provider, error) {
|
||||
// 可只发 thinking.type、只发 effort、都发、或都不发。
|
||||
lc.ThinkingType = c.ThinkingType
|
||||
lc.ReasoningEffort = c.ReasoningEffort
|
||||
// 输出上限的字段名选择(空 = 用 max_tokens)。上限的「值」不在这里:它每轮随
|
||||
// agentcore.Options.MaxTokens 走,provider 只决定把它塞进哪个键。
|
||||
lc.MaxTokensField = c.MaxTokensField
|
||||
if c.RatePerSecond > 0 || c.RatePerMinute > 0 {
|
||||
lc.RateLimit = &llm.RateLimit{PerSecond: c.RatePerSecond, PerMinute: c.RatePerMinute}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user