更新 API meta 版本号
将 shared-contracts 与前端共享 API_VERSION 更新为 2026-06-16 同步 healthz 响应头断言与 API envelope 测试夹具 补充 api-server 文档中的 API_VERSION 来源说明
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
export const API_VERSION = '2026-04-08';
|
export const API_VERSION = '2026-06-16';
|
||||||
export const API_RESPONSE_ENVELOPE_HEADER = 'x-genarrative-response-envelope';
|
export const API_RESPONSE_ENVELOPE_HEADER = 'x-genarrative-response-envelope';
|
||||||
export const API_RESPONSE_ENVELOPE_VERSION = 'v1';
|
export const API_RESPONSE_ENVELOPE_VERSION = 'v1';
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,7 @@
|
|||||||
当前基础响应头约定:
|
当前基础响应头约定:
|
||||||
|
|
||||||
1. 所有响应都会回写 `x-request-id`。
|
1. 所有响应都会回写 `x-request-id`。
|
||||||
2. 所有响应都会回写固定的 `x-api-version`,当前值与 body `meta.apiVersion` 保持一致。
|
2. 所有响应都会回写固定的 `x-api-version`,值来自 `shared_contracts::api::API_VERSION`,当前为 `2026-06-16`,并与 body `meta.apiVersion` 保持一致。
|
||||||
3. 所有响应都会回写 `x-route-version`,当前阶段默认与 `x-api-version` 保持一致,后续再按路由粒度细分。
|
3. 所有响应都会回写 `x-route-version`,当前阶段默认与 `x-api-version` 保持一致,后续再按路由粒度细分。
|
||||||
4. 所有响应都会回写 `x-response-time-ms`,值来源于 `RequestContext` 内记录的请求开始时间。
|
4. 所有响应都会回写 `x-response-time-ms`,值来源于 `RequestContext` 内记录的请求开始时间。
|
||||||
|
|
||||||
|
|||||||
@@ -486,14 +486,14 @@ mod tests {
|
|||||||
.headers()
|
.headers()
|
||||||
.get("x-api-version")
|
.get("x-api-version")
|
||||||
.and_then(|value| value.to_str().ok()),
|
.and_then(|value| value.to_str().ok()),
|
||||||
Some("2026-04-08")
|
Some("2026-06-16")
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
response
|
response
|
||||||
.headers()
|
.headers()
|
||||||
.get("x-route-version")
|
.get("x-route-version")
|
||||||
.and_then(|value| value.to_str().ok()),
|
.and_then(|value| value.to_str().ok()),
|
||||||
Some("2026-04-08")
|
Some("2026-06-16")
|
||||||
);
|
);
|
||||||
assert!(response.headers().contains_key("x-response-time-ms"));
|
assert!(response.headers().contains_key("x-response-time-ms"));
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
pub const API_VERSION: &str = "2026-04-08";
|
pub const API_VERSION: &str = "2026-06-16";
|
||||||
pub const API_RESPONSE_ENVELOPE_HEADER: &str = "x-genarrative-response-envelope";
|
pub const API_RESPONSE_ENVELOPE_HEADER: &str = "x-genarrative-response-envelope";
|
||||||
pub const X_REQUEST_ID_HEADER: &str = "x-request-id";
|
pub const X_REQUEST_ID_HEADER: &str = "x-request-id";
|
||||||
pub const API_VERSION_HEADER: &str = "x-api-version";
|
pub const API_VERSION_HEADER: &str = "x-api-version";
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ describe('parseApiErrorMessage', () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
'Fallback failure',
|
'Fallback failure',
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -86,8 +86,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -131,8 +131,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -180,8 +180,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -235,8 +235,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
message: '对象不存在',
|
message: '对象不存在',
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -274,8 +274,8 @@ describe('useResolvedAssetReadUrl', () => {
|
|||||||
message: '对象不存在',
|
message: '对象不存在',
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ function createApiEnvelopeResponse(data: unknown) {
|
|||||||
data,
|
data,
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
} as Response;
|
} as Response;
|
||||||
@@ -1181,7 +1181,7 @@ describe('ai runtime client orchestration', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
} as Response);
|
} as Response);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -103,7 +103,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -164,7 +164,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -179,7 +179,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -409,7 +409,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -440,7 +440,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
@@ -502,7 +502,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
@@ -572,7 +572,7 @@ describe('apiClient', () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
requestId: 'req-body',
|
requestId: 'req-body',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -74,8 +74,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -114,8 +114,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -155,8 +155,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -198,8 +198,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -240,8 +240,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -285,8 +285,8 @@ describe('assetReadUrlService', () => {
|
|||||||
},
|
},
|
||||||
error: null,
|
error: null,
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -323,8 +323,8 @@ describe('assetReadUrlService', () => {
|
|||||||
message: '对象不存在',
|
message: '对象不存在',
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
@@ -363,8 +363,8 @@ describe('assetReadUrlService', () => {
|
|||||||
message: '登录状态已失效',
|
message: '登录状态已失效',
|
||||||
},
|
},
|
||||||
meta: {
|
meta: {
|
||||||
apiVersion: '2026-04-08',
|
apiVersion: '2026-06-16',
|
||||||
routeVersion: '2026-04-08',
|
routeVersion: '2026-06-16',
|
||||||
latencyMs: 1,
|
latencyMs: 1,
|
||||||
timestamp: '2099-01-01T00:00:00Z',
|
timestamp: '2099-01-01T00:00:00Z',
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user