# 文本与多模态

OpenAI Chat 文本请求至少包含 `model`、`messages` 与正整数 `max_tokens`，输出上限不得超过目录中的 `maxOutputTokens`。对话历史按顺序追加到 `messages` 中，再发送下一次请求。型号必须来自本站服务端目录，协议、密钥权限与额度均满足才可调用。

## 常用参数

| 参数 | 用途 | 说明 |
| --- | --- | --- |
| `model` | 具体型号 | 使用完整模型 ID |
| `messages` | 对话内容 | 包含角色与消息内容 |
| `stream` | 流式输出 | `true` 时按流式协议读取 |
| `max_tokens` | 限制生成长度 | 本文的 OpenAI Chat 请求必填；为不超过目录 `maxOutputTokens` 的正整数，其他协议参数名不同 |
| `temperature` | 调整输出随机性 | 部分推理型号不接受此参数 |

## Python 示例

以下示例使用 Python 标准库，在服务端读取环境变量。

```python
import json
import os
from urllib.request import Request, urlopen

payload = {
    "model": os.environ["AI_RELAY_MODEL"],  # 目录中的真实 openai-chat 型号
    "messages": [{"role": "user", "content": "帮我整理一份项目计划。"}],
    "max_tokens": int(os.environ["AI_RELAY_MAX_TOKENS"]),  # 不超过目录 maxOutputTokens
}
request = Request(
    os.environ["AI_RELAY_BASE_URL"].rstrip("/") + "/chat/completions",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + os.environ["AI_RELAY_API_KEY"],
        "Content-Type": "application/json",
    },
    method="POST",
)
with urlopen(request, timeout=60) as response:
    result = json.load(response)
    print(result["choices"][0]["message"]["content"])
```

## JavaScript 示例

适用于支持 `fetch` 的 Node.js 服务端环境。代码读取环境变量，不在网页中填写真实密钥。

```javascript
const baseURL = process.env.AI_RELAY_BASE_URL;
const apiKey = process.env.AI_RELAY_API_KEY;
const model = process.env.AI_RELAY_MODEL;
const maxTokens = Number(process.env.AI_RELAY_MAX_TOKENS);
if (!baseURL || !apiKey || !model || !Number.isSafeInteger(maxTokens) || maxTokens < 1) {
  throw new Error("请配置接入地址、密钥、目录中的真实型号与允许的最大输出 Token");
}

const response = await fetch(baseURL.replace(/\/$/, "") + "/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model,
    messages: [{ role: "user", content: "帮我整理一份项目计划。" }],
    max_tokens: maxTokens, // 不超过该型号目录 maxOutputTokens
  }),
  signal: AbortSignal.timeout(60000),
});
if (!response.ok) throw new Error("请求失败：" + response.status);
const result = await response.json();
console.log(result.choices[0].message.content);
```

## 流式与图像理解

设置 `stream: true` 后，响应通常为 SSE 事件流，应逐段读取并在结束信号到达时完成对话；不能按普通完整 JSON 处理。

支持图像理解的文本模型可接收图文内容，但这不代表它能生成图片。图片输入格式与大小限制以对应接口说明为准。先在[模型广场](../models.html)确认能力，再配置请求。

