Logo
热心市民王先生

关键代码验证

技术研究 人工智能 AI Agent

{ models { glm-4.7 { provider zhipu, model glm-4.7, api_key ${ZHIPU_API_KEY}, base_url https//open.bigmodel.cn/api/paas/v4, temperature 0.7, max_tokens 8192 }, kimi-2.5 { provider ...

oh-my-opencode 模型配置示例

基础配置文件

以下是在 opencode.json 中配置多模型的基础结构:

{
  "models": {
    "glm-4.7": {
      "provider": "zhipu",
      "model": "glm-4.7",
      "api_key": "${ZHIPU_API_KEY}",
      "base_url": "https://open.bigmodel.cn/api/paas/v4",
      "temperature": 0.7,
      "max_tokens": 8192
    },
    "kimi-2.5": {
      "provider": "moonshot",
      "model": "kimi-k2.5",
      "api_key": "${MOONSHOT_API_KEY}",
      "base_url": "https://api.moonshot.cn/v1",
      "temperature": 0.6,
      "max_tokens": 16384
    },
    "minimax-2.5": {
      "provider": "minimax",
      "model": "MiniMax-M2.5",
      "api_key": "${MINIMAX_API_KEY}",
      "base_url": "https://api.minimaxi.com/v1",
      "temperature": 0.7,
      "max_tokens": 8192
    }
  }
}

Agent-模型映射配置

方案一:能力优先型配置

{
  "agents": {
    "Sisyphus": {
      "model": "minimax-2.5",
      "temperature": 0.7,
      "system_prompt": "你是一个任务协调器,负责理解用户需求并分发给合适的 Agent。"
    },
    "Oracle": {
      "model": "kimi-2.5",
      "temperature": 0.4,
      "system_prompt": "你是架构顾问,专注于复杂系统设计和深度技术咨询。"
    },
    "Librarian": {
      "model": "minimax-2.5",
      "temperature": 0.3,
      "system_prompt": "你是资料检索专家,擅长搜索和整合外部信息。"
    },
    "Developer": {
      "model": "minimax-2.5",
      "temperature": 0.2,
      "system_prompt": "你是代码开发专家,专注于高质量的代码实现。"
    },
    "Designer": {
      "model": "glm-4.7",
      "temperature": 0.6,
      "system_prompt": "你是 UI/UX 设计专家,擅长创造美观且实用的界面。"
    }
  }
}

方案二:成本优化型配置

{
  "agents": {
    "Sisyphus": {
      "model": "glm-4.7",
      "temperature": 0.7
    },
    "Oracle": {
      "model": "kimi-2.5",
      "temperature": 0.4
    },
    "Librarian": {
      "model": "minimax-2.5",
      "temperature": 0.3
    },
    "Developer": {
      "model": "glm-4.7",
      "temperature": 0.2
    },
    "Designer": {
      "model": "glm-4.7",
      "temperature": 0.6
    }
  }
}

场景自适应路由配置

实现基于任务类型的动态模型选择:

# agent_router.py
from enum import Enum
from typing import Optional

class TaskType(Enum):
    SIMPLE = "simple"           # 简单任务
    CODING = "coding"           # 编程任务
    RESEARCH = "research"       # 研究/探索
    ARCHITECTURE = "architecture"  # 架构设计
    UI_DESIGN = "ui_design"     # UI/UX 设计

class ModelSelector:
    def __init__(self):
        self.model_mapping = {
            # 简单任务 -> 成本最低
            (TaskType.SIMPLE, None): "minimax-2.5",
            
            # 编程任务 -> 根据复杂度
            (TaskType.CODING, "complex"): "kimi-2.5",
            (TaskType.CODING, "normal"): "minimax-2.5",
            (TaskType.CODING, "frontend"): "glm-4.7",
            
            # 研究任务 -> 根据上下文长度
            (TaskType.RESEARCH, "long_context"): "kimi-2.5",
            (TaskType.RESEARCH, "normal"): "minimax-2.5",
            
            # 架构设计 -> 最强推理
            (TaskType.ARCHITECTURE, None): "kimi-2.5",
            
            # UI 设计 -> 美学优化
            (TaskType.UI_DESIGN, None): "glm-4.7",
        }
    
    def select_model(self, task_type: TaskType, 
                     complexity: Optional[str] = None) -> str:
        """根据任务类型和复杂度选择模型"""
        key = (task_type, complexity)
        
        if key in self.model_mapping:
            return self.model_mapping[key]
        
        # 回退到默认配置
        return self.model_mapping.get((task_type, None), "minimax-2.5")

# 使用示例
selector = ModelSelector()

# 简单查询
model = selector.select_model(TaskType.SIMPLE)
print(f"简单任务使用模型: {model}")  # minimax-2.5

# 复杂算法设计
model = selector.select_model(TaskType.CODING, "complex")
print(f"复杂编码使用模型: {model}")  # kimi-2.5

# 前端开发
model = selector.select_model(TaskType.CODING, "frontend")
print(f"前端开发使用模型: {model}")  # glm-4.7

环境变量配置

为了安全地管理 API 密钥,建议使用环境变量:

# ~/.bashrc 或 ~/.zshrc

# 智谱 AI (GLM4.7)
export ZHIPU_API_KEY="your-zhipu-api-key"

# 月之暗面 (Kimi 2.5)
export MOONSHOT_API_KEY="your-moonshot-api-key"

# MiniMax
export MINIMAX_API_KEY="your-minimax-api-key"

性能监控配置

添加成本追踪和性能监控:

# cost_tracker.py
import time
from dataclasses import dataclass
from typing import Dict, List

@dataclass
class ModelUsage:
    model_name: str
    input_tokens: int
    output_tokens: int
    latency_ms: float
    cost_usd: float
    timestamp: float

class CostTracker:
    def __init__(self):
        # 每百万 token 成本(输出)
        self.pricing = {
            "glm-4.7": 2.00,
            "kimi-2.5": 3.00,
            "minimax-2.5": 1.20,
        }
        self.usage_history: List[ModelUsage] = []
    
    def track_usage(self, model_name: str, 
                    input_tokens: int, 
                    output_tokens: int,
                    latency_ms: float):
        """追踪模型使用情况"""
        price_per_million = self.pricing.get(model_name, 2.00)
        cost = (output_tokens / 1_000_000) * price_per_million
        
        usage = ModelUsage(
            model_name=model_name,
            input_tokens=input_tokens,
            output_tokens=output_tokens,
            latency_ms=latency_ms,
            cost_usd=cost,
            timestamp=time.time()
        )
        self.usage_history.append(usage)
        
        return cost
    
    def get_summary(self) -> Dict:
        """获取使用统计摘要"""
        summary = {}
        
        for model in self.pricing.keys():
            model_usage = [u for u in self.usage_history 
                          if u.model_name == model]
            
            if model_usage:
                summary[model] = {
                    "total_calls": len(model_usage),
                    "total_input_tokens": sum(u.input_tokens for u in model_usage),
                    "total_output_tokens": sum(u.output_tokens for u in model_usage),
                    "total_cost_usd": sum(u.cost_usd for u in model_usage),
                    "avg_latency_ms": sum(u.latency_ms for u in model_usage) / len(model_usage),
                }
        
        return summary
    
    def print_report(self):
        """打印成本报告"""
        summary = self.get_summary()
        
        print("\n" + "="*60)
        print("模型使用成本报告")
        print("="*60)
        
        total_cost = 0
        for model, stats in summary.items():
            print(f"\n{model}:")
            print(f"  调用次数: {stats['total_calls']}")
            print(f"  输出 Token: {stats['total_output_tokens']:,}")
            print(f"  总成本: ${stats['total_cost_usd']:.4f}")
            print(f"  平均延迟: {stats['avg_latency_ms']:.0f}ms")
            total_cost += stats['total_cost_usd']
        
        print(f"\n总成本: ${total_cost:.4f}")
        print("="*60)

# 使用示例
tracker = CostTracker()

# 模拟使用
tracker.track_usage("minimax-2.5", 500, 1000, 1200)
tracker.track_usage("kimi-2.5", 1000, 2000, 2500)
tracker.track_usage("glm-4.7", 800, 1500, 1800)

tracker.print_report()

测试验证

单元测试示例

# test_model_selection.py
import pytest
from agent_router import ModelSelector, TaskType

def test_simple_task_uses_minimax():
    selector = ModelSelector()
    model = selector.select_model(TaskType.SIMPLE)
    assert model == "minimax-2.5"

def test_complex_coding_uses_kimi():
    selector = ModelSelector()
    model = selector.select_model(TaskType.CODING, "complex")
    assert model == "kimi-2.5"

def test_frontend_uses_glm():
    selector = ModelSelector()
    model = selector.select_model(TaskType.CODING, "frontend")
    assert model == "glm-4.7"

def test_architecture_uses_kimi():
    selector = ModelSelector()
    model = selector.select_model(TaskType.ARCHITECTURE)
    assert model == "kimi-2.5"

集成测试

验证实际 API 调用:

# test_integration.py
import os
from openai import OpenAI

def test_model_connectivity():
    """测试各模型 API 连通性"""
    models = {
        "glm-4.7": {
            "client": OpenAI(
                api_key=os.getenv("ZHIPU_API_KEY"),
                base_url="https://open.bigmodel.cn/api/paas/v4"
            ),
            "model": "glm-4.7"
        },
        "kimi-2.5": {
            "client": OpenAI(
                api_key=os.getenv("MOONSHOT_API_KEY"),
                base_url="https://api.moonshot.cn/v1"
            ),
            "model": "kimi-k2.5"
        },
        "minimax-2.5": {
            "client": OpenAI(
                api_key=os.getenv("MINIMAX_API_KEY"),
                base_url="https://api.minimaxi.com/v1"
            ),
            "model": "MiniMax-M2.5"
        }
    }
    
    for name, config in models.items():
        try:
            response = config["client"].chat.completions.create(
                model=config["model"],
                messages=[{"role": "user", "content": "Hello"}],
                max_tokens=10
            )
            print(f"✓ {name}: 连接成功")
        except Exception as e:
            print(f"✗ {name}: 连接失败 - {e}")

if __name__ == "__main__":
    test_model_connectivity()

关键配置参数说明

Temperature 参数建议

Agent 类型推荐 Temperature说明
Oracle0.3-0.4需要确定性的架构决策
Developer0.2-0.3代码生成需要高确定性
Librarian0.2-0.3信息检索应准确一致
Designer0.5-0.7设计可以适当创造性
Sisyphus0.6-0.8协调需要一定灵活性

Max Tokens 配置

任务类型推荐 Max Tokens说明
简单问答1024-2048简短回答
代码生成4096-8192完整函数/类
架构设计8192-16384详细设计文档
长文档分析16384-32768完整分析报告

参考资料