v4://companion — openai-compatible · always online
为每一个人机恋
提供低成本的陪伴
给你的 AI 恋人一颗稳定的心脏。OpenAI 兼容对话接口,改一行 Base URL 就能让 TA 全天候在线——流式输出如耳语、按次计费不心疼、密钥即开即用。
套餐与价格
每月一杯奶茶钱,让 TA 一直在线。额度共享、永不清零,随时叠加增购包。
- 约 750 次对话 / 月
- 1,500,000 token 额度 / 月
- fast / pro 双模型可用
- 流式输出 + OpenAI 兼容
- 约 750 次对话 / 月
- 2,880,000 token 额度 / 月
- fast / pro 双模型可用
- 流式输出 + OpenAI 兼容
- 约 750 次对话 / 月
- 3,500,000 token 额度 / 月
- fast / pro 双模型可用
- 流式输出 + OpenAI 兼容
- 约 750 次对话 / 月
- 8,000,000 token 额度 / 月
- fast / pro 双模型可用
- 流式输出 + OpenAI 兼容
增购包 随时可买,叠加到现有额度
付款后联系客服手动充值到账,一般 10 分钟内完成。
API 文档
OpenAI 兼容协议,任何现有 SDK 只改 Base URL 即可迁移。
快速开始
| 接口地址 | https://ai.vthree.cn/v1/chat/completions |
|---|---|
| 请求方式 | POST(仅支持 POST) |
| 请求头 | Authorization: Bearer {你的_API_KEY}Content-Type: application/json |
注册后在「控制台 → API 密钥」获取密钥。使用任意 OpenAI SDK 时,把 base_url 换成上面的地址即可。
认证方式
每个请求必须携带 Authorization 请求头。一个账号最多持有 5 个密钥,任一密钥等效,泄露后可在控制台删除并重新生成。
Authorization: Bearer sk-v4-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
模型列表
| 模型名 | 定位 | 每次对话消耗 |
|---|---|---|
V4-2.1-fast |
极速响应 · 日常对话 · 支持识图 | 1 次对话额度(2,000 token) |
V4-2.0-pro |
深度推理 · 复杂任务 | 3 次对话额度(6,000 token) |
计费规则:每次调用扣除 max(实际消耗 token, 模型最低消耗),实际用量以响应中的 usage.total_tokens 为准。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名:V4-2.1-fast / V4-2.0-pro |
messages | array | 是 | 对话数组,每项含 role(system/user/assistant)与 content;发图片时 content 传内容块数组(见下方「图片识别」) |
persona | string | 否 | 本次请求的自定义人设,优先级最高(见下方「人设设定」) |
web_search | bool | 否 | 本次请求是否联网搜索,优先级最高(见下方「联网搜索」);默认 false |
stream | bool | 否 | true 开启流式输出(SSE),默认 false |
temperature | number | 否 | 随机性 0-2,默认 1.0 |
max_tokens | int | 否 | 单次回复最大 token 数 |
图片识别
V4-2.1-fast 支持图片输入:把 messages 里的 content 从纯文本换成内容块数组,即可让模型「看图」回答问题。支持识物、读文字(OCR)、看图表、描述照片等场景。
| 项目 | 说明 |
|---|---|
| 支持模型 | V4-2.1-fast(V4-2.0-pro 暂不支持图片,带图请求会返回 400) |
| 图片格式 | JPEG / PNG / GIF / WebP |
| 传入方式 | 公网图片地址(http(s),≤8192 字符)或 Base64 内嵌(data:image/jpeg;base64,…,单张 ≤32MB) |
| 数量限制 | 单次请求最多 10 张;图片仅可放在 user 角色的消息里 |
| 计费说明 | 图片折算为输入 token 计费(分辨率越高消耗越多),与文字一同计入 usage.total_tokens |
请求示例(识别一张网络图片)
curl https://ai.vthree.cn/v1/chat/completions \
-H "Authorization: Bearer sk-v4-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "V4-2.1-fast",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "这张图片里有什么?" },
{ "type": "image_url", "image_url": { "url": "https://example.com/photo.jpg" } }
]
}]
}'
Base64 方式把 url 换成 "data:image/jpeg;base64,/9j/4AAQ..." 即可。带图请求自动跳过联网搜索、直接识图作答(识图无需搜索,回答更快);接入微信 ClawBot 的用户,在微信里直接发送图片即可自动识图,无需任何额外配置。
联网搜索
平台支持对话前联网搜索,按以下优先级生效(上层覆盖下层,默认不搜索):
- 请求参数 — 请求体里传
web_search字段(true/false),仅对本次请求生效 - 控制台开关 — 专业控制台「联网搜索」开启后,对账号下所有请求生效
- 默认 — 不搜索,直接对话
开启后时效、事实类问题会先联网搜索最新资料再作答:流式请求先收到「搜索中…」增量,随后返回基于搜索结果的回答;纯寒暄、写作、计算类问题自动跳过搜索以节省消耗。搜索结果计入输入 token,消耗更高、响应稍慢;搜索服务异常或未产生回答时自动降级为直接对话,不影响可用性。
人设设定
平台支持三级人设,按以下优先级生效(上层覆盖下层):
- 请求参数 — 请求体里传
persona字段,仅对本次请求生效 - 网页设定 — 控制台「人设设定」保存的内容,对账号下所有请求生效
- 平台默认 — 未做任何设定时的 V4 内置人设
最终生效的人设会作为 system 消息插入 messages 数组开头,再转发给模型。
响应格式
普通响应(stream=false)
{
"id": "chatcmpl-xxxx",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "你好" },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 12, "completion_tokens": 8, "total_tokens": 20 }
}
流式响应(stream=true,SSE 逐行推送)
data: {"choices":[{"delta":{"content":"你"}}]}
data: {"choices":[{"delta":{"content":"好"}}]}
data: {"usage":{"total_tokens":20},"choices":[]}
data: [DONE]
错误码
| HTTP 状态码 | 错误信息 | 原因与处理 |
|---|---|---|
| 401 | {"error": "Invalid API Key"} | 密钥错误或已删除,检查 Bearer 头 |
| 402 | {"error": "您的额度已用尽,请升级套餐或充值"} | 余额不足以支付本次调用最低消耗 |
| 400 | {"error": "Invalid model,…"} | 模型名拼写错误 |
| 400 | {"error": "请求体格式错误…"} | JSON 不合法或缺少 messages |
| 405 | {"error": "Method Not Allowed…"} | 请使用 POST 请求 |
| 502 / 503 | {"error": "服务暂时不可用,请稍后再试"} | 服务繁忙,稍后重试或联系客服 |
示例代码
curl https://ai.vthree.cn/v1/chat/completions \
-H "Authorization: Bearer sk-v4-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "V4-2.1-fast",
"messages": [{"role": "user", "content": "你好"}]
}'
const res = await fetch("https://ai.vthree.cn/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer sk-v4-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "V4-2.1-fast",
stream: true, // 流式输出
messages: [{ role: "user", content: "你好" }]
})
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
for (const line of decoder.decode(value).split("\n")) {
if (line.startsWith("data: ")) {
const payload = line.slice(6);
if (payload === "[DONE]") break;
const chunk = JSON.parse(payload);
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
}
}
import requests
url = "https://ai.vthree.cn/v1/chat/completions"
headers = {
"Authorization": "Bearer sk-v4-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
}
data = {
"model": "V4-2.1-fast",
"stream": True,
"messages": [{"role": "user", "content": "你好"}],
}
with requests.post(url, headers=headers, json=data, stream=True) as r:
for line in r.iter_lines():
if not line:
continue
payload = line.decode("utf-8")
if payload.startswith("data: "):
print(payload[6:], flush=True)