写这个项目的时候, GenAI平台还是比较好的, 当时我也没申请API. 虽然GenAI平台实际上烂完了,但胜在免费,自己用用还是可以的. 后来申请了API, 只能说难兄难弟,没比公开的好用多少. 现在我已经不缺token了,所以维护这个repo的动力很低很低. 我建议大家玩一玩genai就够了, 最多是一些高通量的任务用一下, 除此之外别折腾了. 嫌贵可以去买那些中转服务, 一个平台可以用所有模型的那种,其实是挺好用的. 最近我看到大家对于这个项目还是挺热情的,所以参考其他人的工作补全了很多很多的功能. 当然距离一个“能用”的API还有距离, 当然这个距离我也无能为力了. 一想当GenAI刚出的时候我还是非常有信心的, Yu老师亲口说这个平台很吊, 但是我只能说烂完了(除了免费). 希望大家能利用AI改善自己的生活. 最后如果不出意外这个项目基本不会再更新了,如果有本科生小朋友愿意接手的话可以联系我(issue里直接提也可以). ciallo (∠·ω )⌒★
GenAI 是一个基于 Flask 的聊天机器人接口服务,兼容 OpenAI 的聊天完成接口,利用上海科技大学的 GenAI API 进行智能对话。项目通过封装 GenAI API,支持思维链、流式响应和普通响应,从而方便客户端集成与调用。该项目适合开发具有中文支持及本地化需求的智能聊天机器人应用。
OpenAI Compatible 功能对比
| 能力项 | OpenAI 官方接口 | 本项目实现情况 | 说明 |
|---|---|---|---|
POST /v1/chat/completions |
✅ 原生支持 | ✅ 已兼容 | 入参/出参保持 OpenAI 风格,转发至 GenAI 上游 |
POST /v1/responses |
✅ 原生支持 | ✅ 最小兼容 | 支持基础 input、流式与非流式输出 |
| 流式输出(SSE) | ✅ | ✅ | 支持 Chat Completions 与 Responses 两条链路 |
| 非流式输出 | ✅ | ✅ | 统一聚合上游增量后返回标准 JSON |
| 推理内容字段(reasoning) | 部分模型支持 | ✅ 兼容输出 | 通过 reasoning_content / response.reasoning.delta 暴露 |
Tool Calling(tools/tool_choice) |
✅ 原生 | ✅ 提示词兼容 | 上游无原生工具调用,本项目做 JSON 约定与本地解析 |
旧版函数调用(functions/function_call) |
已逐步废弃 | ✅ 兼容 | 自动转换为 tools/tool_choice 语义 |
| 图片输入(Vision) | ✅ | ✅(GPT 模型) | 服务端自动上传图片并注入 imageUrl/width/height |
模型列表接口(GET /v1/models) |
✅ | ✅ | 返回本项目映射后的可用模型列表 |
| 认证头兼容(Bearer/API Key) | ✅ | ✅ | 支持 Authorization、X-Access-Token、api-key 等 |
| 客户端 / Agent | 兼容性 |
|---|---|
| Chatbox | ✅ 完美支持 |
| Kilo Code | ❌ 不支持(模型限制) |
- Python 3.11 及以上版本
- 依赖包见
pyproject.toml,推荐使用 uv 管理环境。
uv run main.py [--token <token>] [--account <student_id@password>] [--upload-token <upload_token>] [--log-level INFO] [--port 5000]端口默认 5000。服务将在本地 0.0.0.0:5000 端口启动。
可选参数:
--token:若不在启动时提供,可由客户端在每次请求中通过Authorization: Bearer <token>或其他兼容 API key 请求头传递。--account:上海科技大学统一身份认证账号,格式为学号@密码。当未提供--token时,服务启动时会自动登录并获取 GenAI token。--upload-token:图片上传接口token请求头值(默认内置项目当前可用值)。--log-level:控制台日志级别,支持DEBUG / INFO / WARNING / ERROR / CRITICAL,默认INFO。
- 兼容 OpenAI API,支持
POST /v1/chat/completions、POST /v1/responses接口,实现智能聊天功能。 - 支持流式(stream)及非流式响应,方便高效地获取 AI 回复。
POST /v1/chat/completions支持基于提示词工程和 JSON 解析的 OpenAItools/tool_choice兼容工具调用,也兼容旧版functions/function_call入参。POST /v1/chat/completions支持图片输入(服务端自动上传到 GenAI 图片服务后再发起对话),当前仅 GPT 系列模型可用。- 提供
/v1/models接口列出可用模型,如deepseek-pro、deepseek-chat、gpt-5.5、glm-5.1等。 - 内置
/health健康检查接口,用于服务状态监测。
| 模型 id | 可用性 | 思维链 | 实测上下文长度 |
|---|---|---|---|
| deepseek-r1 | ✅ | ✅ | ~100k-128k tokens |
| deepseek-v3 | ✅ | ❌ | ≥200k tokens |
| glm-5.1 | ✅ | ❌ | ≥200k tokens |
| minimax-m1 | ✅ | ✅ | ≥200k tokens |
| qwen3.5-397b-a17b | ✅ | ✅ | <100k tokens |
| gpt-5.5 | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-5.4 | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-5.2 | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-5 | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-4.1 | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-4.1-mini | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-o4-mini | ✅ | 隐藏 | 未测试(额度限制) |
| gpt-o3 | ✅ | 隐藏 | 未测试(额度限制) |
| deepseek-pro | ✅ | 未知 | 未测试 |
| deepseek-chat | ✅ | 未知 | 未测试 |
兼容层同时兼容历史请求名和底层模型名,详见模型列表。
以上信息最后更新于 2026-04-29。
项目内置 context_length_tester skill,可用于测试模型的实际上下文处理能力:
# 大海捞针测试(推荐)
uv run tools/skills/context_length_tester/context_length_tester.py --model deepseek-v3
# 快速探测 API 上限
uv run tools/skills/context_length_tester/context_length_tester.py --model deepseek-v3 --mode probe测试方法采用大海捞针法(Needle in a Haystack):在长文本中间插入关键信息,验证模型能否准确检索。这比简单的二分查找更能反映模型的真实上下文处理能力。
注意:Azure GPT 模型有严格的额度限制,无法进行上下文长度测试。建议参考各模型的官方文档了解其标称上下文长度。
上游 GenAI API 没有原生 tool calling 能力。本项目在 Chat Completions 接口中通过系统提示词要求模型输出工具调用 JSON,并在本地解析为 OpenAI 兼容的 tool_calls:
{
"model": "gpt-5.5",
"messages": [{ "role": "user", "content": "上海今天适合带伞吗?" }],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string" }
},
"required": ["city"]
}
}
}
],
"tool_choice": "auto"
}如果模型决定调用工具,非流式响应会返回 finish_reason: "tool_calls" 和 message.tool_calls。流式请求也会返回兼容的 tool_calls chunk,但为了可靠解析 JSON,带工具的流式请求会先在服务端收集完整上游输出后再发送结果。
兼容性补充:
- 解析优先级为 JSON 优先;
- 同时兼容 XML 标签形式的工具调用块:
<tool_call>{"name":"...","arguments":{...}}</tool_call>; - 当模型输出多个
<tool_call>...</tool_call>块时,会按顺序解析为多个tool_calls。
/v1/chat/completions 支持 OpenAI 常见多模态消息格式:
type: "image_url"+image_url.url(可传公网图片 URL)type: "input_image"+image_url.url/url- 支持
data:image/...;base64,...的 data URL
服务端行为:
- 从最后一条包含图片的 user message 提取图片输入。
- 自动调用 GenAI 图片上传接口
https://genaipic.shanghaitech.edu.cn//sys/common/upload。 - 将返回的
imageUrl、width、height透传到上游对话请求。
限制:
- 图片能力仅对 GPT/Azure 路由模型开放(如
gpt-5.5、gpt-4.1)。 - 若对非 GPT 模型传图,请求会返回错误:
Image input is only available for GPT models。
示例:
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.5",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有什么?"},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/demo.jpg"
}
}
]
}
]
}'- 首先前往GenAI 对话平台
- 打开浏览器开发者工具,随便发送一条消息,捕获名为
chat的请求 - 复制请求标头中的
x-access-token字段,即为<token>
服务启动时可通过 --token <token> 设置默认 GenAI token;也可通过 --account <学号@密码> 在启动时自动登录获取 token。客户端也可以通过传统的 API key 传递 token,此时请求级 key 会覆盖启动参数中的默认 token,并作为上游 GenAI 的 X-Access-Token 使用。
支持的请求头:
Authorization: Bearer <token>(推荐,兼容 OpenAI SDK)X-Access-Token: <token>api-key: <token>X-API-Key: <token>
示例:
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v3","messages":[{"role":"user","content":"你好"}]}'对于图片功能, 需要捕获upload API, 提取请求 header 中的 token ,然后通过 --upload-token 传入.
- 欢迎 fork 并提交 PR,改进功能或修复 bug。
- 请遵守项目代码风格,代码中请添加必要注释。
- 贡献代码时建议附带测试,确保功能完整性。
- 遇到问题可通过 issue 反馈。
- 联系邮箱:arnoliu@shanghaitech.edu.cn
- 本项目采用 MIT 许可证,详见 LICENSE 文件。
