mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
migrate ai format conversion to responses adapters
This commit is contained in:
@@ -4,8 +4,8 @@ export const API_FORMATS = {
|
||||
CLAUDE: 'claude:chat',
|
||||
CLAUDE_CLI: 'claude:cli',
|
||||
OPENAI: 'openai:chat',
|
||||
OPENAI_CLI: 'openai:cli',
|
||||
OPENAI_COMPACT: 'openai:compact',
|
||||
OPENAI_RESPONSES: 'openai:responses',
|
||||
OPENAI_RESPONSES_COMPACT: 'openai:responses:compact',
|
||||
OPENAI_IMAGE: 'openai:image',
|
||||
OPENAI_VIDEO: 'openai:video',
|
||||
GEMINI: 'gemini:chat',
|
||||
@@ -20,8 +20,8 @@ export const API_FORMAT_LABELS: Record<string, string> = {
|
||||
[API_FORMATS.CLAUDE]: 'Claude Chat',
|
||||
[API_FORMATS.CLAUDE_CLI]: 'Claude CLI',
|
||||
[API_FORMATS.OPENAI]: 'OpenAI Chat',
|
||||
[API_FORMATS.OPENAI_CLI]: 'OpenAI CLI',
|
||||
[API_FORMATS.OPENAI_COMPACT]: 'OpenAI Compact',
|
||||
[API_FORMATS.OPENAI_RESPONSES]: 'OpenAI Responses',
|
||||
[API_FORMATS.OPENAI_RESPONSES_COMPACT]: 'OpenAI Responses Compact',
|
||||
[API_FORMATS.OPENAI_IMAGE]: 'OpenAI Image',
|
||||
[API_FORMATS.OPENAI_VIDEO]: 'OpenAI Video',
|
||||
[API_FORMATS.GEMINI]: 'Gemini Chat',
|
||||
@@ -31,8 +31,10 @@ export const API_FORMAT_LABELS: Record<string, string> = {
|
||||
CLAUDE: 'Claude Chat',
|
||||
CLAUDE_CLI: 'Claude CLI',
|
||||
OPENAI: 'OpenAI Chat',
|
||||
OPENAI_CLI: 'OpenAI CLI',
|
||||
OPENAI_COMPACT: 'OpenAI Compact',
|
||||
OPENAI_CLI: 'OpenAI Responses',
|
||||
OPENAI_COMPACT: 'OpenAI Responses Compact',
|
||||
OPENAI_RESPONSES: 'OpenAI Responses',
|
||||
OPENAI_RESPONSES_COMPACT: 'OpenAI Responses Compact',
|
||||
OPENAI_IMAGE: 'OpenAI Image',
|
||||
OPENAI_VIDEO: 'OpenAI Video',
|
||||
GEMINI: 'Gemini Chat',
|
||||
@@ -43,8 +45,8 @@ export const API_FORMAT_LABELS: Record<string, string> = {
|
||||
// API 格式缩写映射(用于空间紧凑的显示场景)
|
||||
export const API_FORMAT_SHORT: Record<string, string> = {
|
||||
[API_FORMATS.OPENAI]: 'O',
|
||||
[API_FORMATS.OPENAI_CLI]: 'OC',
|
||||
[API_FORMATS.OPENAI_COMPACT]: 'OCP',
|
||||
[API_FORMATS.OPENAI_RESPONSES]: 'OR',
|
||||
[API_FORMATS.OPENAI_RESPONSES_COMPACT]: 'ORC',
|
||||
[API_FORMATS.OPENAI_IMAGE]: 'OI',
|
||||
[API_FORMATS.OPENAI_VIDEO]: 'OV',
|
||||
[API_FORMATS.CLAUDE]: 'C',
|
||||
@@ -54,8 +56,10 @@ export const API_FORMAT_SHORT: Record<string, string> = {
|
||||
[API_FORMATS.GEMINI_VIDEO]: 'GV',
|
||||
// legacy 兼容(仅用于展示历史数据)
|
||||
OPENAI: 'O',
|
||||
OPENAI_CLI: 'OC',
|
||||
OPENAI_COMPACT: 'OCP',
|
||||
OPENAI_CLI: 'OR',
|
||||
OPENAI_COMPACT: 'ORC',
|
||||
OPENAI_RESPONSES: 'OR',
|
||||
OPENAI_RESPONSES_COMPACT: 'ORC',
|
||||
OPENAI_IMAGE: 'OI',
|
||||
OPENAI_VIDEO: 'OV',
|
||||
CLAUDE: 'C',
|
||||
@@ -68,8 +72,8 @@ export const API_FORMAT_SHORT: Record<string, string> = {
|
||||
// API 格式排序顺序(统一的显示顺序)
|
||||
export const API_FORMAT_ORDER: string[] = [
|
||||
API_FORMATS.OPENAI,
|
||||
API_FORMATS.OPENAI_CLI,
|
||||
API_FORMATS.OPENAI_COMPACT,
|
||||
API_FORMATS.OPENAI_RESPONSES,
|
||||
API_FORMATS.OPENAI_RESPONSES_COMPACT,
|
||||
API_FORMATS.OPENAI_IMAGE,
|
||||
API_FORMATS.OPENAI_VIDEO,
|
||||
API_FORMATS.CLAUDE,
|
||||
@@ -90,6 +94,8 @@ export const API_FORMAT_FAMILY_LABELS: Record<string, string> = {
|
||||
export const API_FORMAT_KIND_LABELS: Record<string, string> = {
|
||||
chat: 'Chat',
|
||||
cli: 'CLI',
|
||||
responses: 'Responses',
|
||||
'responses:compact': 'Responses Compact',
|
||||
compact: 'Compact',
|
||||
image: 'Image',
|
||||
video: 'Video',
|
||||
|
||||
@@ -687,7 +687,7 @@ interface ApiFormatGroup {
|
||||
|
||||
const STANDARD_ROUTING_API_FORMATS = [
|
||||
'openai:chat',
|
||||
'openai:cli',
|
||||
'openai:responses',
|
||||
'claude:chat',
|
||||
'claude:cli',
|
||||
'gemini:chat',
|
||||
@@ -704,6 +704,8 @@ function apiDataFormatId(apiFormat: string): string | null {
|
||||
return 'gemini'
|
||||
case 'openai:chat':
|
||||
return 'openai_chat'
|
||||
case 'openai:responses':
|
||||
case 'openai:responses:compact':
|
||||
case 'openai:cli':
|
||||
case 'openai:compact':
|
||||
return 'openai_responses'
|
||||
@@ -723,8 +725,10 @@ function requestConversionKind(clientApiFormat: string, providerApiFormat: strin
|
||||
switch (provider) {
|
||||
case 'openai:chat':
|
||||
return 'to_openai_chat'
|
||||
case 'openai:responses':
|
||||
return 'to_openai_responses'
|
||||
case 'openai:cli':
|
||||
return 'to_openai_cli'
|
||||
return 'to_openai_responses'
|
||||
case 'claude:chat':
|
||||
case 'claude:cli':
|
||||
return 'to_claude'
|
||||
|
||||
@@ -1336,7 +1336,7 @@ function getDefaultPath(apiFormat: string, baseUrl?: string): string {
|
||||
const isCodex = providerType
|
||||
? providerType === 'codex'
|
||||
: (!!baseUrl && isCodexUrl(baseUrl))
|
||||
if (apiFormat === 'openai:cli' && isCodex) {
|
||||
if ((apiFormat === 'openai:responses' || apiFormat === 'openai:cli') && isCodex) {
|
||||
return '/responses'
|
||||
}
|
||||
return defaultPath
|
||||
@@ -2381,7 +2381,7 @@ function getCurrentUpstreamStreamPolicy(endpoint: ProviderEndpoint): string {
|
||||
|
||||
function isUpstreamStreamPolicyLocked(endpoint: ProviderEndpoint): boolean {
|
||||
return (props.provider?.provider_type || '').toLowerCase() === 'codex'
|
||||
&& endpoint.api_format === 'openai:cli'
|
||||
&& (endpoint.api_format === 'openai:responses' || endpoint.api_format === 'openai:cli')
|
||||
}
|
||||
|
||||
// 获取上游流式按钮的样式类
|
||||
@@ -2398,7 +2398,7 @@ function getUpstreamStreamButtonClass(endpoint: ProviderEndpoint): string {
|
||||
|
||||
// 获取上游流式按钮的提示文字
|
||||
function getUpstreamStreamTooltip(endpoint: ProviderEndpoint): string {
|
||||
if (isUpstreamStreamPolicyLocked(endpoint)) return '固定流式(Codex OpenAI CLI,已锁定)'
|
||||
if (isUpstreamStreamPolicyLocked(endpoint)) return '固定流式(Codex OpenAI Responses,已锁定)'
|
||||
const policy = getCurrentUpstreamStreamPolicy(endpoint)
|
||||
if (policy === 'force_stream') return '固定流式(点击切换为固定非流)'
|
||||
if (policy === 'force_non_stream') return '固定非流(点击切换为跟随请求)'
|
||||
|
||||
@@ -611,8 +611,10 @@ const LEGACY_API_FORMAT_MAP: Record<string, string> = {
|
||||
CLAUDE: 'claude:chat',
|
||||
CLAUDE_CLI: 'claude:cli',
|
||||
OPENAI: 'openai:chat',
|
||||
OPENAI_CLI: 'openai:cli',
|
||||
OPENAI_COMPACT: 'openai:compact',
|
||||
OPENAI_CLI: 'openai:responses',
|
||||
OPENAI_COMPACT: 'openai:responses:compact',
|
||||
OPENAI_RESPONSES: 'openai:responses',
|
||||
OPENAI_RESPONSES_COMPACT: 'openai:responses:compact',
|
||||
OPENAI_VIDEO: 'openai:video',
|
||||
GEMINI: 'gemini:chat',
|
||||
GEMINI_CLI: 'gemini:cli',
|
||||
|
||||
@@ -7,8 +7,8 @@ const ENDPOINT_SORT_ORDER = [
|
||||
'claude:chat',
|
||||
'claude:cli',
|
||||
'openai:chat',
|
||||
'openai:cli',
|
||||
'openai:compact',
|
||||
'openai:responses',
|
||||
'openai:responses:compact',
|
||||
'gemini:chat',
|
||||
'gemini:cli',
|
||||
'openai:video',
|
||||
|
||||
@@ -26,8 +26,8 @@ export function useProviderFilters(
|
||||
{ value: 'claude:chat', label: 'Claude Chat' },
|
||||
{ value: 'claude:cli', label: 'Claude CLI' },
|
||||
{ value: 'openai:chat', label: 'OpenAI Chat' },
|
||||
{ value: 'openai:cli', label: 'OpenAI CLI' },
|
||||
{ value: 'openai:compact', label: 'OpenAI Compact' },
|
||||
{ value: 'openai:responses', label: 'OpenAI Responses' },
|
||||
{ value: 'openai:responses:compact', label: 'OpenAI Responses Compact' },
|
||||
{ value: 'gemini:chat', label: 'Gemini Chat' },
|
||||
{ value: 'gemini:cli', label: 'Gemini CLI' },
|
||||
]
|
||||
|
||||
@@ -546,7 +546,7 @@ interface NodeGroup {
|
||||
startIndex: number
|
||||
endIndex: number
|
||||
hasConversion: boolean // 组内是否有格式转换候选
|
||||
providerApiFormat: string | null // 提供商 API 格式(如 openai:cli)
|
||||
providerApiFormat: string | null // 提供商 API 格式(如 openai:responses)
|
||||
isPoolGroup?: boolean
|
||||
}
|
||||
|
||||
|
||||
@@ -754,8 +754,8 @@ const emit = defineEmits<{
|
||||
// 静态常量(放在 defineProps/defineEmits 之后)
|
||||
const AVAILABLE_API_FORMATS = [
|
||||
{ value: 'openai:chat', label: 'OpenAI Chat' },
|
||||
{ value: 'openai:cli', label: 'OpenAI CLI' },
|
||||
{ value: 'openai:compact', label: 'OpenAI Compact' },
|
||||
{ value: 'openai:responses', label: 'OpenAI Responses' },
|
||||
{ value: 'openai:responses:compact', label: 'OpenAI Responses Compact' },
|
||||
{ value: 'openai:video', label: 'OpenAI Video' },
|
||||
{ value: 'claude:chat', label: 'Claude Chat' },
|
||||
{ value: 'claude:cli', label: 'Claude CLI' },
|
||||
|
||||
@@ -114,7 +114,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
if (model.includes('gpt') || model.includes('o1') || model.includes('o3')) return 95
|
||||
|
||||
// 3. 检查请求体结构
|
||||
// OpenAI CLI (Responses API) 使用 input 字段
|
||||
// OpenAI Responses API 使用 input 字段
|
||||
const isCliFormat = req?.input !== undefined || req?.instructions !== undefined
|
||||
// OpenAI Chat Completions 使用 messages 数组
|
||||
const isChatFormat = req?.messages && Array.isArray(req.messages)
|
||||
@@ -129,7 +129,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
: responseBody) as RawObject | null | undefined
|
||||
|
||||
if (respBody) {
|
||||
// OpenAI CLI 响应特征: type 字段为 response.* 格式
|
||||
// OpenAI Responses 响应特征: type 字段为 response.* 格式
|
||||
if (this.isCliResponseEvent(respBody)) {
|
||||
return 95
|
||||
}
|
||||
@@ -163,7 +163,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为 OpenAI CLI (Responses API) 的响应事件
|
||||
* 检查是否为 OpenAI Responses API 的响应事件
|
||||
*/
|
||||
private isCliResponseEvent(chunk: RawObject | null | undefined): boolean {
|
||||
const type = chunk?.type
|
||||
@@ -231,7 +231,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 OpenAI CLI (Responses API) 请求
|
||||
* 解析 OpenAI Responses API 请求
|
||||
*
|
||||
* CLI 格式特点:
|
||||
* - 使用 input 字段(可以是字符串、消息数组或对象)
|
||||
@@ -404,7 +404,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 OpenAI CLI (Responses API) 响应
|
||||
* 解析 OpenAI Responses API 响应
|
||||
*
|
||||
* CLI 响应格式: { output: [{ type: "message", content: [...] }] }
|
||||
*/
|
||||
@@ -548,7 +548,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 OpenAI CLI (Responses API) 流式响应
|
||||
* 解析 OpenAI Responses API 流式响应
|
||||
*
|
||||
* 支持的事件类型:
|
||||
* - response.created: 响应创建
|
||||
@@ -809,7 +809,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染 OpenAI CLI (Responses API) 请求
|
||||
* 渲染 OpenAI Responses API 请求
|
||||
*/
|
||||
private renderCliRequest(requestBody: RawObject): RenderResult {
|
||||
try {
|
||||
@@ -985,7 +985,7 @@ export class OpenAIParser implements ApiFormatParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染 OpenAI CLI (Responses API) 响应
|
||||
* 渲染 OpenAI Responses API 响应
|
||||
*/
|
||||
private renderCliResponse(responseBody: RawObject): RenderResult {
|
||||
try {
|
||||
|
||||
@@ -136,6 +136,8 @@ function normalizeUsageStreamApiFormat(value: string | null | undefined): string
|
||||
function usageApiFormatDefaultsToNonStream(apiFormat: string): boolean {
|
||||
switch (apiFormat) {
|
||||
case 'openai:chat':
|
||||
case 'openai:responses':
|
||||
case 'openai:responses:compact':
|
||||
case 'openai:cli':
|
||||
case 'openai:compact':
|
||||
case 'openai:image':
|
||||
|
||||
@@ -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: [] },
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user