模型 API
完成首个模型调用
用发现请求确认鉴权,再从服务端完成一次文本调用。
1. 准备三个值
从 Portal 模型详情的“API 接入”取得 Base URL 和 模型别名,另在 API Key 页创建覆盖该模型的凭据。
JUSP_BASE_URL 包含末尾 /v1,没有末尾斜线。保留页面给出的协议、域名和端口;Portal 和文档使用 443,不表示模型 API 也取消了 10443。
export JUSP_BASE_URL='https://api.jusuanhub.com:10443/v1'
export JUSP_API_KEY='<API_KEY>'
export JUSP_MODEL='<从模型详情复制的文本模型别名>'这里的 Key 和模型值必须替换。避免 shell 调试回显,不在共享终端、录屏或日志中展示完整 Key。
2. 先检查可调用范围
curl --fail-with-body --max-time 30 "$JUSP_BASE_URL/models" \
-H "Authorization: Bearer $JUSP_API_KEY"这一步不会生成内容。失败时先处理鉴权或网络,不反复发起计费调用。服务发现见 GET /models 和 GET /services。
3. 发起文本请求
选择一个支持 Chat Completions 的模型。本例会调用真实模型,按当前服务规则计费;图片或视频模型请转到对应指南。
cURL
使用 jq 安全组装 JSON,不手动拼接用户文本。
jq -n --arg model "$JUSP_MODEL" \
'{model:$model,messages:[{role:"user",content:"用一句话介绍成都"}]}' |
curl --fail-with-body --max-time 330 "$JUSP_BASE_URL/chat/completions" \
-H "Authorization: Bearer $JUSP_API_KEY" \
-H 'Content-Type: application/json' --data-binary @-Python(标准库,无需平台 SDK)
import json
import os
import urllib.request
base = os.environ["JUSP_BASE_URL"].rstrip("/")
payload = {"model": os.environ["JUSP_MODEL"],
"messages": [{"role": "user", "content": "用一句话介绍成都"}]}
request = urllib.request.Request(
base + "/chat/completions", data=json.dumps(payload).encode(),
headers={"Authorization": "Bearer " + os.environ["JUSP_API_KEY"],
"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(request, timeout=330) as response:
result = json.load(response)
print(result["choices"][0]["message"]["content"])JavaScript(服务端)
const base = process.env.JUSP_BASE_URL.replace(/\/$/, '');
const response = await fetch(`${base}/chat/completions`, {
method: 'POST', signal: AbortSignal.timeout(330_000),
headers: { Authorization: `Bearer ${process.env.JUSP_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ model: process.env.JUSP_MODEL,
messages: [{ role: 'user', content: '用一句话介绍成都' }] }),
});
if (!response.ok) throw new Error(`调用失败:HTTP ${response.status}`);
const result = await response.json();
console.log(result.choices[0].message.content);这些超时值只是客户端等待预算,不扩大模型输出能力,也不会使服务端工作自动取消。模型输出上限、流式能力和更长调用期限应以目标服务公开合同为准。
本页 Python 示例只使用标准库。模型详情生成的媒体流程 Python 示例使用 requests,运行前在自己的虚拟环境安装该依赖;cURL 流程使用 jq,JavaScript 流程在支持内置 fetch 的 Node.js 服务端运行。它们都不是需要私有安装凭据的平台应用 SDK。
4. 判断是否完整
读取 choices[].finish_reason。长度限制结束不等于内容已经完整;检查目标模型允许的 max_tokens,必要时分段生成。流式调用还须正确消费 SSE,详见 文本与视觉。
请求失败或超时不能无条件重放,尤其已经开始返回内容时。参见 错误与恢复。