# Chorus
**Repository Path**: qwe12345678/chorus
## Basic Information
- **Project Name**: Chorus
- **Description**: 多个LLM协同,类似gpt5pro
- **Primary Language**: Rust
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-10
- **Last Updated**: 2025-11-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: llm, AI
## README
# Chorus
**一个智能的 LLM API 聚合服务,通过多模型协同提供更高质量的 AI 响应**
[](https://www.rust-lang.org/)
[](LICENSE)
[](https://github.com/ollama/ollama)
## 📖 简介
Chorus 是一个用 Rust 编写的高性能 LLM API 服务,提供与 Ollama 兼容的 API 接口。它的独特之处在于采用了**三步智能工作流**:
1. **智能分析** - 由 GLM-4.6 分析用户问题并确定最佳 temperature 参数
2. **多模型协同** - 按序调用 7 个不同的 LLM 模型生成响应
3. **智能综合** - 将所有响应综合成一个高质量的最终答案
这种方法结合了多个模型的优势,提供更准确、更全面的回答。
## ✨ 特性
- 🚀 **高性能** - 基于 Rust 和 Tokio 异步运行时
- 🔄 **智能工作流** - 三步式处理流程,确保输出质量
- 🎯 **自适应参数** - 自动分析并设置最优 temperature
- 🤝 **多模型协同** - 支持 7 个不同的 LLM 模型
- 🔌 **兼容 Ollama** - API 接口与 Ollama 兼容
- ⚙️ **灵活配置** - TOML 格式配置文件
- 📝 **详细日志** - 完整的请求追踪和错误日志
- 🛡️ **错误处理** - 健壮的错误处理机制
## 🏗️ 架构
```
┌─────────────┐
│ Client │
└──────┬──────┘
│ HTTP Request
▼
┌─────────────────────────────────────┐
│ Chorus Server │
│ ┌───────────────────────────────┐ │
│ │ Step 1: Prompt Analysis │ │
│ │ Model: GLM-4.6 │ │
│ │ Output: Temperature │ │
│ └───────────┬───────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ Step 2: Multi-Model Work │ │
│ │ Models: │ │
│ │ • qwen3-max │ │
│ │ • qwen3-vl-plus │ │
│ │ • kimi-k2-0905 │ │
│ │ • glm-4.6 │ │
│ │ • deepseek-v3.2 │ │
│ │ • deepseek-v3.1 │ │
│ │ • deepseek-r1 │ │
│ └───────────┬───────────────────┘ │
│ ▼ │
│ ┌───────────────────────────────┐ │
│ │ Step 3: Response Synthesis │ │
│ │ Model: GLM-4.6 │ │
│ │ Output: Final Answer │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
```
## 🚀 快速开始
### 前置要求
- Rust 1.75 或更高版本
- 有效的 iFlow API Key
### 安装
1. **克隆仓库**
```bash
git clone https://github.com/yourusername/chorus.git
cd chorus
```
2. **配置 API Key**
- **生产 / 真实调用**:编辑 `~/.config/chorus/config.toml` 文件,将所有 `your-api-key-here` 替换为真实的 iFlow API Key。
- **本地快速体验**:仓库提供了 `mock_iflow.py`(模拟 iFlow 服务)和 `test-config.toml` 示例配置,无需真实 API Key。使用方式如下:
```bash
# 终端 1:启动本地模拟 LLM 服务(监听 127.0.0.1:18080)
python3 mock_iflow.py
# 终端 2:使用示例配置运行 Chorus
CHORUS_CONFIG=./test-config.toml cargo run
```
示例配置文件 `test-config.toml` 内容如:
```toml
[[model]]
api_base = "http://127.0.0.1:18080"
api_key = "sk-TEST-IFLOW-KEY"
name = "glm-4.6"
```
3. **编译项目**
```bash
# 开发模式
cargo build
# 生产模式(优化编译)
cargo build --release
```
4. **运行服务**
```bash
# 开发模式
cargo run
# 生产模式
./target/release/chorus
```
服务将在 `http://localhost:11435` 启动。
## ⚙️ 配置说明
### 服务器配置
```toml
[server]
host = "127.0.0.1" # 监听地址
port = 11435 # 监听端口
```
### 模型配置
为每个模型添加配置块:
```toml
[[model]]
api_base = "https://apis.iflow.cn/v1"
api_key = "your-api-key"
name = "model-name"
# temperature = 1.4 # 可选:固定 temperature 值(0.0-2.0)
# auto_temperature = false # 可选:是否由大模型自动选择 temperature
```
#### Temperature 配置说明
Chorus 支持三种 temperature 配置方式:
1. **固定 temperature 值**
```toml
[[model]]
name = "qwen3-max"
temperature = 0.8 # 固定使用 0.8
```
- 适用场景:明确知道该模型适合的 temperature 值
- 取值范围:0.0 - 2.0
- 效果:
- `0.0-0.3`:非常确定和保守,适合精确答案
- `0.4-0.7`:平衡输出,适合大多数场景
- `0.8-1.2`:更有创造性,适合创意写作
- `1.3-2.0`:非常随机和创造性
2. **自动 temperature 选择**
```toml
[[model]]
name = "glm-4.6"
auto_temperature = true # 由分析器自动决定
```
- 适用场景:希望根据用户问题类型动态调整
- 工作原理:分析器模型会根据问题特点推荐最佳 temperature
3. **使用默认值**
```toml
[[model]]
name = "deepseek-v3.2"
# 不设置任何 temperature 参数
```
- 默认行为:使用 1.4 作为 temperature
**优先级规则**:
- 如果设置了 `temperature`,则使用该固定值(忽略 `auto_temperature`)
- 如果只设置了 `auto_temperature = true`,则由分析器决定
- 如果两者都未设置,则使用默认值 1.4
**示例配置**:查看 `config-example.toml` 了解更多配置示例。
### 工作流配置(支持域名超时覆盖)
```toml
[workflow-integration]
analyzer_model = "glm-4.6" # 步骤1:分析器模型
worker_models = [ # 步骤2:工作模型列表
"qwen3-max",
"qwen3-vl-plus",
# ...
]
synthesizer_model = "glm-4.6" # 步骤3:综合器模型
# 旧配置(兼容):全局超时
[workflow.timeouts]
analyzer_timeout_secs = 30 # 分析器默认超时
worker_timeout_secs = 60 # 工作者默认超时
synthesizer_timeout_secs = 60 # 综合器默认超时
# 新配置:按域名覆盖(可选)
# 通过模型的 api_base URL 域名匹配覆盖部分或全部超时字段
[workflow.domains]
[workflow.domains."api.example.com"]
# 仅覆盖提供的字段,其他回落至全局 timeouts
analyzer_timeout_secs = 40
worker_timeout_secs = 80
[workflow.domains."app.example.com"]
# 支持部分覆盖
analyzer_timeout_secs = 20
synthesizer_timeout_secs = 30
```
生效规则:
- 从模型配置的 api_base 提取域名(例如 https://api.example.com/v1 → api.example.com)。
- 若存在对应域名覆盖,仅替换提供的字段;未提供的字段回落到 [workflow.timeouts]。
- 若无覆盖项或域名无法解析,则使用全局 [workflow.timeouts]。
## 📚 API 文档
### 1. 生成接口(Generate API)
类似于 Ollama 的 `/api/generate` 接口。
**请求**
```bash
curl -H 'Content-Type: application/json' \
http://localhost:11435/api/generate \
-d '{
"model": "chorus",
"prompt": "你好"
}'
```
**参数**
| 参数 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `model` | string | 否 | 模型名称(默认: "chorus") |
| `prompt` | string | 是 | 用户提示词 |
| `stream` | boolean | 否 | 是否流式返回(暂不支持) |
**响应(使用示例配置运行时会返回 mock 数据)**
```json
{
"model": "chorus",
"created_at": "2025-10-20T13:23:23.284964394+00:00",
"response": "mock reply",
"done": true
}
```
> 提示:使用真实 API Key 时,这里会返回实际模型的回答。
### 2. 聊天接口(Chat API)
类似于 Ollama 的 `/api/chat` 接口。
**请求**
```bash
curl -H 'Content-Type: application/json' \
http://localhost:11435/api/chat \
-d '{
"model": "chorus",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
```
**参数**
| 参数 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `model` | string | 否 | 模型名称 |
| `messages` | array | 是 | 消息历史数组 |
| `stream` | boolean | 否 | 是否流式返回 |
**响应(示例配置下的 mock 数据)**
```json
{
"model": "chorus",
"created_at": "2025-10-20T13:27:54.677058219+00:00",
"message": {
"role": "assistant",
"content": "mock reply"
},
"done": true
}
```
> 提示:使用真实 API Key 时,这里会返回实际模型的回答。
### 3. 列出模型(List Models)
**请求**
```bash
curl http://localhost:11435/api/tags
```
**响应**
```json
{
"models": [
{
"name": "qwen3-max",
"model": "qwen3-max",
"modified_at": "2024-01-15T10:30:00Z"
},
...
]
}
```
### 4. 健康检查
**请求**
```bash
curl http://localhost:11435/
```
**响应**
```json
{
"status": "ok",
"service": "Chorus",
"version": "0.1.0"
}
```
## 🔄 工作流程详解
### 步骤 1:智能分析
Chorus 首先使用 GLM-4.6 分析用户的提示词,判断问题类型并决定最适合的 temperature 参数:
- **创意性问题**(如写作、头脑风暴)→ 较高 temperature (1.0-1.5)
- **事实性问题**(如知识问答)→ 较低 temperature (0.3-0.7)
- **代码生成**(如编程任务)→ 低 temperature (0.1-0.5)
### 步骤 2:多模型协同
使用分析得出的 temperature,**按顺序**调用 7 个不同的模型:
1. **qwen3-max** - 阿里通义千问最新模型
2. **qwen3-vl-plus** - 支持视觉理解的多模态模型
3. **kimi-k2-0905** - Moonshot AI 的长文本模型
4. **glm-4.6** - 智谱 AI 的对话模型
5. **deepseek-v3.2** - DeepSeek 最新版本
6. **deepseek-v3.1** - DeepSeek 稳定版本
7. **deepseek-r1** - DeepSeek 推理优化版本
每个模型独立处理问题,如果某个模型失败,会继续执行其他模型。
### 步骤 3:智能综合
使用 GLM-4.6 综合所有模型的响应,生成最终答案:
- 提取各模型回答的优点
- 去除重复和冗余信息
- 整合成连贯、准确的答案
- 确保逻辑清晰、结构完整
## 🛠️ 开发指南
### 项目结构
```
Chorus/
├── Cargo.toml # 项目依赖配置
├── ~/.config/chorus/config.toml # 用户级服务配置文件(默认优先)
├── README.md # 项目文档
└── src/
├── main.rs # 程序入口
├── config.rs # 配置管理
├── server.rs # HTTP 服务器
├── llm.rs # LLM 客户端
└── workflow.rs # 工作流引擎
```
### 运行测试(含域名覆盖单元测试)
```bash
cargo test
# 关键测试位置:src/config_tests.rs(覆盖全局、完整域名覆盖、部分覆盖三种场景)
```
### 测试指南
- 单元测试
```bash
cargo test
```
- 启动与健康检查(先在 ~/.config/chorus/config.toml 配好 api_key)
```bash
RUST_LOG=info cargo run
curl http://localhost:11435/
```
- 端到端验证
```bash
curl -H 'Content-Type: application/json' \
http://localhost:11435/api/generate \
-d '{"model":"chorus","prompt":"hello"}'
curl -H 'Content-Type: application/json' \
http://localhost:11435/api/chat \
-d '{"model":"chorus","messages":[{"role":"user","content":"hi"}]}'
```
- 代码检查(可选)
```bash
cargo fmt -- --check
cargo clippy -D warnings
```
### 代码格式化
```bash
cargo fmt
```
### 代码检查
```bash
cargo clippy
```
### 启用调试日志
```bash
RUST_LOG=debug cargo run
```
## 📊 性能优化
### 生产环境建议
1. **使用 Release 模式编译**
```bash
cargo build --release
```
2. **调整超时时间**
根据实际网络情况调整 `~/.config/chorus/config.toml` 中的超时配置:
```toml
[workflow.timeouts]
analyzer_timeout_secs = 30
worker_timeout_secs = 120 # 如果网络较慢,可以增加
synthesizer_timeout_secs = 90
```
3. **日志级别**
生产环境建议使用 `info` 级别:
```bash
RUST_LOG=info ./target/release/chorus
```
## 🐛 故障排除
### 问题 1:API Key 无效
**错误信息**:`LLM API request failed with status 401`
**解决方案**:检查 `~/.config/chorus/config.toml` 中的 `api_key` 是否正确配置。
### 问题 2:超时错误
**错误信息**:`request timeout`
**解决方案**:增加 `~/.config/chorus/config.toml` 中的超时时间配置。
### 问题 3:端口被占用
**错误信息**:`Address already in use`
**解决方案**:修改 `~/.config/chorus/config.toml` 中的端口号,或停止占用 11435 端口的程序。
### 问题 4:所有工作模型失败
**错误信息**:`All worker models failed`
**解决方案**:
- 检查网络连接
- 确认 API Key 有足够的配额
- 查看详细日志 `RUST_LOG=debug cargo run`
## 🔒 安全建议
1. **保护 API Key**
- 不要将 API Key 提交到版本控制
- 使用环境变量存储敏感信息
2. **网络安全**
- 在生产环境中配置防火墙
- 考虑使用反向代理(如 Nginx)
3. **访问控制**
- 限制服务监听地址(默认 127.0.0.1 仅本地访问)
- 实现 API 认证机制(可扩展)
## 🗺️ 路线图
- [ ] 支持流式响应(SSE)
- [ ] 添加请求缓存机制
- [ ] 支持自定义工作流配置
- [ ] 添加 Prometheus 监控指标
- [ ] 实现负载均衡
- [ ] 支持更多 LLM 提供商
- [ ] Web UI 管理界面
- [ ] Docker 容器化
## 🤝 贡献
欢迎贡献代码!请遵循以下步骤:
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 🙏 致谢
- [Ollama](https://github.com/ollama/ollama) - API 设计灵感
- [iFlow](https://apis.iflow.cn/) - LLM API 提供商
- Rust 社区的所有贡献者
## 📧 联系方式
- 问题反馈:[GitHub Issues](https://github.com/yourusername/chorus/issues)
- 邮箱:your.email@example.com
---
**[⬆ 回到顶部](#chorus-)**
用 ❤️ 和 Rust 构建