文档

API 接入文档

IWKey 统一网关的接入指南:可用模型、快速开始、调用入口、代码示例、SDK 配置与常见问题。

文本调用 · cURL
curl https://iwkey.com/v1/chat/completions \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-6", "messages": [ {"role": "user", "content": "Hello"} ] }'
图像生成 · cURL
curl https://iwkey.com/v1/images/generations \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-image-2", "prompt": "A watercolor fox" }'
视觉模型任务 · cURL
curl https://iwkey.com/videos/v1/videos/generations \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seedance-2.0", "prompt": "A cinematic product shot", "duration": 5, "resolution": "480p", "aspect_ratio": "16:9" }'

01文本、图像与视觉模型,一个 Key 接入

统一查看 Claude、ChatGPT、图像与视觉模型的调用入口、模型 ID 获取方式和状态;完整目录见 模型页面

接口定义见 /docs/openapi.json;模型详情以实时 /v1/models模型市场 为准。

curl · List models
curl https://iwkey.com/v1/models \ -H "Authorization: Bearer $IWKEY_KEY"

02三步接入

STEP 01

申请 API Key

登录控制台,创建 API Key。支持对公账户 + 增值税发票。

STEP 02

选择调用入口

文本模型替换 SDK base URL;图像用 /v1/images/generations;视觉模型用 /videos/v1/videos/generations 提交任务。

STEP 03

查看结果与用量

文本与图像请求实时返回;视觉模型按任务轮询,完成后可下载结果,并进入使用记录汇总。

03调用入口

GET

/v1/models

接入前查询当前可调用模型 ID。ChatGPT 模型 ID 以此列表为准。

POST

/v1/chat/completions

OpenAI 兼容入口。完成 base URL 替换后,OpenAI SDK、Cursor、Codex CLI、opencode、LangChain 可走此入口。

POST

/v1/messages

Anthropic Messages 原生入口。Claude Code 与 Anthropic SDK 可直接切换到 IWKey base URL。

POST

/v1/images/generations

OpenAI 兼容图像生成入口。gpt-image-2 提供两档画质,按张计费;输出尺寸固定(size 参数不影响输出),画质由所选档位固定。

POST

/videos/v1/videos/generations

视觉模型异步任务入口。提交 prompt、时长、清晰度和画幅后返回 job_id 与 poll_url。

GET

/videos/v1/videos/jobs/{job_id}

优先请求提交响应返回的 poll_url;该地址用于查询任务状态、完成结果、失败原因和视频下载地址。

04进阶场景示例

文本高级能力、图像生成与视觉模型异步任务示例,每个场景给出 cURL / Python / JavaScript 三种写法。

