@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.
@@ -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.description.includes('vision') ||
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 { AgentRuntimeError, AgentRuntimeErrorType, LobeGoogleAI } from '@/libs/agent-runtime';
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.initializeWithProviderOptions(provider, {
134
- [provider]: { ...getLlmOptionsFromPayload(provider, payload), ...params },
133
+ return AgentRuntime.initializeWithProvider(provider, {
134
+ ...getLlmOptionsFromPayload(provider, payload),
135
+ ...params,
135
136
  });
136
137
  };
137
138
 
@@ -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.initializeWithProviderOptions(provider, {
151
- [provider]: {
152
- ...commonOptions,
153
- ...providerAuthPayload,
154
- ...payload,
155
- },
150
+ return AgentRuntime.initializeWithProvider(provider, {
151
+ ...commonOptions,
152
+ ...providerAuthPayload,
153
+ ...payload,
156
154
  });
157
155
  }
158
156
 
package/src/types/llm.ts CHANGED
@@ -49,7 +49,7 @@ export interface ChatModelCard {
49
49
  reasoning?: boolean;
50
50
 
51
51
  /**
52
- * whether model is legacy (deprecated but not removed yet)
52
+ * the date when model is released
53
53
  */
54
54
  releasedAt?: string;
55
55