Files
cursor-byok/internal/backend/server/config/resolver.go
2026-06-30 10:38:52 +08:00

87 lines
3.4 KiB
Go

package config
import (
"context"
"strings"
"cursor/internal/modelchannel"
legacyruntime "cursor/internal/runtime"
)
const (
defaultChannelTimeoutMS = int((2 * 60 * 60) * 1000)
defaultChannelContextWindowTokens = 200_000
defaultChannelMaxTokens = 65_536
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: defaultChannelMaxTokens,
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
}