跳到正文

Python 与 JavaScript ​

以下示例调用 COCO API 的 Chat Completions 兼容端点,仅用于服务端或可信本地环境。运行会产生真实用量;文档编写时没有用你的密钥执行这些生成请求。

准备环境变量 ​

将 COCO_API_KEY 设置为本站密钥,COCO_MODEL 设置为该密钥分组可用的精确模型名称。不要把真实密钥硬编码进源码。

macOS / Linux 示例:

sh
export COCO_API_KEY='YOUR_COCO_API_KEY'
export COCO_MODEL='YOUR_MODEL_ID'

占位符需要替换。共享机器应通过密钥管理服务或私密配置注入,避免将密钥长期保存在命令历史中。

Python ​

在项目自己的虚拟环境安装 OpenAI Python SDK:

sh
python3 -m venv .venv
source .venv/bin/activate
python -m pip install openai

以下代码显式设置 base_url,不会把请求发到 OpenAI 官方默认域名。示例关闭 SDK 自动重试,便于首次测试时控制意外重复请求。

python
import os
from openai import OpenAI, APIStatusError, APIConnectionError

client = OpenAI(
    api_key=os.environ["COCO_API_KEY"],
    base_url="https://api.cocoapi.top/v1",
    timeout=120.0,
    max_retries=0,
)

try:
    result = client.chat.completions.create(
        model=os.environ["COCO_MODEL"],
        messages=[{"role": "user", "content": "Reply with OK only."}],
        max_tokens=32,
    )
    if result.choices:
        print(result.choices[0].message.content or "No text content returned.")
    else:
        print("No choices returned. Check the response and usage log.")
except APIStatusError as error:
    print("HTTP status:", error.status_code)
    print("Request ID:", error.response.headers.get("x-oneapi-request-id", "unavailable"))
except APIConnectionError:
    print("Connection failed. Check the network, TLS, proxy and timeout settings.")
finally:
    client.close()

max_tokens 适用于支持该字段的模型。若模型拒绝该参数,请按它的协议说明改用适配参数;不要仅因 HTTP 400 就启用无限重试。

SDK 的自定义 base_url 用法参考 OpenAI Python 官方文档。这不代表本站实现 SDK 暴露的所有官方接口。

JavaScript / Node.js ​

Node.js 20+ 可直接使用内置 fetch。将示例作为 ESM 文件运行,例如 example.mjs。不要把这段密钥调用直接放到公开网页前端。

javascript
const key = process.env.COCO_API_KEY;
const model = process.env.COCO_MODEL;
if (!key || !model) {
  throw new Error('Set COCO_API_KEY and COCO_MODEL first.');
}

try {
  const response = await fetch('https://api.cocoapi.top/v1/chat/completions', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${key}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model,
      messages: [{ role: 'user', content: 'Reply with OK only.' }],
      max_tokens: 32,
      stream: false
    }),
    signal: AbortSignal.timeout(120000)
  });

  const requestId = response.headers.get('x-oneapi-request-id') || 'unavailable';
  if (!response.ok) {
    console.error(`HTTP ${response.status}; request ID: ${requestId}`);
    process.exitCode = 1;
  } else {
    const result = await response.json();
    console.log(result.choices?.[0]?.message?.content ?? 'No text content returned.');
  }
} catch (error) {
  console.error('Request failed:', error.name);
  process.exitCode = 1;
}

这里没有自动重试,也没有打印请求头或密钥。需要更完整的错误诊断时,在私密环境检查经过脱敏的响应体。

接入生产应用前 ​

  • 将密钥保存在后端,浏览器只访问你自己的受控业务接口。
  • 给最终用户做鉴权和速率限制,不能让后端变成任何人都能调用的公开转发接口。
  • 限制输出长度、并发和费用预算,配置监控与异常告警。
  • 验证实际需要的协议、流式结束行为和账单,不要只验证 HTTP 200。
  • 日志中保留必要的状态码、时间、模型和请求编号,避免记录完整提示词和敏感请求头。