migrate ai format conversion to responses adapters

This commit is contained in:
fawney19
2026-04-26 20:32:55 +08:00
parent e36fb8c07a
commit 5b914aa78c
183 changed files with 13539 additions and 3401 deletions

View File

@@ -453,11 +453,11 @@ export const MOCK_PROVIDERS: ProviderWithEndpointsSummary[] = [
active_models: 7,
avg_health_score: 0.91,
unhealthy_endpoints: 0,
api_formats: ['CLAUDE_CLI', 'GEMINI_CLI', 'OPENAI_CLI'],
api_formats: ['CLAUDE_CLI', 'GEMINI_CLI', 'OPENAI_RESPONSES'],
endpoint_health_details: [
{ api_format: 'CLAUDE_CLI', health_score: 0.73, is_active: true, active_keys: 1 },
{ api_format: 'GEMINI_CLI', health_score: 1.0, is_active: true, active_keys: 1 },
{ api_format: 'OPENAI_CLI', health_score: 1.0, is_active: true, active_keys: 1 }
{ api_format: 'OPENAI_RESPONSES', health_score: 1.0, is_active: true, active_keys: 1 }
],
created_at: '2024-12-09T14:10:36.446217+08:00',
updated_at: new Date().toISOString()
@@ -504,10 +504,10 @@ export const MOCK_PROVIDERS: ProviderWithEndpointsSummary[] = [
active_models: 5,
avg_health_score: 1.0,
unhealthy_endpoints: 0,
api_formats: ['claude:cli', 'openai:cli'],
api_formats: ['claude:cli', 'openai:responses'],
endpoint_health_details: [
{ api_format: 'claude:cli', health_score: 1.0, is_active: true, active_keys: 1 },
{ api_format: 'openai:cli', health_score: 1.0, is_active: true, active_keys: 1 }
{ api_format: 'openai:responses', health_score: 1.0, is_active: true, active_keys: 1 }
],
created_at: '2024-12-07T22:56:46.361092+08:00',
updated_at: new Date().toISOString()
@@ -529,12 +529,12 @@ export const MOCK_PROVIDERS: ProviderWithEndpointsSummary[] = [
active_models: 7,
avg_health_score: 1.0,
unhealthy_endpoints: 0,
api_formats: ['claude:cli', 'gemini:chat', 'gemini:cli', 'openai:cli'],
api_formats: ['claude:cli', 'gemini:chat', 'gemini:cli', 'openai:responses'],
endpoint_health_details: [
{ api_format: 'claude:cli', health_score: 1.0, is_active: true, active_keys: 1 },
{ api_format: 'gemini:chat', health_score: 1.0, is_active: true, active_keys: 1 },
{ api_format: 'gemini:cli', health_score: 1.0, is_active: true, active_keys: 1 },
{ api_format: 'openai:cli', health_score: 1.0, is_active: true, active_keys: 1 }
{ api_format: 'openai:responses', health_score: 1.0, is_active: true, active_keys: 1 }
],
created_at: '2024-12-07T15:16:55.807595+08:00',
updated_at: new Date().toISOString()
@@ -556,14 +556,14 @@ export const MOCK_PROVIDERS: ProviderWithEndpointsSummary[] = [
active_models: 8,
avg_health_score: 0.863,
unhealthy_endpoints: 1,
api_formats: ['claude:chat', 'claude:cli', 'gemini:chat', 'gemini:cli', 'openai:chat', 'openai:cli'],
api_formats: ['claude:chat', 'claude:cli', 'gemini:chat', 'gemini:cli', 'openai:chat', 'openai:responses'],
endpoint_health_details: [
{ api_format: 'claude:chat', health_score: 1.0, is_active: true, active_keys: 2 },
{ api_format: 'claude:cli', health_score: 0.48, is_active: true, active_keys: 2 },
{ api_format: 'gemini:chat', health_score: 1.0, is_active: true, active_keys: 2 },
{ api_format: 'gemini:cli', health_score: 0.85, is_active: true, active_keys: 2 },
{ api_format: 'openai:chat', health_score: 0.85, is_active: true, active_keys: 2 },
{ api_format: 'openai:cli', health_score: 1.0, is_active: true, active_keys: 1 }
{ api_format: 'openai:responses', health_score: 1.0, is_active: true, active_keys: 1 }
],
created_at: '2024-12-07T22:56:09.712806+08:00',
updated_at: new Date().toISOString()
@@ -881,7 +881,8 @@ export const MOCK_API_FORMATS = {
{ value: 'claude:chat', label: 'Claude Chat', default_path: '/v1/messages', aliases: [] },
{ value: 'claude:cli', label: 'Claude CLI', default_path: '/v1/messages', aliases: [] },
{ value: 'openai:chat', label: 'OpenAI Chat', default_path: '/v1/chat/completions', aliases: [] },
{ value: 'openai:cli', label: 'OpenAI CLI', default_path: '/v1/responses', aliases: [] },
{ value: 'openai:responses', label: 'OpenAI Responses', default_path: '/v1/responses', aliases: ['openai:cli'] },
{ value: 'openai:responses:compact', label: 'OpenAI Responses Compact', default_path: '/v1/responses/compact', aliases: ['openai:compact'] },
{ value: 'openai:image', label: 'OpenAI Image', default_path: '/v1/images/generations', aliases: [] },
{ value: 'openai:video', label: 'OpenAI Video', default_path: '/v1/videos', aliases: [] },
{ value: 'gemini:chat', label: 'Gemini Chat', default_path: '/v1beta/models/{model}:{action}', aliases: [] },

View File

@@ -141,7 +141,7 @@ function generateHealthEvents(
// Mock 端点健康数据
// 注意success_rate 使用 0-1 之间的小数,前端会乘以 100 显示为百分比
// 事件的成功/失败/跳过比例必须与 success_rate 保持一致
// 覆盖所有 API 格式claude, claude_cli, openai, openai_cli, gemini, gemini_cli
// 覆盖所有 API 格式claude, claude_cli, openai, openai_responses, gemini, gemini_cli
const MOCK_ENDPOINT_STATUS = {
generated_at: new Date().toISOString(),
formats: [
@@ -216,7 +216,7 @@ const MOCK_ENDPOINT_STATUS = {
events: generateHealthEvents(60, 0.974, 0.022, 0.004, 700, 400)
},
{
api_format: 'openai:cli',
api_format: 'openai:responses',
api_path: '/v1/responses',
total_attempts: 2340,
success_count: 2200,
@@ -324,7 +324,7 @@ function generateMockUsageRecords(count: number = 100) {
{ id: 'demo-user-uuid-0004', username: 'Bob Zhang', email: 'bob@demo.aether.ai' }
]
const apiFormats = ['claude:chat', 'claude:cli', 'openai:chat', 'openai:cli', 'gemini:chat', 'gemini:cli']
const apiFormats = ['claude:chat', 'claude:cli', 'openai:chat', 'openai:responses', 'gemini:chat', 'gemini:cli']
const statusOptions: Array<'completed' | 'failed' | 'streaming'> = ['completed', 'completed', 'completed', 'completed', 'failed', 'streaming']
for (let i = 0; i < count; i++) {
@@ -337,7 +337,7 @@ function generateMockUsageRecords(count: number = 100) {
if (model.provider === 'anthropic') {
apiFormat = Math.random() > 0.3 ? 'claude:cli' : 'claude:chat'
} else if (model.provider === 'openai') {
apiFormat = Math.random() > 0.3 ? 'openai:cli' : 'openai:chat'
apiFormat = Math.random() > 0.3 ? 'openai:responses' : 'openai:chat'
} else {
apiFormat = Math.random() > 0.3 ? 'gemini:cli' : 'gemini:chat'
}
@@ -445,7 +445,7 @@ function getMockEndpointExtras(apiFormat: string) {
accept_formats: ['openai:chat', 'claude:chat']
}
extras.config = { upstream_stream_policy: 'force_stream' }
} else if (normalizedFormat === 'openai:cli') {
} else if (normalizedFormat === 'openai:responses' || normalizedFormat === 'openai:cli') {
extras.config = { upstream_stream_policy: 'force_non_stream' }
} else if (normalizedFormat === 'gemini:chat') {
extras.custom_path = '/v1beta/models/gemini-3-pro-preview:generateContent'