Skip to content

Commit f2a5062

Browse files
hezhijie0327arvinxx
authored andcommitted
✨ feat: add Jina AI model provider support (lobehub#6140)
* ✨ feat: add Jina model provider support * 🐛 fix: fix ci error * 💄 style: add `proxyUrl` support * 🔨 chore: cleanup code --------- Co-authored-by: Arvin Xu <arvinx@foxmail.com>
1 parent dbed33b commit f2a5062

File tree

12 files changed

+121
-0
lines changed

12 files changed

+121
-0
lines changed

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ ENV \
183183
HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
184184
# InternLM
185185
INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \
186+
# Jina
187+
JINA_API_KEY="" JINA_MODEL_LIST="" JINA_PROXY_URL="" \
186188
# Minimax
187189
MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \
188190
# Mistral

Dockerfile.database

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ ENV \
220220
HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
221221
# InternLM
222222
INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \
223+
# Jina
224+
JINA_API_KEY="" JINA_MODEL_LIST="" JINA_PROXY_URL="" \
223225
# Minimax
224226
MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \
225227
# Mistral

src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
HigressProviderCard,
1414
HunyuanProviderCard,
1515
InternLMProviderCard,
16+
JinaProviderCard,
1617
MinimaxProviderCard,
1718
MistralProviderCard,
1819
MoonshotProviderCard,
@@ -77,6 +78,7 @@ export const useProviderList = (): ProviderItem[] => {
7778
Ai21ProviderCard,
7879
UpstageProviderCard,
7980
XAIProviderCard,
81+
JinaProviderCard,
8082
QwenProviderCard,
8183
WenxinProviderCard,
8284
HunyuanProviderCard,

src/config/aiModels/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { default as higress } from './higress';
1818
import { default as huggingface } from './huggingface';
1919
import { default as hunyuan } from './hunyuan';
2020
import { default as internlm } from './internlm';
21+
import { default as jina } from './jina';
2122
import { default as lmstudio } from './lmstudio';
2223
import { default as minimax } from './minimax';
2324
import { default as mistral } from './mistral';
@@ -81,6 +82,7 @@ export const LOBE_DEFAULT_MODEL_LIST = buildDefaultModelList({
8182
huggingface,
8283
hunyuan,
8384
internlm,
85+
jina,
8486
lmstudio,
8587
minimax,
8688
mistral,
@@ -125,6 +127,7 @@ export { default as higress } from './higress';
125127
export { default as huggingface } from './huggingface';
126128
export { default as hunyuan } from './hunyuan';
127129
export { default as internlm } from './internlm';
130+
export { default as jina } from './jina';
128131
export { default as lmstudio } from './lmstudio';
129132
export { default as minimax } from './minimax';
130133
export { default as mistral } from './mistral';

src/config/aiModels/jina.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { AIChatModelCard } from '@/types/aiModel';
2+
3+
const jinaChatModels: AIChatModelCard[] = [
4+
{
5+
abilities: {
6+
reasoning: true,
7+
},
8+
contextWindowTokens: 64_000,
9+
description: '深度搜索结合了网络搜索、阅读和推理,可进行全面调查。您可以将其视为一个代理,接受您的研究任务 - 它会进行广泛搜索并经过多次迭代,然后才能给出答案。这个过程涉及持续的研究、推理和从各个角度解决问题。这与直接从预训练数据生成答案的标准大模型以及依赖一次性表面搜索的传统 RAG 系统有着根本的不同。',
10+
displayName: 'Jina DeepSearch v1',
11+
enabled: true,
12+
id: 'jina-deepsearch-v1',
13+
pricing: {
14+
input: 0.02,
15+
output: 0.02
16+
},
17+
type: 'chat'
18+
}
19+
]
20+
21+
export const allModels = [...jinaChatModels];
22+
23+
export default allModels;

src/config/llm.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ export const getLLMConfig = () => {
134134

135135
ENABLED_TENCENT_CLOUD: z.boolean(),
136136
TENCENT_CLOUD_API_KEY: z.string().optional(),
137+
138+
ENABLED_JINA: z.boolean(),
139+
JINA_API_KEY: z.string().optional(),
137140
},
138141
runtimeEnv: {
139142
API_KEY_SELECT_MODE: process.env.API_KEY_SELECT_MODE,
@@ -266,6 +269,9 @@ export const getLLMConfig = () => {
266269

267270
ENABLED_TENCENT_CLOUD: !!process.env.TENCENT_CLOUD_API_KEY,
268271
TENCENT_CLOUD_API_KEY: process.env.TENCENT_CLOUD_API_KEY,
272+
273+
ENABLED_JINA: !!process.env.JINA_API_KEY,
274+
JINA_API_KEY: process.env.JINA_API_KEY,
269275
},
270276
});
271277
};

src/config/modelProviders/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import HigressProvider from './higress';
1818
import HuggingFaceProvider from './huggingface';
1919
import HunyuanProvider from './hunyuan';
2020
import InternLMProvider from './internlm';
21+
import JinaProvider from './jina';
2122
import LMStudioProvider from './lmstudio';
2223
import MinimaxProvider from './minimax';
2324
import MistralProvider from './mistral';
@@ -67,6 +68,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [
6768
AnthropicProvider.chatModels,
6869
HuggingFaceProvider.chatModels,
6970
XAIProvider.chatModels,
71+
JinaProvider.chatModels,
7072
ZeroOneProvider.chatModels,
7173
StepfunProvider.chatModels,
7274
NovitaProvider.chatModels,
@@ -110,6 +112,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [
110112
Ai21Provider,
111113
UpstageProvider,
112114
XAIProvider,
115+
JinaProvider,
113116
QwenProvider,
114117
WenxinProvider,
115118
TencentcloudProvider,
@@ -159,6 +162,7 @@ export { default as HigressProviderCard } from './higress';
159162
export { default as HuggingFaceProviderCard } from './huggingface';
160163
export { default as HunyuanProviderCard } from './hunyuan';
161164
export { default as InternLMProviderCard } from './internlm';
165+
export { default as JinaProviderCard } from './jina';
162166
export { default as LMStudioProviderCard } from './lmstudio';
163167
export { default as MinimaxProviderCard } from './minimax';
164168
export { default as MistralProviderCard } from './mistral';

src/config/modelProviders/jina.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ModelProviderCard } from '@/types/llm';
2+
3+
const Jina: ModelProviderCard = {
4+
chatModels: [],
5+
checkModel: 'jina-deepsearch-v1',
6+
description: 'Jina AI 成立于 2020 年,是一家领先的搜索 AI 公司。我们的搜索底座平台包含了向量模型、重排器和小语言模型,可帮助企业构建可靠且高质量的生成式AI和多模态的搜索应用。',
7+
id: 'jina',
8+
modelList: { showModelFetcher: true },
9+
modelsUrl: 'https://jina.ai/models',
10+
name: 'Jina',
11+
settings: {
12+
proxyUrl: {
13+
placeholder: 'https://deepsearch.jina.ai/v1',
14+
},
15+
sdkType: 'openai',
16+
showModelFetcher: true,
17+
},
18+
url: 'https://jina.ai',
19+
};
20+
21+
export default Jina;

src/libs/agent-runtime/AgentRuntime.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { LobeHigressAI } from './higress';
2121
import { LobeHuggingFaceAI } from './huggingface';
2222
import { LobeHunyuanAI } from './hunyuan';
2323
import { LobeInternLMAI } from './internlm';
24+
import { LobeJinaAI } from './jina';
2425
import { LobeLMStudioAI } from './lmstudio';
2526
import { LobeMinimaxAI } from './minimax';
2627
import { LobeMistralAI } from './mistral';
@@ -154,6 +155,7 @@ class AgentRuntime {
154155
huggingface: { apiKey?: string; baseURL?: string };
155156
hunyuan: Partial<ClientOptions>;
156157
internlm: Partial<ClientOptions>;
158+
jina: Partial<ClientOptions>;
157159
lmstudio: Partial<ClientOptions>;
158160
minimax: Partial<ClientOptions>;
159161
mistral: Partial<ClientOptions>;
@@ -369,6 +371,11 @@ class AgentRuntime {
369371
break;
370372
}
371373

374+
case ModelProvider.Jina: {
375+
runtimeModel = new LobeJinaAI(params.jina ?? {});
376+
break;
377+
}
378+
372379
case ModelProvider.Cloudflare: {
373380
runtimeModel = new LobeCloudflareAI(params.cloudflare ?? {});
374381
break;

src/libs/agent-runtime/jina/index.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { ModelProvider } from '../types';
2+
import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';
3+
4+
import type { ChatModelCard } from '@/types/llm';
5+
6+
export interface JinaModelCard {
7+
id: string;
8+
}
9+
10+
export const LobeJinaAI = LobeOpenAICompatibleFactory({
11+
baseURL: 'https://deepsearch.jina.ai/v1',
12+
debug: {
13+
chatCompletion: () => process.env.DEBUG_JINA_CHAT_COMPLETION === '1',
14+
},
15+
models: async ({ client }) => {
16+
const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
17+
18+
const reasoningKeywords = [
19+
'deepsearch',
20+
];
21+
22+
const modelsPage = await client.models.list() as any;
23+
const modelList: JinaModelCard[] = modelsPage.data;
24+
25+
return modelList
26+
.map((model) => {
27+
const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.toLowerCase() === m.id.toLowerCase());
28+
29+
return {
30+
contextWindowTokens: knownModel?.contextWindowTokens ?? undefined,
31+
displayName: knownModel?.displayName ?? undefined,
32+
enabled: knownModel?.enabled || false,
33+
functionCall:
34+
knownModel?.abilities?.functionCall
35+
|| false,
36+
id: model.id,
37+
reasoning:
38+
reasoningKeywords.some(keyword => model.id.toLowerCase().includes(keyword))
39+
|| knownModel?.abilities?.reasoning
40+
|| false,
41+
vision:
42+
knownModel?.abilities?.vision
43+
|| false,
44+
};
45+
})
46+
.filter(Boolean) as ChatModelCard[];
47+
},
48+
provider: ModelProvider.Jina,
49+
});

src/libs/agent-runtime/types/type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export enum ModelProvider {
4040
HuggingFace = 'huggingface',
4141
Hunyuan = 'hunyuan',
4242
InternLM = 'internlm',
43+
Jina = 'jina',
4344
LMStudio = 'lmstudio',
4445
Minimax = 'minimax',
4546
Mistral = 'mistral',

src/types/user/settings/keyVaults.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export interface UserKeyVaults {
4444
huggingface?: OpenAICompatibleKeyVault;
4545
hunyuan?: OpenAICompatibleKeyVault;
4646
internlm?: OpenAICompatibleKeyVault;
47+
jina?: OpenAICompatibleKeyVault;
4748
lmstudio?: OpenAICompatibleKeyVault;
4849
lobehub?: any;
4950
minimax?: OpenAICompatibleKeyVault;

0 commit comments

Comments
 (0)