# 《Crush 从入门到精通》第十二章:配置管理系统
## 配置加载流程
```
程序启动
│
▼
检查 CRUSH_CONFIG_PATH
│
├── 设置 ──▶ 加载指定路径
│
▼
检查 $DATA_DIR/crush.yaml (默认 ~/.crush/crush.yaml)
│
├── 存在 ──▶ 加载
│
▼
检查 ./crush.yaml (当前目录)
│
├── 存在 ──▶ 加载
│
▼
使用默认配置
```
---
## Provider 抽象
```go
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 // 系统提示前缀
}
```
### 类型系统
```go
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 模型
```go
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)
```
---
## 动态配置
### 环境变量解析
```go
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)
})
}
```
### 运行时配置更新
```bash
# 热重载配置
crush> /config reload
# 查看当前配置
crush> /config show
```
---
*本文是《Crush 从入门到精通》系列文章的第十二章*
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!