程序启动
│
▼
检查 CRUSH_CONFIG_PATH
│
├── 设置 ──▶ 加载指定路径
│
▼
检查 $DATA_DIR/crush.yaml (默认 ~/.crush/crush.yaml)
│
├── 存在 ──▶ 加载
│
▼
检查 ./crush.yaml (当前目录)
│
├── 存在 ──▶ 加载
│
▼
使用默认配置
type ProviderConfig struct {
ID string // 提供商 ID
Name string // 显示名称
BaseURL string // API 端点
Type catwalk.Type // 提供商类型
APIKey string // API 密钥
OAuthToken *oauth.Token // OAuth 令牌
Models []catwalk.Model // 可用模型列表
// 扩展配置
ExtraHeaders map[string]string // 自定义请求头
ExtraBody map[string]any // 自定义请求体
SystemPromptPrefix string // 系统提示前缀
}
type Type string
const (
TypeOpenAI Type = "openai" // OpenAI 官方
TypeOpenAICompat Type = "openai-compat" // OpenAI 兼容
TypeAnthropic Type = "anthropic" // Anthropic
TypeGemini Type = "gemini" // Google Gemini
TypeAzure Type = "azure" // Azure OpenAI
TypeVertexAI Type = "vertexai" // Google VertexAI
)
type SelectedModel struct {
Model string // 模型 ID
Provider string // 提供商 ID
// 生成参数
MaxTokens int64
Temperature *float64
TopP *float64
TopK *int64
FrequencyPenalty *float64
PresencePenalty *float64
// 模型特定选项
ReasoningEffort string // OpenAI
Think bool // Anthropic
}
请求处理
│
▼
检查是否为复杂任务?
│
├── 是 ──▶ 使用 Large Model
│ (gpt-4o, claude-sonnet)
│
└── 否 ──▶ 使用 Small Model
(gpt-4o-mini, claude-haiku)
func resolveVariables(content string) string {
re := regexp.MustCompile(`\$\{([^}]+)\}`)
return re.ReplaceAllStringFunc(content, func(match string) string {
varName := match[2 : len(match)-1]
// 处理默认值: ${VAR:-default}
if strings.Contains(varName, ":-") {
parts := strings.SplitN(varName, ":-", 2)
return os.Getenv(parts[0])
}
return os.Getenv(varName)
})
}
# 热重载配置
crush> /config reload
# 查看当前配置
crush> /config show
本文是《Crush 从入门到精通》系列文章的第十二章
还没有人回复