Files
supply-intelligence/tech/INTERFACE.md
2026-05-07 10:16:46 +08:00

276 lines
9.3 KiB
Markdown
Raw 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.
# Supply-Intelligence 核心接口设计
> 状态说明2026-05 收敛修订):本文件保留为旧版接口草案,已不再作为当前实现真源。
> 当前接口真源以 /home/long/project/立交桥/projects/supply-intelligence/tech/BASELINE_TECHLEAD_V2.md 为准。
> 以下旧接口定义已废止,不得继续作为实现入口:
> - pricing comparison / recommendations / predictions 相关接口
> - 与新 candidate 状态机不一致的旧状态枚举
> - 未区分 published 与 gateway applied 的旧消费口径
> 版本v1.0 | 状态:初稿
---
## 1. 内部模块间接口
### 1.1 ProbeService
```go
type ProbeService interface {
// 执行单次探针
Probe(ctx context.Context, accountID string) (*ProbeResult, error)
// 批量探针(按供应商或全量)
ProbeBatch(ctx context.Context, filter ProbeFilter) (*BatchProbeResult, error)
// 获取探针结果历史
GetProbeHistory(ctx context.Context, accountID string, limit int) ([]ProbeResult, error)
// 手动触发掠针(运营干预)
TriggerManualProbe(ctx context.Context, accountID string, actorID string) (*ProbeResult, error)
}
type ProbeResult struct {
AccountID string
Status string // active suspended disabled
RiskScore int // 0-100
RiskReason string
LatencyMs int
ResponseCode int
CheckedAt time.Time
NextCheckAt time.Time
}
type ProbeFilter struct {
Platform *string
Status *string
RiskScoreMin *int
RiskScoreMax *int
}
```
### 1.2 DiscoveryService
```go
type DiscoveryService interface {
// 执行单次全网扫描
Scan(ctx context.Context) (*ScanResult, error)
// 获取最近扫描结果
GetLastScan(ctx context.Context) (*ScanResult, error)
// 获取候选模型列表
ListCandidates(ctx context.Context, filter CandidateFilter) ([]ModelCandidate, error)
// 手动触发扫描
TriggerManualScan(ctx context.Context, actorID string) (*ScanResult, error)
// 忽略候选模型
IgnoreCandidate(ctx context.Context, candidateID string, reason string, actorID string) error
}
type ScanResult struct {
ScannedAt time.Time
Platforms []string
NewModels int
RemovedModels int
Errors []ScanError
}
type ModelCandidate struct {
ID string
Platform string
ModelID string
Status string // discovered queued testing test_passed test_failed ignored
DiscoveredAt time.Time
TestedAt *time.Time
TestResult *TestResult
}
```
### 1.3 AdmissionService
```go
type AdmissionService interface {
// 执行准入测试
RunTest(ctx context.Context, candidateID string) (*TestResult, error)
// 获取测试结果
GetTestResult(ctx context.Context, candidateID string) (*TestResult, error)
// 手动确认上架(运营干预)
Publish(ctx context.Context, candidateID string, actorID string) error
// 强制上架(测试失败但运营确认)
ForcePublish(ctx context.Context, candidateID string, reason string, actorID string) error
}
type TestResult struct {
CandidateID string
Status string // passed failed
Dimensions []TestDimension
FailedReason *string
ExecutedAt time.Time
DurationMs int
}
type TestDimension struct {
Name string
Passed bool
Detail string
}
```
### 1.4 AccountService
```go
type AccountService interface {
// 创建账号(手动或自动)
CreateAccount(ctx context.Context, req CreateAccountRequest) (*SupplyAccount, error)
// 获取账号信息
GetAccount(ctx context.Context, accountID string) (*SupplyAccount, error)
// 更新账号状态
UpdateStatus(ctx context.Context, accountID string, status string, reason string) error
// 轮换密钥
RotateKey(ctx context.Context, accountID string, actorID string) error
// 列表账号
ListAccounts(ctx context.Context, filter AccountFilter) ([]SupplyAccount, error)
}
type SupplyAccount struct {
ID string
Platform string
ProxyID string
Status string
RiskScore int
APIKeyHint string // 密钥前 4 后 4
CreatedAt time.Time
UpdatedAt time.Time
}
```
### 1.5 HealthBoardService
```go
type HealthBoardService interface {
// 获取供应商健康大盘
GetBoard(ctx context.Context, scope BoardScope) (*HealthBoard, error)
// 获取模型比价报表
GetPricingComparison(ctx context.Context, modelID string) ([]PricingComparison, error)
// 获取供应链覆盖率
GetCoverage(ctx context.Context) (*CoverageReport, error)
// 获取预测分析
GetPredictions(ctx context.Context, minConfidence float64) ([]Prediction, error)
}
type HealthBoard struct {
Accounts []AccountHealth
Candidates []CandidateSummary
Coverage float64
FreshnessIndex float64
}
```
---
## 2. 外部系统集成接口
### 2.1 与 Bridge Gateway 集成
| 方法 | 路径 | 请求 | 响应 | 说明 |
|------|------|------|------|------|
| 查询账号状态 | `GET /internal/supply-intelligence/accounts/{id}/health` | - | `ProbeResult` | Gateway 路由决策时查询 |
| 查询模型定价 | `GET /internal/supply-intelligence/pricing/{model_id}` | - | `PricingInfo` | 动态定价参考 |
| 获取推荐供应商 | `GET /internal/supply-intelligence/recommendations` | `?model={model_id}&strategy=cost` | `[]Recommendation` | 智能路由推荐 |
### 2.2 与 supply-api 集成
| 方法 | 路径 | 请求 | 响应 | 说明 |
|------|------|------|------|------|
| 读取账号列表 | `GET /internal/supply/accounts` | - | `[]SupplyAccount` | 探针器获取待检测账号 |
| 更新账号状态 | `POST /internal/supply/accounts/{id}/status` | `{"status":"suspended","reason":""}` | `{"success":true}` | 探针结果写回 |
| 读取模型列表 | `GET /internal/supply/packages` | - | `[]SupplyPackage` | 扫描比对基准 |
| 创建模型 | `POST /internal/supply/packages` | `SupplyPackage` | `{"id":""}` | 准入测试通过后上架 |
| 获取审计日志格式 | `GET /internal/supply/audit/schema` | - | `{"schema":{}}` | 审计事件格式一致 |
---
## 3. API 接口规范
### 3.1 REST API 基础
- **基础路径**: `/api/v1/supply-intelligence/`
- **内部路径** (集成模式): `/internal/supply-intelligence/`
- **内容类型**: `application/json`
- **错误响应格式**:
```json
{
"error": {
"code": "SI_PRB_4001",
"message": "供应商账号不存在",
"details": {}
}
}
```
### 3.2 核心端点
#### 探针管理
| 方法 | 路径 | 描述 |
|------|------|------|
| GET | `/api/v1/supply-intelligence/probes` | 列表探针结果 |
| POST | `/api/v1/supply-intelligence/probes/{account_id}` | 手动触发探针 |
| GET | `/api/v1/supply-intelligence/probes/{account_id}/history` | 探针历史 |
#### 扫描与发现
| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/api/v1/supply-intelligence/discovery/scan` | 手动触发全网扫描 |
| GET | `/api/v1/supply-intelligence/discovery/candidates` | 列表候选模型 |
| GET | `/api/v1/supply-intelligence/discovery/candidates/{id}` | 获取候选模型详情 |
| POST | `/api/v1/supply-intelligence/discovery/candidates/{id}/ignore` | 忽略候选模型 |
#### 准入测试
| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/api/v1/supply-intelligence/admission/{candidate_id}/test` | 手动执行准入测试 |
| GET | `/api/v1/supply-intelligence/admission/{candidate_id}/result` | 获取测试结果 |
| POST | `/api/v1/supply-intelligence/admission/{candidate_id}/publish` | 确认上架 |
| POST | `/api/v1/supply-intelligence/admission/{candidate_id}/force-publish` | 强制上架 |
#### 账号管理
| 方法 | 路径 | 描述 |
|------|------|------|
| GET | `/api/v1/supply-intelligence/accounts` | 列表账号 |
| POST | `/api/v1/supply-intelligence/accounts` | 创建账号 |
| GET | `/api/v1/supply-intelligence/accounts/{id}` | 获取账号 |
| POST | `/api/v1/supply-intelligence/accounts/{id}/rotate-key` | 轮换密钥 |
| POST | `/api/v1/supply-intelligence/accounts/{id}/status` | 更新状态 |
#### 健康大盘
| 方法 | 路径 | 描述 |
|------|------|------|
| GET | `/api/v1/supply-intelligence/health-board` | 获取健康大盘 |
| GET | `/api/v1/supply-intelligence/pricing/{model_id}/comparison` | 模型比价 |
| GET | `/api/v1/supply-intelligence/coverage` | 供应链覆盖率 |
| GET | `/api/v1/supply-intelligence/predictions` | 预测分析 |
### 3.3 错误码定义
| 错误码 | HTTP 状态 | 说明 |
|---------|-----------|------|
| `SI_PRB_4001` | 404 | 供应商账号不存在 |
| `SI_PRB_4002` | 429 | 探针频率过高,请等待 |
| `SI_DIS_4001` | 404 | 候选模型不存在 |
| `SI_DIS_4002` | 409 | 候选模型状态不允许忽略 |
| `SI_ADM_4001` | 404 | 准入测试任务不存在 |
| `SI_ADM_4002` | 409 | 准入测试正在执行中 |
| `SI_ADM_4003` | 400 | 测试未通过,无法上架 |
| `SI_ACC_4001` | 404 | 账号不存在 |
| `SI_ACC_4002` | 409 | 账号状态不允许此操作 |
| `SI_ACC_4003` | 403 | 无权执行此操作 |
| `SI_BRD_4001` | 400 | 查询参数无效 |
### 3.4 WebSocket 接口
**路径**: `/ws/v1/supply-intelligence/board`
- 运营工作台订阅后,实时推送探针结果、候选模型变更、状态变更待办。
- 心跳间隔 30 秒。