Files
FuDie0915 db73cf5a39 chore: import Local-Cursor v1.1.8 source snapshot
Includes the current working directory changes. Historical commits and release binaries are excluded to limit Gitea storage.
Source base: d7515973fbfd6dd2001fa156c483455b8081c7cb
2026-11-10 01:24:28 +08:00

91 lines
3.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package config
import (
"context"
"strings"
"cursor/internal/modelchannel"
legacyruntime "cursor/internal/runtime"
)
const (
defaultChannelTimeoutMS = int((2 * 60 * 60) * 1000)
defaultChannelContextWindowTokens = 500_000
// 两类渠道的最大输出默认值按协议分道:
// openai 兼容网关对大 max_tokens 普遍宽容;anthropic 生态主流输出上限为 128K,
// 默认值越过服务方上限会直接返回 400(exceeds the configured maximum output length)。
defaultChannelMaxTokens = 278_000
defaultChannelAnthropicMaxTokens = 131_072
defaultChannelThinkingBudget = 4_096
defaultChannelAnthropicEffort = "xhigh"
)
func (manager *Manager) SelectChannelForModel(_ context.Context, modelID string) (*legacyruntime.ResolvedChannel, error) {
if manager == nil {
return nil, legacyruntime.ErrChannelNotAvailable
}
adapters, err := NormalizeModelAdapterConfigs(manager.Current().ModelAdapters)
if err != nil {
return nil, err
}
return resolveModelAdapterChannel(adapters, modelID)
}
func resolveModelAdapterChannel(adapters []ModelAdapterConfig, requestedModel string) (*legacyruntime.ResolvedChannel, error) {
matchIndex, ok := modelchannel.ResolveAdapterIndex(
adapters,
requestedModel,
func(adapter ModelAdapterConfig) string { return adapter.ID },
func(adapter ModelAdapterConfig) string { return adapter.ModelID },
func(adapter ModelAdapterConfig) string {
return modelchannel.BuildLegacyChannelID(adapter.BaseURL, adapter.ModelID, adapter.APIKey, adapter.DisplayName)
},
)
if !ok {
return nil, legacyruntime.ErrChannelNotAvailable
}
matched := adapters[matchIndex]
resolved := &legacyruntime.ResolvedChannel{
ID: strings.TrimSpace(matched.ID),
Name: strings.TrimSpace(matched.DisplayName),
GroupName: "local",
Code: strings.TrimSpace(matched.ID),
Provider: strings.TrimSpace(matched.Type),
BaseURL: strings.TrimSpace(matched.BaseURL),
APIKey: strings.TrimSpace(matched.APIKey),
Model: strings.TrimSpace(matched.ModelID),
OpenAIEndpoint: strings.TrimSpace(matched.OpenAIEndpoint),
OpenAIExtraParamsEnabled: matched.OpenAIExtraParamsEnabled,
OpenAIExtraParamsJSON: strings.TrimSpace(matched.OpenAIExtraParamsJSON),
CustomHeadersEnabled: matched.CustomHeadersEnabled,
CustomHeadersJSON: strings.TrimSpace(matched.CustomHeadersJSON),
AnthropicExtraParamsEnabled: matched.AnthropicExtraParamsEnabled,
AnthropicExtraParamsJSON: strings.TrimSpace(matched.AnthropicExtraParamsJSON),
TimeoutMS: defaultChannelTimeoutMS,
ContextWindowTokens: defaultChannelContextWindowTokens,
MaxTokens: defaultChannelMaxTokens,
ReasoningEffort: strings.TrimSpace(matched.ReasoningEffort),
AnthropicMaxTokens: defaultChannelAnthropicMaxTokens,
AnthropicThinkingEffort: defaultChannelAnthropicEffort,
ThinkingEnabled: true,
ThinkingBudgetTokens: defaultChannelThinkingBudget,
}
if matched.ContextWindowTokens > 0 {
resolved.ContextWindowTokens = matched.ContextWindowTokens
}
if matched.MaxCompletionTokens > 0 {
resolved.MaxTokens = matched.MaxCompletionTokens
}
if matched.AnthropicMaxTokens > 0 {
resolved.AnthropicMaxTokens = matched.AnthropicMaxTokens
}
if matched.ThinkingBudgetTokens > 0 {
resolved.ThinkingBudgetTokens = matched.ThinkingBudgetTokens
}
if strings.TrimSpace(matched.AnthropicThinkingEffort) != "" {
resolved.AnthropicThinkingEffort = strings.TrimSpace(matched.AnthropicThinkingEffort)
}
return resolved, nil
}