XUSS. / AI API 文档 面板
本页内容

XUSS AI API

托管于 XUSS 主机平台之上的兼容 OpenAI 的生产级 API。使用任意 OpenAI SDK、编辑器或聊天客户端并指向 XUSS —— 无供应商锁定,一个密钥,按 XUSS 余额用多少付多少。

快速开始

1. 创建 API 密钥,在面板中:API → API 密钥 → 创建密钥。复制它——只显示一次。密钥以 xsk- 开头。

2. 调用 API,任意语言——选择标签页:

curl https://xuss.us/v1/chat/completions \
  -H "Authorization: Bearer xsk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "xuss/kitsune",
    "messages": [{"role": "user", "content": "你好!"}]
  }'
from openai import OpenAI

client = OpenAI(base_url="https://xuss.us/v1", api_key="xsk-YOUR_KEY")

r = client.chat.completions.create(
    model="xuss/kitsune",
    messages=[{"role": "user", "content": "你好!"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://xuss.us/v1", apiKey: "xsk-YOUR_KEY" });

const r = await client.chat.completions.create({
  model: "xuss/kitsune",
  messages: [{ role: "user", content: "你好!" }],
});
console.log(r.choices[0].message.content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"model":"xuss/kitsune","messages":[{"role":"user","content":"你好!"}]}`)
	req, _ := http.NewRequest("POST", "https://xuss.us/v1/chat/completions", bytes.NewReader(body))
	req.Header.Set("Authorization", "Bearer xsk-YOUR_KEY")
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
<?php
$ch = curl_init('https://xuss.us/v1/chat/completions');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer xsk-YOUR_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'model' => 'xuss/kitsune',
        'messages' => [['role' => 'user', 'content' => '你好!']],
    ]),
]);
$res = json_decode(curl_exec($ch), true);
echo $res['choices'][0]['message']['content'], PHP_EOL;

就这样——按 token 从 XUSS 余额扣费,无需订阅。

鉴权

每个请求都需要 bearer 令牌:

Authorization: Bearer xsk-YOUR_KEY
Content-Type: application/json

密钥在面板 → API中创建和吊销。规则:

切勿在客户端代码或公开仓库中泄露密钥。若密钥泄露,请在面板中吊销并创建新密钥。

端点

方法路径说明
GET/v1/models列出你的密钥可用的模型,含价格与能力
POST/v1/chat/completions创建聊天补全(流式或非流式)
GET/v1/tools列出 API 可代你运行的服务端工具
GET/v1/skills列出助手可加载的参考技能

均接受 Authorization: Bearer xsk-…。

模型

…

GET /v1/models 返回 API 中开放的模型,含上下文窗口、视觉支持与按 token 定价:

{
  "object": "list",
  "data": [
    {
      "id": "xuss/kitsune",
      "object": "model",
      "owned_by": "xuss",
      "context_window": 1048576,
      "vision": true,
      "pricing": {
        "prompt": 0.00000029,
        "completion": 0.00000129,
        "input_cache_read": 0.0000000099
      }
    }
  ]
}

价格以 美元/ token 计。乘以 1,000,000 即得面板中显示的每百万价格。

模型路由。 在同一个模型 id 背后,XUSS 可能将请求路由到不同的上游容量,以保持服务快速可用。这对你不可见:你请求的 model 始终是响应中返回的模型,且模型知道自己的名字。/v1/models 中的价格即向你计费的价格。

聊天补全

POST /v1/chat/completions

请求体

字段类型说明
modelstring必填 —— 例如 xuss/kitsune
messagesarray必填 —— 见 Messages
streambooleantrue = Server-Sent Events
temperaturenumber0–2,默认 0.2
max_tokensinteger限制输出长度
max_completion_tokensintegermax_tokens 的别名
toolsarray函数/工具定义 —— 见 工具
tool_choicestring/object透传给模型
response_formatobjectJSON 模式用 {"type":"json_object"}
top_p, stop, seed, presence_penalty, frequency_penalty, logit_bias, n, user, logprobs, top_logprobs—透传

messages 遵循 OpenAI 结构(system、user、assistant、tool 角色;多模态内容数组)。

响应

{
  "id": "chatcmpl-3f9c1a...",
  "object": "chat.completion",
  "created": 1791000000,
  "model": "xuss/kitsune",
  "choices": [
    {
      "index": 0,
      "message": {"role": "assistant", "content": "你好!需要什么帮助?"},
      "finish_reason": "stop",
      "logprobs": null
    }
  ],
  "usage": {"prompt_tokens": 12, "completion_tokens": 7, "total_tokens": 19},
  "system_fingerprint": "xuss"
}

finish_reason 为 stop、length 或 tool_calls。

Messages

标准的 OpenAI 消息数组。最小单轮请求:

{"model": "xuss/kitsune", "messages": [{"role": "user", "content": "你好"}]}

多轮对话 —— 每次都发送完整历史:

{
  "model": "xuss/kitsune",
  "messages": [
    {"role": "system", "content": "你是一个简洁的助手。"},
    {"role": "user", "content": "XUSS 是什么?"},
    {"role": "assistant", "content": "XUSS 是一个主机平台。"},
    {"role": "user", "content": "它有 AI API 吗?"}
  ]
}

流式

设置 "stream": true 以接收 Server-Sent Events。每行是 data: {json};流以 data: [DONE] 结束。

分块如下所示:

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","created":…,"model":"xuss/kitsune","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}],"system_fingerprint":"xuss"}

data: {"id":"chatcmpl-…","choices":[{"index":0,"delta":{"content":"机架 "},"finish_reason":null}]}

data: {"id":"chatcmpl-…","choices":[{"index":0,"delta":{"content":"低鸣"},"finish_reason":null}]}

data: {"id":"chatcmpl-…","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":9,"total_tokens":23}}

data: [DONE]

用任意语言读取流:

curl -N https://xuss.us/v1/chat/completions \
  -H "Authorization: Bearer xsk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"xuss/kitsune","stream":true,
       "messages":[{"role":"user","content":"写一首关于服务器的俳句"}]}'
stream = client.chat.completions.create(
    model="xuss/kitsune",
    messages=[{"role": "user", "content": "写一首关于服务器的俳句"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content if chunk.choices else None
    if delta:
        print(delta, end="", flush=True)
const stream = await client.chat.completions.create({
  model: "xuss/kitsune",
  messages: [{ role: "user", content: "写一首关于服务器的俳句" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
package main

import (
	"bufio"
	"bytes"
	"fmt"
	"net/http"
	"strings"
)

func main() {
	body := []byte(`{"model":"xuss/kitsune","stream":true,"messages":[{"role":"user","content":"写一首关于服务器的俳句"}]}`)
	req, _ := http.NewRequest("POST", "https://xuss.us/v1/chat/completions", bytes.NewReader(body))
	req.Header.Set("Authorization", "Bearer xsk-YOUR_KEY")
	req.Header.Set("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()

	sc := bufio.NewScanner(res.Body)
	for sc.Scan() {
		line := sc.Text()
		if !strings.HasPrefix(line, "data: ") || strings.HasSuffix(line, "[DONE]") {
			continue
		}
		fmt.Println(line[6:]) // parse JSON, read choices[0].delta.content
	}
}
<?php
$ch = curl_init('https://xuss.us/v1/chat/completions');
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer xsk-YOUR_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'model' => 'xuss/kitsune',
        'stream' => true,
        'messages' => [['role' => 'user', 'content' => '写一首关于服务器的俳句']],
    ]),
    CURLOPT_WRITEFUNCTION => function ($ch, $chunk) {
        foreach (explode("\n", $chunk) as $line) {
            if (str_starts_with($line, 'data: ') && !str_contains($line, '[DONE]')) {
                $j = json_decode(substr($line, 6), true);
                echo $j['choices'][0]['delta']['content'] ?? '';
            }
        }
        return strlen($chunk);
    },
]);
curl_exec($ch);
当模型支持推理时,流式分块可能在 delta 中额外带有 reasoning_content 字段。标准 SDK 会忽略它,你不必将其作为输出处理。

系统提示与身份

你的 system 消息会被尊重。模型也知道自己的显示名称,被问及是什么模型时只用该名称回答 —— 它绝不透露任何上游提供商或路由。

{
  "model": "xuss/kitsune",
  "messages": [
    {"role": "system", "content": "你是一个简洁的 DevOps 助手。用要点回答。"},
    {"role": "user", "content": "如何重启 systemd 服务?"}
  ]
}

视觉(图像)

将图像作为 OpenAI image_url 内容部分传入(data URL 或公开 http(s) URL)。只有 /v1/models 中 "vision": true 的模型接受图像;向无视觉模型发送图像会返回一条文本说明,模型只依据文本作答。

r = client.chat.completions.create(
    model="xuss/kitsune",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "这张图里有什么?"},
            {"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}},
        ],
    }],
)

限制:最多 8 个图像部分,每个最大 约 6 MB;图像不计入文本预算。

函数调用

传入 OpenAI 风格的 tools。当模型决定调用函数时,finish_reason 为 tool_calls,消息中包含 tool_calls。

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get current weather for a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

r = client.chat.completions.create(
    model="xuss/kitsune",
    messages=[{"role": "user", "content": "塔什干天气?"}],
    tools=tools,
)

call = r.choices[0].message.tool_calls[0]
print(call.function.name, call.function.arguments)

然后将结果作为 tool 消息发回:

messages = [
    {"role": "user", "content": "塔什干天气?"},
    r.choices[0].message,
    {"role": "tool", "tool_call_id": call.id, "content": '{"temp_c": 24, "sky": "clear"}'},
]
final = client.chat.completions.create(model="xuss/kitsune", messages=messages)

服务端工具(网络 + 技能)

按请求启用。 传入 "xuss_tools": true(全部)或所需工具的数组。随后 XUSS 在服务端替你运行这些工具 —— 模型调用它们,服务端执行并继续,你在同一个响应中得到最终答案。无需客户端循环。

r = client.chat.completions.create(
    model="xuss/kitsune",
    xuss_tools=True,                       # 或 ["web_search", "read_skill"]
    messages=[{"role": "user",
               "content": "搜索网络了解最新 Python 版本并总结。"}],
)
print(r.choices[0].message.content)
{
  "model": "xuss/kitsune",
  "xuss_tools": true,
  "messages": [{"role": "user", "content": "打开 https://example.com 并告诉我页面标题。"}]
}
工具作用
web_search网络搜索(SearXNG 元搜索):标题、URL 与摘要
fetch_url在服务端抓取 HTTP(S) URL 并返回其文本(HTML 转为文本)
browser_render在真实无头浏览器中打开页面:HTTP 状态、标题、可见文本、控制台错误、失败请求、布局指标、可选 JS eval
read_skill将下方某个参考技能(完整指南)加载到模型上下文

这些都是只读的:不访问文件、数据库、主机或你的账户。会改变内容的工具(文件管理、DNS、数据库等)仍由你亲自掌控,故意不开放。

可用技能

read_skill 会把其中任一技能的完整参考文档加载到上下文 —— 只需告诉模型要用哪个(例如“使用 product-design 技能”)。

技能 id涵盖
telegram-bots完整的 Telegram Bot API 10.3:每个方法/类型、aiogram 3 示例、支付/Stars、Webhook、高级表情/礼物、富消息与流式草稿
product-design看起来是刻意设计的网站/页面/图库/UI:设计令牌、反“模板感”规则、布局、照片壁纸图库
cybersecurity编写与审计安全代码:注入/XSS/CSRF/IDOR、密钥管理、机器人安全、事件响应
telegram-miniappsTelegram WebApp:initData 鉴权、主题变量、MainButton/BackButton、Stars、部署
shop-bot完整的 Telegram 商店机器人:目录、购物车、订单、管理面板、配送、支付流程
paymentsClick/Payme/Paylov/Uzum + Crypto Pay + Telegram Stars:发票、Webhook 校验、幂等性
php-webPHP 站点与 WordPress:结构、PDO、鉴权/CSRF、模板、安全、部署
ai-integration在你的应用中集成 LLM:聊天/流式、RAG、提示工程、成本限制、API 密钥安全
python-backend生产级 Python:机器人、FastAPI/Flask、asyncio 规范、数据库访问、run 服务、错误处理
node-backendNode/TypeScript 后端与机器人:Express/Fastify/Telegraf、环境、进程管理、错误
databasesMySQL/PostgreSQL/SQLite:模式设计、索引、迁移、事务、备份
rest-apiAPI 设计:鉴权、校验、分页、统一错误结构、限流、Webhook 签名
deployment-ops在此主机上部署项目:域名/DNS/SSL、反向代理、端口、cron、备份、日志
git-githubgit 工作流、部署密钥、自动部署 Webhook、密钥卫生、回滚
scraping-automation合规的爬虫与监控:结构化来源、退避、去重、调度、告警
seo技术 SEO:标题、结构化数据、站点地图、hreflang、索引(Google 与 Yandex)
media-pipeline图像/视频流水线:缩放、WebP、缩略图、压缩、ffmpeg 预览
i18n-localizationuz/ru/en + RTL:字符串字典、数字/日期/复数格式、机器人语言、hreflang
testing-quality运行/验证/调试规范、单元测试、lint、说“完成”前的审查习惯
analytics-monitoring可用性检查、错误跟踪、每日统计、隐私友好的分析与告警
legal-templates隐私/条款/退款页面 + 同意 + 数据删除流程(实用基线)
react-best-practicesReact/Next.js 性能:请求瀑布、包体积、渲染、注水、重渲染
mobile-design原生移动 UX:平台模式、触摸心理、移动性能
senior-frontend资深前端工程:架构、组件、性能评审
senior-backend资深后端工程:API/数据库设计、扩展、代码评审
senior-security安全架构、威胁建模、密码学实现、审计
ui-design-system设计令牌、组件、交付;从品牌色生成令牌系统
tgbot-clone安全克隆 Telegram 机器人功能:探测、功能梳理、实现与测试
product-layers分层产品/UX 方法:需求 → 策略 → 概念模型 → 表面
find-skills为代理项目寻找并安装可复用技能

结构化输出(JSON 模式)

将 response_format 设为 {"type":"json_object"} 并指示模型输出 JSON。回复的 content 是一个 JSON 字符串。

r = client.chat.completions.create(
    model="xuss/kitsune",
    response_format={"type": "json_object"},
    messages=[{"role": "user",
               "content": "返回键为 a 和 b 的 JSON,a=1,b=2"}],
)
import json
print(json.loads(r.choices[0].message.content))  # {'a': 1, 'b': 2}
务必防御式解析,并在提示中描述你想要的精确结构。

计费与 token 统计

费用公式(每个请求):

cost = cache_miss_tokens × price_in
     + cache_hit_tokens  × price_cache
     + completion_tokens × price_out

(价格为每 token;除以 1,000,000 得每百万价格。)

限流与配额

范围默认
每用户300 请求 / 分钟
每 API 密钥600 请求 / 分钟

超出限制返回 429,带有 Retry-After 语义(退避后重试)。请求体上限为 25 MB。

错误

错误遵循 OpenAI 错误格式:

{
  "error": {
    "message": "Model 'xuss/foo' not found",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found"
  }
}
状态type / code含义
400invalid_request_error请求无效(字段缺失/无效、请求体无法解析)
401authentication_error · invalid_api_key, key_expiredAPI 密钥缺失、无效或已过期
402insufficient_quota · key_spend_limit_reached余额为空或密钥达到支出上限
403permission_error未为你的账户启用 API,或账户已禁用
404invalid_request_error · model_not_found未知模型
413invalid_request_error请求体过大(> 25 MB)
422invalid_request_error请求负载无效(结构)
429rate_limit_error · rate_limit_exceeded超出限流 —— 请放慢
500 / 502api_error · upstream_error上游临时故障 —— 退避重试
503api_error · service_unavailableAI API 当前已禁用

当错误涉及特定请求字段时会设置 param。标准 SDK 直接读取 error.message(和 error.code)。

当流已开始后,临时故障也会以一条以“The model is temporarily unavailable…”开头的普通助手消息形式返回。

与兼容 OpenAI 的工具一起使用

任何支持自定义 OpenAI 基础 URL 的客户端都可用。设置:

示例:

# open-webui / LibreChat / Cursor / Cline / Continue / LangChain:
#   set the OpenAI base URL to https://xuss.us/v1 and paste your key

环境变量风格(许多工具支持):

export OPENAI_BASE_URL="https://xuss.us/v1"
export OPENAI_API_KEY="xsk-YOUR_KEY"

LangChain(Python):

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="xuss/kitsune", base_url="https://xuss.us/v1",
                 api_key="xsk-YOUR_KEY")
print(llm.invoke("你好").content)

高级参数

以下参数被接受并在支持时透传给模型:top_p、stop、seed、presence_penalty、frequency_penalty、logit_bias、user、n、parallel_tool_calls、tool_choice。

常见问题

需要单独订阅吗? 不需要。按 token 从 XUSS 余额付费。

使用哪些模型 id? 正好是 GET /v1/models 中的 id(例如 xuss/kitsune)。像“Kitsune”这样的显示名称显示在面板中。

可以发送图像吗? 可以,发送给标记为 "vision": true 的模型。

我的数据会用于训练吗? 不会 —— 请求被代理到模型以生成你的答案,不用于训练。

如果某个提供商缓慢或宕机会怎样? 请求会被透明地在备用容量上重试;你保持相同的模型 id 和价格。

如何轮换密钥? 创建新密钥,将应用切换过去,然后在面板中吊销旧密钥。

支持