接入 GPT-6 Astra:最小请求、超时与回退怎么设计

17 阅读3分钟

接入 GPT-6 Astra:最小请求、超时与回退怎么设计

GPT-6 Astra 的价值不只是生成代码。对需要长时间运行的网站维护任务,更值得关注的是它能否连续完成读取项目、修改、测试和页面验收,减少人反复登录服务器和复制命令的次数。

在模型目录里看到 gpt-6-astra,只能证明页面展示了这个名称,不等于当前账号、分组和路由已经通过真实调用。

先跑最小请求

接入时不要立即把模型放进完整项目。先用 Responses API 验证地址可达、Key 有效、模型名可用、返回结构能被解析。

const baseURL = process.env.OPENAI_BASE_URL;
const apiKey = process.env.OPENAI_API_KEY;

if (!baseURL || !apiKey) {
  throw new Error('missing OPENAI_BASE_URL or OPENAI_API_KEY');
}

const response = await fetch(`${baseURL.replace(/\/$/, '')}/responses`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${apiKey}`,
  },
  body: JSON.stringify({
    model: 'gpt-6-astra',
    reasoning: { effort: 'low' },
    input: '只返回 OK',
  }),
});

const body = await response.text();
console.log({ status: response.status, body: body.slice(0, 300) });

OPENAI_BASE_URL 应使用当前账号文档中的真实接入地址,不要根据平台主页自行猜测 API 地址。日志也不应记录完整 Key 和请求正文。

超时要能取消

长任务不代表请求可以无限等待。应用需要显式设置超时,并在取消后给出可识别的错误;模型是否仍在目录中可以单独回读。

type CallResult = {
  ok: boolean;
  status?: number;
  retryable: boolean;
  data?: unknown;
  error?: string;
};

async function callModel(
  model: string,
  input: string,
  timeoutMs = 45_000,
): Promise<CallResult> {
  const controller = new AbortController();
  const timer = setTimeout(() => controller.abort(), timeoutMs);

  try {
    const response = await fetch(`${baseURL.replace(/\/$/, '')}/responses`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${apiKey}`,
      },
      signal: controller.signal,
      body: JSON.stringify({ model, input }),
    });

    const data = await response.json().catch(() => null);
    if (response.ok) return { ok: true, retryable: false, data };

    const retryable = response.status === 429 || response.status >= 500;
    return {
      ok: false,
      status: response.status,
      retryable,
      error: `upstream returned ${response.status}`,
    };
  } catch (error) {
    const timeout = error instanceof DOMException && error.name === 'AbortError';
    return {
      ok: false,
      retryable: true,
      error: timeout ? 'request timeout' : 'network error',
    };
  } finally {
    clearTimeout(timer);
  }
}

401 和 403 通常是凭据或权限问题,404 更可能与地址、路径或模型名有关。这类错误应先核对账号内文档,不应被当成普通抖动无限重试。429 和 5xx 可以做有上限的退避重试,但必须保留失败证据。

回退不能偷偷发生

回退模型应由业务配置指定,只在可重试错误上启用。候选模型只能从当前模型目录和账号实际权限中选;认证、权限或参数错误需要先修复原因,不能通过换模型掩盖。

async function callWithFallback(input: string) {
  const primary = await callModel('gpt-6-astra', input);
  if (primary.ok || !primary.retryable) return primary;

  const fallback = process.env.FALLBACK_MODEL;
  if (!fallback) return primary;

  return callModel(fallback, input, 30_000);
}

生产日志至少应记录请求 ID、目标模型、实际返回模型、状态码、用量和是否发生回退。如果只看最终有文本返回,就无法证明 GPT-6 Astra 真的被调用。

把调用证据和业务验收分开

最小请求通过,只能证明 API 链路基本可用。网站维护任务仍要分别验收:

  1. 本地修改是否符合项目规则;
  2. 构建和相关测试是否通过;
  3. 生产发布是否经过授权、备份和健康检查;
  4. 公开页面在电脑端和手机端是否真实可见;
  5. 账号用量与计费日志能否对应到这次请求。

如果使用 FishAI API 中转站 接入,先在账号内核对目录状态,再用真实请求、返回体、用量和计费日志完成闭环。不要把模型卡展示写成真实路由已验证。

GPT-6 Astra 是否能让网站维护更少打断,最终也不能只看模型回答。应记录人工追加指令次数、服务器登录次数、失败后接管次数和最终返工次数。这些数字下降,才是可验收的工程改善。

资料依据:OpenAI 官方模型文档。本文采用 AI 辅助整理。