Skip to content

Commit 02b4fa9

Browse files
committed
Route openai requests through direct api instead of open router
1 parent d0fc0d1 commit 02b4fa9

File tree

2 files changed

+584
-98
lines changed

2 files changed

+584
-98
lines changed

web/src/app/api/v1/chat/completions/_post.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ import {
5555
} from '@/llm-api/siliconflow'
5656
import {
5757
handleOpenAINonStream,
58-
OPENAI_SUPPORTED_MODELS,
58+
handleOpenAIStream,
59+
isOpenAIDirectModel,
60+
OpenAIError,
5961
} from '@/llm-api/openai'
6062
import {
6163
handleOpenRouterNonStream,
@@ -266,7 +268,7 @@ export async function postChatCompletions(params: {
266268
return NextResponse.json(
267269
{
268270
error: 'free_mode_unavailable',
269-
message: 'Free mode is not available outside of the United States and Canada. Please upgrade to a paid plan to use Codebuff outside the US and Canada.',
271+
message: 'Free mode is not available in your country.',
270272
},
271273
{ status: 403 },
272274
)
@@ -421,6 +423,7 @@ export async function postChatCompletions(params: {
421423
const useSiliconFlow = false // isSiliconFlowModel(typedBody.model)
422424
const useCanopyWave = false // isCanopyWaveModel(typedBody.model)
423425
const useFireworks = isFireworksModel(typedBody.model)
426+
const useOpenAIDirect = !useFireworks && isOpenAIDirectModel(typedBody.model)
424427
const stream = useSiliconFlow
425428
? await handleSiliconFlowStream({
426429
body: typedBody,
@@ -451,6 +454,16 @@ export async function postChatCompletions(params: {
451454
logger,
452455
insertMessageBigquery,
453456
})
457+
: useOpenAIDirect
458+
? await handleOpenAIStream({
459+
body: typedBody,
460+
userId,
461+
stripeCustomerId,
462+
agentId,
463+
fetch,
464+
logger,
465+
insertMessageBigquery,
466+
})
454467
: await handleOpenRouterStream({
455468
body: typedBody,
456469
userId,
@@ -487,15 +500,7 @@ export async function postChatCompletions(params: {
487500
const useSiliconFlow = false // isSiliconFlowModel(model)
488501
const useCanopyWave = false // isCanopyWaveModel(model)
489502
const useFireworks = isFireworksModel(model)
490-
const modelParts = model.split('/')
491-
const shortModelName = modelParts.length > 1 ? modelParts[1] : model
492-
const isOpenAIDirectModel =
493-
model.startsWith('openai/') &&
494-
(OPENAI_SUPPORTED_MODELS as readonly string[]).includes(shortModelName)
495-
// Only use OpenAI endpoint for OpenAI models with n parameter
496-
// All other models (including non-OpenAI with n parameter) should use OpenRouter
497-
const shouldUseOpenAIEndpoint =
498-
isOpenAIDirectModel && typedBody.codebuff_metadata?.n !== undefined
503+
const shouldUseOpenAIEndpoint = !useFireworks && isOpenAIDirectModel(model)
499504

500505
const nonStreamRequest = useSiliconFlow
501506
? handleSiliconFlowNonStream({
@@ -579,10 +584,14 @@ export async function postChatCompletions(params: {
579584
if (error instanceof SiliconFlowError) {
580585
siliconflowError = error
581586
}
587+
let openaiError: OpenAIError | undefined
588+
if (error instanceof OpenAIError) {
589+
openaiError = error
590+
}
582591

583592
// Log detailed error information for debugging
584593
const errorDetails = openrouterError?.toJSON()
585-
const providerLabel = siliconflowError ? 'SiliconFlow' : canopywaveError ? 'CanopyWave' : fireworksError ? 'Fireworks' : 'OpenRouter'
594+
const providerLabel = siliconflowError ? 'SiliconFlow' : canopywaveError ? 'CanopyWave' : fireworksError ? 'Fireworks' : openaiError ? 'OpenAI' : 'OpenRouter'
586595
logger.error(
587596
{
588597
error: getErrorObject(error),
@@ -596,8 +605,8 @@ export async function postChatCompletions(params: {
596605
? typedBody.messages.length
597606
: 0,
598607
messages: typedBody.messages,
599-
providerStatusCode: (openrouterError ?? fireworksError ?? canopywaveError ?? siliconflowError)?.statusCode,
600-
providerStatusText: (openrouterError ?? fireworksError ?? canopywaveError ?? siliconflowError)?.statusText,
608+
providerStatusCode: (openrouterError ?? fireworksError ?? canopywaveError ?? siliconflowError ?? openaiError)?.statusCode,
609+
providerStatusText: (openrouterError ?? fireworksError ?? canopywaveError ?? siliconflowError ?? openaiError)?.statusText,
601610
openrouterErrorCode: errorDetails?.error?.code,
602611
openrouterErrorType: errorDetails?.error?.type,
603612
openrouterErrorMessage: errorDetails?.error?.message,
@@ -631,6 +640,9 @@ export async function postChatCompletions(params: {
631640
if (error instanceof SiliconFlowError) {
632641
return NextResponse.json(error.toJSON(), { status: error.statusCode })
633642
}
643+
if (error instanceof OpenAIError) {
644+
return NextResponse.json(error.toJSON(), { status: error.statusCode })
645+
}
634646

635647
return NextResponse.json(
636648
{ error: 'Failed to process request' },

0 commit comments

Comments
 (0)