@lobehub/chat 1.68.6 → 1.68.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/changelog/v1.json +18 -0
- package/package.json +1 -1
- package/src/app/(backend)/webapi/chat/[provider]/route.test.ts +2 -2
- package/src/database/server/models/aiModel.ts +1 -0
- package/src/libs/agent-runtime/AgentRuntime.test.ts +76 -255
- package/src/libs/agent-runtime/AgentRuntime.ts +13 -338
- package/src/libs/agent-runtime/azureOpenai/index.test.ts +9 -9
- package/src/libs/agent-runtime/azureOpenai/index.ts +6 -6
- package/src/libs/agent-runtime/openrouter/__snapshots__/index.test.ts.snap +898 -48
- package/src/libs/agent-runtime/openrouter/index.ts +24 -8
- package/src/libs/agent-runtime/openrouter/type.ts +11 -0
- package/src/libs/agent-runtime/runtimeMap.ts +97 -0
- package/src/libs/agent-runtime/vertexai/index.ts +3 -1
- package/src/server/modules/AgentRuntime/index.ts +3 -2
- package/src/services/chat.ts +4 -6
- package/src/types/llm.ts +1 -1
@@ -2,7 +2,12 @@ import type { ChatModelCard } from '@/types/llm';
|
|
2
2
|
|
3
3
|
import { ModelProvider } from '../types';
|
4
4
|
import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';
|
5
|
-
import { OpenRouterModelCard } from './type';
|
5
|
+
import { OpenRouterModelCard, OpenRouterModelExtraInfo } from './type';
|
6
|
+
|
7
|
+
const formatPrice = (price: string) => {
|
8
|
+
if (price === '-1') return undefined;
|
9
|
+
return Number((Number(price) * 1e6).toPrecision(5));
|
10
|
+
};
|
6
11
|
|
7
12
|
export const LobeOpenRouterAI = LobeOpenAICompatibleFactory({
|
8
13
|
baseURL: 'https://openrouter.ai/api/v1',
|
@@ -28,8 +33,6 @@ export const LobeOpenRouterAI = LobeOpenAICompatibleFactory({
|
|
28
33
|
models: async ({ client }) => {
|
29
34
|
const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
|
30
35
|
|
31
|
-
const visionKeywords = ['qwen/qvq', 'vision'];
|
32
|
-
|
33
36
|
const reasoningKeywords = [
|
34
37
|
'deepseek/deepseek-r1',
|
35
38
|
'openai/o1',
|
@@ -42,11 +45,21 @@ export const LobeOpenRouterAI = LobeOpenAICompatibleFactory({
|
|
42
45
|
const modelsPage = (await client.models.list()) as any;
|
43
46
|
const modelList: OpenRouterModelCard[] = modelsPage.data;
|
44
47
|
|
48
|
+
const response = await fetch('https://openrouter.ai/api/frontend/models');
|
49
|
+
const modelsExtraInfo: OpenRouterModelExtraInfo[] = [];
|
50
|
+
if (response.ok) {
|
51
|
+
const data = await response.json();
|
52
|
+
modelsExtraInfo.push(...data['data']);
|
53
|
+
}
|
54
|
+
|
45
55
|
return modelList
|
46
56
|
.map((model) => {
|
47
57
|
const knownModel = LOBE_DEFAULT_MODEL_LIST.find(
|
48
58
|
(m) => model.id.toLowerCase() === m.id.toLowerCase(),
|
49
59
|
);
|
60
|
+
const extraInfo = modelsExtraInfo.find(
|
61
|
+
(m) => m.slug.toLowerCase() === model.id.toLowerCase(),
|
62
|
+
);
|
50
63
|
|
51
64
|
return {
|
52
65
|
contextWindowTokens: model.context_length,
|
@@ -56,6 +69,7 @@ export const LobeOpenRouterAI = LobeOpenAICompatibleFactory({
|
|
56
69
|
functionCall:
|
57
70
|
model.description.includes('function calling') ||
|
58
71
|
model.description.includes('tools') ||
|
72
|
+
extraInfo?.endpoint?.supports_tool_parameters ||
|
59
73
|
knownModel?.abilities?.functionCall ||
|
60
74
|
false,
|
61
75
|
id: model.id,
|
@@ -63,16 +77,18 @@ export const LobeOpenRouterAI = LobeOpenAICompatibleFactory({
|
|
63
77
|
typeof model.top_provider.max_completion_tokens === 'number'
|
64
78
|
? model.top_provider.max_completion_tokens
|
65
79
|
: undefined,
|
80
|
+
pricing: {
|
81
|
+
input: formatPrice(model.pricing.prompt),
|
82
|
+
output: formatPrice(model.pricing.completion),
|
83
|
+
},
|
66
84
|
reasoning:
|
67
85
|
reasoningKeywords.some((keyword) => model.id.toLowerCase().includes(keyword)) ||
|
86
|
+
extraInfo?.endpoint?.supports_reasoning ||
|
68
87
|
knownModel?.abilities?.reasoning ||
|
69
88
|
false,
|
89
|
+
releasedAt: new Date(model.created * 1000).toISOString().split('T')[0],
|
70
90
|
vision:
|
71
|
-
model.
|
72
|
-
model.description.includes('multimodal') ||
|
73
|
-
visionKeywords.some((keyword) => model.id.toLowerCase().includes(keyword)) ||
|
74
|
-
knownModel?.abilities?.vision ||
|
75
|
-
false,
|
91
|
+
model.architecture.modality.includes('image') || knownModel?.abilities?.vision || false,
|
76
92
|
};
|
77
93
|
})
|
78
94
|
.filter(Boolean) as ChatModelCard[];
|
@@ -19,6 +19,7 @@ interface ModelTopProvider {
|
|
19
19
|
export interface OpenRouterModelCard {
|
20
20
|
architecture: ModelArchitecture;
|
21
21
|
context_length: number;
|
22
|
+
created: number;
|
22
23
|
description: string;
|
23
24
|
id: string;
|
24
25
|
name: string;
|
@@ -26,3 +27,13 @@ export interface OpenRouterModelCard {
|
|
26
27
|
pricing: ModelPricing;
|
27
28
|
top_provider: ModelTopProvider;
|
28
29
|
}
|
30
|
+
|
31
|
+
interface OpenRouterModelEndpoint {
|
32
|
+
supports_reasoning?: boolean;
|
33
|
+
supports_tool_parameters?: boolean;
|
34
|
+
}
|
35
|
+
|
36
|
+
export interface OpenRouterModelExtraInfo {
|
37
|
+
endpoint?: OpenRouterModelEndpoint;
|
38
|
+
slug: string;
|
39
|
+
}
|
@@ -0,0 +1,97 @@
|
|
1
|
+
import { LobeAi21AI } from './ai21';
|
2
|
+
import { LobeAi360AI } from './ai360';
|
3
|
+
import LobeAnthropicAI from './anthropic';
|
4
|
+
import { LobeAzureOpenAI } from './azureOpenai';
|
5
|
+
import { LobeAzureAI } from './azureai';
|
6
|
+
import { LobeBaichuanAI } from './baichuan';
|
7
|
+
import LobeBedrockAI from './bedrock';
|
8
|
+
import { LobeCloudflareAI } from './cloudflare';
|
9
|
+
import { LobeDeepSeekAI } from './deepseek';
|
10
|
+
import { LobeFireworksAI } from './fireworksai';
|
11
|
+
import { LobeGiteeAI } from './giteeai';
|
12
|
+
import { LobeGithubAI } from './github';
|
13
|
+
import LobeGoogleAI from './google';
|
14
|
+
import { LobeGroq } from './groq';
|
15
|
+
import { LobeHigressAI } from './higress';
|
16
|
+
import { LobeHuggingFaceAI } from './huggingface';
|
17
|
+
import { LobeHunyuanAI } from './hunyuan';
|
18
|
+
import { LobeInternLMAI } from './internlm';
|
19
|
+
import { LobeJinaAI } from './jina';
|
20
|
+
import { LobeLMStudioAI } from './lmstudio';
|
21
|
+
import { LobeMinimaxAI } from './minimax';
|
22
|
+
import { LobeMistralAI } from './mistral';
|
23
|
+
import { LobeMoonshotAI } from './moonshot';
|
24
|
+
import { LobeNovitaAI } from './novita';
|
25
|
+
import { LobeNvidiaAI } from './nvidia';
|
26
|
+
import LobeOllamaAI from './ollama';
|
27
|
+
import { LobeOpenAI } from './openai';
|
28
|
+
import { LobeOpenRouterAI } from './openrouter';
|
29
|
+
import { LobePerplexityAI } from './perplexity';
|
30
|
+
import { LobePPIOAI } from './ppio';
|
31
|
+
import { LobeQwenAI } from './qwen';
|
32
|
+
import { LobeSambaNovaAI } from './sambanova';
|
33
|
+
import { LobeSenseNovaAI } from './sensenova';
|
34
|
+
import { LobeSiliconCloudAI } from './siliconcloud';
|
35
|
+
import { LobeSparkAI } from './spark';
|
36
|
+
import { LobeStepfunAI } from './stepfun';
|
37
|
+
import { LobeTaichuAI } from './taichu';
|
38
|
+
import { LobeTencentCloudAI } from './tencentcloud';
|
39
|
+
import { LobeTogetherAI } from './togetherai';
|
40
|
+
import { ModelProvider } from './types';
|
41
|
+
import { LobeUpstageAI } from './upstage';
|
42
|
+
import { LobeVLLMAI } from './vllm';
|
43
|
+
import { LobeVolcengineAI } from './volcengine';
|
44
|
+
import { LobeWenxinAI } from './wenxin';
|
45
|
+
import { LobeXAI } from './xai';
|
46
|
+
import { LobeZeroOneAI } from './zeroone';
|
47
|
+
import { LobeZhipuAI } from './zhipu';
|
48
|
+
|
49
|
+
export const providerRuntimeMap = {
|
50
|
+
[ModelProvider.OpenAI]: LobeOpenAI,
|
51
|
+
[ModelProvider.Azure]: LobeAzureOpenAI,
|
52
|
+
[ModelProvider.AzureAI]: LobeAzureAI,
|
53
|
+
[ModelProvider.ZhiPu]: LobeZhipuAI,
|
54
|
+
[ModelProvider.Google]: LobeGoogleAI,
|
55
|
+
[ModelProvider.Moonshot]: LobeMoonshotAI,
|
56
|
+
[ModelProvider.Bedrock]: LobeBedrockAI,
|
57
|
+
[ModelProvider.LMStudio]: LobeLMStudioAI,
|
58
|
+
[ModelProvider.Ollama]: LobeOllamaAI,
|
59
|
+
[ModelProvider.VLLM]: LobeVLLMAI,
|
60
|
+
[ModelProvider.Perplexity]: LobePerplexityAI,
|
61
|
+
[ModelProvider.Anthropic]: LobeAnthropicAI,
|
62
|
+
[ModelProvider.DeepSeek]: LobeDeepSeekAI,
|
63
|
+
[ModelProvider.HuggingFace]: LobeHuggingFaceAI,
|
64
|
+
[ModelProvider.Minimax]: LobeMinimaxAI,
|
65
|
+
[ModelProvider.Mistral]: LobeMistralAI,
|
66
|
+
[ModelProvider.Groq]: LobeGroq,
|
67
|
+
[ModelProvider.Github]: LobeGithubAI,
|
68
|
+
[ModelProvider.OpenRouter]: LobeOpenRouterAI,
|
69
|
+
[ModelProvider.TogetherAI]: LobeTogetherAI,
|
70
|
+
[ModelProvider.FireworksAI]: LobeFireworksAI,
|
71
|
+
[ModelProvider.ZeroOne]: LobeZeroOneAI,
|
72
|
+
[ModelProvider.Stepfun]: LobeStepfunAI,
|
73
|
+
[ModelProvider.Qwen]: LobeQwenAI,
|
74
|
+
[ModelProvider.Novita]: LobeNovitaAI,
|
75
|
+
[ModelProvider.Nvidia]: LobeNvidiaAI,
|
76
|
+
[ModelProvider.Taichu]: LobeTaichuAI,
|
77
|
+
[ModelProvider.Baichuan]: LobeBaichuanAI,
|
78
|
+
[ModelProvider.Ai360]: LobeAi360AI,
|
79
|
+
[ModelProvider.SiliconCloud]: LobeSiliconCloudAI,
|
80
|
+
[ModelProvider.GiteeAI]: LobeGiteeAI,
|
81
|
+
[ModelProvider.Upstage]: LobeUpstageAI,
|
82
|
+
[ModelProvider.Spark]: LobeSparkAI,
|
83
|
+
[ModelProvider.Ai21]: LobeAi21AI,
|
84
|
+
[ModelProvider.Hunyuan]: LobeHunyuanAI,
|
85
|
+
[ModelProvider.SenseNova]: LobeSenseNovaAI,
|
86
|
+
[ModelProvider.XAI]: LobeXAI,
|
87
|
+
[ModelProvider.Jina]: LobeJinaAI,
|
88
|
+
[ModelProvider.SambaNova]: LobeSambaNovaAI,
|
89
|
+
[ModelProvider.Cloudflare]: LobeCloudflareAI,
|
90
|
+
[ModelProvider.InternLM]: LobeInternLMAI,
|
91
|
+
[ModelProvider.Higress]: LobeHigressAI,
|
92
|
+
[ModelProvider.TencentCloud]: LobeTencentCloudAI,
|
93
|
+
[ModelProvider.Volcengine]: LobeVolcengineAI,
|
94
|
+
[ModelProvider.PPIO]: LobePPIOAI,
|
95
|
+
[ModelProvider.Doubao]: LobeVolcengineAI,
|
96
|
+
[ModelProvider.Wenxin]: LobeWenxinAI,
|
97
|
+
};
|
@@ -1,6 +1,8 @@
|
|
1
1
|
import { VertexAI, VertexInit } from '@google-cloud/vertexai';
|
2
2
|
|
3
|
-
import {
|
3
|
+
import { AgentRuntimeErrorType } from '../error';
|
4
|
+
import { LobeGoogleAI } from '../google';
|
5
|
+
import { AgentRuntimeError } from '../utils/createError';
|
4
6
|
|
5
7
|
export class LobeVertexAI extends LobeGoogleAI {
|
6
8
|
static initFromVertexAI(params?: VertexInit) {
|
@@ -130,8 +130,9 @@ export const initAgentRuntimeWithUserPayload = (
|
|
130
130
|
payload: JWTPayload,
|
131
131
|
params: any = {},
|
132
132
|
) => {
|
133
|
-
return AgentRuntime.
|
134
|
-
|
133
|
+
return AgentRuntime.initializeWithProvider(provider, {
|
134
|
+
...getLlmOptionsFromPayload(provider, payload),
|
135
|
+
...params,
|
135
136
|
});
|
136
137
|
};
|
137
138
|
|
package/src/services/chat.ts
CHANGED
@@ -147,12 +147,10 @@ export function initializeWithClientStore(provider: string, payload: any) {
|
|
147
147
|
* Configuration override order:
|
148
148
|
* payload -> providerAuthPayload -> commonOptions
|
149
149
|
*/
|
150
|
-
return AgentRuntime.
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
...payload,
|
155
|
-
},
|
150
|
+
return AgentRuntime.initializeWithProvider(provider, {
|
151
|
+
...commonOptions,
|
152
|
+
...providerAuthPayload,
|
153
|
+
...payload,
|
156
154
|
});
|
157
155
|
}
|
158
156
|
|