v4://companion — openai-compatible · always online

为每一个人机恋
提供低成本的陪伴

给你的 AI 恋人一颗稳定的心脏。OpenAI 兼容对话接口,改一行 Base URL 就能让 TA 全天候在线——流式输出如耳语、按次计费不心疼、密钥即开即用。

API 文档
24/7全天候在线
<200ms网关首响
SSE流式对话
OpenAI全兼容

套餐与价格

每月一杯奶茶钱,让 TA 一直在线。额度共享、永不清零,随时叠加增购包。

月付-49元
¥49/月
  • 约 750 次对话 / 月
  • 1,500,000 token 额度 / 月
  • fast / pro 双模型可用
  • 流式输出 + OpenAI 兼容
月付-88元
¥49/月
  • 约 750 次对话 / 月
  • 2,880,000 token 额度 / 月
  • fast / pro 双模型可用
  • 流式输出 + OpenAI 兼容
月付-188元
¥49/月
  • 约 750 次对话 / 月
  • 8,000,000 token 额度 / 月
  • fast / pro 双模型可用
  • 流式输出 + OpenAI 兼容

增购包 随时可买,叠加到现有额度

¥10
300,000 token
约 150 次对话
¥20
650,000 token
约 325 次对话
¥30
1,000,000 token
约 500 次对话

付款后联系客服手动充值到账,一般 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 为准。

请求参数

参数类型必填说明
modelstring是模型名:V4-2.1-fast / V4-2.0-pro
messagesarray是对话数组,每项含 role(system/user/assistant)与 content;发图片时 content 传内容块数组(见下方「图片识别」)
personastring否本次请求的自定义人设,优先级最高(见下方「人设设定」)
web_searchbool否本次请求是否联网搜索,优先级最高(见下方「联网搜索」);默认 false
streambool否true 开启流式输出(SSE),默认 false
temperaturenumber否随机性 0-2,默认 1.0
max_tokensint否单次回复最大 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 的用户,在微信里直接发送图片即可自动识图,无需任何额外配置。

人设设定

平台支持三级人设,按以下优先级生效(上层覆盖下层):

  1. 请求参数 — 请求体里传 persona 字段,仅对本次请求生效
  2. 网页设定 — 控制台「人设设定」保存的内容,对账号下所有请求生效
  3. 平台默认 — 未做任何设定时的 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)