diff --git a/src/app/api/openrouter/[...path]/route.ts b/src/app/api/openrouter/[...path]/route.ts index 4f16bc3af..2fcc06bc9 100644 --- a/src/app/api/openrouter/[...path]/route.ts +++ b/src/app/api/openrouter/[...path]/route.ts @@ -5,7 +5,14 @@ import { generateProviderSpecificHash } from '@/lib/providerHash'; import { extractPromptInfo, type MicrodollarUsageContext } from '@/lib/processUsage'; import { validateFeatureHeader, FEATURE_HEADER } from '@/lib/feature-detection'; import type { OpenRouterChatCompletionRequest } from '@/lib/providers/openrouter/types'; -import { applyProviderSpecificLogic, getProvider, openRouterRequest } from '@/lib/providers'; +import { + applyProviderSpecificLogic, + fixDuplicatedReasoning, + getProvider, + isLegacyRooBasedClient, + isModernOpenCodeBasedClient, + openRouterRequest, +} from '@/lib/providers'; import { debugSaveProxyRequest } from '@/lib/debugUtils'; import { captureException, setTag, startInactiveSpan } from '@sentry/nextjs'; import { getUserFromAuth } from '@/lib/user.server'; @@ -384,6 +391,10 @@ export async function POST(request: NextRequest): Promise rd.type === ReasoningDetailType.Encrypted + ); + const lastSignedItem = msgWithReasoning.reasoning_details.findLast( + rd => rd.type === ReasoningDetailType.Text && rd.signature + ); + const lastTextItem = msgWithReasoning.reasoning_details.findLast( + rd => rd.type === ReasoningDetailType.Text + ); + const prevailingItem = lastEncryptedItem ?? lastSignedItem ?? lastTextItem; + if (!prevailingItem) { + continue; + } + console.debug( + '[fixDuplicatedReasoning] removing all but one item', + msgWithReasoning.reasoning_details + ); + msgWithReasoning.reasoning_details = [prevailingItem]; + } +} + export function applyProviderSpecificLogic( provider: Provider, requestedModel: string,