跳转至

OpenAI 兼容推理

Mint Recursive 提供一个与 OpenAI Completions API 兼容的 HTTP 端点,让你可以用任意 OpenAI SDK 或直接用 HTTP 从任意 checkpoint 采样——无论是基座模型还是你自己微调的 sampler。这是训练过程中快速试一个模型最便捷的方式。

训练过程中的推理(例如 RL rollout)请优先使用原生的 SamplingClient——它更快,并且提供 token 级别的控制。

Beta,低流量

该端点目前面向测试、评估和内部工具场景调优,不适合高吞吐生产流量。Beta 期间延迟和吞吐会随模型变化。如需更大或更稳定的吞吐,请联系 Mint Recursive 团队。

把 OpenAI 客户端指向 Mint Recursive

  1. Base URL —— 把 OpenAI 客户端的 base URL 设为 Mint Recursive 端点:
https://mintcn.macaron.xin/services/tinker-prod/oai/api/v1
  1. Model —— 把 Mint Recursive sampler checkpoint 路径(或基座模型名)作为 model 传入:
mindlab-toolkit://0034d8c9-0a88-52a9-b2b7-bce7cb1e6fef:train:0/sampler_weights/000080

任意合法 sampler 路径都可以,你也可以在同一个 checkpoint 上一边训练一边采样。

  1. Auth —— 用你的 MINT_API_KEY 作为 OpenAI API key。

/completions 和 /chat/completions 都支持:

  • /chat/completions —— chat 格式输入。你传入 messages,服务端套用模型的 chat template。指令微调 checkpoint 默认走这条路径。
  • /completions —— 纯文本续写,不套 chat template。通常用于基座(预训练)模型或 completion 式提示。
  • 需要用非默认 renderer?自己把 prompt 渲染成 token ID(见 Rendering),再用原生的 SamplingClient(ModelInput.from_ints(...))采样,它会用你给定的 token。

示例

from os import getenv
from openai import OpenAI

BASE_URL = "https://mintcn.macaron.xin/services/tinker-prod/oai/api/v1"
MODEL_PATH = "mindlab-toolkit://0034d8c9-0a88-52a9-b2b7-bce7cb1e6fef:train:0/sampler_weights/000080"

client = OpenAI(base_url=BASE_URL, api_key=getenv("MINT_API_KEY"))
response = client.completions.create(
    model=MODEL_PATH,
    prompt="The capital of France is",
    max_tokens=50,
    temperature=0.7,
    top_p=0.9,
)
print(response.choices[0].text)

prompt、max_tokens、temperature、top_p 的行为与 OpenAI API 一致。上面的 temperature/top_p 只是示例,不是推荐默认值。把 MODEL_PATH 换成任意其它 sampler,即可在评估或 notebook 中对比不同运行结果。

把推理过程与答案分开

对于推理模型,/chat/completions 接受一个非标准的 separate_reasoning 标志。设为 true(默认)时,服务端会把 chain-of-thought 从 content 中抽出,放到单独的 reasoning_content 字段返回:

response = client.chat.completions.create(
    model=MODEL_PATH,
    messages=[{"role": "user", "content": "What is 17 * 23?"}],
    extra_body={"separate_reasoning": True},
)
msg = response.choices[0].message
print("Reasoning:", msg.reasoning_content)
print("Answer:", msg.content)
  • 设 separate_reasoning=False 可把推理过程留在 content 里。
  • 仅在 /chat/completions 上有效。
  • 流式模式下,推理与答案作为两路独立的 SSE 事件流到达(先推理,后答案)。
  • 对没有可分离推理轨迹的模型无效果。

Thinking effort

支持该参数的模型,/chat/completions 接受 OpenAI 的 reasoning_effort 参数,用来控制模型在回答前思考多少。用 OpenAI 的字符串——"none"、"minimal"、"low"、"medium"、"high"、"xhigh"——或 [0.0, 0.99] 区间内的原始浮点数:

response = client.chat.completions.create(
    model=MODEL_PATH,
    messages=[{"role": "user", "content": "What is 17 * 23?"}],
    reasoning_effort="high",
)
# …or a fine-grained float:
response = client.chat.completions.create(
    model=MODEL_PATH,
    messages=[{"role": "user", "content": "What is 17 * 23?"}],
    extra_body={"reasoning_effort": 0.8},
)
  • 字符串在内部映射为固定浮点数:"none" → 0.0,"minimal" → 0.1,"low" → 0.2,"medium" → 0.7,"high" → 0.9,"xhigh" → 0.99。默认 0.9。
  • 并非所有模型都支持;不支持的模型返回 HTTP 400。
  • 仅在 /chat/completions 上有效。
  • 快速入门 —— 获取 MINT_API_KEY。
  • Rendering —— 非默认 chat template。
  • SamplingClient API —— 训练循环内的原生采样。