Files
goaiapi/proto/README.md
2026-06-03 14:09:58 +08:00

80 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# proto — 跨语言 API 契约
本目录是系统的**语言中立契约源**。`contract.proto` 定义了内核与插件之间、以及外部系统与本系统交互所需的全部 gRPC 服务与消息。任何语言都可以从这里生成客户端/服务端代码来接入本系统。
```
proto/
contract/v1/contract.proto 契约源(唯一可信来源)
```
> Go 生成代码位于 `src/go/proto/contract/v1/`(已入库,克隆即可 `go build`)。其它语言的生成代码不入库,由各使用方按需生成。
## 契约内容
`contract.v1` package 定义:
**通用服务(每个插件都实现)**
- `PluginManifest``GetManifest``HealthCheck`
- `InvocationBroker``Invoke`(内核托管,插件互调入口)、`ListPlugins`
**枚举与基础消息**
- `PluginTier``BASE` / `MID` / `COMPLEX`
- `Dependency``Capability``PluginInfo``TrafficEntry``UsageInfo`
**业务服务(由插件实现)**
- `EchoService``TransformService``StreamingDemo` — 样例(验证三层与流式)
- `RecorderService` — 留存与查询Save/List/ReadBlob/Stats
- `UsageService` — 用量解析ParseBody/ParseStream
- `ProxyService` — 外部流量处理入口Handle
- `DashboardService` — 只读管理界面渲染Render
## 跨语言生成示例
先确保安装了 protoc 及对应语言插件,然后从仓库根目录执行(`--proto_path` 指向本目录)。
**Python**
```bash
python -m grpc_tools.protoc \
--proto_path=proto \
--python_out=out/python --grpc_python_out=out/python \
contract/v1/contract.proto
```
**TypeScript / JavaScriptts-proto**
```bash
protoc \
--proto_path=proto \
--plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto \
--ts_proto_out=out/ts \
contract/v1/contract.proto
```
**Java**
```bash
protoc \
--proto_path=proto \
--java_out=out/java --grpc-java_out=out/java \
contract/v1/contract.proto
```
**Go**(已配置在 `scripts/genproto.ps1`,无需手动)
```powershell
.\scripts\genproto.ps1 # 从 proto/ 生成到 src/go/proto/
```
## 互调约定
插件间调用全部经内核 `InvocationBroker.Invoke`
- `target_plugin` — 目标插件名(如 `"echo-base"`
- `method` — gRPC 方法全路径(如 `"/contract.v1.EchoService/Echo"`
- `payload` — 目标请求消息的 proto-wire 字节(用本契约生成的类型序列化)
返回的 `result` 是目标响应消息的 proto-wire 字节,用同一契约反序列化即可。内核不感知具体类型,只透传字节——这正是契约必须语言中立、独立存在的原因。
## 修改契约
`contract.proto` 后:
1. 重新生成 Go 代码:`.\scripts\genproto.ps1`
2. 提交更新后的 `proto/contract/v1/contract.proto``src/go/proto/contract/v1/*.pb.go`
3. 通知各语言使用方按上面的命令重新生成