fix(aichat): fallback to completion if responses fails (#7190)

* fallback to completion if responses fails

* add missing fallbacks

* remove test errors
This commit is contained in:
centdix
2025-11-20 17:23:37 +01:00
committed by GitHub
parent c3cf093384
commit dcd0a2733c
2 changed files with 56 additions and 21 deletions

View File

@@ -408,24 +408,42 @@ class AIChatManager {
}
const model = getCurrentModel()
const completionFn =
model.provider === 'anthropic'
? getAnthropicCompletion
: model.provider === 'openai' || model.provider === 'azure_openai'
? getOpenAIResponsesCompletion
: getCompletion
const parseFn =
model.provider === 'anthropic'
? parseAnthropicCompletion
: model.provider === 'openai' || model.provider === 'azure_openai'
? parseOpenAIResponsesCompletion
: parseOpenAICompletion
const isOpenAI = model.provider === 'openai' || model.provider === 'azure_openai'
const isAnthropic = model.provider === 'anthropic'
const completion = await completionFn(
[systemMessage, ...messages, ...(pendingUserMessage ? [pendingUserMessage] : [])],
abortController,
tools.map((t) => t.def)
)
let completion: any
let parseFn: any
const messageParams = [
systemMessage,
...messages,
...(pendingUserMessage ? [pendingUserMessage] : [])
]
const toolDefs = tools.map((t) => t.def)
// For OpenAI/Azure, try Responses API first, fallback to Completions API
if (isOpenAI) {
try {
completion = await getOpenAIResponsesCompletion(
messageParams,
abortController,
toolDefs
)
parseFn = parseOpenAIResponsesCompletion
} catch (err) {
console.warn('OpenAI Responses API failed, falling back to Completions API:', err)
completion = await getCompletion(messageParams, abortController, toolDefs, {
forceCompletions: true
})
parseFn = parseOpenAICompletion
}
} else if (isAnthropic) {
completion = await getAnthropicCompletion(messageParams, abortController, toolDefs)
parseFn = parseAnthropicCompletion
} else {
completion = await getCompletion(messageParams, abortController, toolDefs)
parseFn = parseOpenAICompletion
}
if (completion) {
const continueCompletion = await parseFn(

View File

@@ -675,7 +675,16 @@ export async function getNonStreamingCompletion(
// Use Responses API for OpenAI and Azure OpenAI
if (provider === 'openai' || provider === 'azure_openai') {
return getNonStreamingOpenAIResponsesCompletion(messages, abortController, testOptions)
try {
const response = await getNonStreamingOpenAIResponsesCompletion(
messages,
abortController,
testOptions
)
return response
} catch (error) {
console.error('Error using Responses API:', error)
}
}
const fetchOptions: {
@@ -793,13 +802,21 @@ export async function getFimCompletion(
export async function getCompletion(
messages: ChatCompletionMessageParam[],
abortController: AbortController,
tools?: OpenAI.Chat.Completions.ChatCompletionTool[]
tools?: OpenAI.Chat.Completions.ChatCompletionTool[],
options?: {
forceCompletions?: boolean
}
): Promise<Stream<ChatCompletionChunk>> {
const { provider, config } = getProviderAndCompletionConfig({ messages, stream: true, tools })
// Use Responses API for OpenAI and Azure OpenAI
if (provider === 'openai' || provider === 'azure_openai') {
return getOpenAIResponsesCompletionStream(messages, abortController, tools) as any
if ((provider === 'openai' || provider === 'azure_openai') && !options?.forceCompletions) {
try {
const stream = getOpenAIResponsesCompletionStream(messages, abortController, tools) as any
return stream
} catch (error) {
console.error('Error using Responses API:', error)
}
}
// Use Completions API for other providers