| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package operation_setting
- import "github.com/QuantumNous/new-api/setting/config"
- type ChannelAffinityKeySource struct {
- Type string `json:"type"` // context_int, context_string, gjson
- Key string `json:"key,omitempty"`
- Path string `json:"path,omitempty"`
- }
- type ChannelAffinityRule struct {
- Name string `json:"name"`
- ModelRegex []string `json:"model_regex"`
- PathRegex []string `json:"path_regex"`
- UserAgentInclude []string `json:"user_agent_include,omitempty"`
- KeySources []ChannelAffinityKeySource `json:"key_sources"`
- ValueRegex string `json:"value_regex"`
- TTLSeconds int `json:"ttl_seconds"`
- ParamOverrideTemplate map[string]interface{} `json:"param_override_template,omitempty"`
- SkipRetryOnFailure bool `json:"skip_retry_on_failure,omitempty"`
- IncludeUsingGroup bool `json:"include_using_group"`
- IncludeRuleName bool `json:"include_rule_name"`
- }
- type ChannelAffinitySetting struct {
- Enabled bool `json:"enabled"`
- SwitchOnSuccess bool `json:"switch_on_success"`
- MaxEntries int `json:"max_entries"`
- DefaultTTLSeconds int `json:"default_ttl_seconds"`
- Rules []ChannelAffinityRule `json:"rules"`
- }
- var codexCliPassThroughHeaders = []string{
- "Originator",
- "Session_id",
- "User-Agent",
- "X-Codex-Beta-Features",
- "X-Codex-Turn-Metadata",
- }
- var claudeCliPassThroughHeaders = []string{
- "X-Stainless-Arch",
- "X-Stainless-Lang",
- "X-Stainless-Os",
- "X-Stainless-Package-Version",
- "X-Stainless-Retry-Count",
- "X-Stainless-Runtime",
- "X-Stainless-Runtime-Version",
- "X-Stainless-Timeout",
- "User-Agent",
- "X-App",
- "Anthropic-Beta",
- "Anthropic-Dangerous-Direct-Browser-Access",
- "Anthropic-Version",
- }
- func buildPassHeaderTemplate(headers []string) map[string]interface{} {
- clonedHeaders := make([]string, 0, len(headers))
- clonedHeaders = append(clonedHeaders, headers...)
- return map[string]interface{}{
- "operations": []map[string]interface{}{
- {
- "mode": "pass_headers",
- "value": clonedHeaders,
- "keep_origin": true,
- },
- },
- }
- }
- var channelAffinitySetting = ChannelAffinitySetting{
- Enabled: true,
- SwitchOnSuccess: true,
- MaxEntries: 100_000,
- DefaultTTLSeconds: 3600,
- Rules: []ChannelAffinityRule{
- {
- Name: "codex cli trace",
- ModelRegex: []string{"^gpt-.*$"},
- PathRegex: []string{"/v1/responses"},
- KeySources: []ChannelAffinityKeySource{
- {Type: "gjson", Path: "prompt_cache_key"},
- },
- ValueRegex: "",
- TTLSeconds: 0,
- ParamOverrideTemplate: buildPassHeaderTemplate(codexCliPassThroughHeaders),
- SkipRetryOnFailure: false,
- IncludeUsingGroup: true,
- IncludeRuleName: true,
- UserAgentInclude: nil,
- },
- {
- Name: "claude cli trace",
- ModelRegex: []string{"^claude-.*$"},
- PathRegex: []string{"/v1/messages"},
- KeySources: []ChannelAffinityKeySource{
- {Type: "gjson", Path: "metadata.user_id"},
- },
- ValueRegex: "",
- TTLSeconds: 0,
- ParamOverrideTemplate: buildPassHeaderTemplate(claudeCliPassThroughHeaders),
- SkipRetryOnFailure: false,
- IncludeUsingGroup: true,
- IncludeRuleName: true,
- UserAgentInclude: nil,
- },
- },
- }
- func init() {
- config.GlobalConfig.Register("channel_affinity_setting", &channelAffinitySetting)
- }
- func GetChannelAffinitySetting() *ChannelAffinitySetting {
- return &channelAffinitySetting
- }
|