/v1/chat/completions支持对话交互、工具调用、结构化 JSON 输出与流式响应,可直接搭配各类官方 SDK 使用。
通过可直接运行的示例快速发起请求,并根据实际业务场景选择最佳接入方案。
export INFERWAY_API_KEY="inferway_live_..." curl 'https://api.inferway.ai/v1/chat/completions' \ -H "Authorization: Bearer $INFERWAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "inferway/qwen3.8-27b", "stream": true, "messages": [ { "role": "user", "content": "Say hello in one short sentence." } ] }'
curl 'https://api.inferway.ai/v1/chat/completions' \
-H "Authorization: Bearer $INFERWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "inferway/qwen3.8-27b",
"stream": true,
"messages": [
{
"role": "user",
"content": "Say hello in one short sentence."
}
]
}'非流式请求经由 CDN 网关代理,首字节存在约 100 秒超时限制,长文本生成建议设置 stream=true;短文本补全使用非流式请求完全不受影响。IDE/智能体客户端可以在内部自行选择非流式,而无需暴露任何设置项:Inferway 会将此类请求的候选输出总量上限设为 4,096 token,并通过 X-Inferway-Max-Tokens-Applied 与 X-Inferway-Max-Tokens-Reason 响应头报告实际应用的单候选上限;客户端支持流式时,更长的输出仍建议使用流式。
https://api.inferway.ai/v1$INFERWAY_API_KEYinferway/qwen3.8-27bdata: {
"id": "chatcmpl_...",
"object": "chat.completion.chunk",
"model": "inferway/qwen3.8-27b",
"choices": [
{
"index": 0,
"delta": { "role": "assistant", "content": "Hello" },
"finish_reason": null
}
]
}
data: [DONE]绝大多数初次调用异常通常源自环境或参数配置,在修改业务代码前请先核对以下常见问题。
| 异常现象 | 可能原因 | 排查与修复建议 |
|---|---|---|
| 401 | API Key 缺失、已被吊销、输入有误,或未在当前终端会话中正确 export。 | 前往 控制台 → API 密钥里重新复制一份,重试前先执行 echo $INFERWAY_API_KEY 确认。 |
| 404 | 客户端指向了错误的 Base URL,或把 /v1 拼了两次。 | Base URL 用 https://api.inferway.ai/v1,请求路径 /chat/completions 只写一次。 |
| 429 | 触发了账户额度、匿名试玩限额,或单次请求大小限制。 | 查看错误中的 dimension。单次大小超限请缩短输入或调低 max_tokens;其他限额按响应中的 Retry-After 等待。 |
| 504 / 超时 | 非流式请求的长文本生成耗时超出了 CDN 网关约 100 秒的首字节超时限制。 | 在请求参数中设置 stream=true。 |
# For OpenAI-compatible clients that read OpenAI env vars export OPENAI_API_KEY="$INFERWAY_API_KEY" export OPENAI_BASE_URL='https://api.inferway.ai/v1' export INFERWAY_MODEL='inferway/qwen3.8-27b'
当前服务的模型默认不输出推理(thinking)token,需在请求中显式开启。
思考过程 Token 按照输出 Token 标准价格计费,可在 usage.completion_tokens_details.reasoning_tokens 中查看详细用量。
可在单次请求中通过 chat_template_kwargs.enable_thinking=true(OpenAI SDK 通过 extra_body 传递)或 reasoning: {"enabled": true} 显式开启。
官方 OpenAI Python SDK 原生支持任何兼容接口。仅需替换 base_url 与 API Key 即可。非流式请求适用于短文本生成;长文本任务建议使用流式传输。
import os from openai import OpenAI client = OpenAI( base_url="https://api.inferway.ai/v1", api_key=os.environ["INFERWAY_API_KEY"], ) resp = client.chat.completions.create( model="inferway/qwen3.8-27b", messages=[{"role": "user", "content": "Say hello in one short sentence."}], max_tokens=64, ) print(resp.choices[0].message.content)
选择工具,查看接入方式与功能限制。配置会跟随页面顶部选择的模型。
初次运行 cURL 命令无需安装任何依赖;当您准备将调用正式集成到项目中时,再安装对应语言的官方 SDK。
# Python pip install openai # TypeScript / Node.js npm install openai
将 Inferway 添加为 OpenCode 的自定义服务商。接入前,请确认账户已开通模型访问。
上下文 262,144 最大输出 131,072
已在 2026-09-19 于 macOS 26.6.2 arm64(版本 1.18.25)验证:基础对话与文件读取工具往返(模型 inferway/qwen3.8-27b)。
将以下内容保存为临时文件夹根目录的 opencode.json。服务商部分以公开模型 ID 作为模型键,组合模型选择器为 provider/model。{env:INFERWAY_API_KEY} 引用之前设置的变量,Key 本身不写入文件。1024 输出上限是实测验证预设;更大的上限未在此验证。
先在启动客户端的终端中设置 INFERWAY_API_KEY。不要把密钥直接写进配置。
{
"$schema": "https://opencode.ai/config.json",
"model": "inferway/inferway/qwen3.8-27b",
"provider": {
"inferway": {
"npm": "@ai-sdk/openai-compatible",
"name": "Inferway",
"options": {
"baseURL": "https://api.inferway.ai/v1",
"apiKey": "{env:INFERWAY_API_KEY}"
},
"models": {
"inferway/qwen3.8-27b": {
"name": "Inferway",
"limit": {
"context": 262144,
"output": 1024
}
}
}
}
}
}opencode run --pure --format json --title 'Inferway basic check' --model 'inferway/inferway/qwen3.8-27b' --agent build --dir . 'Reply with exactly: connected'
opencode run --pure --format json --title 'Inferway read fixture' --model 'inferway/inferway/qwen3.8-27b' --agent build --dir . 'Read the file read-tool-fixture.txt and reply with exactly the nonce it contains, nothing else.'
先按官方说明安装客户端。本文的 Pi 指 pi-mono coding agent;Hermes 指 Nous Research 的 Hermes Agent。
Inferway 账户激活后,从控制台 → API keys 获取 Key。建议为该客户端使用独立 Key,并确认允许的模型和消费上限。live、test 前缀共用推理与计费流程;test 是环境标签,不代表免费或模拟推理。
Inferway 地址需要 Inferway Key;OpenRouter Key 用于 OpenRouter,不能直接用于此地址。
将 Key 保存在客户端凭证存储或本机环境中,不要粘贴到提示词、截图或提交到仓库的配置文件。终端示例适用于 macOS / Linux 的 bash、zsh。
下面的交互输入会隐藏 Key,并避免将其写入命令历史。请从同一个终端启动客户端;另外打开的应用可能无法继承该变量。
printf 'Inferway API key: ' IFS= read -r -s INFERWAY_API_KEY printf '\n' export INFERWAY_API_KEY
使用完整模型 ID inferway/qwen3.8-27b。Base URL 只包含一次 /v1,不要在 Base URL 设置中添加 /chat/completions。确认下方响应中包含该模型 ID。
curl --fail-with-body --silent --show-error --max-time 30 \ 'https://api.inferway.ai/v1/models' \ -H "Authorization: Bearer $INFERWAY_API_KEY"
OpenCode 可以从项目根目录加载项目配置(项目配置与自定义路径见 OpenCode 配置文档)。请在一个临时文件夹中操作,避免测试影响你的日常设置或全局服务商列表。
已接受的实测在 macOS 26.6.2 arm64 上使用 OpenCode CLI 针对下方目录模型进行;操作前请核对自己安装的版本。git init 只为让 OpenCode 有一个干净的项目根目录;检查本身不需要提交。
# Scratch folder with a small read fixture mkdir inferway-opencode-verify && cd inferway-opencode-verify && git init -q printf 'nonce-7f3a9c\n' > read-tool-fixture.txt
检查通过后,把 provider 块(及其下的模型项)复制到你现有的 OpenCode 配置中,保留你自己的设置。日常使用不需要临时文件夹或测试夹具。
实际用量由 Inferway 记录:打开控制台 → Requests 查看每次请求的状态与 token 用量,在控制台 → 用量查看汇总。客户端本地显示的数字只是其自身估算,不是计费金额;请以控制台为准。
认证失败:检查 Key 是否存在、有效且获准使用该模型,并从设置变量的终端重新打开客户端。排错时不要输出完整 Key。
地址或模型错误:检查是否重复添加 /v1,使用公布的完整模型 ID,并确认客户端选择 Chat Completions。请求发往 /responses 或 /completions 时,换 Key 无法解决。
额度或超时:检查钱包余额和 Key 限额,按 Retry-After 等待,并缩短输入或降低输出上限。长输出保持流式传输,排错期间避免 Agent 连续重试。
联系支持时提供客户端版本、模型 ID、请求时间和可用的 request ID;请遮盖凭证和源码。
撤销接入:在控制台吊销此工具的 Key,并移除客户端中的 Inferway 服务商配置。
独立指南MCP 端点现已开放。将支持 MCP 规范的客户端配置至下方服务地址,并使用同一把 API Key 进行鉴权即可;工具调用遵循官方标准协议,零数据留存承诺同样适用。
无可用余额的账户会自动走免费档,而不是收到 402 错误——与 REST API 相同的免费档(60 次/分钟)。注册用户的待遇绝不会低于匿名访客。
{
"mcpServers": {
"inferway": {
"url": "https://api.inferway.ai/v1/mcp/sse",
"headers": {
"Authorization": "Bearer $INFERWAY_API_KEY"
}
}
}
}在将业务流量接入 Inferway 前,欢迎查阅透明度中心、服务状态页以及原始基准性能报告。
OpenAI 兼容路径保持精简与高确定性;账户、财务账单、用量统计及 Agent 相关操作则通过一组独立的第一方端点提供。
/v1/chat/completions支持对话交互、工具调用、结构化 JSON 输出与流式响应,可直接搭配各类官方 SDK 使用。
/v1/interactions用于视频生成:提交一次即持久化的后台任务,随后轮询直至成片可取回。
/v1/keys · /v1/billing · /v1/usage · /v1/requests用于服务端的 API 密钥管理、余额与账单查询、用量统计及请求元数据审计。
| 端点路径 | 请求方法 | 功能说明 |
|---|---|---|
| /v1/chat/completions | POST | OpenAI 兼容的对话补全接口 |
| /v1/interactions | POST | 异步视频生成任务(同一路由下的四种操作) |
| /v1/models | GET | 获取已发布模型列表及能力、价格元数据 |
| /v1/mcp/sse · /v1/mcp/messages | GET · POST | MCP 服务协议接入端点(已上线) |
| /v1/keys | GET / POST / DELETE | 管理直连 API 密钥 |
| /v1/billing | GET | 钱包余额与近期用量统计 |
| /v1/billing/transactions | GET | 钱包充值与消费交易明细 |
| /v1/billing/checkout | POST | 创建在线充值收银台会话 |
| /v1/usage | GET | 按时间聚合的 Token 用量统计 |
| /v1/requests | GET | 请求元数据历史明细(不含交互正文) |
| /health | GET | 网关与核心后端健康检查 |
| /v1/stats | GET | 服务状态页公开监控数据 |
视频生成不会在请求内直接返回成片。所有调用都发往 POST /v1/interactions,并在请求体的 op 字段中指明操作;任务本身持久化,连接中断不会丢失已扣费的工作。
| op 取值 | 功能说明 |
|---|---|
| prepare_upload | 申请一份短时效、带体积上限的输入媒体上传凭证。 |
| create | 提交生成意图并获得 interaction ID。按下单时长一次性计费。 |
| get | 读取持久化状态与当前阶段;成片交付落定后,返回结果及其下载地址。 |
| cancel | 尽力而为地取消排队中或执行中的任务。 |
公开支持的端点是 POST /v1/chat/completions、POST /v1/interactions 和 GET /v1/models。旧版 POST /v1/completions 不提供:它返回 501(未实现),并在错误信息里指明应改用的 chat completions 路由。POST /v1/messages(Anthropic 格式)已在本部署提供,但尚未对 API key 开放:在另行通知前,即使配置正确也会被权限错误拒绝。
选择模型,查看其已发布的能力事实。API 示例和工具配置会使用同一个模型。
费用与可用区域见 定价。
Authorization: Bearer $INFERWAY_API_KEY
Inferway 返回 OpenAI 兼容的错误对象:{"error": { "type": "...", "message": "...", "code": "..." }}
付费请求在派发前预留 prompt 估价 × 输入价 + max_tokens × 输出价。可用余额耗尽时,符合条件的请求可使用注册免费额度;免费请求不扣钱包。402 表示请求在派发前被拒绝,不产生费用。已认证请求在派发前被 400 拒绝时,会以零 Token、零费用记录在控制台请求历史中,便于事后排查故障。余额以 4 位小数展示;单价以实时价目表为准。
命中缓存的输入 Token 记在 usage.prompt_tokens_details.cached_tokens 中,按缓存价计费。qwen3.8-27b 的缓存按 1,600 Token 整块匹配,且不复用提示词的最后一个整块,因此输入约 3,200 Token 以上的请求才可能部分命中;更短的请求始终按标准输入价计费。
/v1/chat/completions 与 /v1/agent/chat 可能返回的全部错误码,直接取自网关自己的目录,不是抄写。每一行都带 HTTP 状态、是否可以安全重试,以及 API 实际发出的原文。结账、账单与密钥管理相关的端点会返回它们各自的错误码,不在本表中。
| code | HTTP 状态码 | 可否重试 | 错误含义 |
|---|---|---|---|
| admission_paused | 503 | 可以,先退避 | Paid admission is paused while we finish a service change. Retry shortly; nothing is wrong with this request. |
| authentication_error | 401 | 不可 | Authentication failed. |
| conflict | 409 | 不可 | A conflict occurred with the current state of the resource. |
| free_quota_exhausted | 429 | 可以,先退避 | Free quota exhausted. Please retry later. |
| free_tier_unavailable | 503 | 可以,先退避 | The free tier is temporarily unavailable; please retry shortly. |
| internal_error | 500 | 不可 | 网关内部错误 |
| internal_tool_failure | 500 | 不可 | An internal tool error occurred. |
| invalid_request | 400 | 不可 | 请求格式错误或参数非法 |
| malformed_upstream | 502 | 不可 | Received an invalid response from the upstream service. |
| model_unavailable | 503 | 可以,先退避 | This model is temporarily out of service. Other models are unaffected; please retry later. |
| payment_required | 402 | 不可 | Payment required. Add credit at https://inferway.ai/console/billing |
| rate_limited | 429 | 可以,先退避 | 超出免费使用或并发限额 |
| service_unavailable | 503 | 不可 | Service outage in progress. Live status: https://inferway.ai/status |
| upstream_rejected | 422 | 不可 | The upstream service rejected the request. |
| upstream_unavailable | 503 | 可以,先退避 | The service is temporarily unavailable. |
额度拒绝返回 HTTP 429。查看错误码、window 与 dimension;有 Retry-After 时按其等待。单次请求大小超限需缩短输入或调低 max_tokens,等待不会改变此限制。
| 适用对象 | 限额 | 时间窗口 |
|---|---|---|
| 匿名试玩 | 60 | 每分钟(每 IP) |
| 匿名试玩 | 300 | 每小时 |
| 匿名试玩 | 1,000 | 每滚动 24 小时 |
| 账户充值后 | 按账户正式配额 | 自动解除访客体验限制,可在控制台查看专属配额 |
注册免费账户:突发 8 次/秒、每分钟 60 次、每小时 300 次、每天 1,000 次,并发 2。不限制单次输入或输出 token,也不设每分钟或每日 token 额度。
每小时与每天的次数按滚动窗口计算,不在固定时刻整体重置。同一账户的 API Key 共享这些次数额度。
单次请求仍受模型自身的上下文长度和最大输出限制。超过 4,096 tokens 的输出请使用流式请求。
以下清单如实列出了网关对各项参数的实际支持情况,反映线上运行时的真实处理逻辑。
| 参数 | 支持状态 | 具体行为 |
|---|---|---|
| model | 支持 | 转发前会重写成后端的模型 ID。 |
| messages | 支持 | 必填且非空,校验后转发给推理引擎。 |
| stream | 支持 | 流式路径已实现;自动注入 stream_options.include_usage。 |
| temperature | 支持 | 透传给推理引擎,并记入计费元数据。 |
| top_p | 支持 | 列于 supported_sampling_parameters,整体透传。 |
| max_tokens | 支持 | 透传给推理引擎。 |
| stop | 支持 | 列于 supported_sampling_parameters,转发给推理引擎。 |
| n | 未验证 | 网关不做处理,原样转发;实际行为取决于后端。 |
| logprobs | 未验证 | 网关不做处理,随原始请求体转发,未对线上响应做过验证。 |
| tools | 支持 | supported_features 中声明 ["tools","json_mode"],转发给推理引擎。 |
| response_format | 支持 | 网关声明 json_mode;字段随原始请求体转发。 |
| 图像输入 | 未验证 | 模型元数据声明 input_modalities: ["text"];网关只为 CSAM 哈希检查解析 image_url,推理侧行为未验证。 |
思考过程默认处于关闭状态。如需开启,请在请求参数中传入 "reasoning": {"enabled": true},并为该请求预留约 16k 以上的 max_tokens 预算 —— 若输出预算过小,可能被思考过程消耗殆尽导致最终正文为空。
两段最小请求体,分别对应两种公开协议,都把图片以内联 base64 / data URL 形式发送到 catalog 中声明了 image_input 的模型。网关在 Playground 上执行的 per-image、per-kind 累计字节与 16 MiB 请求体上限在这里同样生效。
下方每个片段的实际行为仍受上方兼容性矩阵中“推理未验证”声明的同一约束。
image_url.content 指向包含 base64 字节的 data URL,MIME 与 catalog 允许的类型一致即可。
POST https://api.inferway.ai/v1/chat/completions Authorization: Bearer $INFERWAY_API_KEY Content-Type: application/json { "model": "inferway/qwen3.8-27b", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "What is in this image?"}, { "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" } } ] } ] }
Anthropic 使用 base64 source 对象而不是 data URL;网关会把 Anthropic 形态的请求路由到同样的 image_input 通道。Messages 端点尚未对 API key 开放,详见上方端点说明。
POST https://api.inferway.ai/v1/messages Authorization: Bearer $INFERWAY_API_KEY Content-Type: application/json { "model": "inferway/qwen3.8-27b", "max_tokens": 1024, "messages": [ { "role": "user", "content": [ {"type": "text", "text": "What is in this image?"}, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" } } ] } ] }
#!/usr/bin/env python3 """Minimal Inferway chat sample. Requires: pip install openai""" import os from openai import OpenAI client = OpenAI( base_url="https://api.inferway.ai/v1", api_key=os.environ["INFERWAY_API_KEY"], ) messages = [{"role": "system", "content": "You are a helpful assistant."}] while True: user = input("You: ") if not user: break messages.append({"role": "user", "content": user}) stream = client.chat.completions.create( model="inferway/qwen3.8-27b", messages=messages, stream=True, ) reply = "" print("Assistant: ", end="", flush=True) for chunk in stream: if not chunk.choices: continue piece = chunk.choices[0].delta.content if piece: reply += piece print(piece, end="", flush=True) print("\n") messages.append({"role": "assistant", "content": reply})