Files
codex_backend/main.cjs.md
T
2026-05-24 22:53:05 +09:00

2.7 KiB

index.cjs 说明

文件作用

这个文件启动本地 Express 服务,为前端提供 Codex 登录管理、普通聊天和流式聊天 API。它把 HTTP 请求转换成对 codexClient.cjs 的函数调用,并负责错误转换、CORS、JSON 解析和 SSE 输出。

服务配置

  • PORT:默认 8787,可通过环境变量 PORT 覆盖。
  • HOST:默认 127.0.0.1,可通过环境变量 HOST 覆盖。
  • 使用 cors 只允许本地来源。
  • 使用 express.json({ limit: '2mb' }) 解析 JSON 请求体。

主要函数

isAllowedOrigin(origin)

判断请求来源是否允许:

  • 没有 origin 时允许,方便非浏览器或同源请求。
  • 只允许 hostname 为 localhost127.0.0.1::1 的来源。
  • URL 解析失败时拒绝。

writeSse(res, eventName, data)

向响应写入一条 SSE 事件:

  • 写入 event: 事件名
  • 写入 JSON 序列化后的 data:
  • 用空行结束事件。

toHttpStatus(error)

从错误对象中读取 statusstatusCode。如果是合法 4xx/5xx 状态码就返回它,否则返回 500。

toErrorMessage(error)

把错误对象转换为可返回给前端的字符串。优先使用 error.message,没有错误时返回未知错误文案。

API 路由

GET /api/health

健康检查接口,返回 { ok: true, provider: 'codex-sdk' }

GET /api/codex/status

强制刷新 Codex 登录状态,调用 getAuthStatus({ force: true })。失败时返回标准错误 JSON。

GET /api/codex/login-log

返回当前或最近一次 Codex 登录进程状态,数据来自 getLoginState()

POST /api/codex/login

启动 Codex 登录流程。请求体中的 deviceAuth 控制是否使用设备码登录。接口返回 202 和登录状态。

POST /api/codex/logout

执行 Codex 退出登录。命令成功时返回 200,命令失败时返回 500。

POST /api/chat

普通非流式聊天接口:

  • 为请求创建 AbortController
  • 监听响应 close,如果客户端提前断开则中止 Codex 运行。
  • 调用 runCodexOnce(req.body, controller.signal)
  • 成功时返回 JSON 结果,失败时返回错误 JSON。

POST /api/chat/stream

流式聊天接口:

  • 创建 AbortController 并监听客户端断开。
  • 设置 text/event-stream、禁用缓存和保持连接。
  • 调用 runCodexStream
  • onDelta 时写入 delta SSE 事件。
  • onError 时写入 error SSE 事件。
  • 正常完成时写入 done SSE 事件并结束响应。
  • 异常时写入 error 事件并结束响应。

依赖关系

该文件从 codexClient.cjs 引入 Codex 相关能力。前端 src/utils/api.js 会调用这里暴露的 API。