diff --git a/README.md b/README.md
index a23d881..8a80aad 100644
--- a/README.md
+++ b/README.md
@@ -6,12 +6,14 @@
**自托管的 OCI 多租户管理面板与 GenAI 兼容网关**
-
-
-
-
+[](https://github.com/wangdefaa/oci-portal/releases/latest)
+[](go.mod)
+[](docker-compose.yml)
+[](LICENSE)
-[快速开始](#快速开始) · [核心能力](#核心能力) · [生产部署](#生产部署) · [AI 网关](#ai-网关) · [开发](#开发)
+[界面预览](#界面预览) · [核心能力](#核心能力) · [快速开始](#快速开始) · [生产部署](#生产部署) · [AI 网关](#ai-网关) · [开发](#开发)
+
+[AI 网关文档](docs/AI网关.md) · [OpenAPI](docs/swagger.yaml) · [更新日志](CHANGELOG.md) · [前端仓库](https://github.com/wangdefaa/oci-portal-dash)
@@ -21,27 +23,36 @@ OCI Portal 将多份 OCI API Key、云资源、自动化任务、审计事件和
## 界面预览
-| 总览 | 登录 |
-| --- | --- |
-|  |  |
+
+
+
-| 租户 | 任务 |
-| --- | --- |
-|  |  |
+
+展开更多界面截图
-| AI 网关 | 通知设置 |
+| 登录 | 租户 |
| --- | --- |
-|  |  |
+|  |  |
+
+| 任务 | AI 网关 |
+| --- | --- |
+|  |  |
+
+| 通知设置 |
+| --- |
+|  |
+
+
## 核心能力
-- **租户与区域**:集中管理多份 OCI API Key,支持分组、批量测活、账户画像、订阅区域缓存与区域切换;私钥和口令使用 AES-256-GCM 加密落库
-- **计算、网络与存储**:实例创建与电源操作、公网 IP、IPv6、VNIC、串行控制台连接,VCN / 子网 / 安全列表,引导卷与块存储挂载,限额和成本查询
-- **自动化任务**:抢机、租户测活、成本同步、AI 渠道探测四类 cron 任务,提供执行日志、重叠执行防护、熔断与结果通知
-- **网页控制台**:浏览器内使用 xterm 串行终端和 noVNC,通过 OCI 控制台连接建立两跳 SSH 隧道
-- **身份与审计**:IAM 用户、MFA、API Key、密码策略、SAML 身份提供商、通知收件人和多 Identity Domain 管理;OCI Audit 事件可经 Service Connector Hub 与 Notifications 回传,关键事件按类别通过「云端事件」通知推送
-- **通知与安全**:Telegram、Webhook、ntfy、Bark、SMTP 五类渠道;JWT、bcrypt、TOTP、OIDC / GitHub 登录、登录锁定、IP 限速、会话撤销和系统操作审计
-- **AI 网关**:提供 OpenAI Responses、Chat Completions、Embeddings 与 Anthropic Messages 兼容接口,支持渠道分组、加权路由、熔断探测、模型黑白名单、密钥管理和调用日志
+| 能力域 | 覆盖范围 |
+| --- | --- |
+| **租户与云资源** | 多 OCI API Key、分组、批量测活、账户画像、订阅区域缓存与切换;实例创建与电源操作、VNIC、公网 IP、IPv6、VCN、安全列表、引导卷、块存储挂载、限额与成本查询 |
+| **自动化与控制台** | 抢机、租户测活、成本同步、AI 渠道探测;执行日志、重叠防护、熔断与结果通知;xterm 串行终端、noVNC 和 OCI 控制台连接两跳 SSH 隧道 |
+| **身份与审计** | IAM 用户、MFA、API Key、密码策略、SAML、通知收件人与多 Identity Domain;通过 Service Connector Hub 与 Notifications 接收并分类推送 OCI Audit 事件 |
+| **通知与安全** | Telegram、Webhook、ntfy、Bark、SMTP;AES-256-GCM、JWT、bcrypt、TOTP、OIDC / GitHub 登录、登录锁定、IP 限速、会话撤销和操作审计 |
+| **AI 网关** | OpenAI Responses、Chat Completions、Embeddings 与 Anthropic Messages;渠道分组、加权路由、熔断探测、模型治理、密钥管理和调用日志 |
## 运行形态
@@ -57,7 +68,9 @@ OCI Portal 将多份 OCI API Key、云资源、自动化任务、审计事件和
└─────────────────────────────────────────────────────────────────┘
```
-默认推荐 SQLite 单实例部署。MySQL 和 PostgreSQL 适配仍属 experimental,不应据此推断服务支持多副本并发运行。
+> [!NOTE]
+> 默认推荐 SQLite 单实例部署。MySQL 和 PostgreSQL 适配仍属 experimental,
+> 不应据此推断服务支持多副本并发运行。
## 快速开始
@@ -65,6 +78,10 @@ OCI Portal 将多份 OCI API Key、云资源、自动化任务、审计事件和
前置条件:Docker、Docker Compose v2、OpenSSL。
+> [!CAUTION]
+> `.env` 中的 `DATA_KEY` 用于解密 OCI 私钥、口令和渠道凭据。首次生成后必须长期
+> 保存;升级或重装时不要覆盖,否则已有密文将无法恢复。
+
1. 克隆仓库并生成一份需要长期保存的 `.env`:
```bash
@@ -79,19 +96,27 @@ OCI Portal 将多份 OCI API Key、云资源、自动化任务、审计事件和
chmod 600 .env
```
-2. 准备数据目录并启动:
+2. 准备数据目录:
```bash
mkdir -p data
+ ```
- # Linux bind mount 需要让镜像内的 nonroot 用户(uid 65532)可写。
+ Linux 使用 bind mount 时,需要让镜像内的 nonroot 用户(uid `65532`)可写;
+ Docker Desktop 用户通常不需要执行:
+
+ ```bash
sudo chown 65532:65532 data
+ ```
+3. 启动并检查状态:
+
+ ```bash
docker compose up -d
docker compose ps
```
-3. 查看初始管理员密码并登录:
+4. 查看初始管理员密码并登录:
```bash
grep '^ADMIN_PASSWORD=' .env
@@ -99,7 +124,14 @@ OCI Portal 将多份 OCI API Key、云资源、自动化任务、审计事件和
访问 `http://127.0.0.1:18888`,默认用户名为 `admin`。
-> `DATA_KEY` 用于解密数据库中的 OCI 私钥、口令和渠道凭据。它只能生成一次并持续复用;丢失或更换后,已有密文无法恢复。请将 `.env` 与 `data/oci-portal.db` 一起备份。
+ 启动异常时查看最近日志:
+
+ ```bash
+ docker compose logs --tail=100 oci-portal
+ ```
+
+> [!TIP]
+> 请将 `.env` 与 `data/oci-portal.db` 成对备份;恢复时两者必须匹配。
### 二进制运行
@@ -107,6 +139,8 @@ Release 提供 Linux amd64 / arm64 二进制。以下以 amd64 为例;arm64
```bash
curl -fLO https://github.com/wangdefaa/oci-portal/releases/latest/download/oci-portal-server-linux-amd64
+curl -fLO https://github.com/wangdefaa/oci-portal/releases/latest/download/SHA256SUMS
+grep 'oci-portal-server-linux-amd64$' SHA256SUMS | sha256sum -c -
chmod +x oci-portal-server-linux-amd64
# 复用上文生成并妥善保存的 .env。
@@ -142,7 +176,9 @@ CGO_ENABLED=0 go build -trimpath -o bin/oci-portal-server ./cmd/server
## 生产部署
-服务本身只提供 HTTP。除本机试用外,应保持服务仅监听回环地址或容器内部网络,并由 TLS 反向代理提供 HTTPS;否则管理员密码、JWT、AI 密钥和租户凭据会经明文连接传输。
+> [!WARNING]
+> 服务本身只提供 HTTP。除本机试用外,应仅监听回环地址或容器内部网络,并由
+> TLS 反向代理提供 HTTPS;否则管理员密码、JWT、AI 密钥和租户凭据会经明文传输。
### Caddy
@@ -229,29 +265,31 @@ OpenAPI 文件随仓库维护:[`docs/swagger.yaml`](docs/swagger.yaml) · [`do
### 环境变量
-| 变量 | 必填 | 默认值 | 说明 |
+| 变量 | 使用条件 | 默认值 | 说明 |
| --- | :---: | --- | --- |
-| `DATA_KEY` | 是 | — | 敏感字段加密主密钥;必须持久保存,不能随意轮换 |
-| `JWT_SECRET` | 是 | — | JWT 签名密钥;更换会使已有登录令牌失效 |
-| `ADMIN_USERNAME` | 否 | `admin` | 初始管理员用户名 |
+| `DATA_KEY` | 必填 | — | 敏感字段加密主密钥;必须持久保存,不能随意轮换 |
+| `JWT_SECRET` | 必填 | — | JWT 签名密钥;更换会使已有登录令牌失效 |
+| `ADMIN_USERNAME` | 可选 | `admin` | 初始管理员用户名 |
| `ADMIN_PASSWORD` | 首次启动 | — | 仅在数据库无用户时创建管理员,不会重置已有密码 |
-| `ADDR` | 否 | `:8080` | HTTP 监听地址 |
-| `DB_DRIVER` | 否 | `sqlite` | `sqlite` / `mysql` / `postgres`;后两者为 experimental |
+| `ADDR` | 可选 | `:8080` | HTTP 监听地址 |
+| `DB_DRIVER` | 可选 | `sqlite` | `sqlite` / `mysql` / `postgres`;后两者为 experimental |
| `DB_PATH` | SQLite | `oci-portal.db` | SQLite 文件路径 |
-| `DB_DSN` | 外部数据库 | — | MySQL 需 `parseTime=True`;不要在日志或文档中暴露凭据 |
-| `PUBLIC_URL` | 否 | — | 面板公网基址,作为 OAuth 回调和日志回传引导的回退值 |
-| `TZ` | 否 | 系统时区 | cron 表达式的解释时区;容器示例使用 `Asia/Shanghai` |
-| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 否 | — | Go 标准出站代理变量;面板内显式代理配置优先用于对应业务 |
-| `SWAGGER` | 否 | 关闭 | 设为 `1` 时开放 Swagger UI |
-| `GIN_MODE` | 否 | `release` | `debug` / `release` |
+| `DB_DSN` | MySQL / PostgreSQL | — | MySQL 需 `parseTime=True`;不要在日志或文档中暴露凭据 |
+| `PUBLIC_URL` | 可选 | — | 面板公网基址,作为 OAuth 回调和日志回传引导的回退值 |
+| `TZ` | 可选 | 系统时区 | cron 表达式的解释时区;容器示例使用 `Asia/Shanghai` |
+| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 可选 | — | Go 标准出站代理变量;面板内显式代理配置优先用于对应业务 |
+| `SWAGGER` | 可选 | 关闭 | 设为 `1` 时开放 Swagger UI |
+| `GIN_MODE` | 可选 | `release` | `debug` / `release` |
## 升级与备份
-- 升级前同时备份 `.env` 和数据库;SQLite Compose 部署的数据文件为 `data/oci-portal.db`
-- 保持 `DATA_KEY` 不变;只恢复数据库而没有原密钥,敏感字段无法解密
-- 服务启动时会自动执行数据库迁移;跨版本升级前先阅读 [CHANGELOG](CHANGELOG.md)
-- Compose 部署使用 `docker compose pull && docker compose up -d` 更新镜像
-- OCI API Key 应遵循最小权限原则;生产环境保持 Swagger 关闭并限制管理面访问来源
+1. 阅读 [CHANGELOG](CHANGELOG.md),确认目标版本的行为变化。
+2. 备份 `.env` 和数据库。SQLite Compose 部署建议先停止服务,再复制
+ `data/oci-portal.db`,避免在线复制产生不一致快照。
+3. 保持原 `DATA_KEY` 不变;只有数据库而没有对应密钥时,敏感字段无法解密。
+4. Compose 部署执行 `docker compose pull`,再执行 `docker compose up -d`;服务启动时
+ 会自动完成数据库迁移。
+5. 生产环境保持 Swagger 关闭、限制管理面访问来源,并为 OCI API Key 配置最小权限。
## 开发
diff --git a/docs/AI网关.md b/docs/AI网关.md
index 018b16a..d12cac4 100644
--- a/docs/AI网关.md
+++ b/docs/AI网关.md
@@ -1,23 +1,33 @@
+
+
+
+
+

+
# AI 网关
+**将多路 OCI Generative AI 统一为 OpenAI、Anthropic 与 xAI 兼容接口**
+
+
+
+
+
+
+[快速接入](#quick-start) · [端点一览](#endpoints) · [路由机制](#routing) · [Codex 接入](#codex) · [已知限制](#limitations) · [兼容矩阵](#compatibility)
+
+
+
> [!NOTE]
-> OCI Portal AI 网关将多个 OCI GenAI 渠道统一为 OpenAI、Anthropic 与 xAI
-> 兼容接口,并集中处理鉴权、模型访问控制、渠道调度和协议适配。
->
-> 路径、参数与响应结构以 [Swagger YAML](swagger.yaml) 或运行时 Swagger UI
-> 为准;协议差异、兼容改写和实测边界以本文为准。
+> 网关集中处理密钥鉴权、模型访问控制、渠道调度与协议适配。路径、参数和
+> 响应结构以 [Swagger YAML](swagger.yaml) 或运行时 Swagger UI 为准;协议差异、
+> 兼容改写和实测边界以本文为准。
-**兼容快照:2026-07-15**
-
-## 快速导航
-
-- [快速接入](#quick-start)
-- [端点一览](#endpoints)
-- [路由与全局行为](#routing)
-- [Codex 接入](#codex)
-- [已知限制](#limitations)
-- [字段兼容矩阵](#compatibility)
-- [实现索引](#implementation)
+| 文档属性 | 当前值 |
+| --- | --- |
+| 兼容快照 | **2026-07-16** |
+| API 基址 | `/ai/v1` |
+| 首选对话协议 | OpenAI Responses |
+| 会话模式 | 无状态,客户端携带完整上下文 |
@@ -25,19 +35,13 @@
### 基础地址与鉴权
-```text
-Base URL: https://<网关地址>/ai/v1
-```
+网关密钥在管理面板中创建。连接信息如下:
-网关密钥在管理面板中创建,支持以下任一请求头:
-
-```http
-Authorization: Bearer sk-...
-```
-
-```http
-x-api-key: sk-...
-```
+| 项目 | 配置 |
+| --- | --- |
+| Base URL | `https://<网关地址>/ai/v1` |
+| Bearer 鉴权 | `Authorization: Bearer sk-...` |
+| API Key 鉴权 | `x-api-key: sk-...` |
密钥可绑定渠道分组和模型白名单。全局模型黑名单会同时作用于模型列表、
请求路由和探测候选;开启「过滤弃用模型」后,OCI 已宣布弃用的模型也会从
@@ -50,6 +54,15 @@ curl "https://<网关地址>/ai/v1/models" \
-H "Authorization: Bearer $OCI_PORTAL_KEY"
```
+再发起一条最小 Responses 请求;请将示例模型替换为模型列表中的可见模型:
+
+```bash
+curl "https://<网关地址>/ai/v1/responses" \
+ -H "Authorization: Bearer $OCI_PORTAL_KEY" \
+ -H "Content-Type: application/json" \
+ -d '{"model":"xai.grok-4.3","input":"你好,请用一句话介绍自己。"}'
+```
+
## 端点一览
@@ -66,12 +79,14 @@ curl "https://<网关地址>/ai/v1/models" \
| 安全 | `POST /ai/v1/moderations` | OpenAI 外壳映射 OCI Guardrails | — |
| 发现 | `GET /ai/v1/models` | 当前密钥可见模型列表 | — |
-选择建议:
+### 如何选择协议
-- 新客户端优先使用 **Responses**
-- Anthropic SDK 或 Claude 生态客户端使用 **Messages**
-- 仅支持旧 OpenAI 对话协议的客户端使用 **Chat Completions**
-- Embeddings、TTS、Rerank 与 Moderations 使用各自专用端点
+| 使用场景 | 推荐接口 |
+| --- | --- |
+| 新客户端、推理模型、服务端工具 | **Responses** |
+| Anthropic SDK、Claude 生态客户端 | **Messages** |
+| 仅支持旧 OpenAI 对话协议的客户端 | **Chat Completions** |
+| 向量、语音、重排与安全审核 | 对应专用端点 |
@@ -106,6 +121,14 @@ flowchart LR
| 文件输入 | `input_file` 会被 OCI ZDR 形态拒绝,详见[已知限制](#limitations) |
| Chat 定位 | Chat Completions 只承担协议转换与兼容修复;新能力优先落在 Responses 与 Messages |
+### 可配置运行策略
+
+| 策略 | 默认行为 | 配置入口 |
+| --- | --- | --- |
+| Responses 流式保险丝 | 开启;阈值 `60 KB`,按 `instructions` 与 `tools` 两个字段的原始 JSON 值计算 | **设置 → AI → 流式保险丝** |
+| Grok 服务端搜索 | 对 `xai.` 模型默认注入 `web_search` 与 `x_search`;同名工具不重复覆盖 | **设置 → AI → Grok 服务端搜索工具** |
+| 弃用模型过滤 | 开启后从模型列表、请求路由与探测候选中统一排除 | **设置 → AI → 模型治理** |
+
## Codex 接入
@@ -143,7 +166,7 @@ model = "xai.grok-4.3"
```
> [!IMPORTANT]
-> `codex-cli 0.144.1` 已实测主会话和 multi-agent 子代理全链路可用。
+> `Codex CLI 0.144.1` 已实测主会话和 multi-agent 子代理全链路可用。
> 内置 worker 可能先尝试 `gpt-5.6-luna` 或 `gpt-5.4`;网关没有对应渠道时
> 会出现少量 404,随后由 Codex 回落到可用模型。自定义 agent 的模型覆盖是否
> 直接生效取决于 Codex 版本;0.144.1 的实测主要依赖自动回落。
@@ -165,38 +188,35 @@ Codex 工具兼容现状:
## 已知限制
-### 超大流式请求
-
-上游流式断流有两个独立触发维度,状态不同:
+### `instructions` / `tools` 大体量流式断流
> [!WARNING]
-> **instructions + tools 合计超过约 64.5 KB** 的流式请求,上游会在推理阶段
-> 静默断连(纯 EOF,无 error / 终态事件);同请求非流式总是成功,`input`
-> 正文完全不计入。2026-07-13 定位(字节级二分),**2026-07-16 复测仍存在**
-> (70.4 KB 断 / 59.7 KB 过,Chicago,API Key 与签名行为一致)。
+> `instructions` 与 `tools` 两个字段的原始 JSON 值合计超过约 **64.5 KB** 时,
+> 上游流式请求可能在推理阶段静默断连:连接直接 EOF,不发送 `error` 或终态事件。
+> 同一请求改为非流式实测可正常完成;单独扩大 `input` 未触发该限制。
-> [!NOTE]
-> **完整请求体超过约 82 KB**(含 input)的纯体积断流(2026-07-15 定位)
-> **已被上游修复**:2026-07-16 复核 83 KB、真实 codex 形态 104.5 KB、200 KB、
-> 400 KB 流式均正常完成(Chicago 与 Phoenix 两区、签名与 API Key 两路径对照)。
+该问题于 2026-07-13 通过字节级二分定位,2026-07-16 在 Chicago 复测仍存在:
+`70.4 KB` 断流、`59.7 KB` 正常,API Key 与签名鉴权表现一致。本文及设置页中的
+`KB` 均按 `1024 B` 计算。
-网关当前行为:
+| 协议 | 网关保护 | 客户端表现 |
+| --- | --- | --- |
+| Responses | 保险丝默认开启;超过 `60 KB` 时改走非流式上游,并合成最小 SSE 序列 | 结果语义保留,但不再增量输出 |
+| Chat Completions / Messages | 客户端尚未收到内容就断流时,自动改用非流式重做 | 合成对应 chunk / event 序列 |
+| 已开始输出的流 | 无法透明重试;调用日志记录提前终止 | 客户端可能只收到部分事件 |
-- **Chat Completions / Messages**:若上游在客户端收到任何内容前断流,自动用
- 非流式重做,并合成对应 chunk / event 序列(可兜住 64.5 KB 断流)
-- **Responses**:直通协议中途无法透明重试(客户端已收到事件)。流式保险丝按
- `instructions + tools` 字节和判定:超过阈值时预防性改非流式上游 + 合成最小
- SSE 事件序列(`response.created` → `response.output_item.done` →
- `response.completed`),语义保留但无增量输出。默认开、60 KB,可在
- **设置 → AI → 流式保险丝** 调整或关闭
-- **已开始输出的流**:不能透明重试;调用日志会记录提前终止,客户端可能只拿到
- 部分事件
+Responses 合成的最小事件序列为:`response.created` →
+`response.output_item.done` → `response.completed`。保险丝可在
+**设置 → AI → 流式保险丝** 调整或关闭。
-### grok 服务端搜索工具默认注入
+
+历史问题:完整请求体体积断流(已由上游修复)
-对 `xai.` 前缀模型的 Responses 请求,网关按开关默认注入 `web_search` /
-`x_search` 工具;请求 tools 已包含同名工具时保持原样,不覆盖参数。默认双开,
-可在 **设置 → AI → grok 服务端搜索工具** 关闭。
+2026-07-15 曾在完整请求体约 `82 KB`(含 `input`)时观测到纯体积流式断流。
+2026-07-16 复核 `83 KB`、真实 Codex 形态 `104.5 KB`、`200 KB` 与 `400 KB`
+请求均正常完成;Chicago 与 Phoenix、签名与 API Key 两条路径结果一致。
+
+
### ZDR 与文件输入
@@ -208,16 +228,20 @@ File content is currently unsupported for ZDR customers
网关强制 `store:false`,属于 ZDR 请求形态,因此当前不能通过该端点上传或引用文件。
-### 规格与实测边界
-
-本项目提供的是兼容接口,而不是 OpenAI、Anthropic 或 xAI 协议的完整实现。
-部分 OCI OpenAI 兼容行为来自实测,未见 Oracle 文档合同,可能随上游调整。
-
## 字段兼容矩阵
-矩阵基线:
+> [!IMPORTANT]
+> 本项目提供兼容接口,而不是 OpenAI、Anthropic 或 xAI 协议的完整实现。部分 OCI
+> OpenAI 兼容行为来自实测,未见 Oracle 文档合同,可能随上游调整。
+
+### 矩阵索引
+
+[Responses](#compat-responses) · [Chat Completions](#compat-chat) · [Messages](#compat-messages) · [Embeddings](#compat-embeddings) · [语音生成](#compat-audio) · [Rerank](#compat-rerank) · [Moderations](#compat-moderations) · [Models](#compat-models)
+
+
+展开参考规格
- [OpenAI Responses](https://developers.openai.com/api/reference/resources/responses/methods/create)
- [OpenAI Chat Completions](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create)
@@ -227,6 +251,8 @@ File content is currently unsupported for ZDR customers
- [Anthropic Messages](https://platform.claude.com/docs/en/api/messages/create)
- [Cohere Rerank](https://docs.cohere.com/reference/rerank)
+
+
| 标记 | 含义 |
| :---: | --- |
| ✅ | 网关直接支持 |
@@ -234,6 +260,8 @@ File content is currently unsupported for ZDR customers
| 🔄 | 网关执行字段或协议转换后支持 |
| ◐ | 部分支持、存在前置条件或语义降级 |
+
+
### OpenAI Responses
**`POST /ai/v1/responses` · 无状态主接口**
@@ -255,12 +283,12 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
| `reasoning` | ➡️ | 整个对象保留;`effort` 不校验档位 |
| `tool_choice` | ◐ | 普通形态保留;namespace 对象会重限定,全部工具被剥离时删除 |
| `store` | 🔄 | 无论客户端传什么,上游请求都强制改写为 `false` |
-| `stream` | ◐ | 支持 SSE;网关按 instructions+tools 字节和触发预防性非流式回退(保险丝,默认开 60 KB,见[已知限制](#limitations)) |
+| `stream` | ◐ | 支持 SSE;`instructions` 与 `tools` 的原始 JSON 值合计超过保险丝阈值时,预防性改走非流式上游(默认开启、`60 KB`,见[已知限制](#limitations)) |
| 其余标准与未知顶层字段 | ➡️ | `context_management`、`include`、`metadata`、`prompt`、`prompt_cache_key`、`service_tier`、`truncation`、`user` 等均保留,由 OCI 决定是否接受 |
-
+
工具兼容
| 工具或参数 | 状态 | 网关行为 |
@@ -270,7 +298,7 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
| `tools[].type=mcp` | ➡️ | 远程 MCP 由上游直连,`server_url`、`require_approval`、`authorization` 等保留 |
| `tools[].type=namespace` | 🔄 | 子 `function` 上提并限定命名;响应、历史调用和 `tool_choice` 会反向还原;组内非 `function` 子工具被剥离 |
| `tools[].type=custom` | ◐ | 顶层非 `apply_patch` 工具转为带 `input` schema 的 `function`;响应与多轮历史双向回转;`format` 会删除 |
-| `custom:apply_patch` | ◐ | 整体剥离;grok 系未针对 Codex 补丁格式训练,模型应回落其他编辑方式 |
+| `custom:apply_patch` | ◐ | 整体剥离;Grok 系未针对 Codex 补丁格式训练,模型应回落其他编辑方式 |
| `tools[].type=tool_search` | ◐ | 请求可被接受,但工具本身直接剥离 |
| `web_search.external_web_access=true` | 🔄 | 删除上游不识别的字段,保留 `web_search` |
| `web_search.external_web_access=false` | ◐ | 上游没有“仅缓存检索”对应能力,按不越权原则剥离整个工具 |
@@ -293,6 +321,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
- 未知模型返回 404,无可用渠道返回 503
- 上游错误使用 OpenAI 风格错误外壳,但不保证字段与标准 OpenAI 完全一致
+
+
### OpenAI Chat Completions
**`POST /ai/v1/chat/completions` · 存量客户端兼容层**
@@ -348,6 +378,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
`prompt_tokens_details.cached_tokens`
- 已开始输出的流中断不会转换成标准 SSE 错误事件
+
+
### Anthropic Messages
**`POST /ai/v1/messages` · Anthropic 协议转换层**
@@ -401,6 +433,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
- usage 只保留 `input_tokens`、`output_tokens` 与 `cache_read_input_tokens`
- 流式上游错误与无终态断流会转成 Anthropic `error` 事件
+
+
### OpenAI Embeddings
**`POST /ai/v1/embeddings` · 向量化专用端点**
@@ -418,6 +452,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
响应使用标准 `object:"list"` 外壳,向量为 `float32` 数组,不支持流式。
+
+
### 语音生成
两个端点最终使用同一 OCI xAI TTS 上游与渠道调度:
@@ -458,6 +494,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
- 不提供 HTTP 流式音频或 WebSocket 代理
- 无 token 用量口径,调用日志只记时延与渠道
+
+
### Rerank
**`POST /ai/v1/rerank` · Cohere / Jina 风格协议**
@@ -475,6 +513,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
`max_tokens_per_doc` 与未知字段静默忽略。响应按相关度降序,
`results[].index` 指向输入下标,`relevance_score` 为 0~1 浮点;无 token 用量口径。
+
+
### Moderations
**`POST /ai/v1/moderations` · OpenAI 外壳映射 OCI Guardrails**
@@ -496,6 +536,8 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
- 实测中文人名与手机号识别较弱,英文 PII 识别正常
- 响应 `model` 恒为 `oci-guardrails`
+
+
### Models
**`GET /ai/v1/models` · 当前密钥可见模型列表**
@@ -512,7 +554,7 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
-## 实现索引
+## 附录:实现索引
| 端点 / 能力 | 主要实现 |
| --- | --- |
@@ -526,3 +568,5 @@ Codex 工具兼容改写。请求会重新编码,不承诺字节级原样转
本文是兼容性快照,不替代 Swagger。标准接口、Codex 客户端与 OCI 上游均可能
变化,最终行为以当前版本代码、运行时 Swagger 和实测结果为准。
+
+[返回顶部](#top)