cURL · 流式响应(SSE)
curl -N https://iwkey.com/v1/chat/completions \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "写一首关于云的短诗"}], "stream": true }'
Python · 流式响应
from openai import OpenAI client = OpenAI(base_url="https://iwkey.com/v1", api_key="$IWKEY_KEY") stream = client.chat.completions.create( model="claude-sonnet-4-6", messages=[{"role": "user", "content": "写一首关于云的短诗"}], stream=True, ) for chunk in stream: print(chunk.choices[0].delta.content or "", end="")
JavaScript · 流式响应
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://iwkey.com/v1", apiKey: process.env.IWKEY_KEY, }); const stream = await client.chat.completions.create({ model: "claude-sonnet-4-6", messages: [{ role: "user", content: "写一首关于云的短诗" }], stream: true, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0].delta.content ?? ""); }
cURL · 视觉模型异步任务
# 1. Submit job and capture the returned poll_url POLL_URL=$(curl -sS https://iwkey.com/videos/v1/videos/generations \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seedance-2.0", "prompt": "A cinematic product shot on a clean studio desk", "duration": 5, "resolution": "480p", "aspect_ratio": "16:9" }' | jq -r '.poll_url') # 2. Poll the exact URL returned by the API curl "$POLL_URL" \ -H "Authorization: Bearer $IWKEY_KEY"
Python · 视觉模型异步任务
import os import time import requests headers = { "Authorization": f"Bearer {os.environ['IWKEY_KEY']}", "Content-Type": "application/json", } job = requests.post( "https://iwkey.com/videos/v1/videos/generations", headers=headers, json={ "model": "doubao-seedance-2.0", "prompt": "A cinematic product shot on a clean studio desk", "duration": 5, "resolution": "480p", "aspect_ratio": "16:9", }, ) job.raise_for_status() poll_url = job.json()["poll_url"] while True: result = requests.get(poll_url, headers=headers) result.raise_for_status() data = result.json() if data["status"] in {"completed", "failed", "cancelled", "timeout"}: print(data) break time.sleep(5)
JavaScript · 视觉模型异步任务
const headers = { Authorization: `Bearer ${process.env.IWKEY_KEY}`, "Content-Type": "application/json", }; const submit = await fetch("https://iwkey.com/videos/v1/videos/generations", { method: "POST", headers, body: JSON.stringify({ model: "doubao-seedance-2.0", prompt: "A cinematic product shot on a clean studio desk", duration: 5, resolution: "480p", aspect_ratio: "16:9", }), }); const job = await submit.json(); while (true) { const res = await fetch(job.poll_url, { headers }); const result = await res.json(); if (["completed", "failed", "cancelled", "timeout"].includes(result.status)) { console.log(result); break; } await new Promise((resolve) => setTimeout(resolve, 5000)); }
视频任务参数参考
参数 类型 说明
model string doubao-seedance-2.0doubao-seedance-2.0-fast
prompt string 文本描述,必填
duration integer 时长(秒),范围 4–15
resolution string 480p / 720p / 1080p(fast 不支持 1080p)
image_urls array ≤9 参考图片。每项可以是 URL 字符串(默认角色 = first_frame,图生视频)或对象 {"url":"…","role":"first_frame|last_frame|reference_image"}
video_urls array ≤3 参考视频
audio_urls array ≤3 参考音频;不能单独使用,必须搭配 role:"reference_image" 的图片或 video_urls;首帧/尾帧图片不能与音频同时使用
generate_audio boolean 输出是否带音频,默认 false
cURL · 含参考图与音频
curl https://iwkey.com/videos/v1/videos/generations \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "doubao-seedance-2.0", "prompt": "产品展示视频,柔和灯光,镜头缓慢推进", "duration": 5, "resolution": "720p", "image_urls": [ {"url": "https://example.com/product.jpg", "role": "reference_image"} ], "audio_urls": ["https://example.com/bgm.mp3"], "generate_audio": true }'

计费:按任务结算;成功后按上游 usage.total_tokens 精算,多退少补;失败全额退款不收费。

cURL · 图像生成
curl https://iwkey.com/v1/images/generations \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-image-2", "prompt": "A watercolor fox in a misty forest" }'
Python · 图像生成
from openai import OpenAI client = OpenAI(base_url="https://iwkey.com/v1", api_key="$IWKEY_KEY") image = client.images.generate( model="gpt-image-2", prompt="A watercolor fox in a misty forest", ) print(image.data[0])
JavaScript · 图像生成
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://iwkey.com/v1", apiKey: process.env.IWKEY_KEY, }); const image = await client.images.generate({ model: "gpt-image-2", prompt: "A watercolor fox in a misty forest", }); console.log(image.data[0]);
图像生成参数参考
参数 类型 说明
model string gpt-image-2,必填
prompt string 文本描述,必填
size string 可选,仅为兼容 OpenAI SDK 接受——当前不影响输出。两档实际输出尺寸相同,约 1536×1024 像素。
quality string 可选,接受 low/medium/high——画质由所选档位固定(标准画质 = medium,精细画质 = high),请求中传入的值不会覆盖档位设置。

计费:按张计费,标准画质 / 精细画质两档;同步请求,无 streaming;完整定价见模型市场 · gpt-image-2

cURL · 工具调用(Function Calling)
curl https://iwkey.com/v1/chat/completions \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "杭州天气怎么样?"}], "tools": [{ "type": "function", "function": { "name": "get_weather", "parameters": { "type": "object", "properties": {"city": {"type": "string"}} } } }] }'
Python · 工具调用
from openai import OpenAI client = OpenAI(base_url="https://iwkey.com/v1", api_key="$IWKEY_KEY") resp = client.chat.completions.create( model="claude-sonnet-4-6", messages=[{"role": "user", "content": "杭州天气怎么样?"}], tools=[{ "type": "function", "function": { "name": "get_weather", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, }, }, }], ) print(resp.choices[0].message.tool_calls)
JavaScript · 工具调用
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://iwkey.com/v1", apiKey: process.env.IWKEY_KEY, }); const resp = await client.chat.completions.create({ model: "claude-sonnet-4-6", messages: [{ role: "user", content: "杭州天气怎么样?" }], tools: [{ type: "function", function: { name: "get_weather", parameters: { type: "object", properties: { city: { type: "string" } }, }, }, }], }); console.log(resp.choices[0].message.tool_calls);

