企业级 AI 中台 —— 汇聚 家厂商 · 分发 种原子能力, 为 款产品提供 统一鉴权 · 配额管控 · 调用审计 · 智能路由。 让每一次 AI 调用都可观测、可控制、可优化。
对接阿里 DashScope / 字节火山 Ark / 硅基流动 / DeepSeek / OpenAI / Kimi / 智谱 等 21 家厂商,统一为 chat / translate / tts / asr / embed / vl / avatar 7 种原子能力。一个 endpoint,多家供应。
X-App-Key 鉴权 · 按 app/user 维度的 RPM 限流 + 日 CNY 配额 · 全量 调用审计 · 失败自动 熔断与降级。密钥零下放到端侧。
SSE 9 事件 + JSON + job-poll 三协议自适应弱网移动端 · vendor/model 路由 可灰度可 A/B · Idempotency-Key 防重 · 对端侧零侵入升级。
/system/overview 实时聚合 —— 内存 ring 缓冲(最近 次调用)。audit_log (PG),T1 上线。
plugins/quota.ts)。
plugins/idempotency.ts)。/translate 多 vendor 串行 fallback。src/routes/ai/*.ts 实现 —— LIVE 已上线 / ROADMAP 规划中,绝不挂羊头卖狗肉。/translate 走多 vendor 串行链。/chat 故意 strict-vendor,避免 model 契约错乱。/system/overview.protections;认证均为 PLANNED 状态 —— 不挂未取得的徽章。plugins/auth.tsplugins/idempotency.tsplugins/quota.tsplugins/stats.ts
中枢驱动的 款产品 — 教育 · 翻译 · 助手 · 工业。每一款都跑在同一套 AI 能力供给上。直接试用 H5,或查看桌面客户端的产品资料。
中枢全链路可观测:调用频次、Token 消耗、端到端延迟、错误分布按时间窗口聚合;Top apps · vendors · routes · models 实时排行。
| App | 调用 | 错误 | CNY |
|---|---|---|---|
| ¥ | |||
| 无数据 | |||
| Vendor | 调用 | 错误 | CNY |
|---|---|---|---|
| ¥ | |||
| 无数据 | |||
| Route | 调用 | avg ms | 错误 |
|---|---|---|---|
| 无数据 | |||
| Model | 调用 | tokens | CNY |
|---|---|---|---|
| / | ¥ | ||
| 无数据 | |||
| 时间 | app | route | vendor | model | in/out | ms | CNY | status |
|---|---|---|---|---|---|---|---|---|
| / | ¥ | |||||||
| 还没有调用记录 — 跑一发请求试试 | ||||||||
每款产品一把 X-App-Key —— 配额隔离 · 调用归因 · 独立治理。 当前 dev 模式:只显示固定 fallback key + ring buffer 观测到的 app。
| app_id | key_hint | scopes | RPM | 日额 (CNY) | 今日 calls | 今日 CNY | 最近活跃 |
|---|---|---|---|---|---|---|---|
|
synthetic
revoked
|
… |
|
¥ | ||||
| 无 App Key | |||||||
DATABASE_URL=... npx tsx scripts/seed-app-key.ts <app_id> <daily_cny> <rpm>
apps/.md
尚未创建产品介绍 manifest(apps/.md)。
如需展示产品 profile,请在该目录添加带 YAML frontmatter 的 markdown 文件。
注:profile 接口需 X-Admin-Token;空 token 也会返回 404 提示。
X-Admin-Token(顶部 "服务/限流" tab 内)后可查看断流分析与详细 vendor / capability / error 分布。
| vendor | calls | errors | aborted | abort rate | avg TTFB | P95 latency |
|---|---|---|---|---|---|---|
| capability | calls | stream | aborted |
|---|---|---|---|
| time | vendor | capability | reason | TTFB | duration |
|---|---|---|---|---|---|
中枢深度分析层:跨产品调用概览 + 单产品下钻。覆盖流式健康、断流根因、per-vendor 性能画像、错误码分布 —— 让每一次异常都有迹可循。
/admin?admin_token=<TOKEN>#analytics,token 自动存进 localStorage,URL 上的 query 会被立即清除(不会进书签)。或在右上方输入框手动粘贴。
| app | calls | errors | streams | aborted | abort rate | avg TTFB | P95 latency | silent for | |
|---|---|---|---|---|---|---|---|---|---|
| vendor | calls | errors | aborted | abort rate | avg TTFB | P95 latency |
|---|---|---|---|---|---|---|
| capability | calls | stream | aborted |
|---|---|---|---|
| time | vendor | capability | reason | TTFB | duration |
|---|---|---|---|---|---|
把 AI 中枢升级为 AI + 知识 + 连接器 三位一体的能力底座。围绕 教育 / 会议 / 办公 / 出口贸易 / 细分行业 链接和补齐所需资源 —— 知识库、Prompt 模板、工具连接器、结构化数据、多媒体素材,统一目录、统一鉴权、统一计费。
curl https://ainextcore.cn/api/v1/catalog/list?kind=tool&limit=5 \ -H "X-App-Key: pk_<your_slug>_<24c>"
curl -X POST https://ainextcore.cn/api/v1/mcp \
-H "X-App-Key: pk_<your_slug>_<24c>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
curl -X POST https://ainextcore.cn/api/v1/catalog/datasets/china_provinces/sample \
-H "X-App-Key: pk_<your_slug>_<24c>" \
-d '{"n":5}'
curl "https://ainextcore.cn/api/v1/catalog/prompts/<id>/render?vars=%7B%22subject%22%3A%22math%22%7D" \ -H "X-App-Key: pk_<your_slug>_<24c>"
| 资源类 | 动词 endpoint | 说明 |
|---|---|---|
| tool | POST /api/v1/mcp (tools/call) | JSON-RPC 2.0 · 4 内置 first-party 工具 |
| prompt | GET /api/v1/catalog/prompts/:id/render | Mustache-lite 变量替换 + 缺失声明 |
| knowledge | POST /api/v1/catalog/knowledge/search | 语义 top-K 召回 (BGE/embed) |
| dataset | POST /api/v1/catalog/datasets/:id/sample | N 随机样本 · bundle 或单条 |
| asset | GET /api/v1/catalog/assets/:id/signed-url | HMAC 签名 · 外部资产返回 upstream |
| content | POST /api/v1/catalog/content/search | 关键词 + subkind/owner 过滤 |
Vendor 总开关(全局 / 全 app)· service_policies 限流与配额策略 · 熔断降级规则。一切策略均可热生效,修改需 Admin Token。
DATABASE_URL 才能编辑策略;当前 DISABLE_PG=1 模式下只能查看 vendor 列表。
| vendor | capabilities | key | 总开关 |
|---|---|---|---|
| 未注册 |
—
|
||
| 无 vendor | |||
| scope | enabled | RPM | 日额 (CNY) | note | 操作 |
|---|---|---|---|---|---|
| 填入 Admin Token 后即可加载策略 pg 未启用,无 service_policies 表 暂无策略 — 点右上「新增策略」 | |||||
中枢上游:21 家厂商 × 7 种能力 的对接矩阵。绿点 = key 已配置可调度,灰点 = 等待 key。下方按 vendor 展开已注册模型 catalog + 单价 + ctx。
| Vendor | key | RPM | |
|---|---|---|---|
| 未注册 | — |
| model | cap | in/M | out/M | ctx |
|---|---|---|---|---|
专家库做定制诊断 · 量表升级让评分有依据 · 教学目标看是否真正达成。完全 platform-api 内置,复用 Nexus 网关的 LLM / ASR 通道。
区/校本评课逻辑沉淀虚拟专家:关联课例后定制诊断 + 连续追问 + 改进建议。
DOC/PDF 一键导入 → AI 自动拆解观测点与评价细则 → 一键 AI 优化补全分层标准。
从目标出发回看结构 / 行为 / 策略 / 成效四维,判断预设目标是否达成。
5 步从零到第一次 AI 调用 · 4 种接入方式按场景选 · 5 类资源全部可用 · 8 个生产级 reference 实现可抄作业。所有 endpoint 都在
最直接。你的后端服务直接 POST 中枢 endpoint。X-App-Key 在服务端 env,永远不下放端侧。
# fetch / curl / OkHttp / 任何 HTTP client POST /api/v1/ai/chat X-App-Key: pk_xxx {"messages":[...]}
推荐给 H5 / 移动端。你的 BFF 服务做透传 + 用户态注入,端侧只跟自己 BFF 通信,App Key 永不下放。
// Node BFF (Express / Hono / Fastify) app.post('/api/chat', async (req, res) => { // 注入 X-App-Key(服务端 env) const r = await fetch(GW + '/ai/chat', { headers: { 'X-App-Key': process.env.KEY }, body: req.body, }); });
桌面 / 跨端原生 App 用。一个 Adapter 类封装 X-App-Key 管理 + SSE 解析 + 事件分发,给业务层用 Qt signal / Promise / Future。
// Qt5 / C++ — 已有 PlatformGatewayClient PlatformGatewayClient gw("http://...", KEY); connect(&gw, &Client::textChunk, this, &Self::onChunk); gw.streamChat(req);
官方 SDK 封装鉴权 / SSE 解析 / 重试 / 错误码。Python 已发包,其余语言 ROADMAP。
# pip install -e sdk/python from platform_api_sdk import PlatformClient cli = PlatformClient(base=BASE, app_key=KEY) for ev in cli.stream_chat(messages=...): if ev.type == "text": print(ev.delta)
/system/overview.assets 实时聚合。下方 4 张资产卡是 2026-05-26 架构师审计后新增的中间层资产。一个 app 一把 key(pk_<app>_<24-char>),绑定可访问 scope + RPM + 日 CNY 配额。
scripts/seed-app-key.ts
家厂商 × 能力的真实矩阵,含单价 / 上下文窗口 / 输出上限。
GET /system/vendors
chat · translate · tts · asr · embed · vl · avatar,统一 SSE / JSON 协议,OpenAI 兼容。
/api/v1/ai/*
Python SDK 已发包,其余语言可拉 OpenAPI 用 openapi-generator 自动生成。
sdk/python/
实时调用 / per-app 用量 / 流式健康 / 断流告警 / Hourly chart。接入即可见。
/system/stats
配额护栏 · 13 错误码 · ring 审计 · X-RateLimit-* 响应头自适应限流。
plugins/quota.ts
个版本化 prompt(YAML),跨 app 复用。每个含变量定义 + 推荐 tier / model。
prompts/*.yaml
条向量, 个 namespace · dim 。RAG / 语义检索 / 重复去重。
plugins/kb.ts
说 tier: 'fast' | 'quality' | 'cheap' 代替硬编码 vendor + model。 个 capability 已落 tier 映射。
plugins/tier.ts
质量回路( / 反馈, 正 · 负)+ vendor 评测 baseline。
routes/feedback.ts
tier: 'fast' 代替硬编 vendor+model。已接入 /ai/chat。pk_dev_local_only 直接连本机 gateway。pk_<app_id>_<24-char>。
# 在 platform-api 仓库 root 下 DATABASE_URL=postgres://… npx tsx scripts/seed-app-key.ts mandarea-prod 100 1200 # 输出 raw_app_key 一次性可见,自己拷走存好
curl -N \ -H "X-App-Key: pk_mandarea_prod_xxxxxxxx" \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ -d '{ "vendor": "siliconflow", "model": "Qwen/Qwen2.5-72B-Instruct", "messages": [{"role":"user","content":"你好"}], "stream": true }' \ /api/v1/ai/chat
curl -H "X-App-Key: $KEY" \ -H "Content-Type: application/json" \ -d '{"text":"Hello world","source_lang":"en","target_lang":"zh"}' \ /api/v1/ai/translate
curl -H "X-App-Key: $KEY" -H "Content-Type: application/json" \ -d '{ "vendor":"siliconflow", "model":"FunAudioLLM/CosyVoice2-0.5B", "voice":"FunAudioLLM/CosyVoice2-0.5B:alex", "text":"hello world","format":"mp3" }' \ /api/v1/ai/tts --output out.mp3
curl -H "X-App-Key: $KEY" \ -F "file=@audio.mp3" \ -F "vendor=siliconflow" \ -F "language=zh" \ /api/v1/ai/asr
curl -H "X-App-Key: $KEY" -H "Content-Type: application/json" \ -d '{"input":["sentence one","sentence two"]}' \ /api/v1/ai/embed
const r = await fetch(`${BASE}/api/v1/ai/chat`, { method: 'POST', headers: { 'X-App-Key': APP_KEY, 'Content-Type': 'application/json', }, body: JSON.stringify({ vendor: 'dashscope', model: 'qwen-turbo', messages: [{ role: 'user', content: 'Hi' }], stream: false, }), }); const json = await r.json(); console.log(json.data.message.content);
const r = await fetch(`${BASE}/api/v1/ai/chat`, { method: 'POST', headers: { 'X-App-Key': APP_KEY, 'Content-Type': 'application/json', Accept: 'text/event-stream' }, body: JSON.stringify({ vendor: 'siliconflow', model: 'Qwen/Qwen2.5-7B-Instruct', messages: [{ role: 'user', content: '写一首短诗' }], stream: true }), }); const reader = r.body!.getReader(); const dec = new TextDecoder(); let buf = ''; while (true) { const { value, done } = await reader.read(); if (done) break; buf += dec.decode(value, { stream: true }); let idx; while ((idx = buf.indexOf('\n\n')) !== -1) { const frame = buf.slice(0, idx); buf = buf.slice(idx + 2); const ev = frame.match(/^event: (\w+)/m)?.[1]; const dataLine = frame.match(/^data: (.+)$/m)?.[1]; if (!dataLine) continue; const data = JSON.parse(dataLine); if (ev === 'text') process.stdout.write(data.text); } }
import httpx resp = httpx.post( f"{BASE}/api/v1/ai/chat", headers={"X-App-Key": APP_KEY}, json={ "vendor": "siliconflow", "model": "Qwen/Qwen2.5-7B-Instruct", "messages": [{"role": "user", "content": "Hi"}], "stream": False, }, timeout=60, ) print(resp.json()["data"]["message"]["content"])
import json, httpx with httpx.stream( "POST", f"{BASE}/api/v1/ai/chat", headers={"X-App-Key": APP_KEY, "Accept": "text/event-stream"}, json={"vendor": "dashscope", "model": "qwen-turbo", "messages": [{"role": "user", "content": "写一首诗"}], "stream": True}, timeout=90, ) as r: event = None for line in r.iter_lines(): if line.startswith("event:"): event = line[6:].strip() elif line.startswith("data:"): data = json.loads(line[5:].strip()) if event == "text": print(data["text"], end="", flush=True)
# pip install -e D:/Claude/platform-api/sdk/python from platform_api_sdk import PlatformClient cli = PlatformClient(base=BASE, app_key=APP_KEY) for ev in cli.stream_chat( vendor="siliconflow", model="deepseek-ai/DeepSeek-V3", messages=[{"role": "user", "content": "解释一下 TP 菲林"}], ): if ev.type == "text": print(ev.delta, end="", flush=True)
// blackboard/src/ai/providers/PlatformGatewayClient.{h,cpp} — 复用 PlatformGatewayClient gw("", "pk_app_xxxxx"); QJsonObject req; req["vendor"] = "dashscope"; req["model"] = "qwen-turbo"; req["stream"] = true; req["messages"] = QJsonArray{ QJsonObject{ {"role", "user"}, {"content", "Hi"} }}; connect(&gw, &PlatformGatewayClient::textChunk, this, [](const QString& t){ qDebug() << t; }); connect(&gw, &PlatformGatewayClient::done, this, [](){ qDebug() << "stream done"; }); gw.streamChat(req);
| code | HTTP | retry | 说明 |
|---|---|---|---|
必须读完再上线。规范覆盖鉴权、限流、幂等、流式、版本、计费、超时、可观测、最佳实践共 9 项。
每次请求带上 X-App-Key: pk_<app>_<24-char>。错误 / 缺失 → 401 AUTH_INVALID_KEY。Key 隔离应用维度,绑定 RPM 上限 / 日额度 CNY / 可访问 scope。
如果你的 app 已有用户登录态,可签 HS256 JWT 传过来,payload 必须含 sub 和 app_id(与 X-App-Key 匹配,否则 401)。本平台不发 JWT — 你的 app 自己签自己验。
三层叠加:App RPM × User RPM × 日 CNY 配额。超额一律 429。
| 层级 | 默认 | 超额返回 | 重置时间 |
|---|---|---|---|
| App RPM | 1200 / 分钟(per app_id) | 429 QUOTA_RATE_LIMITED | 下一分钟边界 |
| User RPM | 60 / 分钟(如带 JWT) | 429 QUOTA_RATE_LIMITED | 下一分钟边界 |
| 日 CNY 配额 | 100 CNY / 天(per app_id) | 429 QUOTA_DAILY_EXCEEDED | UTC 0 点 |
X-RateLimit-Limit-App: 1200 X-RateLimit-Remaining-App: 1197 X-RateLimit-Reset: 1716700860 # epoch 秒,下一桶重置时刻 X-Quota-Daily-Limit-CNY: 100 X-Quota-Daily-Remaining-CNY: 87.32 Retry-After: 27 # 只在 429 时出现,秒数
Retry-After 退避,不要瞬时重试;建议 jittered exponential backoff,base 1s,cap 60s。非流式 POST(translate / tts / asr / embed)支持 Idempotency-Key 请求头。同 key + 同 body 24h 内重发 → 直接重放上次响应,不会重复计费。
POST /api/v1/ai/translate X-App-Key: pk_xxx Idempotency-Key: txn_abc123_2026_05_25_v1 # 8-256 字符,建议 sha256(body) 或业务 ID Content-Type: application/json {...} # 首次:返回正常 + 响应头 Idempotency-Stored: true # 重放:返回缓存 + 响应头 Idempotency-Replayed: true # 同 key 但 body 改了:409 IDEMPOTENCY_KEY_REUSED
POST /ai/chat/job + GET /ai/chat/job/:id 模式。
stream: true(默认)Accept: text/event-streamContent-Type: text/event-stream; charset=utf-8event: ping 心跳event: text\ndata: {"text":"hi"}\n\n。 tool_call 多帧拼接,详见 §3。/api/v1/*。大破坏性变更 → 平行启 /api/v2/*,旧版至少保留 6 个月。X-API-Version: 0.1.0 每次返回,可用于客户端兼容性日志。Deprecation: true + Sunset: <RFC1123 date> 公告。网关原价透传 vendor 报价,不加价;每次成功响应回填实际成本。
# /ai/chat 非流式响应 { "ok": true, "data": {/* ... */}, "usage": { "prompt_tokens": 18, "completion_tokens": 42, "total_tokens": 60 }, "request_id": "req_..." } # /ai/tts 响应头 X-Vendor: siliconflow X-Model: FunAudioLLM/CosyVoice2-0.5B X-Usage-Characters: 11 X-Usage-Cost-Cny: 0.000022
stream:false 拿完整 JSON 更省事。input 数组,比逐条调便宜 + 快。id 串接 arguments_delta 才能拼出完整 JSON(§3.3 有 TS 范例)。Idempotency-Key,重试不重扣。X-RateLimit-* 自我节流,比被动 429 重试体感更好。retryable: true 的错(429/502/504)才重试;retryable: false 立刻报告用户。POST /ai/chat/job 拿 job_id → GET /ai/chat/job/:id?since=N 轮询。/healthz 间隔 ≥ 30s;高频探活会污染 stats ring。| endpoint | method | 必填 | 可选 | 流式 | 幂等 | 默认 vendor |
|---|---|---|---|---|---|---|
/api/v1/ai/* 后,adapter 在 onResponse 写入 cost_cny → cost-rollup plugin 60s 内 snapshot 到 var/cost-daily/ → 此页自动汇总。
如果调用了但金额还是 0,多半是该 vendor adapter 未配 token-price 表(VL/TTS/avatar 类常见)。
看哪个 App 花了多少、花在哪里、相比上期涨跌几何。日级 rollup 已持久化,周 / 月 / 季度切片随时切换;点应用卡进 drilldown 看模型与能力级账单。
点卡片进 drilldown · 抽屉里看模型 / 能力 / 供应商级账单
| 调用 | Token | 成本 ¥ | ¥/1K tok | 占比 | |
|---|---|---|---|---|---|
| / |
|
||||
| 无数据 | |||||
var/cost-daily/YYYY-MM-DD.json rollup(cost-rollup plugin,每 60s 从 stats ring snapshot 持久化)+ 当日 live 直读 ring。app × model 准确归因。
T1 接入 PG audit_log 后接口形状不变,存储层无感切换。
| 模型 | 调用 | ¥ | 占比 |
|---|---|---|---|
| / | |||
| 无数据 | |||
按 appKey × UTC 日窗的 CNY 累计。达到 cap 立即 429 COST_CAP_EXCEEDED,到 UTC 0 点自动重置。优先级:app_keys.cost_cap_daily_cny > env CAP_DEFAULT_DAILY_CNY。
/admin?admin_token=<TOKEN>#cost-caps。| App | Cap (CNY/day) | Used | Remaining | Source | Reset |
|---|---|---|---|---|---|
| 暂无数据。先发起一次 AI 调用,或检查 X-Admin-Token / Redis 连接。 | |||||
每条 AI/Domain 请求一行:hash_self = sha256(prev_hash + canonical_json(row))。任意一行被改动,chain 校验会在该行立即报错。
| ts | app | route | vendor | model | status | dur | ¥ | hash_self |
|---|---|---|---|---|---|---|---|---|
| 无 audit 记录。先发起一次 AI 调用。 | ||||||||
每能力一条链:5xx / 网络错 / 429 跳下一家;4xx 直抛。5 分钟窗口内某厂商失败 ≥ 5 次自动开断路器,TTL 到期自愈。
| # | vendor | model | fails | breaker |
|---|---|---|---|---|