¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档 д Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£ Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£ Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢ Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£ Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
91 lines
3.7 KiB
Go
91 lines
3.7 KiB
Go
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
|
||
}
|