首页
/ TextGen 本地 OpenAI/Anthropic 兼容 API 实战指南:启动、端点、工具调用与第三方客户端接入

TextGen 本地 OpenAI/Anthropic 兼容 API 实战指南:启动、端点、工具调用与第三方客户端接入

2026-09-05 14:36:35作者:胡易黎Nicole

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 客户端库,所有协议层逻辑均在仓库内自行实现;
  • 除显式开启外,服务默认只监听 localhostrun_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#L166script.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_PORTOPENEDAI_CERT_PATHOPENEDAI_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-L563embeddings.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_IPV6OPENEDAI_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 支持更多的可选参数——GenerationOptionstyping.py#L10-L60)把 dynatemp_*min_ptfstop_adry_*sampler_prioritygrammar_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_templateuser_data/instruction-templates/ 下的模板名)或 instruction_template_str(原始 Jinja2 字符串,优先级最高)显式指定。模板解析顺序在 completions.py#L536-L545 中实现:instruction_template_strinstruction_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
  }'

ChatCompletionRequestParamstyping.py#L147-L190)还暴露了一些 OpenAI 之外的扩展字段,常用者包括:

  • mode:取值 instruct(默认)、chatchat-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_tokensmax_tokens 的兼容别名(typing.py#L170-L173);
  • model 字段被接受但不生效——换模型请使用 /v1/internal/model/loadtyping.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;promptmessages 二者必须提供其一(多模态场景可用 messages 格式);echobest_ofuser 为兼容字段不生效。

一个值得注意的源码细节:流式 + 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 消息允许 contentnullcompletions.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),modeinstruct/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_templateuser_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 概率分布(LogitsRequestParamstop_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=9cfg_scale=0.0image_seed=-1(随机)、nbatch_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_formatfloatbase64(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.pymodules/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):本文所基于的官方文档原件,含全部端点示例。
登录后查看全文
热门项目推荐
相关项目推荐