package engine // query_source.go -- 查询来源标识,用于区分前台/后台请求. // // 核心用途:529 (Overloaded) 重试策略需要区分请求来源. // 前台请求(用户在等待)应该重试,后台请求应该直接失败以避免级联雪崩. // QuerySource 标识一次 API 查询的来源. // 不同来源在重试策略,优先级,超时等方面有不同行为. type QuerySource string const ( // SourceMainThread 用户直接交互(最高优先级,必须重试) SourceMainThread QuerySource = "main_thread" // SourceSubAgent 子代理调用(用户间接等待) SourceSubAgent QuerySource = "sub_agent" // SourceCompact 上下文压缩(用户间接等待,但可降级) SourceCompact QuerySource = "compact" // SourceSummary 工具摘要生成(后台,可丢弃) SourceSummary QuerySource = "summary" // SourceDream Dream 巩固(纯后台) SourceDream QuerySource = "dream" // SourceClassifier 权限分类器(后台,可降级为默认策略) SourceClassifier QuerySource = "classifier" // SourceBackground 后台任务(最低优先级) SourceBackground QuerySource = "background" ) // IsForeground 判断是否为前台请求(用户正在等待结果). // 前台请求在遇到 529 时应该重试;后台请求应直接返回错误,防止级联雪崩. func (s QuerySource) IsForeground() bool { switch s { case SourceMainThread, SourceSubAgent, SourceCompact: return true default: return false } } // String 返回来源的字符串表示. func (s QuerySource) String() string { return string(s) } // ShouldRetryOverloaded 判断给定来源在遇到 529 Overloaded 时是否应该重试. // 只有前台请求才重试 529,后台请求直接失败. func ShouldRetryOverloaded(source QuerySource) bool { return source.IsForeground() } // isOverloadedError 判断 API 错误是否为 529 过载错误. func isOverloadedError(errStr string) bool { // 匹配 "HTTP 529" 模式 return len(errStr) >= 8 && contains529(errStr) } // contains529 检查错误字符串中是否包含 HTTP 529 标识. func contains529(s string) bool { for i := 0; i <= len(s)-8; i++ { if s[i:i+8] == "HTTP 529" { return true } } return false }