package engine // norm_orphan_thinking.go -- 过滤只包含 thinking 块的 assistant 消息. // // 来源:新增步骤,早期方案 normalize 未处理. // 场景:压缩切割后可能留下只有 thinking 的 assistant 消息. // API 遇到连续的 thinking-only assistant 会返回 400. // 跨场景通用:任何启用 extended thinking 的场景. import ( "git.flytoex.net/yuanwei/flyto-agent/pkg/query" ) // OrphanThinkingFilter 过滤只包含 thinking 块的 assistant 消息. // // 精妙之处(CLEVER): 只过滤 assistant 消息中的纯 thinking. // user 消息不可能包含 thinking 块(API 约束), // 所以只检查 assistant 角色,避免误伤. type OrphanThinkingFilter struct{} func (f *OrphanThinkingFilter) Name() string { return "orphan_thinking" } func (f *OrphanThinkingFilter) Priority() int { return 18 } func (f *OrphanThinkingFilter) Normalize(messages []query.Message) []query.Message { if len(messages) == 0 { return messages } result := make([]query.Message, 0, len(messages)) for _, msg := range messages { if msg.Role == query.RoleAssistant && isThinkingOnly(msg) { // 跳过只包含 thinking 的 assistant 消息 continue } result = append(result, msg) } return result } // isThinkingOnly 检查消息是否只包含 thinking 块. func isThinkingOnly(msg query.Message) bool { if len(msg.Content) == 0 { return false } for _, c := range msg.Content { if c.Type != query.ContentThinking { return false } } return true }