TextGen 本地 OpenAI/Anthropic 兼容 API 实战指南:启动、端点、工具调用与第三方客户端接入
TextGen(oobabooga text-generation-webui 的社区分支)内置了一套完全离线、隐私优先的 OpenAI/Anthropic 兼容 API 服务:在命令行加上 --api 后,它就在本机 5000 端口暴露 /v1/chat/completions、/v1/completions、/v1/messages(Anthropic Messages 协议)等端点,且不使用 openai-python 库、不产生日志、不连接任何 OpenAI 服务。读完本篇,你将掌握:如何通过命令行标志与环境变量启动并加固该 API;如何调用 Chat/Completions/流式/工具调用/多模态视觉/图像生成/Embeddings 等全部端点;以及如何让 openai-python、openai-node 等第三方应用把请求指向你的本地模型。
一、API 服务架构与启动方式
1.1 基本特性
该 API 的定位是 OpenAI 与 Anthropic API 的"drop-in 替代品",覆盖 Chat、Completions 与 Messages 三类端点。从 modules/api/script.py 的源码可以确认以下事实:
- 服务基于 FastAPI + uvicorn 构建,SSE 流式输出由
sse_starlette.EventSourceResponse实现(见 script.py#L11-L17); - 不依赖 openai-python 客户端库,所有协议层逻辑均在仓库内自行实现;
- 除显式开启外,服务默认只监听 localhost:
run_server()中,未加--listen时地址绑定为127.0.0.1(IPv6 为::1),并且中间件会严格校验Host头,非 localhost 请求直接返回 400(见 script.py#L149-L160); - CORS 策略同样遵循"默认收紧、显式放开":只有传入
--listen或--public-api时才允许*来源(见 script.py#L98-L110)。
启动入口在 server.py#L106-L109:当检测到 shared.args.api or shared.args.public_api 时调用 modules/api/script.py 中的 setup(),在无 Web UI 模式下直接前台运行,否则以守护线程启动。
1.2 命令行参数
在启动命令上追加 --api 即可启用 API。结合 modules/shared.py 中的参数定义(#L161-L168),完整可用标志如下:
| 参数 | 说明 |
|---|---|
--api |
启用 API 服务(action='store_true') |
--public-api |
通过 Cloudflare(cloudflared/flask_cloudflared)创建公网隧道 URL;可配合 --public-api-id 指定命名隧道的 Tunnel ID |
--listen |
使服务监听本地网络(同时可指定 --listen-port、--listen-host) |
--api-port |
API 监听端口,默认 5000 |
--api-key |
启用 Bearer Token 鉴权 |
--admin-key |
管理端点(模型加载/卸载、LoRA 操作)专用密钥;不设置时自动与 --api-key 相同(见 shared.py#L166 及 script.py#L594-L602) |
--ssl-keyfile / --ssl-certfile |
启用 HTTPS,分别为密钥文件与证书文件路径。注意:与 --public-api 不兼容,因为 Cloudflare 隧道本身已提供 HTTPS |
--api-enable-ipv6 / --api-disable-ipv4 |
控制 API 的 IPv6/IPv4 绑定 |
--parallel N |
llama.cpp 后端下的并发请求槽数(ExLlamaV3 默认即支持并行,见下文"并发请求"一节) |
--image-model |
启动时预加载指定图像模型,供 /v1/images/generations 使用 |
启动后的实际端口、SSL 证书均由 run_server() 解析:环境变量 OPENEDAI_PORT、OPENEDAI_CERT_PATH、OPENEDAI_KEY_PATH 会覆盖命令行值,且若目标端口被占用,find_available_port() 会自动寻找可用端口并打警告日志(script.py#L542-L555)。
1.3 API Key 鉴权
若以 --api-key yourkey 启动,所有 /v1/* 端点(除 Anthropic 端点外)都要求请求头 Authorization: Bearer yourkey,否则返回 401。实现见 verify_api_key()。Anthropic 的 /v1/messages 端点则使用 x-api-key 请求头,校验逻辑在 verify_anthropic_key()。
在 Python 客户端中的写法:
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer yourPassword123"
}
1.4 环境变量
以下环境变量优先级最高(覆盖命令行参数),名称以 script.py#L560-L563 与 embeddings.py#L23-L26 中的源码为准:
| 变量名 | 说明 | 示例值 |
|---|---|---|
OPENEDAI_PORT |
端口号 | 5000 |
OPENEDAI_CERT_PATH |
SSL 证书文件路径 | cert.pem |
OPENEDAI_KEY_PATH |
SSL 密钥文件路径 | key.pem |
OPENEDAI_DEBUG |
开启调试输出(设为 1) | 1 |
OPENEDAI_EMBEDDING_MODEL |
Embedding 模型(若适用) | sentence-transformers/all-mpnet-base-v2 |
OPENEDAI_EMBEDDING_DEVICE |
Embedding 设备(若适用) | cuda |
另外,run_server() 还支持 OPENEDAI_ENABLE_IPV6 与 OPENEDAI_DISABLE_IPV4 两个变量控制网络栈(script.py#L570-L573)。OPENEDAI_DEBUG=1 时,debug_msg() 会输出 embedding 维度等内部调试信息(utils.py#L25-L27)。
二、端点总览与请求模型
全部端点定义在 modules/api/script.py 中,请求/响应结构体由 Pydantic 模型在 modules/api/typing.py 中声明。由于使用了 FastAPI 自带文档,服务启动后可直接访问 http://127.0.0.1:5000/docs 查看交互式 API 文档(含参数类型)。官方 OpenAI 文档中的示例请求通常可以直接迁移过来,且本 API 支持更多的可选参数——GenerationOptions(typing.py#L10-L60)把 dynatemp_*、min_p、tfs、top_a、dry_*、sampler_priority、grammar_string 等一大批采样器参数全部暴露为请求字段。
端点兼容性对照表(源自文档 [docs/12 - OpenAI API.md](https://gitcode.com/GitHub_Trending/te/textgen/blob/79b46b80ec7ec98141c570dbc26f867fdfc39ead/docs/12 - OpenAI API.md?utm_source=gitcode_repo_files)):
| API 端点 | 说明 |
|---|---|
/v1/chat/completions |
适合指令跟随模型。支持流式、工具调用 |
/v1/completions |
文本补全端点 |
/v1/embeddings |
基于 SentenceTransformer 的 embedding |
/v1/images/generations |
图像生成,仅支持 response_format='b64_json' |
/v1/moderations |
基于 embeddings 的基础支持 |
/v1/models |
列出模型,当前已加载模型排在最前 |
/v1/models/{id} |
返回模型信息 |
/v1/audio/* |
已支持(transcriptions,基于 Whisper) |
/v1/images/edits |
尚未支持 |
/v1/images/variations |
尚未支持 |
此外仓库中还实现了若干"内部"端点(前缀 /v1/internal/):/health、/encode、/decode、/token-count、/chat-prompt(只返回渲染后的 prompt)、/stop-generation、/logits,以及管理类的 /model/list、/model/load、/model/unload、/lora/*。注意 /v1/internal/model/* 与 /v1/internal/lora/* 使用管理密钥(--admin-key)鉴权,见 script.py#L474-L539。
三、核心生成端点
3.1 Chat Completions
最适合指令跟随模型。若不传 instruction_template,会从模型元数据中自动检测;也可以通过 instruction_template(user_data/instruction-templates/ 下的模板名)或 instruction_template_str(原始 Jinja2 字符串,优先级最高)显式指定。模板解析顺序在 completions.py#L536-L545 中实现:instruction_template_str → instruction_template → 启动参数中的 chat_template_file → 全局设置。
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}'
ChatCompletionRequestParams(typing.py#L147-L190)还暴露了一些 OpenAI 之外的扩展字段,常用者包括:
mode:取值instruct(默认)、chat、chat-instruct;character/bot_name/context/greeting/user_name/user_bio:角色扮演相关,未设置character时默认使用 "Assistant" 角色(对应 user_data/characters/Assistant.yaml);chat_template_str:自定义聊天 Jinja2 模板;continue_:将历史中最后一条 bot 消息继续续写而非新开消息;max_completion_tokens:max_tokens的兼容别名(typing.py#L170-L173);model字段被接受但不生效——换模型请使用/v1/internal/model/load(typing.py#L149)。
3.2 Completions
curl http://127.0.0.1:5000/v1/completions \
-H "Content-Type": "application/json" \
-d '{
"prompt": "This is a cake recipe:\n\n1.",
"max_tokens": 512,
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}'
按 CompletionRequestParams 的定义:max_tokens 默认 512;prompt 与 messages 二者必须提供其一(多模态场景可用 messages 格式);echo、best_of、user 为兼容字段不生效。
一个值得注意的源码细节:流式 + n > 1 组合会被显式拒绝(返回 400 "n > 1 is not supported with streaming"),见 script.py#L173-L178。
3.3 SSE 流式输出
在请求体中加 "stream": true 即可,响应为 text/event-stream,每个事件 data 是 JSON chunk,最后以 [DONE] 结束(见 script.py#L221-L239)。服务端每轮 chunk 都会检查客户端是否断开连接,断开即中止生成并置位 stop_event。
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Content-Type": "application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20,
"stream": true
}'
3.4 工具/函数调用(Tool/Function Calling)
需要选用支持工具调用的模型(Qwen、Mistral、GPT-OSS 等)。工具通过 tools 参数传入,prompt 由模型自带的 Jinja2 模板自动格式化(ToolDefinition/ToolCall 结构见 typing.py#L63-L100)。tool_choice 支持 'auto'、'none'、'required' 或指定函数对象。
当模型决定调用工具时,响应中 finish_reason 为 "tool_calls",并附带结构化 tool_calls 数组(含函数名与 JSON 字符串形式的 arguments)——该逻辑由 completions.py#L657-L730 实现:检测到 tool_calls 后会提前停止生成并把 stop_reason 置为 "tool_calls"。你随后执行工具,把结果作为 role: "tool" 消息(带 tool_call_id)回传,直到模型以 finish_reason: "stop" 给出最终答案。部分模型(Qwen、Mistral)支持一轮并行调用多个工具,GPT-OSS 则一次只调一个,下面的循环两种风格都能处理:
import json
import requests
url = "http://127.0.0.1:5000/v1/chat/completions"
# Define your tools
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a given location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"},
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "get_time",
"description": "Get the current time in a given timezone",
"parameters": {
"type": "object",
"properties": {
"timezone": {"type": "string", "description": "IANA timezone string"},
},
"required": ["timezone"]
}
}
},
]
def execute_tool(name, arguments):
"""Replace this with your actual tool implementations."""
if name == "get_weather":
return {"temperature": 22, "condition": "sunny", "humidity": 45}
elif name == "get_time":
return {"time": "2:30 PM", "timezone": "JST"}
return {"error": f"Unknown tool: {name}"}
messages = [{"role": "user", "content": "What time is it in Tokyo and what's the weather like there?"}]
# Tool-calling loop: keep going until the model gives a final answer
for _ in range(10):
response = requests.post(url, json={"messages": messages, "tools": tools}).json()
choice = response["choices"][0]
if choice["finish_reason"] == "tool_calls":
# Add the assistant's response (with tool_calls) to history
messages.append({
"role": "assistant",
"content": choice["message"]["content"],
"tool_calls": choice["message"]["tool_calls"],
})
# Execute each tool and add results to history
for tool_call in choice["message"]["tool_calls"]:
name = tool_call["function"]["name"]
arguments = json.loads(tool_call["function"]["arguments"])
result = execute_tool(name, arguments)
print(f"Tool call: {name}({arguments}) => {result}")
messages.append({
"role": "tool",
"tool_call_id": tool_call["id"],
"content": json.dumps(result),
})
else:
# Final answer
print(f"\nAssistant: {choice['message']['content']}")
break
源码侧还可以确认:带 tool_calls 的 assistant 消息允许 content 为 null(completions.py#L505-L506),与 OpenAI 官方行为一致。
3.5 多模态/视觉(llama.cpp 与 ExLlamaV3)
方式一:/v1/chat/completions(推荐)
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Content-Type": "application/json" \
-d '{
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Please describe what you see in this image."},
{"type": "image_url", "image_url": {"url": "https://your-host/images/cat.png"}}
]
}
],
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}'
方式二:/v1/completions——同样可用 messages 数组替代 prompt,文本中用 <__media__> 占位符对应图片顺序:
curl http://127.0.0.1:5000/v1/completions \
-H "Content-Type": "application/json" \
-d '{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "About image <__media__> and image <__media__>, what I can say is that the first one"
},
{
"type": "image_url",
"image_url": {
"url": "https://your-host/images/cat.png"
}
},
{
"type": "image_url",
"image_url": {
"url": "https://your-host/images/strawberry.png"
}
}
]
}
],
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}'
两种方式的 image_url.url 都可以换成 base64 内联格式:data:image/FORMAT;base64,BASE64_STRING,其中 FORMAT 是文件类型(png、jpeg、gif 等)。
3.6 带角色设定的 Chat Completions
curl http://127.0.0.1:5000/v1/chat/completions \
-H "Content-Type": "application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "Hello! Who are you?"
}
],
"mode": "chat-instruct",
"character": "Example",
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}'
character 对应 user_data/characters/ 下的 YAML 角色定义(如 Example.yaml),mode 取 instruct/chat/chat-instruct 三种。
四、模型管理与内部端点
4.1 列出模型
curl -k http://127.0.0.1:5000/v1/internal/model/list \
-H "Content-Type": "application/json"
4.2 加载模型
args 字段用于在加载前临时覆盖 loader 参数,加载之间会自动复位到启动默认值,不会互相污染:
curl -k http://127.0.0.1:5000/v1/internal/model/load \
-H "Content-Type": "application/json" \
-d '{
"model_name": "Qwen_Qwen3-0.6B-Q4_K_M.gguf",
"args": {
"ctx_size": 32768,
"cache_type": "q8_0"
}
}'
文档的 handle_load_model 说明中给出的另一个例子:"args": {"load_in_4bit": true, "n_gpu_layers": 12}。
此外,可以在加载时为该模型设定默认指令模板:传 instruction_template(user_data/instruction-templates/ 下的模板名,如 Alpaca、ChatML、Llama-v3、Vicuna-v1.1)或 instruction_template_str(原始 Jinja2 字符串,优先级更高),作用于之后所有 API 请求:
curl -k http://127.0.0.1:5000/v1/internal/model/load \
-H "Content-Type": "application/json" \
-d '{
"model_name": "Qwen_Qwen3-0.6B-Q4_K_M.gguf",
"instruction_template": "Alpaca"
}'
4.3 Logits 端点
/v1/internal/logits 返回 prompt 下一个位置最可能 top 50 的 token 概率分布(LogitsRequestParams,top_logits 默认 50)。use_samplers: false 时返回原始 logits,true 时先经过采样器链处理——这对调试采样参数影响很有用:
# 原始 logits
curl -k http://127.0.0.1:5000/v1/internal/logits \
-H "Content-Type": "application/json" \
-d '{
"prompt": "Who is best, Asuka or Rei? Answer:",
"use_samplers": false
}'
# 经过采样参数处理后的 logits
curl -k http://127.0.0.1:5000/v1/internal/logits \
-H "Content-Type": "application/json" \
-d '{
"prompt": "Who is best, Asuka or Rei? Answer:",
"use_samplers": true,
"top_k": 3
}'
五、图像生成端点
curl http://127.0.0.1:5000/v1/images/generations \
-H "Content-Type": "application/json" \
-d '{
"prompt": "an orange tree",
"steps": 9,
"cfg_scale": 0,
"batch_size": 1,
"batch_count": 1
}'
前提是先加载图像模型:可通过 UI 完成,或启动时加 --image-model your_model_name。源码层面,modules/api/images.py 在未加载图像模型时会抛出 503("No image model loaded");请求模型 ImageGenerationRequest 的默认值为 size="1024x1024"、steps=9、cfg_scale=0.0、image_seed=-1(随机)、n 是 batch_size 的 OpenAI 兼容别名。响应中 data 数组的每个元素含 base64 编码的 PNG(b64_json 字段),且 PNG 会内嵌 image_gen_settings 元数据:
{
"created": 1764791227,
"data": [
{
"b64_json": "iVBORw0KGgo..."
}
]
}
六、第三方应用接入
几乎所有依赖 OpenAI API 的应用,都可以通过以下环境变量把请求指到本地 API:
OPENAI_API_HOST=http://127.0.0.1:5000
或
OPENAI_API_KEY=sk-111111111111111111111111111111111111111111111111
OPENAI_API_BASE=http://127.0.0.1:5000/v1
官方 Python openai 客户端(v1.x)——直接设置 base_url:
from openai import OpenAI
client = OpenAI(
api_key="sk-111111111111111111111111111111111111111111111111",
base_url="http://127.0.0.1:5000/v1"
)
response = client.chat.completions.create(
model="x",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
官方 Node.js openai 客户端(v4.x):
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: "http://127.0.0.1:5000/v1",
});
const response = await client.chat.completions.create({
model: "x",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);
应用兼容性一览(源自文档;✅❌ 表示仅部分端点可用):
| 兼容性 | 应用/库 | 接入方式与备注 |
|---|---|---|
| ✅❌ | openai-python | OpenAI(base_url="http://127.0.0.1:5000/v1"),仅上表中的端点可用 |
| ✅❌ | openai-node | new OpenAI({baseURL: "http://127.0.0.1:5000/v1"}),见上方示例 |
| ✅ | anse | API Key 与 URL 可在 UI 中配置,图像也可用 |
| ✅ | shell_gpt | OPENAI_API_HOST=http://127.0.0.1:5000 |
| ✅ | gpt-shell | OPENAI_API_BASE=http://127.0.0.1:5000/v1 |
| ✅ | gpt-discord-bot | OPENAI_API_BASE=http://127.0.0.1:5000/v1 |
| ✅ | OpenAI for Notepad++ | 配置文件中 api_url=http://127.0.0.1:5000,或环境变量 |
| ✅ | vscode-openai | OPENAI_API_BASE=http://127.0.0.1:5000/v1 |
| ✅❌ | langchain | base_url="http://127.0.0.1:5000/v1",效果取决于所选模型与 prompt 格式 |
七、Embeddings(alpha)
/v1/embeddings 依赖 sentence-transformers 库,但即使未安装它,chat 与 completions 功能也完全正常。实现见 modules/api/embeddings.py:
- 默认模型为
sentence-transformers/all-mpnet-base-v2(768 维,最大 384 token),懒加载——首次调用 embedding 时才真正加载(embeddings.py#L56-L62); - 可通过
OPENEDAI_EMBEDDING_MODEL/OPENEDAI_EMBEDDING_DEVICE环境变量更换模型与设备(设备支持 auto/cpu/cuda 等,auto时交给框架自动选择); - 支持
encoding_format为float或base64(base64 是 float32 原始字节的编码,见 utils.py#L10-L22),输出向量经过归一化; - 加载失败会返回 503
ServiceUnavailableError,而不会拖垮整个 API 进程。
候选模型对比(数据引自文档,源自 sbert 官方模型页):
| 模型 | 维度 | 最大输入 token | 速度 | 大小 | 平均性能 |
|---|---|---|---|---|---|
| all-mpnet-base-v2 | 768 | 384 | 2800 | 420M | 63.3 |
| all-MiniLM-L6-v2 | 384 | 256 | 14200 | 80M | 58.8 |
all-MiniLM-L6-v2 快约 5 倍、内存约 5 倍、体积约 2 倍更小且质量仍然不错,切换方式:
OPENEDAI_EMBEDDING_MODEL=all-MiniLM-L6-v2
警告:即使维度相同,不同模型产生的 embedding 也不可比对,切勿混用。
八、Python 客户端示例
8.1 基础多轮对话
import requests
url = "http://127.0.0.1:5000/v1/chat/completions"
headers = {
"Content-Type": "application/json"
}
history = []
while True:
user_message = input("> ")
history.append({"role": "user", "content": user_message})
data = {
"messages": history,
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}
response = requests.post(url, headers=headers, json=data, verify=False)
assistant_message = response.json()['choices'][0]['message']['content']
history.append({"role": "assistant", "content": assistant_message})
print(assistant_message)
启用 API Key 时,把 headers 替换为:
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer yourPassword123"
}
8.2 流式 Chat(SSE)
用 python -u 启动脚本可实时看到输出:
import requests
import sseclient # pip install sseclient-py
import json
url = "http://127.0.0.1:5000/v1/chat/completions"
headers = {
"Content-Type": "application/json"
}
history = []
while True:
user_message = input("> ")
history.append({"role": "user", "content": user_message})
data = {
"stream": True,
"messages": history,
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20
}
stream_response = requests.post(url, headers=headers, json=data, verify=False, stream=True)
client = sseclient.SSEClient(stream_response)
assistant_message = ''
for event in client.events():
payload = json.loads(event.data)
chunk = payload['choices'][0]['delta']['content']
assistant_message += chunk
print(chunk, end='')
print()
history.append({"role": "assistant", "content": assistant_message})
8.3 流式 Completions
import json
import requests
import sseclient # pip install sseclient-py
url = "http://127.0.0.1:5000/v1/completions"
headers = {
"Content-Type": "application/json"
}
data = {
"prompt": "This is a cake recipe:\n\n1.",
"max_tokens": 512,
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20,
"stream": True,
}
stream_response = requests.post(url, headers=headers, json=data, verify=False, stream=True)
client = sseclient.SSEClient(stream_response)
print(data['prompt'], end='')
for event in client.events():
payload = json.loads(event.data)
print(payload['choices'][0]['text'], end='')
print()
8.4 并发请求
API 支持并行处理多个请求:ExLlamaV3 后端开箱即用;llama.cpp 需要传 --parallel N 设置并发槽数(注意上下文大小会在各槽间平均分配,例如要 4 个槽、每槽 8192 上下文,应把 ctx_size 设为 32768,见 shared.py#L111)。
import concurrent.futures
import requests
url = "http://127.0.0.1:5000/v1/chat/completions"
prompts = [
"Write a haiku about the ocean.",
"Explain quantum computing in simple terms.",
"Tell me a joke about programmers.",
]
def send_request(prompt):
response = requests.post(url, json={
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 200,
})
return response.json()["choices"][0]["message"]["content"]
with concurrent.futures.ThreadPoolExecutor() as executor:
results = list(executor.map(send_request, prompts))
for prompt, result in zip(prompts, results):
print(f"Q: {prompt}\nA: {result}\n")
九、小结与深入阅读的源码入口
这套 API 的设计原则在源码中一目了然:默认安全(仅 localhost + 严格 Host 校验)、协议兼容(OpenAI 与 Anthropic 双协议,错误格式也分别模仿各自风格,见 script.py#L113-L146)、功能外延(角色、LoRA、logits、工具调用等 OpenAI 之外的能力通过 /v1/internal/* 与请求体扩展字段提供)。建议按以下路径继续深入:
- modules/api/script.py:全部路由注册、鉴权依赖、CORS 与 Host 校验、
run_server()启动逻辑; - modules/api/typing.py:所有请求/响应 Pydantic 模型,即
http://127.0.0.1:5000/docs交互文档的权威来源; - modules/api/completions.py:chat/completions 主实现,含指令模板解析与 tool_calls 流式处理;
- modules/api/embeddings.py 与 modules/api/images.py:embeddings 懒加载与图像生成响应构建;
- [docs/12 - OpenAI API.md](https://gitcode.com/GitHub_Trending/te/textgen/blob/79b46b80ec7ec98141c570dbc26f867fdfc39ead/docs/12 - OpenAI API.md?utm_source=gitcode_repo_files):本文所基于的官方文档原件,含全部端点示例。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00