平台只提供官方标准模型 ID,不再提供 -thinking/-high/-low 等后缀变体。推理增强通过 API 参数 控制——Anthropic 用 thinking 对象,OpenAI 用 reasoning_effort

Anthropic Claude · 启用 Extended Thinking
curl https://iwkey.com/v1/messages \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-opus-4-7", "max_tokens": 16000, "thinking": { "type": "enabled", "budget_tokens": 10000 }, "messages": [{ "role": "user", "content": "解释量子纠缠的机制" }] }' # thinking.budget_tokens 控制推理深度(1024 ~ 100000) # max_tokens 须 > budget_tokens,留足 output 空间 # 支持 claude-opus-4-7, claude-opus-4-8 等支持 extended thinking 的模型
Python · Anthropic SDK
import anthropic client = anthropic.Anthropic( base_url="https://iwkey.com", api_key="$IWKEY_KEY", ) resp = client.messages.create( model="claude-opus-4-7", max_tokens=16000, thinking={ "type": "enabled", "budget_tokens": 10000, }, messages=[{"role": "user", "content": "解释量子纠缠的机制"}], ) for block in resp.content: if block.type == "thinking": print("[思考过程]", block.thinking[:200], "...") elif block.type == "text": print("[回答]", block.text)
OpenAI · reasoning_effort 参数
curl https://iwkey.com/v1/chat/completions \ -H "Authorization: Bearer $IWKEY_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.5", "reasoning_effort": "high", "messages": [{ "role": "user", "content": "解释量子纠缠的机制" }] }' # reasoning_effort: "low" | "medium" | "high"(默认 medium) # 适用于 gpt-5.5 等支持推理的模型;查 /v1/models 确认当前可用 ID
Python · OpenAI SDK
from openai import OpenAI client = OpenAI(base_url="https://iwkey.com/v1", api_key="$IWKEY_KEY") resp = client.chat.completions.create( model="gpt-5.5", reasoning_effort="high", messages=[{"role": "user", "content": "解释量子纠缠的机制"}], ) print(resp.choices[0].message.content)

05各客户端配置示例

Claude Code

Claude 全系
ANTHROPIC_BASE_URL 只到主机名 https://iwkey.com,不要加 /v1(与 OpenAI 接口不同;加了会拼成 /v1/v1/messages → 404)
# 设置环境变量后直接启动 export ANTHROPIC_BASE_URL=https://iwkey.com export ANTHROPIC_API_KEY=your-iwkey-key claude

Cursor

Claude + ChatGPT
⚠ Base URL 须带 /v1(OpenAI 协议入口,Cursor 直接拼接 /chat/completions;与 Claude Code 的 ANTHROPIC_BASE_URL 不带 /v1 不同)
# Settings → Models → Override OpenAI Base URL Base URL: https://iwkey.com/v1 API Key: your-iwkey-key # Claude 可直接填 claude-sonnet-4-6;ChatGPT 模型 ID 先查 /v1/models

Anthropic Python SDK

Claude 全系
import anthropic client = anthropic.Anthropic( base_url="https://iwkey.com", api_key="your-iwkey-key", ) msg = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{"role": "user", "content": "Hello"}], )

OpenAI Python SDK

Claude + ChatGPT
# model 换名即切 provider from openai import OpenAI client = OpenAI( base_url="https://iwkey.com/v1", api_key="your-iwkey-key", ) # Claude resp = client.chat.completions.create( model="claude-sonnet-4-6", messages=[{"role": "user", "content": "Hello"}], ) # ChatGPT — 同一个 client,具体模型 ID 先查 /v1/models resp = client.chat.completions.create( model="gpt-5.5", messages=[{"role": "user", "content": "Hello"}], )

视觉模型 API

Seedance / 视频任务
# 标准 HTTP 调用:提交任务后轮询 poll_url curl https://iwkey.com/videos/v1/videos/generations \ -H "Authorization: Bearer your-iwkey-key" \ -H "Content-Type: application/json" \ -d '{"model":"doubao-seedance-2.0","prompt":"A product video","duration":5,"resolution":"480p","aspect_ratio":"16:9"}'

图像生成 API

gpt-image-2 / 按张计费
# 同步请求,两档画质按张计费 curl https://iwkey.com/v1/images/generations \ -H "Authorization: Bearer your-iwkey-key" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-image-2","prompt":"A watercolor fox"}'

Codex CLI

