# token meter
**Repository Path**: cxunmz/token-meter
## Basic Information
- **Project Name**: token meter
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-03-20
- **Last Updated**: 2026-04-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Token Meter
**一个智能、高效、易用的 AI 模型 API 代理调度工具**
Token Meter 是一个轻量级的 HTTP 代理服务器,专为多 AI 模型场景设计。它能够智能地将聊天完成请求分发到多个后端模型,提供灵活的调度策略、完善的统计功能和美观的管理界面,让你轻松管理和优化 AI API 的使用。

---
## 🎯 核心场景
Token Meter 能帮你解决什么问题?
- **💰 成本优化** - 你有多个免费/低价额度的 API,希望充分利用每个配额
- **🔄 负载均衡** - 避免单点故障,通过轮询机制分散请求压力
- **📊 统一入口** - 为不同平台的模型提供统一的 API 接口,简化客户端配置
- **📈 使用监控** - 实时追踪每个模型的调用次数和 Token 消耗,避免超额
- **⚡ 智能调度** - 根据模型质量(权重)自动选择最优服务,保障响应质量
- **🛡️ 容错重试** - 请求失败自动切换其他模型,提升服务可用性
无论你是个人开发者还是小团队,Token Meter 都能帮助你更高效、更经济地使用 AI 模型服务。
## ✨ 功能特性
- 🔄 **轮流模式** - 所有启用的模型按顺序轮流使用,均匀分配请求
- ⭐ **专一模式** - 始终使用 score 权重最高的启用模型,优先保障高质量
- 🥇 **高分轮流 A** - 分数最高的 2 个可用模型轮流调用,更集中
- 🏆 **高分轮流 B** - 分数最高的 3 个可用模型轮流调用,更均衡
- 📊 **调用统计** - 实时记录每个模型的调用次数和 Token 消耗(prompt/completion/total)
- 📈 **错误统计** - 记录每个模型的错误次数(非 200 状态码和异常)
- 🎯 **调用限制** - 支持按 **调用次数** 或 **Token 消耗** 设置每日上限
- 🔔 **上限触发词** - 当响应包含指定关键词时,自动设置次数上限为当前已用次数
- 🚀 **Web 管理后台** - 美观的管理界面,实时查看和切换模型状态、日志开关
- ✏️ **模型管理** - 支持在线添加、编辑、删除、复制模型配置,无需手动修改配置文件
- 🧪 **模型测试** - 内置模型测试功能,可直接在管理界面测试模型响应
- 🔐 **双重认证** - API 访问使用 `auth_keys`,管理后台使用独立的 `admin_key`
- 📝 **交互日志** - 可开关的日志功能,记录所有请求和响应的详细信息
- 📋 **平台管理** - 支持为模型添加平台标签(如 OpenRouter、SiliconFlow 等)
- 🔀 **多线程处理** - 使用 ThreadingHTTPServer,支持并发处理多个请求
- ⏱️ **耗时统计** - 自动记录并输出每次请求的响应时间
- 🛡️ **错误重试** - 请求失败自动重试 3 次,并将原始错误信息透传给客户端
- 🖥️ **后台模式** - 支持后台运行(`-d` 参数),日志始终保存到 `log.log`
- 🌐 **网络绑定** - 支持绑定到指定地址(`--host` 参数),允许外部访问
- 🔄 **防重复启动** - 自动检测端口占用,防止重复启动
## 📦 快速开始
### 环境要求
- Python 3.6+
- 无需额外依赖(仅使用标准库)
### 安装与运行
1. 克隆项目
```bash
git clone
cd token-meter
```
2. 编辑配置文件 `config.json`
3. 启动服务
```bash
# 前台运行(默认绑定 127.0.0.1)
python main_web.py
# 前台运行,允许外部访问
python main_web.py --host
# 后台运行(日志保存到 log.log)
python main_web.py -d
# 后台运行,允许外部访问
python main_web.py -d --host
# 停止后台服务
python main_web.py -s
```
**命令行参数说明:**
| 参数 | 说明 |
|------|------|
| `-d`, `--daemon` | 后台模式运行,日志保存到 `log.log` |
| `-s`, `--stop` | 停止后台服务 |
| `--host` | 绑定到 `0.0.0.0`(允许外部访问),默认绑定 `127.0.0.1` |

4. 访问管理后台
```
http://localhost:9999/admin
```
如果使用了 `--host` 参数,可通过本机 IP 访问:
```
http://<本机 IP>:9999/admin
```
## ⚙️ 配置说明
### config.json 结构
```json
{
"models": [
{
"name": "模型名称",
"platform": "平台名称(可选)",
"url": "API 端点 URL",
"key": "API 密钥",
"model": "模型标识",
"limit_count": 500,
"limit_token": 0,
"limit_trigger": "quota exceeded",
"score": 100,
"switchon": true
}
],
"listen_port": 9999,
"auth_keys": ["your-auth-token"],
"admin_key": "your-admin-password",
"model": "all",
"log_enabled": false,
"mode": "round"
}
```
### 客户端配置
启动服务后,将以下信息配置到你的 AI 客户端(如 OpenClaw):
- **url**: `http://<你的IP>:9999/v1`
- **key**: `cc-1234567890`(与 config.json 中的 auth_keys 一致)
- **model**: `all`


