feat(api): 统一官方兼容接口响应协议
ci / verify (pull_request) Failing after 15s

兼容接口现在以入口协议作为最终响应协议,同协议保留官方 Wire 响应,跨协议统一转换成功、任务状态与错误结构。

同时修正异步提交状态边界,持久化兼容公开任务标识和官方提交响应,并新增迁移、流式响应及协议契约测试。

验证:go vet ./...;go test ./...;govulncheck ./...;pnpm lint;pnpm test;pnpm build;pnpm audit --audit-level high;pnpm openapi;全部 CI 脚本。
This commit is contained in:
2026-07-22 15:11:50 +08:00
parent cbebfd7baa
commit a778216264
32 changed files with 2436 additions and 591 deletions
+236 -124
View File
@@ -378,6 +378,28 @@ definitions:
example: /static/uploaded/upload-abc123.png
type: string
type: object
httpapi.GeminiErrorEnvelope:
properties:
error:
$ref: '#/definitions/httpapi.GeminiErrorStatus'
type: object
httpapi.GeminiErrorStatus:
properties:
code:
example: 400
type: integer
details:
items:
additionalProperties: {}
type: object
type: array
message:
example: Invalid argument
type: string
status:
example: INVALID_ARGUMENT
type: string
type: object
httpapi.HealthResponse:
properties:
env:
@@ -512,6 +534,20 @@ definitions:
example: false
type: boolean
type: object
httpapi.KlingErrorEnvelope:
properties:
code:
example: 1001
type: integer
error:
example: invalid_parameter
type: string
message:
example: invalid parameter
type: string
request_id:
type: string
type: object
httpapi.ModelCatalogFilterOption:
properties:
count:
@@ -704,6 +740,26 @@ definitions:
example: env
type: string
type: object
httpapi.OpenAIErrorEnvelope:
properties:
error:
$ref: '#/definitions/httpapi.OpenAIErrorPayload'
type: object
httpapi.OpenAIErrorPayload:
properties:
code:
example: invalid_parameter
type: string
message:
example: Invalid parameter
type: string
param:
example: model
type: string
type:
example: invalid_request_error
type: string
type: object
httpapi.PlatformListResponse:
properties:
items:
@@ -1158,6 +1214,49 @@ definitions:
$ref: '#/definitions/store.GatewayUser'
type: array
type: object
httpapi.VolcesContentsGenerationTaskResponse:
properties:
content:
additionalProperties: {}
type: object
created_at:
type: integer
error:
additionalProperties: {}
type: object
id:
example: cgt-202607221234
type: string
model:
type: string
status:
enum:
- queued
- running
- succeeded
- failed
- cancelled
type: string
updated_at:
type: integer
usage:
additionalProperties: {}
type: object
type: object
httpapi.VolcesErrorEnvelope:
properties:
error:
$ref: '#/definitions/httpapi.VolcesErrorPayload'
type: object
httpapi.VolcesErrorPayload:
properties:
code:
example: invalid_parameter
type: string
message:
example: model is required
type: string
type: object
httpapi.WalletAdjustmentResponse:
properties:
account:
@@ -2155,6 +2254,20 @@ definitions:
type: array
cancellable:
type: boolean
compatibilityProtocol:
type: string
compatibilityPublicId:
type: string
compatibilitySourceProtocol:
type: string
compatibilitySubmitBody:
additionalProperties: {}
type: object
compatibilitySubmitHeaders:
additionalProperties: {}
type: object
compatibilitySubmitHttpStatus:
type: integer
conversationId:
type: string
createdAt:
@@ -6831,31 +6944,31 @@ paths:
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"402":
description: Payment Required
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"429":
description: Too Many Requests
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
security:
- BearerAuth: []
summary: 创建 Chat Completions
@@ -6871,6 +6984,14 @@ paths:
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
security:
- BearerAuth: []
summary: 列出火山内容生成任务
@@ -6887,8 +7008,23 @@ paths:
"200":
description: OK
schema:
additionalProperties: true
type: object
$ref: '#/definitions/httpapi.VolcesContentsGenerationTaskResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
"429":
description: Too Many Requests
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
security:
- BearerAuth: []
summary: 创建火山内容生成任务
@@ -6903,8 +7039,11 @@ paths:
"200":
description: OK
schema:
additionalProperties: true
type: object
$ref: '#/definitions/httpapi.VolcesContentsGenerationTaskResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
security:
- BearerAuth: []
summary: 取消火山内容生成任务
@@ -6917,8 +7056,11 @@ paths:
"200":
description: OK
schema:
additionalProperties: true
type: object
$ref: '#/definitions/httpapi.VolcesContentsGenerationTaskResponse'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.VolcesErrorEnvelope'
security:
- BearerAuth: []
summary: 查询火山内容生成任务
@@ -6928,17 +7070,8 @@ paths:
post:
consumes:
- application/json
description: 统一公开入口按 model 选择平台模型并默认同步返回兼容响应;设置 X-Async=true 时异步创建任务并返回 202。
parameters:
- description: true 时异步创建任务并返回 202
in: header
name: X-Async
type: boolean
- description: 可选请求幂等键;同一用户范围内唯一
in: header
name: Idempotency-Key
type: string
- description: AI 任务请求,字段随任务类型变化
- description: OpenAI Embeddings 请求
in: body
name: input
required: true
@@ -6951,43 +7084,27 @@ paths:
description: OK
schema:
$ref: '#/definitions/httpapi.CompatibleResponse'
"202":
description: Accepted
schema:
$ref: '#/definitions/httpapi.TaskAcceptedResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"402":
description: Payment Required
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"429":
description: Too Many Requests
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
security:
- BearerAuth: []
summary: 创建或执行 AI 任务
summary: 创建 OpenAI Embeddings
tags:
- tasks
- embeddings
/api/v1/files/upload:
post:
consumes:
@@ -7117,17 +7234,8 @@ paths:
post:
consumes:
- application/json
description: 统一公开入口按 model 选择平台模型并默认同步返回兼容响应;设置 X-Async=true 时异步创建任务并返回 202。
parameters:
- description: true 时异步创建任务并返回 202
in: header
name: X-Async
type: boolean
- description: 可选请求幂等键;同一用户范围内唯一
in: header
name: Idempotency-Key
type: string
- description: AI 任务请求,字段随任务类型变化
- description: OpenAI Images 请求
in: body
name: input
required: true
@@ -7140,58 +7248,33 @@ paths:
description: OK
schema:
$ref: '#/definitions/httpapi.CompatibleResponse'
"202":
description: Accepted
schema:
$ref: '#/definitions/httpapi.TaskAcceptedResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"402":
description: Payment Required
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"429":
description: Too Many Requests
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
security:
- BearerAuth: []
summary: 创建或执行 AI 任务
summary: 创建或编辑 OpenAI Images
tags:
- tasks
- images
/api/v1/images/generations:
post:
consumes:
- application/json
description: 统一公开入口按 model 选择平台模型并默认同步返回兼容响应;设置 X-Async=true 时异步创建任务并返回 202。
parameters:
- description: true 时异步创建任务并返回 202
in: header
name: X-Async
type: boolean
- description: 可选请求幂等键;同一用户范围内唯一
in: header
name: Idempotency-Key
type: string
- description: AI 任务请求,字段随任务类型变化
- description: OpenAI Images 请求
in: body
name: input
required: true
@@ -7204,43 +7287,27 @@ paths:
description: OK
schema:
$ref: '#/definitions/httpapi.CompatibleResponse'
"202":
description: Accepted
schema:
$ref: '#/definitions/httpapi.TaskAcceptedResponse'
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"402":
description: Payment Required
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
"404":
description: Not Found
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"429":
description: Too Many Requests
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
security:
- BearerAuth: []
summary: 创建或执行 AI 任务
summary: 创建或编辑 OpenAI Images
tags:
- tasks
- images
/api/v1/kling/v1/videos/omni-video:
get:
parameters:
@@ -7296,7 +7363,7 @@ paths:
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.KlingErrorEnvelope'
security:
- BearerAuth: []
summary: 创建可灵 V1 Omni 视频任务
@@ -7362,7 +7429,7 @@ paths:
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.KlingErrorEnvelope'
security:
- BearerAuth: []
summary: 创建可灵 API 2.0 Omni 视频任务
@@ -7509,6 +7576,7 @@ paths:
type: object
produces:
- application/json
- text/event-stream
responses:
"200":
description: OK
@@ -7518,19 +7586,67 @@ paths:
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
security:
- BearerAuth: []
summary: Gemini generateContent 兼容接口
tags:
- gemini-compatible
/api/v1/models/{model}:streamGenerateContent:
post:
consumes:
- application/json
description: 使用统一 /api/v1 前缀接收 Gemini generateContent 请求;旧 /v1 和 /v1beta 路径保留兼容。
parameters:
- description: 模型名称
in: path
name: model
required: true
type: string
- description: Gemini generateContent 请求
in: body
name: input
required: true
schema:
additionalProperties: true
type: object
produces:
- application/json
- text/event-stream
responses:
"200":
description: OK
schema:
additionalProperties: true
type: object
"400":
description: Bad Request
schema:
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
"502":
description: Bad Gateway
schema:
$ref: '#/definitions/httpapi.GeminiErrorEnvelope'
security:
- BearerAuth: []
summary: Gemini generateContent 兼容接口
@@ -8001,33 +8117,29 @@ paths:
responses:
"200":
description: OK
headers:
X-Gateway-Task-Id:
description: 网关审计任务 ID
type: string
schema:
$ref: '#/definitions/httpapi.ResponsesCompatibleResponse'
"400":
description: invalid_previous_response_id / unsupported_response_tool /
unsupported_response_parameter
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"402":
description: Payment Required
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"403":
description: Forbidden
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
"503":
description: response_chain_unavailable
schema:
$ref: '#/definitions/httpapi.ErrorEnvelope'
$ref: '#/definitions/httpapi.OpenAIErrorEnvelope'
security:
- BearerAuth: []
summary: 创建 OpenAI Responses