@lobehub/chat 1.136.13 → 1.137.1
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/.cursor/rules/add-setting-env.mdc +175 -0
- package/.cursor/rules/db-migrations.mdc +25 -0
- package/.env.example +7 -0
- package/CHANGELOG.md +50 -0
- package/Dockerfile +3 -2
- package/Dockerfile.database +15 -3
- package/Dockerfile.pglite +3 -2
- package/changelog/v1.json +18 -0
- package/docs/development/database-schema.dbml +1 -0
- package/docs/self-hosting/advanced/feature-flags.mdx +25 -15
- package/docs/self-hosting/advanced/feature-flags.zh-CN.mdx +25 -15
- package/docs/self-hosting/environment-variables/basic.mdx +12 -0
- package/docs/self-hosting/environment-variables/basic.zh-CN.mdx +12 -0
- package/locales/ar/setting.json +8 -0
- package/locales/bg-BG/setting.json +8 -0
- package/locales/de-DE/setting.json +8 -0
- package/locales/en-US/setting.json +8 -0
- package/locales/es-ES/setting.json +8 -0
- package/locales/fa-IR/setting.json +8 -0
- package/locales/fr-FR/setting.json +8 -0
- package/locales/it-IT/setting.json +8 -0
- package/locales/ja-JP/setting.json +8 -0
- package/locales/ko-KR/setting.json +8 -0
- package/locales/nl-NL/setting.json +8 -0
- package/locales/pl-PL/setting.json +8 -0
- package/locales/pt-BR/setting.json +8 -0
- package/locales/ru-RU/setting.json +8 -0
- package/locales/tr-TR/setting.json +8 -0
- package/locales/vi-VN/setting.json +8 -0
- package/locales/zh-CN/setting.json +8 -0
- package/locales/zh-TW/setting.json +8 -0
- package/package.json +1 -1
- package/packages/agent-runtime/examples/tools-calling.ts +4 -3
- package/packages/agent-runtime/src/core/__tests__/runtime.test.ts +559 -29
- package/packages/agent-runtime/src/core/runtime.ts +171 -43
- package/packages/agent-runtime/src/types/instruction.ts +32 -6
- package/packages/agent-runtime/src/types/runtime.ts +2 -2
- package/packages/agent-runtime/src/types/state.ts +1 -8
- package/packages/agent-runtime/vitest.config.mts +14 -0
- package/packages/const/src/settings/image.ts +8 -0
- package/packages/const/src/settings/index.ts +3 -0
- package/packages/context-engine/src/__tests__/pipeline.test.ts +485 -0
- package/packages/context-engine/src/base/__tests__/BaseProcessor.test.ts +381 -0
- package/packages/context-engine/src/base/__tests__/BaseProvider.test.ts +392 -0
- package/packages/context-engine/src/processors/__tests__/MessageCleanup.test.ts +346 -0
- package/packages/context-engine/src/processors/__tests__/ToolCall.test.ts +552 -0
- package/packages/database/migrations/0038_add_image_user_settings.sql +1 -0
- package/packages/database/migrations/meta/0038_snapshot.json +7580 -0
- package/packages/database/migrations/meta/_journal.json +7 -0
- package/packages/database/src/core/migrations.json +6 -0
- package/packages/database/src/models/user.ts +3 -1
- package/packages/database/src/schemas/user.ts +1 -0
- package/packages/file-loaders/src/loaders/docx/index.test.ts +0 -1
- package/packages/file-loaders/src/loaders/excel/__snapshots__/index.test.ts.snap +30 -0
- package/packages/file-loaders/src/loaders/excel/index.test.ts +8 -0
- package/packages/file-loaders/src/loaders/pptx/index.test.ts +25 -0
- package/packages/file-loaders/src/utils/parser-utils.test.ts +155 -0
- package/packages/file-loaders/vitest.config.mts +8 -0
- package/packages/model-runtime/CLAUDE.md +5 -0
- package/packages/model-runtime/docs/test-coverage.md +706 -0
- package/packages/model-runtime/src/core/ModelRuntime.test.ts +231 -0
- package/packages/model-runtime/src/core/RouterRuntime/createRuntime.ts +1 -1
- package/packages/model-runtime/src/core/openaiCompatibleFactory/createImage.test.ts +799 -0
- package/packages/model-runtime/src/core/openaiCompatibleFactory/index.test.ts +188 -4
- package/packages/model-runtime/src/core/openaiCompatibleFactory/index.ts +41 -10
- package/packages/model-runtime/src/core/streams/openai/__snapshots__/responsesStream.test.ts.snap +439 -0
- package/packages/model-runtime/src/core/streams/openai/openai.test.ts +789 -0
- package/packages/model-runtime/src/core/streams/openai/responsesStream.test.ts +551 -0
- package/packages/model-runtime/src/core/usageConverters/utils/computeChatCost.test.ts +230 -0
- package/packages/model-runtime/src/core/usageConverters/utils/computeImageCost.test.ts +334 -37
- package/packages/model-runtime/src/providerTestUtils.ts +148 -145
- package/packages/model-runtime/src/providers/ai302/index.test.ts +60 -0
- package/packages/model-runtime/src/providers/ai302/index.ts +9 -4
- package/packages/model-runtime/src/providers/ai360/index.test.ts +1213 -1
- package/packages/model-runtime/src/providers/ai360/index.ts +9 -4
- package/packages/model-runtime/src/providers/aihubmix/index.test.ts +73 -0
- package/packages/model-runtime/src/providers/aihubmix/index.ts +6 -9
- package/packages/model-runtime/src/providers/akashchat/index.test.ts +433 -3
- package/packages/model-runtime/src/providers/akashchat/index.ts +12 -7
- package/packages/model-runtime/src/providers/anthropic/generateObject.test.ts +183 -29
- package/packages/model-runtime/src/providers/anthropic/generateObject.ts +40 -24
- package/packages/model-runtime/src/providers/azureai/index.test.ts +102 -0
- package/packages/model-runtime/src/providers/baichuan/index.test.ts +416 -26
- package/packages/model-runtime/src/providers/baichuan/index.ts +23 -20
- package/packages/model-runtime/src/providers/bedrock/index.test.ts +420 -2
- package/packages/model-runtime/src/providers/cerebras/index.test.ts +465 -0
- package/packages/model-runtime/src/providers/cerebras/index.ts +8 -3
- package/packages/model-runtime/src/providers/cohere/index.test.ts +1074 -1
- package/packages/model-runtime/src/providers/cohere/index.ts +8 -3
- package/packages/model-runtime/src/providers/cometapi/index.test.ts +439 -3
- package/packages/model-runtime/src/providers/cometapi/index.ts +8 -3
- package/packages/model-runtime/src/providers/deepseek/index.test.ts +116 -1
- package/packages/model-runtime/src/providers/deepseek/index.ts +8 -3
- package/packages/model-runtime/src/providers/fireworksai/index.test.ts +264 -3
- package/packages/model-runtime/src/providers/fireworksai/index.ts +8 -3
- package/packages/model-runtime/src/providers/giteeai/index.test.ts +325 -3
- package/packages/model-runtime/src/providers/giteeai/index.ts +23 -6
- package/packages/model-runtime/src/providers/github/index.test.ts +532 -3
- package/packages/model-runtime/src/providers/github/index.ts +8 -3
- package/packages/model-runtime/src/providers/groq/index.test.ts +344 -31
- package/packages/model-runtime/src/providers/groq/index.ts +8 -3
- package/packages/model-runtime/src/providers/higress/index.test.ts +142 -0
- package/packages/model-runtime/src/providers/higress/index.ts +8 -3
- package/packages/model-runtime/src/providers/huggingface/index.test.ts +612 -1
- package/packages/model-runtime/src/providers/huggingface/index.ts +9 -4
- package/packages/model-runtime/src/providers/hunyuan/index.test.ts +365 -1
- package/packages/model-runtime/src/providers/hunyuan/index.ts +9 -3
- package/packages/model-runtime/src/providers/infiniai/index.test.ts +71 -0
- package/packages/model-runtime/src/providers/internlm/index.test.ts +369 -2
- package/packages/model-runtime/src/providers/internlm/index.ts +10 -5
- package/packages/model-runtime/src/providers/jina/index.test.ts +164 -3
- package/packages/model-runtime/src/providers/jina/index.ts +8 -3
- package/packages/model-runtime/src/providers/lmstudio/index.test.ts +182 -3
- package/packages/model-runtime/src/providers/lmstudio/index.ts +8 -3
- package/packages/model-runtime/src/providers/mistral/index.test.ts +779 -27
- package/packages/model-runtime/src/providers/mistral/index.ts +8 -3
- package/packages/model-runtime/src/providers/modelscope/index.test.ts +232 -1
- package/packages/model-runtime/src/providers/modelscope/index.ts +8 -3
- package/packages/model-runtime/src/providers/moonshot/index.test.ts +489 -2
- package/packages/model-runtime/src/providers/moonshot/index.ts +8 -3
- package/packages/model-runtime/src/providers/nebius/index.test.ts +381 -3
- package/packages/model-runtime/src/providers/nebius/index.ts +8 -3
- package/packages/model-runtime/src/providers/newapi/index.test.ts +667 -3
- package/packages/model-runtime/src/providers/newapi/index.ts +6 -3
- package/packages/model-runtime/src/providers/nvidia/index.test.ts +168 -1
- package/packages/model-runtime/src/providers/nvidia/index.ts +12 -7
- package/packages/model-runtime/src/providers/ollama/index.test.ts +797 -1
- package/packages/model-runtime/src/providers/ollama/index.ts +8 -0
- package/packages/model-runtime/src/providers/ollamacloud/index.test.ts +411 -0
- package/packages/model-runtime/src/providers/ollamacloud/index.ts +8 -3
- package/packages/model-runtime/src/providers/openai/index.test.ts +171 -2
- package/packages/model-runtime/src/providers/openai/index.ts +8 -3
- package/packages/model-runtime/src/providers/openrouter/index.test.ts +1647 -95
- package/packages/model-runtime/src/providers/openrouter/index.ts +12 -7
- package/packages/model-runtime/src/providers/qiniu/index.test.ts +294 -1
- package/packages/model-runtime/src/providers/qiniu/index.ts +8 -3
- package/packages/model-runtime/src/providers/search1api/index.test.ts +1131 -11
- package/packages/model-runtime/src/providers/search1api/index.ts +10 -4
- package/packages/model-runtime/src/providers/sensenova/index.test.ts +1069 -1
- package/packages/model-runtime/src/providers/sensenova/index.ts +8 -3
- package/packages/model-runtime/src/providers/siliconcloud/index.test.ts +196 -0
- package/packages/model-runtime/src/providers/siliconcloud/index.ts +8 -3
- package/packages/model-runtime/src/providers/spark/index.test.ts +293 -1
- package/packages/model-runtime/src/providers/spark/index.ts +8 -3
- package/packages/model-runtime/src/providers/stepfun/index.test.ts +322 -3
- package/packages/model-runtime/src/providers/stepfun/index.ts +8 -3
- package/packages/model-runtime/src/providers/tencentcloud/index.test.ts +182 -3
- package/packages/model-runtime/src/providers/tencentcloud/index.ts +8 -3
- package/packages/model-runtime/src/providers/togetherai/index.test.ts +359 -4
- package/packages/model-runtime/src/providers/togetherai/index.ts +12 -5
- package/packages/model-runtime/src/providers/v0/index.test.ts +341 -0
- package/packages/model-runtime/src/providers/v0/index.ts +20 -6
- package/packages/model-runtime/src/providers/vercelaigateway/index.test.ts +710 -0
- package/packages/model-runtime/src/providers/vercelaigateway/index.ts +19 -13
- package/packages/model-runtime/src/providers/vllm/index.test.ts +45 -1
- package/packages/model-runtime/src/providers/volcengine/index.test.ts +75 -0
- package/packages/model-runtime/src/providers/wenxin/index.test.ts +144 -1
- package/packages/model-runtime/src/providers/wenxin/index.ts +8 -3
- package/packages/model-runtime/src/providers/xai/index.test.ts +105 -1
- package/packages/model-runtime/src/providers/xinference/index.test.ts +70 -1
- package/packages/model-runtime/src/providers/zeroone/index.test.ts +327 -3
- package/packages/model-runtime/src/providers/zeroone/index.ts +23 -6
- package/packages/model-runtime/src/providers/zhipu/index.test.ts +908 -236
- package/packages/model-runtime/src/providers/zhipu/index.ts +8 -3
- package/packages/model-runtime/src/types/structureOutput.ts +5 -1
- package/packages/model-runtime/vitest.config.mts +7 -1
- package/packages/types/src/aiChat.ts +20 -2
- package/packages/types/src/serverConfig.ts +7 -1
- package/packages/types/src/tool/index.ts +1 -0
- package/packages/types/src/tool/tool.ts +33 -0
- package/packages/types/src/user/settings/image.ts +3 -0
- package/packages/types/src/user/settings/index.ts +3 -0
- package/src/app/[variants]/(main)/settings/_layout/SettingsContent.tsx +3 -0
- package/src/app/[variants]/(main)/settings/hooks/useCategory.tsx +8 -3
- package/src/app/[variants]/(main)/settings/image/index.tsx +74 -0
- package/src/components/FormInput/FormSliderWithInput.tsx +40 -0
- package/src/components/FormInput/index.ts +1 -0
- package/src/envs/image.ts +27 -0
- package/src/features/Conversation/Messages/Assistant/index.tsx +1 -1
- package/src/features/Conversation/Messages/User/index.tsx +2 -2
- package/src/hooks/useFetchAiImageConfig.ts +12 -17
- package/src/locales/default/setting.ts +8 -0
- package/src/server/globalConfig/index.ts +5 -0
- package/src/server/routers/lambda/aiChat.ts +2 -0
- package/src/store/global/initialState.ts +1 -0
- package/src/store/image/slices/generationConfig/action.test.ts +17 -0
- package/src/store/image/slices/generationConfig/action.ts +18 -21
- package/src/store/image/slices/generationConfig/initialState.ts +3 -2
- package/src/store/user/slices/common/action.ts +1 -0
- package/src/store/user/slices/settings/selectors/settings.ts +3 -0
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { ChatModelCard } from '@lobechat/types';
|
|
2
2
|
import { ModelProvider } from 'model-bank';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
OpenAICompatibleFactoryOptions,
|
|
6
|
+
createOpenAICompatibleRuntime,
|
|
7
|
+
} from '../../core/openaiCompatibleFactory';
|
|
5
8
|
import { resolveParameters } from '../../core/parameterResolver';
|
|
6
9
|
|
|
7
10
|
export interface MistralModelCard {
|
|
@@ -14,7 +17,7 @@ export interface MistralModelCard {
|
|
|
14
17
|
max_context_length: number;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
export const
|
|
20
|
+
export const params = {
|
|
18
21
|
baseURL: 'https://api.mistral.ai/v1',
|
|
19
22
|
chatCompletion: {
|
|
20
23
|
// Mistral API does not support stream_options: { include_usage: true }
|
|
@@ -66,4 +69,6 @@ export const LobeMistralAI = createOpenAICompatibleRuntime({
|
|
|
66
69
|
.filter(Boolean) as ChatModelCard[];
|
|
67
70
|
},
|
|
68
71
|
provider: ModelProvider.Mistral,
|
|
69
|
-
}
|
|
72
|
+
} satisfies OpenAICompatibleFactoryOptions;
|
|
73
|
+
|
|
74
|
+
export const LobeMistralAI = createOpenAICompatibleRuntime(params);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
// @vitest-environment node
|
|
2
2
|
import { ModelProvider } from 'model-bank';
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
4
|
|
|
4
5
|
import { testProvider } from '../../providerTestUtils';
|
|
5
|
-
import { LobeModelScopeAI } from './index';
|
|
6
|
+
import { LobeModelScopeAI, ModelScopeModelCard, params } from './index';
|
|
6
7
|
|
|
7
8
|
const provider = ModelProvider.ModelScope;
|
|
8
9
|
const defaultBaseURL = 'https://api-inference.modelscope.cn/v1';
|
|
9
10
|
|
|
11
|
+
// Basic provider tests
|
|
10
12
|
testProvider({
|
|
11
13
|
Runtime: LobeModelScopeAI,
|
|
12
14
|
provider,
|
|
@@ -17,3 +19,232 @@ testProvider({
|
|
|
17
19
|
skipAPICall: true,
|
|
18
20
|
},
|
|
19
21
|
});
|
|
22
|
+
|
|
23
|
+
// Custom feature tests
|
|
24
|
+
describe('LobeModelScopeAI - custom features', () => {
|
|
25
|
+
describe('params export', () => {
|
|
26
|
+
it('should export params object', () => {
|
|
27
|
+
expect(params).toBeDefined();
|
|
28
|
+
expect(params.baseURL).toBe(defaultBaseURL);
|
|
29
|
+
expect(params.provider).toBe(provider);
|
|
30
|
+
expect(params.debug).toBeDefined();
|
|
31
|
+
expect(params.models).toBeDefined();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('debug configuration', () => {
|
|
36
|
+
it('should disable debug mode by default', () => {
|
|
37
|
+
delete process.env.DEBUG_MODELSCOPE_CHAT_COMPLETION;
|
|
38
|
+
const result = params.debug.chatCompletion();
|
|
39
|
+
expect(result).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should enable debug mode when env is set to 1', () => {
|
|
43
|
+
process.env.DEBUG_MODELSCOPE_CHAT_COMPLETION = '1';
|
|
44
|
+
const result = params.debug.chatCompletion();
|
|
45
|
+
expect(result).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should disable debug mode when env is not 1', () => {
|
|
49
|
+
process.env.DEBUG_MODELSCOPE_CHAT_COMPLETION = '0';
|
|
50
|
+
const result = params.debug.chatCompletion();
|
|
51
|
+
expect(result).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('models function', () => {
|
|
56
|
+
let mockClient: any;
|
|
57
|
+
let consoleWarnSpy: any;
|
|
58
|
+
|
|
59
|
+
beforeEach(() => {
|
|
60
|
+
mockClient = {
|
|
61
|
+
models: {
|
|
62
|
+
list: vi.fn(),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should fetch and process models successfully', async () => {
|
|
69
|
+
const mockModelData: ModelScopeModelCard[] = [
|
|
70
|
+
{
|
|
71
|
+
id: 'qwen2-7b-instruct',
|
|
72
|
+
object: 'model',
|
|
73
|
+
created: 1234567890,
|
|
74
|
+
owned_by: 'qwen',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'qwen2.5-72b-instruct',
|
|
78
|
+
object: 'model',
|
|
79
|
+
created: 1234567891,
|
|
80
|
+
owned_by: 'qwen',
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
mockClient.models.list.mockResolvedValue({
|
|
85
|
+
data: mockModelData,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const models = await params.models({ client: mockClient });
|
|
89
|
+
|
|
90
|
+
expect(mockClient.models.list).toHaveBeenCalledTimes(1);
|
|
91
|
+
expect(models).toBeDefined();
|
|
92
|
+
expect(Array.isArray(models)).toBe(true);
|
|
93
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should handle empty model list', async () => {
|
|
97
|
+
mockClient.models.list.mockResolvedValue({
|
|
98
|
+
data: [],
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const models = await params.models({ client: mockClient });
|
|
102
|
+
|
|
103
|
+
expect(mockClient.models.list).toHaveBeenCalledTimes(1);
|
|
104
|
+
expect(models).toBeDefined();
|
|
105
|
+
expect(Array.isArray(models)).toBe(true);
|
|
106
|
+
expect(models).toHaveLength(0);
|
|
107
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('should handle missing data field', async () => {
|
|
111
|
+
mockClient.models.list.mockResolvedValue({});
|
|
112
|
+
|
|
113
|
+
const models = await params.models({ client: mockClient });
|
|
114
|
+
|
|
115
|
+
expect(mockClient.models.list).toHaveBeenCalledTimes(1);
|
|
116
|
+
expect(models).toBeDefined();
|
|
117
|
+
expect(Array.isArray(models)).toBe(true);
|
|
118
|
+
expect(models).toHaveLength(0);
|
|
119
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should handle API errors gracefully', async () => {
|
|
123
|
+
const mockError = new Error('API Error');
|
|
124
|
+
mockClient.models.list.mockRejectedValue(mockError);
|
|
125
|
+
|
|
126
|
+
const models = await params.models({ client: mockClient });
|
|
127
|
+
|
|
128
|
+
expect(mockClient.models.list).toHaveBeenCalledTimes(1);
|
|
129
|
+
expect(models).toEqual([]);
|
|
130
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(
|
|
131
|
+
'Failed to fetch ModelScope models. Please ensure your ModelScope API key is valid and your Alibaba Cloud account is properly bound:',
|
|
132
|
+
mockError,
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should handle network errors', async () => {
|
|
137
|
+
const networkError = new Error('Network timeout');
|
|
138
|
+
mockClient.models.list.mockRejectedValue(networkError);
|
|
139
|
+
|
|
140
|
+
const models = await params.models({ client: mockClient });
|
|
141
|
+
|
|
142
|
+
expect(models).toEqual([]);
|
|
143
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(
|
|
144
|
+
'Failed to fetch ModelScope models. Please ensure your ModelScope API key is valid and your Alibaba Cloud account is properly bound:',
|
|
145
|
+
networkError,
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should handle invalid API key errors', async () => {
|
|
150
|
+
const authError = new Error('Invalid API key');
|
|
151
|
+
mockClient.models.list.mockRejectedValue(authError);
|
|
152
|
+
|
|
153
|
+
const models = await params.models({ client: mockClient });
|
|
154
|
+
|
|
155
|
+
expect(models).toEqual([]);
|
|
156
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(
|
|
157
|
+
'Failed to fetch ModelScope models. Please ensure your ModelScope API key is valid and your Alibaba Cloud account is properly bound:',
|
|
158
|
+
authError,
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should process models with processMultiProviderModelList', async () => {
|
|
163
|
+
const mockModelData: ModelScopeModelCard[] = [
|
|
164
|
+
{
|
|
165
|
+
id: 'qwen-plus',
|
|
166
|
+
object: 'model',
|
|
167
|
+
created: 1234567890,
|
|
168
|
+
owned_by: 'qwen',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'qwen-turbo',
|
|
172
|
+
object: 'model',
|
|
173
|
+
created: 1234567891,
|
|
174
|
+
owned_by: 'qwen',
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
mockClient.models.list.mockResolvedValue({
|
|
179
|
+
data: mockModelData,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const models = await params.models({ client: mockClient });
|
|
183
|
+
|
|
184
|
+
expect(models).toBeDefined();
|
|
185
|
+
expect(Array.isArray(models)).toBe(true);
|
|
186
|
+
// processMultiProviderModelList should process the models
|
|
187
|
+
expect(mockClient.models.list).toHaveBeenCalledTimes(1);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('should handle models with different owned_by values', async () => {
|
|
191
|
+
const mockModelData: ModelScopeModelCard[] = [
|
|
192
|
+
{
|
|
193
|
+
id: 'model-1',
|
|
194
|
+
object: 'model',
|
|
195
|
+
created: 1234567890,
|
|
196
|
+
owned_by: 'provider-1',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'model-2',
|
|
200
|
+
object: 'model',
|
|
201
|
+
created: 1234567891,
|
|
202
|
+
owned_by: 'provider-2',
|
|
203
|
+
},
|
|
204
|
+
];
|
|
205
|
+
|
|
206
|
+
mockClient.models.list.mockResolvedValue({
|
|
207
|
+
data: mockModelData,
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const models = await params.models({ client: mockClient });
|
|
211
|
+
|
|
212
|
+
expect(models).toBeDefined();
|
|
213
|
+
expect(Array.isArray(models)).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe('ModelScopeModelCard interface', () => {
|
|
218
|
+
it('should have correct structure', () => {
|
|
219
|
+
const mockCard: ModelScopeModelCard = {
|
|
220
|
+
id: 'test-model',
|
|
221
|
+
object: 'model',
|
|
222
|
+
created: 1234567890,
|
|
223
|
+
owned_by: 'test-provider',
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
expect(mockCard.id).toBe('test-model');
|
|
227
|
+
expect(mockCard.object).toBe('model');
|
|
228
|
+
expect(mockCard.created).toBe(1234567890);
|
|
229
|
+
expect(mockCard.owned_by).toBe('test-provider');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
describe('runtime instantiation', () => {
|
|
234
|
+
it('should create runtime instance with default config', () => {
|
|
235
|
+
const instance = new LobeModelScopeAI({ apiKey: 'test_api_key' });
|
|
236
|
+
expect(instance).toBeDefined();
|
|
237
|
+
expect(instance.baseURL).toBe(defaultBaseURL);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('should create runtime instance with custom baseURL', () => {
|
|
241
|
+
const customBaseURL = 'https://custom.modelscope.cn/v1';
|
|
242
|
+
const instance = new LobeModelScopeAI({
|
|
243
|
+
apiKey: 'test_api_key',
|
|
244
|
+
baseURL: customBaseURL,
|
|
245
|
+
});
|
|
246
|
+
expect(instance).toBeDefined();
|
|
247
|
+
expect(instance.baseURL).toBe(customBaseURL);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { ModelProvider } from 'model-bank';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
OpenAICompatibleFactoryOptions,
|
|
5
|
+
createOpenAICompatibleRuntime,
|
|
6
|
+
} from '../../core/openaiCompatibleFactory';
|
|
4
7
|
import { processMultiProviderModelList } from '../../utils/modelParse';
|
|
5
8
|
|
|
6
9
|
export interface ModelScopeModelCard {
|
|
@@ -10,7 +13,7 @@ export interface ModelScopeModelCard {
|
|
|
10
13
|
owned_by: string;
|
|
11
14
|
}
|
|
12
15
|
|
|
13
|
-
export const
|
|
16
|
+
export const params = {
|
|
14
17
|
baseURL: 'https://api-inference.modelscope.cn/v1',
|
|
15
18
|
debug: {
|
|
16
19
|
chatCompletion: () => process.env.DEBUG_MODELSCOPE_CHAT_COMPLETION === '1',
|
|
@@ -30,4 +33,6 @@ export const LobeModelScopeAI = createOpenAICompatibleRuntime({
|
|
|
30
33
|
}
|
|
31
34
|
},
|
|
32
35
|
provider: ModelProvider.ModelScope,
|
|
33
|
-
}
|
|
36
|
+
} satisfies OpenAICompatibleFactoryOptions;
|
|
37
|
+
|
|
38
|
+
export const LobeModelScopeAI = createOpenAICompatibleRuntime(params);
|