大模型对话 API

接口概述

对接阿里云百炼大模型服务(OpenAI 兼容协议),支持非流式与 SSE 流式两种返回方式, 可通过 enable_thinking 参数开启深度思考(思考过程),默认为关闭。

本接口采用按量计费:根据实际消耗的 token 数与所选模型的输入/输出单价,直接从「LLM 余额」中扣除对应金额, 与平台其他按「次」计费的 API 相互独立。

接口地址

/api/llm_api.php

对话补全

POST ?action=chat

查询模型列表

GET ?action=models

参数可通过 JSON Body、POST 表单、GET 查询字符串或 HTTP Header 传递。

请求参数(action=chat)

参数名类型必填描述
api_keystring是API 密钥(用户中心获取),本接口仅需密钥即可鉴权
actionstring否操作类型:chat(默认)/ models
messagesarray二选一消息数组,格式 [{"role":"user","content":"..."}],支持 system / user / assistant
promptstring二选一单轮提问文本,等价于一条 role=user 的消息
streamint否是否流式输出:0 非流式(默认)/ 1 SSE 流式
modelstring否指定模型,不传则使用平台默认模型(可通过 models 接口查询)
enable_thinkingint / bool否是否开启深度思考:1/true 开启,0/false 或不传为关闭(默认,响应更快)。开启后响应会返回 reasoning_content,会额外生成思考 token,延迟更高,且思考 token 计入输出计费

响应示例(非流式)

{
    "code": 0,
    "message": "success",
    "data": {
        "model": "qwen3.8-flash",
        "content": "你好,我是大语言模型助手……",
        "reasoning_content": "用户问好,我应该礼貌回应……",
        "usage": {
            "prompt_tokens": 68,
            "completion_tokens": 78,
            "total_tokens": 146,
            "completion_tokens_details": {
                "reasoning_tokens": 56
            }
        },
        "cost": 0.01,
        "cost_detail": {
            "cost": 0.01,
            "input_tokens": 68,
            "output_tokens": 134,
            "reasoning_tokens": 56,
            "pricing": { "input_price": 0.003, "output_price": 0.006 }
        },
        "remaining_credits": 9.99
    }
}

reasoning_content 仅在请求时传 enable_thinking=1 且模型支持深度思考时返回,否则为 null。 remaining_credits 为本次扣费后的 LLM 余额(单位:元)。

流式响应(stream=1)

传 stream=1 时,接口返回 Content-Type: text/event-stream, 逐块推送 data: {...},最后以 data: [DONE] 结束。 计费在流结束后按上游返回的最终 usage 结算。以下示例为开启了 enable_thinking=1 时的思考片段。

data: {"choices":[{"delta":{"reasoning_content":"用户问好,"}}]}

data: {"choices":[{"delta":{"content":"你好"}}]}

data: {"choices":[{"delta":{"content":"!有什么可以帮你?"}}]}

data: {"usage":{"prompt_tokens":12,"completion_tokens":9,"total_tokens":21}}

data: [DONE]
流式模式下响应头为 SSE,调用方需要使用流式读取方式(如 cURL 的 CURLOPT_WRITEFUNCTION、 Python requests 的 stream=True)逐块处理,不要等待完整响应体。

计费规则

  • 按实际 token 计费,公式:
    费用 = prompt_tokens / 1000 × 输入单价 + (completion_tokens + reasoning_tokens) / 1000 × 输出单价
  • 思考 token 计入输出成本:深度思考模型的 reasoning_tokens 与正常输出同价
  • 单次最低消费 0.01 元(余额按两位小数存储)
  • 扣费顺序:优先扣 LLM 余额 → 余额不足时,若用户已开启「账户余额兜底」,自动从账户余额补扣 → 两者都不足则拒绝请求
  • 流式调用如果连接失败,不会扣费
「账户余额兜底」开关在用户中心 → 余额管理 → LLM 余额 页面自行开启。

模型与单价

单价单位为元 / 1000 token。调用 GET /api/llm_api.php?action=models 可实时获取当前可用模型与单价。

{
    "code": 0,
    "message": "success",
    "data": {
        "default_model": "qwen3.8-flash",
        "use_account_balance": true,
        "models": [
            {
                "name": "qwen3.8-flash",
                "input_price": 0.003,
                "output_price": 0.006,
                "is_default": true
            },
            {
                "name": "qwen-plus",
                "input_price": 0.02,
                "output_price": 0.05,
                "is_default": false
            }
        ]
    }
}

错误码说明

错误码说明
0成功
1001缺少必要参数(api_key / messages / prompt)
1002参数验证失败(messages 格式错误等)
1003API 密钥无效
1004LLM 余额不足,请充值后再使用
1005大模型调用失败(上游异常 / 网络问题)

调用示例

PHP(非流式)

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => "https://your-domain/api/llm_api.php",
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 90,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'api_key'  => '你的API密钥',
        'action'   => 'chat',
        'messages' => [
            ['role' => 'user', 'content' => '你好,介绍一下你自己'],
        ],
        'stream'   => 0,
    ], JSON_UNESCAPED_UNICODE),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($res['code'] === 0) {
    echo $res['data']['content'];
    echo "\n本次费用:¥" . $res['data']['cost'];
    echo "\n剩余余额:¥" . $res['data']['remaining_credits'];
}

PHP(流式)

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL        => "https://your-domain/api/llm_api.php",
    CURLOPT_POST       => true,
    CURLOPT_TIMEOUT    => 120,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'api_key'  => '你的API密钥',
        'action'   => 'chat',
        'prompt'   => '写一段 200 字的产品介绍',
        'stream'   => 1,
    ], JSON_UNESCAPED_UNICODE),
    CURLOPT_WRITEFUNCTION => function ($ch, $chunk) {
        echo $chunk;
        flush();
        return strlen($chunk);
    },
]);
curl_exec($ch);
curl_close($ch);

Python(非流式)

import requests

resp = requests.post("https://your-domain/api/llm_api.php", json={
    "api_key": "你的API密钥",
    "action": "chat",
    "prompt": "你好,介绍一下你自己",
    "stream": 0,
}, timeout=90)

result = resp.json()
if result["code"] == 0:
    print(result["data"]["content"])
    print("本次费用:", result["data"]["cost"], "元")
    print("剩余余额:", result["data"]["remaining_credits"], "元")
else:
    print("调用失败:", result["message"])

Python(流式)

import json
import requests

resp = requests.post("https://your-domain/api/llm_api.php", json={
    "api_key": "你的API密钥",
    "action": "chat",
    "prompt": "写一段 200 字的产品介绍",
    "stream": 1,
}, stream=True, timeout=120)

for line in resp.iter_lines(decode_unicode=True):
    if not line or not line.startswith("data: "):
        continue
    payload = line[6:]
    if payload == "[DONE]":
        break
    obj = json.loads(payload)
    delta = obj.get("choices", [{}])[0].get("delta", {})
    if delta.get("reasoning_content"):
        print(delta["reasoning_content"], end="", flush=True)
    if delta.get("content"):
        print(delta["content"], end="", flush=True)