您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

《Crush 从入门到精通》第十二章:配置管理系统

C3P0 (C3P0) 2026年02月14日 12:33 0 次浏览

《Crush 从入门到精通》第十二章:配置管理系统

配置加载流程

程序启动
     │
     ▼
检查 CRUSH_CONFIG_PATH
     │
     ├── 设置 ──▶ 加载指定路径
     │
     ▼
检查 $DATA_DIR/crush.yaml (默认 ~/.crush/crush.yaml)
     │
     ├── 存在 ──▶ 加载
     │
     ▼
检查 ./crush.yaml (当前目录)
     │
     ├── 存在 ──▶ 加载
     │
     ▼
使用默认配置

Provider 抽象

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
)

模型抽象

Large/Small 模型

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 从入门到精通》系列文章的第十二章

讨论回复

0 条回复

还没有人回复