ChatGPT 系(Responses API)
base_url 只到 /v1,不要加 /chat/completions,否则 Codex 会拼出错误路径导致 404
⚠ 模型用 gpt-5.5,Codex 走 Responses API(非 chat/completions),需在 config.toml 声明 wire_api = "responses"
# ~/.codex/config.toml model = "gpt-5.5" model_provider = "iwkey" [model_providers.iwkey] name = "IWKey" base_url = "https://iwkey.com/v1" wire_api = "responses" env_key = "IWKEY_KEY"
export IWKEY_KEY="sk-你的令牌" codex

opencode

Claude + ChatGPT
options.baseURL 须带 /v1@ai-sdk/openai-compatible 直接拼接 /chat/completions,不会自动补 /v1)
# ~/.config/opencode/opencode.json { "$schema": "https://opencode.ai/config.json", "provider": { "iwkey": { "npm": "@ai-sdk/openai-compatible", "name": "IWKey", "options": { "baseURL": "https://iwkey.com/v1", "apiKey": "{env:IWKEY_KEY}" }, "models": { "claude-sonnet-4-6": { "name": "Claude Sonnet 4.6" }, "gpt-5.5": { "name": "GPT-5.5" } } } } }
# 设置环境变量后运行 /connect 存凭据,provider id 填 "iwkey" export IWKEY_KEY="your-iwkey-key" opencode # TUI 内:/connect → Other → 粘贴 Key,provider id 填 "iwkey" # 完成后 /models 选择上面配置的模型

LangChain

Claude 全系
from langchain_anthropic import ChatAnthropic llm = ChatAnthropic( base_url="https://iwkey.com", api_key="your-iwkey-key", model="claude-sonnet-4-6", )

06常见问题

如何验证我用的是真模型?
每次请求的响应会包含上游官方的原始字段(Anthropic 的 request_id、OpenAI 的 idsystem_fingerprint),与直连 API 完全一致。你也可以访问 透明度页面 查看数据库 schema,确认我们不存储任何 prompt 或 response 内容。
计费方式是什么?
文本模型按 token 用量计费;图像按张计费(标准画质 / 精细画质两档);视觉模型按任务、时长和上游模型计费。登录控制台后可查看实时余额、用量明细、按模型/日期/Key 分组导出。支持对公转账 + 增值税发票。
你们会存储我的 prompt 和 response 吗?
文本与图像通道不在普通数据库层保存 prompt、response 或生成图片正文。视觉模型属于异步任务,任务参数、状态、成本、结果地址和失败原因会用于任务追踪与计费;完整边界以 透明度页面 为准。
支持 Streaming 吗?
文本模型支持 Anthropic 原生 SSE streaming 和 OpenAI 兼容 streaming,在请求中设置 "stream": true 即可。图像生成为同步请求,不使用 streaming。视觉模型不是 streaming 响应;提交任务后应优先请求响应中的 poll_url,当前 canonical 地址为 /videos/v1/videos/jobs/{job_id}
视觉模型怎么调用?
使用同一个 API Key 调用 POST /videos/v1/videos/generations,提交后会返回 job_idpoll_url。任务完成后可在轮询响应或「视觉模型使用详情」里查看结果、下载地址和失败原因。
如何启用推理增强(Extended Thinking / reasoning_effort)?
平台只提供官方标准模型 ID,不提供 -thinking/-high/-low 等后缀变体。推理强度由 API 参数控制:
  • Anthropic Claude:在请求体加 "thinking": {"type": "enabled", "budget_tokens": 10000}(预算 1024~100000 tokens)。max_tokens 须大于 budget_tokens。支持模型:claude-opus-4-7claude-opus-4-8 等。
  • OpenAI(推理模型):在请求体加 "reasoning_effort": "high"(可选 low/medium/high)。支持模型:gpt-5.5 等,查 GET /v1/models 确认。
完整示例见代码示例 → 推理增强(Thinking) 标签。
如何启用提示缓存(Prompt Caching)?
💡 提示缓存(Prompt Caching):Claude 模型支持提示缓存,对重复的长上下文(system prompt、Agent 循环、代码库上下文等)可节省最高约 90% 的输入费用。启用方式:使用 Anthropic 原生 /v1/messages 格式,并在消息/系统提示中标记 cache_control 断点。注意:OpenAI 兼容的 /v1/chat/completions 格式不支持 Claude 提示缓存,每次请求按全价输入计费。零散或每次内容都不同的请求无需缓存。
和直连 Anthropic / OpenAI API 有什么区别?
文本与图像通道保留 Anthropic / OpenAI 的兼容协议能力,包括 Streaming 和 Tool Calling;视觉模型由 IWKey 的异步任务接口统一多家视频上游。区别是:同一个 Key、余额和使用记录打通,支持人民币对公结算 + 增值税发票。