Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ ENV \
HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
# InternLM
INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \
# Jina
JINA_API_KEY="" JINA_MODEL_LIST="" JINA_PROXY_URL="" \
# Minimax
MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \
# Mistral
Expand Down
2 changes: 2 additions & 0 deletions Dockerfile.database
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ ENV \
HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
# InternLM
INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \
# Jina
JINA_API_KEY="" JINA_MODEL_LIST="" JINA_PROXY_URL="" \
# Minimax
MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \
# Mistral
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
HigressProviderCard,
HunyuanProviderCard,
InternLMProviderCard,
JinaProviderCard,
MinimaxProviderCard,
MistralProviderCard,
MoonshotProviderCard,
Expand Down Expand Up @@ -77,6 +78,7 @@ export const useProviderList = (): ProviderItem[] => {
Ai21ProviderCard,
UpstageProviderCard,
XAIProviderCard,
JinaProviderCard,
QwenProviderCard,
WenxinProviderCard,
HunyuanProviderCard,
Expand Down
3 changes: 3 additions & 0 deletions src/config/aiModels/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { default as higress } from './higress';
import { default as huggingface } from './huggingface';
import { default as hunyuan } from './hunyuan';
import { default as internlm } from './internlm';
import { default as jina } from './jina';
import { default as lmstudio } from './lmstudio';
import { default as minimax } from './minimax';
import { default as mistral } from './mistral';
Expand Down Expand Up @@ -81,6 +82,7 @@ export const LOBE_DEFAULT_MODEL_LIST = buildDefaultModelList({
huggingface,
hunyuan,
internlm,
jina,
lmstudio,
minimax,
mistral,
Expand Down Expand Up @@ -125,6 +127,7 @@ export { default as higress } from './higress';
export { default as huggingface } from './huggingface';
export { default as hunyuan } from './hunyuan';
export { default as internlm } from './internlm';
export { default as jina } from './jina';
export { default as lmstudio } from './lmstudio';
export { default as minimax } from './minimax';
export { default as mistral } from './mistral';
Expand Down
23 changes: 23 additions & 0 deletions src/config/aiModels/jina.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { AIChatModelCard } from '@/types/aiModel';

const jinaChatModels: AIChatModelCard[] = [
{
abilities: {
reasoning: true,
},
contextWindowTokens: 64_000,
description: '深度搜索结合了网络搜索、阅读和推理,可进行全面调查。您可以将其视为一个代理,接受您的研究任务 - 它会进行广泛搜索并经过多次迭代,然后才能给出答案。这个过程涉及持续的研究、推理和从各个角度解决问题。这与直接从预训练数据生成答案的标准大模型以及依赖一次性表面搜索的传统 RAG 系统有着根本的不同。',
displayName: 'Jina DeepSearch v1',
enabled: true,
id: 'jina-deepsearch-v1',
pricing: {
input: 0.02,
output: 0.02
},
type: 'chat'
}
]

export const allModels = [...jinaChatModels];

export default allModels;
6 changes: 6 additions & 0 deletions src/config/llm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ export const getLLMConfig = () => {

ENABLED_TENCENT_CLOUD: z.boolean(),
TENCENT_CLOUD_API_KEY: z.string().optional(),

ENABLED_JINA: z.boolean(),
JINA_API_KEY: z.string().optional(),
},
runtimeEnv: {
API_KEY_SELECT_MODE: process.env.API_KEY_SELECT_MODE,
Expand Down Expand Up @@ -266,6 +269,9 @@ export const getLLMConfig = () => {

ENABLED_TENCENT_CLOUD: !!process.env.TENCENT_CLOUD_API_KEY,
TENCENT_CLOUD_API_KEY: process.env.TENCENT_CLOUD_API_KEY,

ENABLED_JINA: !!process.env.JINA_API_KEY,
JINA_API_KEY: process.env.JINA_API_KEY,
},
});
};
Expand Down
4 changes: 4 additions & 0 deletions src/config/modelProviders/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import HigressProvider from './higress';
import HuggingFaceProvider from './huggingface';
import HunyuanProvider from './hunyuan';
import InternLMProvider from './internlm';
import JinaProvider from './jina';
import LMStudioProvider from './lmstudio';
import MinimaxProvider from './minimax';
import MistralProvider from './mistral';
Expand Down Expand Up @@ -67,6 +68,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [
AnthropicProvider.chatModels,
HuggingFaceProvider.chatModels,
XAIProvider.chatModels,
JinaProvider.chatModels,
ZeroOneProvider.chatModels,
StepfunProvider.chatModels,
NovitaProvider.chatModels,
Expand Down Expand Up @@ -110,6 +112,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [
Ai21Provider,
UpstageProvider,
XAIProvider,
JinaProvider,
QwenProvider,
WenxinProvider,
TencentcloudProvider,
Expand Down Expand Up @@ -159,6 +162,7 @@ export { default as HigressProviderCard } from './higress';
export { default as HuggingFaceProviderCard } from './huggingface';
export { default as HunyuanProviderCard } from './hunyuan';
export { default as InternLMProviderCard } from './internlm';
export { default as JinaProviderCard } from './jina';
export { default as LMStudioProviderCard } from './lmstudio';
export { default as MinimaxProviderCard } from './minimax';
export { default as MistralProviderCard } from './mistral';
Expand Down
21 changes: 21 additions & 0 deletions src/config/modelProviders/jina.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ModelProviderCard } from '@/types/llm';

const Jina: ModelProviderCard = {
chatModels: [],
checkModel: 'jina-deepsearch-v1',
description: 'Jina AI 成立于 2020 年,是一家领先的搜索 AI 公司。我们的搜索底座平台包含了向量模型、重排器和小语言模型,可帮助企业构建可靠且高质量的生成式AI和多模态的搜索应用。',
id: 'jina',
modelList: { showModelFetcher: true },
modelsUrl: 'https://jina.ai/models',
name: 'Jina',
settings: {
proxyUrl: {
placeholder: 'https://deepsearch.jina.ai/v1',
},
sdkType: 'openai',
showModelFetcher: true,
},
url: 'https://jina.ai',
};

export default Jina;
7 changes: 7 additions & 0 deletions src/libs/agent-runtime/AgentRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { LobeHigressAI } from './higress';
import { LobeHuggingFaceAI } from './huggingface';
import { LobeHunyuanAI } from './hunyuan';
import { LobeInternLMAI } from './internlm';
import { LobeJinaAI } from './jina';
import { LobeLMStudioAI } from './lmstudio';
import { LobeMinimaxAI } from './minimax';
import { LobeMistralAI } from './mistral';
Expand Down Expand Up @@ -154,6 +155,7 @@ class AgentRuntime {
huggingface: { apiKey?: string; baseURL?: string };
hunyuan: Partial<ClientOptions>;
internlm: Partial<ClientOptions>;
jina: Partial<ClientOptions>;
lmstudio: Partial<ClientOptions>;
minimax: Partial<ClientOptions>;
mistral: Partial<ClientOptions>;
Expand Down Expand Up @@ -369,6 +371,11 @@ class AgentRuntime {
break;
}

case ModelProvider.Jina: {
runtimeModel = new LobeJinaAI(params.jina ?? {});
break;
}

case ModelProvider.Cloudflare: {
runtimeModel = new LobeCloudflareAI(params.cloudflare ?? {});
break;
Expand Down
49 changes: 49 additions & 0 deletions src/libs/agent-runtime/jina/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ModelProvider } from '../types';
import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';

import type { ChatModelCard } from '@/types/llm';

export interface JinaModelCard {
id: string;
}

export const LobeJinaAI = LobeOpenAICompatibleFactory({
baseURL: 'https://deepsearch.jina.ai/v1',
debug: {
chatCompletion: () => process.env.DEBUG_JINA_CHAT_COMPLETION === '1',
},
models: async ({ client }) => {
const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');

const reasoningKeywords = [
'deepsearch',
];

const modelsPage = await client.models.list() as any;
const modelList: JinaModelCard[] = modelsPage.data;

return modelList
.map((model) => {
const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.toLowerCase() === m.id.toLowerCase());

return {
contextWindowTokens: knownModel?.contextWindowTokens ?? undefined,
displayName: knownModel?.displayName ?? undefined,
enabled: knownModel?.enabled || false,
functionCall:
knownModel?.abilities?.functionCall
|| false,
id: model.id,
reasoning:
reasoningKeywords.some(keyword => model.id.toLowerCase().includes(keyword))
|| knownModel?.abilities?.reasoning
|| false,
vision:
knownModel?.abilities?.vision
|| false,
};
})
.filter(Boolean) as ChatModelCard[];
},
provider: ModelProvider.Jina,
});
1 change: 1 addition & 0 deletions src/libs/agent-runtime/types/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export enum ModelProvider {
HuggingFace = 'huggingface',
Hunyuan = 'hunyuan',
InternLM = 'internlm',
Jina = 'jina',
LMStudio = 'lmstudio',
Minimax = 'minimax',
Mistral = 'mistral',
Expand Down
1 change: 1 addition & 0 deletions src/types/user/settings/keyVaults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export interface UserKeyVaults {
huggingface?: OpenAICompatibleKeyVault;
hunyuan?: OpenAICompatibleKeyVault;
internlm?: OpenAICompatibleKeyVault;
jina?: OpenAICompatibleKeyVault;
lmstudio?: OpenAICompatibleKeyVault;
lobehub?: any;
minimax?: OpenAICompatibleKeyVault;
Expand Down