44import { createMockRequest , hybridAuthMockFns } from '@sim/testing'
55import { beforeEach , describe , expect , it , vi } from 'vitest'
66
7- const { mockEmbed, mockEmbedOpenRouter } = vi . hoisted ( ( ) => ( {
8- mockEmbed : vi . fn ( ) ,
9- mockEmbedOpenRouter : vi . fn ( ) ,
7+ const { mockEmbed, mockEmbedOpenRouter, mockGetOpenRouterEmbeddingModelMetadata } = vi . hoisted (
8+ ( ) => ( {
9+ mockEmbed : vi . fn ( ) ,
10+ mockEmbedOpenRouter : vi . fn ( ) ,
11+ mockGetOpenRouterEmbeddingModelMetadata : vi . fn ( ) ,
12+ } )
13+ )
14+
15+ vi . mock ( '@/lib/embeddings/openrouter-model-catalog.server' , ( ) => ( {
16+ getOpenRouterEmbeddingModelMetadata : mockGetOpenRouterEmbeddingModelMetadata ,
17+ OpenRouterEmbeddingModelNotFoundError : class OpenRouterEmbeddingModelNotFoundError extends Error {
18+ constructor ( model : string ) {
19+ super ( `Unsupported OpenRouter embedding model: ${ model } ` )
20+ this . name = 'OpenRouterEmbeddingModelNotFoundError'
21+ }
22+ } ,
1023} ) )
1124
1225vi . mock ( '@/lib/embeddings' , async ( ) => {
@@ -21,6 +34,7 @@ vi.mock('@/lib/embeddings', async () => {
2134 }
2235} )
2336
37+ import { OpenRouterEmbeddingModelNotFoundError } from '@/lib/embeddings/openrouter-model-catalog.server'
2438import { POST } from '@/app/api/tools/embeddings/route'
2539
2640const baseBody = {
@@ -37,6 +51,10 @@ function post(body: Record<string, unknown>) {
3751describe ( 'POST /api/tools/embeddings' , ( ) => {
3852 beforeEach ( ( ) => {
3953 vi . clearAllMocks ( )
54+ mockGetOpenRouterEmbeddingModelMetadata . mockResolvedValue ( {
55+ id : 'openrouter/qwen/qwen3-embedding-8b' ,
56+ maxInputTokens : 32768 ,
57+ } )
4058 hybridAuthMockFns . mockCheckInternalAuth . mockResolvedValue ( {
4159 success : true ,
4260 userId : 'user-1' ,
@@ -142,6 +160,7 @@ describe('POST /api/tools/embeddings', () => {
142160 [ 'hello world' ] ,
143161 expect . objectContaining ( {
144162 apiKey : 'or-test' ,
163+ maxInputTokens : 32768 ,
145164 model : 'openrouter/qwen/qwen3-embedding-8b' ,
146165 } )
147166 )
@@ -175,6 +194,23 @@ describe('POST /api/tools/embeddings', () => {
175194 expect ( mockEmbedOpenRouter ) . not . toHaveBeenCalled ( )
176195 } )
177196
197+ it ( 'rejects a qualified model that is absent from OpenRouter' , async ( ) => {
198+ mockGetOpenRouterEmbeddingModelMetadata . mockRejectedValue (
199+ new OpenRouterEmbeddingModelNotFoundError ( 'openrouter/example/missing' )
200+ )
201+
202+ const response = await post ( {
203+ provider : 'openrouter' ,
204+ model : 'openrouter/example/missing' ,
205+ input : 'hello world' ,
206+ apiKey : 'or-test' ,
207+ } )
208+
209+ expect ( response . status ) . toBe ( 400 )
210+ expect ( ( await response . json ( ) ) . error ) . toContain ( 'Unsupported OpenRouter embedding model' )
211+ expect ( mockEmbedOpenRouter ) . not . toHaveBeenCalled ( )
212+ } )
213+
178214 it ( 'keeps API keys required for non-OpenRouter providers' , async ( ) => {
179215 const response = await post ( {
180216 provider : 'openai' ,
0 commit comments