fix: jina embedding error (#5839)

* fix: jina embedding error

* fix: handle jina model encoding format in Embeddings class
This commit is contained in:
SuYao 2025-05-10 23:03:48 +08:00 committed by GitHub
parent 2f5349cb64
commit 8da51585ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 100 additions and 44 deletions

View File

@ -37,3 +37,49 @@ index 7d19f5578040afa004bc887aab1725e8703d2bac..59ec725b6142299a62798ac4bdedb63b
if (status === 400) { if (status === 400) {
return new BadRequestError(status, error, message, headers); return new BadRequestError(status, error, message, headers);
} }
diff --git a/resources/embeddings.js b/resources/embeddings.js
index aae578404cb2d09a39ac33fc416f1c215c45eecd..25c54b05bdae64d5c3b36fbb30dc7c8221b14034 100644
--- a/resources/embeddings.js
+++ b/resources/embeddings.js
@@ -36,6 +36,9 @@ class Embeddings extends resource_1.APIResource {
// No encoding_format specified, defaulting to base64 for performance reasons
// See https://github.com/openai/openai-node/pull/1312
let encoding_format = hasUserProvidedEncodingFormat ? body.encoding_format : 'base64';
+ if (body.model.includes('jina')) {
+ encoding_format = undefined;
+ }
if (hasUserProvidedEncodingFormat) {
Core.debug('Request', 'User defined encoding_format:', body.encoding_format);
}
@@ -47,7 +50,7 @@ class Embeddings extends resource_1.APIResource {
...options,
});
// if the user specified an encoding_format, return the response as-is
- if (hasUserProvidedEncodingFormat) {
+ if (hasUserProvidedEncodingFormat || body.model.includes('jina')) {
return response;
}
// in this stage, we are sure the user did not specify an encoding_format
diff --git a/resources/embeddings.mjs b/resources/embeddings.mjs
index 0df3c6cc79a520e54acb4c2b5f77c43b774035ff..aa488b8a11b2c413c0a663d9a6059d286d7b5faf 100644
--- a/resources/embeddings.mjs
+++ b/resources/embeddings.mjs
@@ -10,6 +10,9 @@ export class Embeddings extends APIResource {
// No encoding_format specified, defaulting to base64 for performance reasons
// See https://github.com/openai/openai-node/pull/1312
let encoding_format = hasUserProvidedEncodingFormat ? body.encoding_format : 'base64';
+ if (body.model.includes('jina')) {
+ encoding_format = undefined;
+ }
if (hasUserProvidedEncodingFormat) {
Core.debug('Request', 'User defined encoding_format:', body.encoding_format);
}
@@ -21,7 +24,7 @@ export class Embeddings extends APIResource {
...options,
});
// if the user specified an encoding_format, return the response as-is
- if (hasUserProvidedEncodingFormat) {
+ if (hasUserProvidedEncodingFormat || body.model.includes('jina')) {
return response;
}
// in this stage, we are sure the user did not specify an encoding_format

View File

@ -14,7 +14,7 @@ import { getErrorMessage } from '@renderer/utils/error'
import { Form, Input, Modal, Select, Slider } from 'antd' import { Form, Input, Modal, Select, Slider } from 'antd'
import { find, sortBy } from 'lodash' import { find, sortBy } from 'lodash'
import { nanoid } from 'nanoid' import { nanoid } from 'nanoid'
import { useRef, useState } from 'react' import { useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
interface ShowParams { interface ShowParams {
@ -40,59 +40,69 @@ const PopupContainer: React.FC<Props> = ({ title, resolve }) => {
const { providers } = useProviders() const { providers } = useProviders()
const { addKnowledgeBase } = useKnowledgeBases() const { addKnowledgeBase } = useKnowledgeBases()
const allModels = providers const embeddingModels = useMemo(() => {
.map((p) => p.models) return providers
.flat() .map((p) => p.models)
.filter((model) => isEmbeddingModel(model) && !isRerankModel(model)) .flat()
.filter((model) => isEmbeddingModel(model))
}, [providers])
const rerankModels = providers const rerankModels = useMemo(() => {
.map((p) => p.models) return providers
.flat() .map((p) => p.models)
.filter((model) => isRerankModel(model)) .flat()
.filter((model) => isRerankModel(model))
}, [providers])
const nameInputRef = useRef<any>(null) const nameInputRef = useRef<any>(null)
const selectOptions = providers const embeddingSelectOptions = useMemo(() => {
.filter((p) => p.models.length > 0) console.log(providers)
.map((p) => ({ return providers
label: p.isSystem ? t(`provider.${p.id}`) : p.name, .filter((p) => p.models.length > 0)
title: p.name, .map((p) => ({
options: sortBy(p.models, 'name') label: p.isSystem ? t(`provider.${p.id}`) : p.name,
.filter((model) => isEmbeddingModel(model) && !isRerankModel(model)) title: p.name,
.map((m) => ({ options: sortBy(p.models, 'name')
label: m.name, .filter((model) => isEmbeddingModel(model))
value: getModelUniqId(m) .map((m) => ({
})) label: m.name,
})) value: getModelUniqId(m),
.filter((group) => group.options.length > 0) key: `${p.id}-${m.id}`
}))
}))
.filter((group) => group.options.length > 0)
}, [providers, t])
const rerankSelectOptions = providers const rerankSelectOptions = useMemo(() => {
.filter((p) => p.models.length > 0) return providers
.filter((p) => !NOT_SUPPORTED_REANK_PROVIDERS.includes(p.id)) .filter((p) => p.models.length > 0)
.map((p) => ({ .filter((p) => !NOT_SUPPORTED_REANK_PROVIDERS.includes(p.id))
label: p.isSystem ? t(`provider.${p.id}`) : p.name, .map((p) => ({
title: p.name, label: p.isSystem ? t(`provider.${p.id}`) : p.name,
options: sortBy(p.models, 'name') title: p.name,
.filter((model) => isRerankModel(model)) options: sortBy(p.models, 'name')
.map((m) => ({ .filter((model) => isRerankModel(model))
label: m.name, .map((m) => ({
value: getModelUniqId(m) label: m.name,
})) value: getModelUniqId(m)
})) }))
.filter((group) => group.options.length > 0) }))
.filter((group) => group.options.length > 0)
}, [providers, t])
const onOk = async () => { const onOk = async () => {
try { try {
const values = await form.validateFields() const values = await form.validateFields()
const selectedModel = find(allModels, JSON.parse(values.model)) as Model const selectedEmbeddingModel = find(embeddingModels, JSON.parse(values.model)) as Model
const selectedRerankModel = values.rerankModel const selectedRerankModel = values.rerankModel
? (find(rerankModels, JSON.parse(values.rerankModel)) as Model) ? (find(rerankModels, JSON.parse(values.rerankModel)) as Model)
: undefined : undefined
if (selectedModel) { if (selectedEmbeddingModel) {
setLoading(true) setLoading(true)
const provider = providers.find((p) => p.id === selectedModel.provider) const provider = providers.find((p) => p.id === selectedEmbeddingModel.provider)
if (!provider) { if (!provider) {
return return
@ -102,7 +112,7 @@ const PopupContainer: React.FC<Props> = ({ title, resolve }) => {
let dimensions = 0 let dimensions = 0
try { try {
dimensions = await aiProvider.getEmbeddingDimensions(selectedModel) dimensions = await aiProvider.getEmbeddingDimensions(selectedEmbeddingModel)
} catch (error) { } catch (error) {
console.error('Error getting embedding dimensions:', error) console.error('Error getting embedding dimensions:', error)
window.message.error(t('message.error.get_embedding_dimensions') + '\n' + getErrorMessage(error)) window.message.error(t('message.error.get_embedding_dimensions') + '\n' + getErrorMessage(error))
@ -113,7 +123,7 @@ const PopupContainer: React.FC<Props> = ({ title, resolve }) => {
const newBase = { const newBase = {
id: nanoid(), id: nanoid(),
name: values.name, name: values.name,
model: selectedModel, model: selectedEmbeddingModel,
rerankModel: selectedRerankModel, rerankModel: selectedRerankModel,
dimensions, dimensions,
documentCount: values.documentCount || DEFAULT_KNOWLEDGE_DOCUMENT_COUNT, documentCount: values.documentCount || DEFAULT_KNOWLEDGE_DOCUMENT_COUNT,
@ -166,7 +176,7 @@ const PopupContainer: React.FC<Props> = ({ title, resolve }) => {
label={t('models.embedding_model')} label={t('models.embedding_model')}
tooltip={{ title: t('models.embedding_model_tooltip'), placement: 'right' }} tooltip={{ title: t('models.embedding_model_tooltip'), placement: 'right' }}
rules={[{ required: true, message: t('message.error.enter.model') }]}> rules={[{ required: true, message: t('message.error.enter.model') }]}>
<Select style={{ width: '100%' }} options={selectOptions} placeholder={t('settings.models.empty')} /> <Select style={{ width: '100%' }} options={embeddingSelectOptions} placeholder={t('settings.models.empty')} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item

View File

@ -12940,7 +12940,7 @@ __metadata:
"openai@patch:openai@npm%3A4.96.0#~/.yarn/patches/openai-npm-4.96.0-0665b05cb9.patch": "openai@patch:openai@npm%3A4.96.0#~/.yarn/patches/openai-npm-4.96.0-0665b05cb9.patch":
version: 4.96.0 version: 4.96.0
resolution: "openai@patch:openai@npm%3A4.96.0#~/.yarn/patches/openai-npm-4.96.0-0665b05cb9.patch::version=4.96.0&hash=17e659" resolution: "openai@patch:openai@npm%3A4.96.0#~/.yarn/patches/openai-npm-4.96.0-0665b05cb9.patch::version=4.96.0&hash=645779"
dependencies: dependencies:
"@types/node": "npm:^18.11.18" "@types/node": "npm:^18.11.18"
"@types/node-fetch": "npm:^2.6.4" "@types/node-fetch": "npm:^2.6.4"
@ -12959,7 +12959,7 @@ __metadata:
optional: true optional: true
bin: bin:
openai: bin/cli openai: bin/cli
checksum: 10c0/b1f6162017ede2e0c3338ca94ea0e0c6ababc39ef8abea9e1a04d747725cf6ca3fbd0e4682c231af03a6473228b25a16ce52aac03c3cc4feb302d03b9603e06b checksum: 10c0/8c16fcf1812294220eddd4616e298c2af87398acb479287b7565548c8c1979c6d5c487fb7a9c25b0ac59f778de74c23d94ce1a34362c49260ae7a14acf22abc2
languageName: node languageName: node
linkType: hard linkType: hard