feat: add embedding and rerank support

This commit is contained in:
Kayphoon
2026-05-03 17:32:41 +08:00
parent 3e2eca4fd0
commit 5abe664d65
87 changed files with 5520 additions and 184 deletions
@@ -700,7 +700,7 @@ function runMappingTest(testingKey: string, modelName: string) {
selectedTestEndpoint.value = activeEndpoints.value[0] ?? null
testRequestHeadersResetValue.value = buildDefaultModelTestRequestHeaders()
testRequestHeadersDraft.value = testRequestHeadersResetValue.value
testRequestBodyResetValue.value = buildDefaultModelTestRequestBody(modelName)
testRequestBodyResetValue.value = buildDefaultModelTestRequestBody(modelName, selectedTestEndpoint.value?.api_format)
testRequestBodyDraft.value = testRequestBodyResetValue.value
}
@@ -543,6 +543,7 @@ async function testModelConnection(model: Model) {
testRequestHeadersDraft.value = testRequestHeadersResetValue.value
testRequestBodyResetValue.value = buildDefaultModelTestRequestBody(
model.global_model_name || model.provider_model_name,
selectedTestEndpoint.value?.api_format,
)
testRequestBodyDraft.value = testRequestBodyResetValue.value
modelTest.testResult.value = null
@@ -0,0 +1,46 @@
import { describe, expect, it } from 'vitest'
import { buildDefaultModelTestRequestBody } from '../model-test-request'
describe('buildDefaultModelTestRequestBody', () => {
it.each([
'openai:embedding',
'gemini:embedding',
'jina:embedding',
'doubao:embedding',
' OPENAI:EMBEDDING ',
])('uses embedding input payloads for %s api formats', (apiFormat) => {
const body = JSON.parse(buildDefaultModelTestRequestBody('text-embedding-3-small', apiFormat))
expect(body).toEqual({
model: 'text-embedding-3-small',
input: 'This is a test embedding input.',
})
expect(body.messages).toBeUndefined()
expect(body.stream).toBeUndefined()
})
it.each([
'openai:rerank',
'jina:rerank',
' JINA:RERANK ',
])('uses rerank query/documents payloads for %s api formats', (apiFormat) => {
const body = JSON.parse(buildDefaultModelTestRequestBody('bge-reranker-base', apiFormat))
expect(body.model).toBe('bge-reranker-base')
expect(body.query).toBe('This is a test rerank query.')
expect(body.documents).toHaveLength(2)
expect(body.top_n).toBe(1)
expect(body.return_documents).toBe(true)
expect(body.messages).toBeUndefined()
expect(body.stream).toBeUndefined()
})
it('keeps chat payloads for chat api formats', () => {
const body = JSON.parse(buildDefaultModelTestRequestBody('gpt-5.1', 'openai:chat'))
expect(body.messages).toEqual([{ role: 'user', content: 'Hello! This is a test message.' }])
expect(body.stream).toBe(true)
expect(body.input).toBeUndefined()
})
})
@@ -4,7 +4,27 @@ const DEFAULT_MODEL_TEST_MESSAGE = 'Hello! This is a test message.'
export const POOL_TEST_CONCURRENCY = 5
export const SINGLE_TEST_CONCURRENCY = 1
export function buildDefaultModelTestRequestBody(modelName: string): string {
export function buildDefaultModelTestRequestBody(modelName: string, apiFormat?: string | null): string {
if (apiFormat?.trim().toLowerCase().endsWith(':embedding')) {
return JSON.stringify({
model: modelName,
input: 'This is a test embedding input.',
}, null, 2)
}
if (apiFormat?.trim().toLowerCase().endsWith(':rerank')) {
return JSON.stringify({
model: modelName,
query: 'This is a test rerank query.',
documents: [
'This document is relevant to the test query.',
'This document is unrelated.',
],
top_n: 1,
return_documents: true,
}, null, 2)
}
return JSON.stringify({
model: modelName,
messages: [