CONSUMERS¶
Flyto Agent 消费层一站式接入文档. 本文是 wrapper, 详细 API 契约见自动生成产物:
- 业务 REST/SSE:
platform/common/docs/swagger.json(Swagger UI: 部署后访问https://hub.flytoex.net/swagger/) - 观测 gRPC:
platform/common/docs/grpc-api.md - 架构决策:
core/docs/adr/0002-rest-business-grpc-observation.md
端口拓扑¶
cmd/common 单进程三 listener (signal handler 三路协调关闭):
| 端口 | 通道 | 协议 | 用途 | host 暴露 |
|---|---|---|---|---|
| 9090 | gRPC observation | gRPC | HealthService + SafetyChainService (verdicts / breakers) | 否 (compose 内部) |
| 8081 | admin HTTP | HTTP | /admin/health / /admin/version / /admin/tenant + safetychain REST 镜像 |
否 (Caddy /admin/* 反代) |
| 8080 | business REST/SSE | HTTP/1.1 + SSE | /api/v1/* (engine.Run / engine.Session) |
否 (Caddy /api/v1/* 反代) |
外部入口 https://hub.flytoex.net 由 Caddy 按路径分流:
| 路径前缀 | 落地 |
|---|---|
/api/v1/* |
common:8080 (业务 REST/SSE; flush_interval -1, response_header_timeout 0) |
/admin/* (非 proxy) |
common:8081 (admin HTTP) |
/admin/proxy/* |
flyto-relay:7080 (basic_auth 临时, OIDC 替换中) |
/swagger/* |
common:8080 (--swagger 启用时, auth bypass) |
| 其他 | logistics:8080 (C# WebAPI) |
必填环境变量¶
| 变量 | 触发条件 | 示例 | 备注 |
|---|---|---|---|
ANTHROPIC_API_KEY |
--rest-addr 启用 (业务 REST 装配 anthropic provider) |
sk-ant-... |
dev / prod 都必填; 缺失 cmd/common log.Fatal 退出 |
FLYTO_PROXY_TOKEN |
flyto-proxy relay (HK-133 Phase 2-2a) | 任意强随机 | relay 内部 register endpoint auth |
ADMIN_BASIC_AUTH_USER / ADMIN_BASIC_AUTH_HASH |
Caddy /admin/proxy/* 边界鉴权 |
yuanwei / bcrypt |
OIDC ready 后撤 |
CLI flag (cmd/common)¶
| flag | 默认 | 说明 |
|---|---|---|
--grpc-addr |
:9090 |
gRPC observation 监听 |
--http-addr |
空 = disabled | admin HTTP 监听; 空 = gRPC-only 形态 |
--rest-addr |
空 = disabled | 业务 REST/SSE 监听; 启用必带 ANTHROPIC_API_KEY |
--cwd |
进程 cwd | engine Tool 执行根目录 (--rest-addr only) |
--model |
claude-sonnet-4-6 |
engine 默认 LLM model id (见 ModelRegistry) |
--oidc-issuer |
空 = dev mode | OIDC issuer URL; 空 = bypass auth (dev only); 生产必填 |
--oidc-audience |
空 | 期望 OIDC audience |
--oidc-tenant-claim |
tenant_id |
JWT tenant id claim 字段名 |
--version |
空 | 健康响应回显的版本字符串 |
--swagger |
false |
/swagger/* 暴露 Swagger UI (--rest-addr only); auth bypassed |
OIDC Auth 流程¶
客户端 ──(1)── IdP 获取 access_token (aud = --oidc-audience)
│
│ Authorization: Bearer <token>
▼
hub.flytoex.net ──(2)── Caddy ──(3)── common:8080 / common:8081
│
▼
server.authMiddleware
│
▼
auth.HTTPMiddleware(verifier)
├─ 验 OIDC 签名
├─ 检查 audience
└─ 提取 tenant_id 注入 ctx
│
通过 ──→ handler 执行
不通过 ──→ 401 Unauthorized
例外 allow-list (无需 token, 也不烧 rate-limit 预算):
GET /api/v1/health(liveness 探针)OPTIONS /*(CORS preflight)/swagger/*(UI 公开访问)
dev mode (--oidc-issuer 空): 全部 bypass, 启动日志 WARNING auth disabled (dev mode).
跨服务调用示例¶
业务 REST: 一次性 SSE 流式 Agent run¶
curl -N -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"prompt":"你好"}' \
https://hub.flytoex.net/api/v1/agent/run
Event 流 (named events, 见 server.go convertEvent):
event: text_delta
data: {"text":"你"}
event: turn_end
data: {"turn_number":1,"input_tokens":12,"output_tokens":3,"cost_usd":0.0001}
event: done
data: {"total_input_tokens":12,"total_output_tokens":3,"cost_usd":0.0001,"turn_count":1}
业务 REST: 多轮会话¶
# 创建
SESSION=$(curl -s -H "Authorization: Bearer $TOKEN" \
-X POST https://hub.flytoex.net/api/v1/sessions | jq -r .session_id)
# 发消息 (SSE 流, 每次返回 assistant 增量)
curl -N -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"prompt":"继续"}' \
"https://hub.flytoex.net/api/v1/sessions/$SESSION/messages"
# 关
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
"https://hub.flytoex.net/api/v1/sessions/$SESSION"
观测 gRPC: SafetyChain verdicts¶
C# logistics 用 Grpc.Net.ClientFactory 调 SafetyChainService.ListVerdicts 拉取 Tool 装饰链产生的决策记录. 协议见 grpc-api.md SafetyChainService 段. cmd/common 当前 verdictStore 为空, 等行业 Tool 接入 safetychain.Assemble 后自动填充.
进一步阅读¶
core/docs/adr/0002-rest-business-grpc-observation.md— REST 业务 / gRPC 观测 双通道 ADR (与 9 天前 "gRPC 优 HTTP" 是 bifurcation 不是 U-turn)deploy/README.md— HK-133 Phase 1 + 2-2a 部署core/TODO.md— 已登记 tracked debt: L693 多副本 SessionStore (P2) / L694 cross-transport request-id (P3) / L695 SSE 带宽监控 (P3)platform/common/Dockerfile— distroless image 构建 (EXPOSE 9090 / 8081 / 8080)