Skip to content

ShanghaitechGeekPie/GenAI2OpenAI

Repository files navigation

GenAI2OpenAI

写在前面

写这个项目的时候, 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) 支持 AuthorizationX-Access-Tokenapi-key

Agent Tool 生态测试

客户端 / 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/completionsPOST /v1/responses接口,实现智能聊天功能。
  • 支持流式(stream)及非流式响应,方便高效地获取 AI 回复。
  • POST /v1/chat/completions 支持基于提示词工程和 JSON 解析的 OpenAI tools/tool_choice 兼容工具调用,也兼容旧版 functions/function_call 入参。
  • POST /v1/chat/completions 支持图片输入(服务端自动上传到 GenAI 图片服务后再发起对话),当前仅 GPT 系列模型可用
  • 提供 /v1/models 接口列出可用模型,如 deepseek-prodeepseek-chatgpt-5.5glm-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

图片输入(仅 GPT 模型)

/v1/chat/completions 支持 OpenAI 常见多模态消息格式:

  • type: "image_url" + image_url.url(可传公网图片 URL)
  • type: "input_image" + image_url.url / url
  • 支持 data:image/...;base64,... 的 data URL

服务端行为:

  1. 从最后一条包含图片的 user message 提取图片输入。
  2. 自动调用 GenAI 图片上传接口 https://genaipic.shanghaitech.edu.cn//sys/common/upload
  3. 将返回的 imageUrlwidthheight 透传到上游对话请求。

限制:

  • 图片能力仅对 GPT/Azure 路由模型开放(如 gpt-5.5gpt-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"
            }
          }
        ]
      }
    ]
  }'

Token 获取

  1. 首先前往GenAI 对话平台
  2. 打开浏览器开发者工具,随便发送一条消息,捕获名为chat的请求
  3. 复制请求标头中的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 反馈。

联系方式与许可

About

将学校的GenAI服务转为openai兼容格式,以适配下游任务,免去正式申请APIkey

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages