Skip to content

Commit 57589cb

Browse files
waleedlatif1claude
andcommitted
fix(knowledge): match search tokenizer to embedding provider; remove dead var
Cursor bugbot: - Token estimation was hardcoded to 'openai' for every embedding model. For gemini-embedding-001 the cost was computed against an OpenAI-tokenized count, producing wrong input.tokens.prompt and (slightly) wrong cost. Now derive the tokenizer provider from the embedding model's provider. - rerankApplied was set but never read. Removed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent d70ac8f commit 57589cb

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

apps/sim/app/api/knowledge/search/route.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ describe('Knowledge Search API Route', () => {
432432
userId: 'user-123',
433433
name: 'Test KB',
434434
deletedAt: null,
435+
embeddingModel: 'text-embedding-3-small',
435436
},
436437
})
437438

@@ -697,6 +698,7 @@ describe('Knowledge Search API Route', () => {
697698
userId: 'user-123',
698699
name: 'Test KB',
699700
deletedAt: null,
701+
embeddingModel: 'text-embedding-3-small',
700702
},
701703
})
702704

@@ -742,6 +744,7 @@ describe('Knowledge Search API Route', () => {
742744
userId: 'user-123',
743745
name: 'Test KB',
744746
deletedAt: null,
747+
embeddingModel: 'text-embedding-3-small',
745748
},
746749
})
747750

@@ -880,6 +883,7 @@ describe('Knowledge Search API Route', () => {
880883
userId: 'user-123',
881884
name: 'Test KB',
882885
deletedAt: null,
886+
embeddingModel: 'text-embedding-3-small',
883887
},
884888
})
885889

apps/sim/app/api/knowledge/search/route.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { PlatformEvents } from '@/lib/core/telemetry'
77
import { generateRequestId } from '@/lib/core/utils/request'
88
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
99
import { ALL_TAG_SLOTS } from '@/lib/knowledge/constants'
10+
import { getEmbeddingModelInfo } from '@/lib/knowledge/embedding-models'
1011
import { DEFAULT_RERANKER_MODEL, rerank, SUPPORTED_RERANKER_MODELS } from '@/lib/knowledge/reranker'
1112
import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service'
1213
import { buildUndefinedTagsError, validateTagValue } from '@/lib/knowledge/tags/utils'
@@ -355,9 +356,7 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
355356
// Optional Cohere rerank pass on top of vector results.
356357
const rerankedScores = new Map<string, number>()
357358
// `rerankBilled` = Cohere was successfully called (even with 0 results) and we owe the search unit.
358-
// `rerankApplied` = result ordering was actually replaced by the reranker output.
359359
let rerankBilled = false
360-
let rerankApplied = false
361360
let rerankIsBYOK = false
362361
if (useReranker && rerankerModel && results.length > 0) {
363362
const candidateCount = results.length
@@ -381,7 +380,6 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
381380
.map((r) => idToResult.get(r.item.id))
382381
.filter((r): r is SearchResult => Boolean(r))
383382
for (const r of ranked) rerankedScores.set(r.item.id, r.relevanceScore)
384-
rerankApplied = true
385383
logger.info(`[${requestId}] Reranked ${candidateCount}${results.length} results`, {
386384
model: rerankerModel,
387385
})
@@ -404,7 +402,11 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
404402
let tokenCount = null
405403
if (hasQuery) {
406404
try {
407-
tokenCount = estimateTokenCount(validatedData.query!, 'openai')
405+
// Use the tokenizer matching the actual embedding provider so token counts
406+
// (and the input cost derived from them) reflect how the provider tokenizes.
407+
const tokenizerProvider =
408+
getEmbeddingModelInfo(queryEmbeddingModel).provider === 'gemini' ? 'google' : 'openai'
409+
tokenCount = estimateTokenCount(validatedData.query!, tokenizerProvider)
408410
cost = calculateCost(queryEmbeddingModel, tokenCount.count, 0, false)
409411
} catch (error) {
410412
logger.warn(`[${requestId}] Failed to calculate cost for search query`, {

0 commit comments

Comments
 (0)