### 配置项说明
| 字段 | 说明 |
|------|------|
| `models` | 模型配置列表 |
| `name` | 模型自定义名称 |
| `platform` | 模型所属平台(可选,如 OpenRouter、SiliconFlow) |
| `url` | 模型 API 端点地址 |
| `key` | API 认证密钥 |
| `model` | 具体模型标识 |
| `limit_count` | 每日调用次数上限(可选,0 表示不限制) |
| `limit_token` | 每日 Token 消耗上限(可选,0 表示不限制) |
| `limit_trigger` | 上限触发词(可选),当响应包含此词时自动设置 limit_count 为当前已用次数 |
| `score` | 模型权重,用于专一模式/高分轮流模式排序 |
| `switchon` | 模型是否启用(true/false) |
| `listen_port` | 服务监听端口 |
| `auth_keys` | API 访问授权的 Bearer Token 列表(用于 /v1/* 接口) |
| `admin_key` | 管理后台登录密码(用于 /admin/* 接口) |
| `model` | 客户端请求的模型标识(通常为 "all") |
| `log_enabled` | 是否启用交互日志(true/false) |
| `mode` | 调度模式:"round"(轮流)、"priority"(专一)、"top2_round"(高分轮流 A)、"top3_round"(高分轮流 B) |
## 🎮 使用方式
### API 请求
将你的聊天请求发送到代理服务器:
```bash
curl -X POST http://localhost:9999/v1/chat/completions \
-H "Authorization: Bearer cc-1234567890" \
-H "Content-Type: application/json" \
-d '{
"model": "any-model",
"messages": [{"role": "user", "content": "Hello"}]
}'
```
### 管理 API

| 端点 | 方法 | 说明 |
|------|------|------|
| `/admin` | GET | 访问 Web 管理界面 |
| `/admin/status` | GET | 获取所有模型状态 |
| `/admin/models` | POST | 批量更新模型启用状态 |
| `/admin/model/{name}` | POST | 切换单个模型状态 |
| `/admin/model_config/{name}` | GET | 获取单个模型完整配置(含 API Key) |
| `/admin/add_model` | POST | 添加新模型 |
| `/admin/edit_model` | POST | 编辑现有模型 |
| `/admin/delete_model` | POST | 删除模型 |
| `/admin/mode` | POST | 切换调度模式 |
| `/admin/log` | POST | 切换交互日志开关 |
### Web 管理界面功能
- **模型列表** - 表格展示,显示所有模型的名称、平台、模型标识、权重、调用统计等信息
- **排序功能** - 点击表头可按名称、平台、权重、调用次数等字段排序
- **启用/禁用** - 通过切换开关快速启用或禁用模型
- **编辑模型** - 点击 ✏️ 按钮修改模型配置(名称、平台、URL、Key、权重等)
- **复制模型** - 编辑界面点击"复制模型"按钮可快速复制配置(自动添加 _copy1 后缀)
- **删除模型** - 点击 🗑️ 按钮删除模型(需二次确认)
- **添加模型** - 点击 ➕ 按钮添加新模型配置
- **刷新数据** - 点击 🔄 按钮手动刷新模型状态
- **模式切换** - 在轮流模式和专一模式之间切换
- **日志开关** - 控制是否记录交互日志
- **模型测试** - 点击 🧪 按钮打开测试窗口,可测试模型响应(流式输出)
## 📁 项目结构
```
token-meter/
├── main_web.py # 主程序入口
├── config.json # 配置文件(包含模型状态、模式、日志开关等)
├── interaction_log.jsonl # 交互日志(当 log_enabled 启用时)
├── log.log # 后台模式运行时的日志文件
├── src/ # 核心模块目录
│ ├── __init__.py # 包初始化
│ ├── config.py # 配置管理模块
│ ├── stats.py # 统计管理模块
│ ├── admin.py # 管理 API 处理模块
│ ├── admin.html # 管理界面 HTML 模板
│ └── handler.py # HTTP 请求处理模块
├── stats/ # 每日统计目录
│ └── stats_2026-03-21.json # 包含 count、prompt_tokens、completion_tokens、total_tokens
└── imgs/ # 文档图片目录
```
## 🔒 安全提示
1. **请勿提交真实 API 密钥** - 开源前请确保 `config.json` 中的敏感信息已移除
2. 建议将 `config.json` 添加到 `.gitignore`
3. 使用强密码作为 `auth_keys` 和 `admin_key`
4. `auth_keys` 用于 API 访问认证,`admin_key` 用于管理后台登录认证,两者独立
## 📊 统计文件说明
### 每日统计 (stats/stats_YYYY-MM-DD.json)
记录每个模型当日的调用统计:
```json
{
"Qwen3.5-27B": {
"count": 100,
"prompt_tokens": 5000,
"completion_tokens": 10000,
"total_tokens": 15000,
"error_count": 2,
"exception_count": 1
}
}
```
| 字段 | 说明 |
|------|------|
| `count` | 成功调用次数 |
| `prompt_tokens` | 累计输入 token 数 |
| `completion_tokens` | 累计输出 token 数 |
| `total_tokens` | 累计总 token 数 |
| `error_count` | 非 200 状态码错误次数 |
| `exception_count` | 请求异常次数 |
### 交互日志 (interaction_log.jsonl)
当 `log_enabled: true` 时,记录每次请求的详细信息(JSONL 格式)。
### 运行日志 (log.log)
服务运行日志,前台和后台模式均会保存。
## 📄 License
MIT License - 详见 [LICENSE](LICENSE) 文件
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
---
**Made with ❤️ for AI developers**