# Deno + OpenAI

OpenAI 官方 JavaScript SDK 可以通过 Deno 的 npm 兼容层直接使用。当前新文本生成项目优先采用 Responses API。

```bash
deno add npm:openai
```

```ts title="main.ts"
import OpenAI from "openai";

const model = Deno.env.get("OPENAI_MODEL");
if (!model) throw new Error("OPENAI_MODEL is required");

const client = new OpenAI(); // 默认读取 OPENAI_API_KEY
const response = await client.responses.create({
  model,
  instructions: "Answer accurately and say when evidence is missing.",
  input: "Explain Deno permissions in two sentences.",
});

console.log(response.output_text);
```

```bash
OPENAI_MODEL=<已验证的模型名> \
OPENAI_API_KEY=<密钥> \
deno run --allow-env=OPENAI_MODEL,OPENAI_API_KEY \
  --allow-net=api.openai.com:443 main.ts
```

## 为什么不硬编码模型

模型可用性、价格与能力会变化。把模型作为部署配置，基于自己的质量、延迟、成本与安全评测固定值；升级时对同一评测集做对照。不要让示例代码中的临时默认值变成生产决策。

## 服务端边界

- API key 只能留在服务端，不传给浏览器。
- 记录 request ID、模型、耗时、token 用量与错误类别，不记录密钥和完整敏感输入。
- 为外部请求设置 deadline，并在客户端断开时取消上游。
- 将模型输出视作不可信数据；渲染 HTML、执行工具或写数据库前继续校验。
- `response.output` 可能包含多种 item；只要文本时用 SDK 的 `output_text` 聚合属性。

官方参考：[OpenAI text generation](https://developers.openai.com/api/docs/guides/text)、[OpenAI JavaScript SDK](https://github.com/openai/openai-node)、[Deno AI examples](https://docs.deno.com/examples/?category=ai)。
