@kevisual/ai 0.0.6 → 0.0.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/dist/ai-provider-browser.d.ts +16 -2
- package/dist/ai-provider-browser.js +13 -1
- package/dist/ai-provider.d.ts +16 -2
- package/dist/ai-provider.js +13 -1
- package/package.json +9 -5
- package/src/modules/logger.ts +6 -0
- package/src/provider/chat-adapter/custom.ts +14 -0
- package/src/provider/chat-adapter/dashscope.ts +10 -0
- package/src/provider/chat-adapter/deepseek.ts +10 -0
- package/src/provider/chat-adapter/model-scope.ts +11 -0
- package/src/provider/chat-adapter/ollama.ts +47 -0
- package/src/provider/chat-adapter/siliconflow.ts +39 -0
- package/src/provider/chat-adapter/volces.ts +10 -0
- package/src/provider/chat.ts +67 -0
- package/src/provider/core/chat.ts +152 -0
- package/src/provider/core/index.ts +27 -0
- package/src/provider/core/text-regex.ts +105 -0
- package/src/provider/core/type.ts +35 -0
- package/src/provider/index.ts +5 -0
- package/src/provider/knowledge-adapter/knowledge-base.ts +107 -0
- package/src/provider/knowledge-adapter/knowledge.ts +7 -0
- package/src/provider/knowledge-adapter/siliconflow.ts +24 -0
- package/src/provider/knowledge.ts +6 -0
- package/src/provider/media/index.ts +1 -0
- package/src/provider/media/video/siliconflow.ts +37 -0
- package/src/provider/utils/ai-config-type.ts +52 -0
- package/src/provider/utils/chunk.ts +86 -0
- package/src/provider/utils/index.ts +2 -0
- package/src/provider/utils/parse-config.ts +192 -0
- package/src/provider/utils/token.ts +34 -0
- package/src/test/chunks/01-get.ts +65 -0
- package/src/test/encrypt/index.ts +9 -0
- package/src/test/func-call/curl.sh +35 -0
- package/src/test/func-call/demo.ts +116 -0
- package/src/test/model-scope/index.ts +26 -0
- package/src/test/ollama-knowledge.ts +37 -0
- package/src/test/ollama.ts +86 -0
- package/src/test/provider/index.ts +7 -0
- package/src/test/siliconflow/common.ts +15 -0
- package/src/test/siliconflow/get.ts +22 -0
- package/src/test/siliconflow/knowledge/create.ts +18 -0
- package/src/test/siliconflow/knowledge/qwen.md +232 -0
- package/src/test/siliconflow/rerank/fc.ts +28 -0
- package/src/test/siliconflow/rerank/index.ts +34 -0
- package/src/test/siliconflow/videos/index.ts +100 -0
- package/src/utils/json.ts +12 -0
|
@@ -5,7 +5,13 @@ import * as _kevisual_permission from '@kevisual/permission';
|
|
|
5
5
|
import { Permission } from '@kevisual/permission';
|
|
6
6
|
|
|
7
7
|
type ChatMessage = OpenAI.Chat.Completions.ChatCompletionMessageParam;
|
|
8
|
-
type ChatMessageOptions = Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams
|
|
8
|
+
type ChatMessageOptions = Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> & {
|
|
9
|
+
/**
|
|
10
|
+
* 是否能够思考
|
|
11
|
+
* 如果会话是千文,服务器的接口,默认为 true
|
|
12
|
+
*/
|
|
13
|
+
enable_thinking?: boolean;
|
|
14
|
+
};
|
|
9
15
|
type ChatMessageComplete = OpenAI.Chat.Completions.ChatCompletion;
|
|
10
16
|
type ChatMessageStream = OpenAI.Chat.Completions.ChatCompletion;
|
|
11
17
|
type EmbeddingMessage = Partial<OpenAI.Embeddings.EmbeddingCreateParams>;
|
|
@@ -202,12 +208,19 @@ declare class ModelScope extends BaseChat {
|
|
|
202
208
|
constructor(options: ModelScopeOptions);
|
|
203
209
|
}
|
|
204
210
|
|
|
211
|
+
type BailianOptions = Partial<BaseChatOptions>;
|
|
212
|
+
declare class BailianChat extends BaseChat {
|
|
213
|
+
static BASE_URL: string;
|
|
214
|
+
constructor(options: BailianOptions);
|
|
215
|
+
}
|
|
216
|
+
|
|
205
217
|
declare const OllamaProvider: typeof Ollama;
|
|
206
218
|
declare const SiliconFlowProvider: typeof SiliconFlow;
|
|
207
219
|
declare const CustomProvider: typeof Custom;
|
|
208
220
|
declare const VolcesProvider: typeof Volces;
|
|
209
221
|
declare const DeepSeekProvider: typeof DeepSeek;
|
|
210
222
|
declare const ModelScopeProvider: typeof ModelScope;
|
|
223
|
+
declare const BailianProvider: typeof BailianChat;
|
|
211
224
|
declare const ChatProviderMap: {
|
|
212
225
|
Ollama: typeof Ollama;
|
|
213
226
|
SiliconFlow: typeof SiliconFlow;
|
|
@@ -216,6 +229,7 @@ declare const ChatProviderMap: {
|
|
|
216
229
|
DeepSeek: typeof DeepSeek;
|
|
217
230
|
ModelScope: typeof ModelScope;
|
|
218
231
|
BaseChat: typeof BaseChat;
|
|
232
|
+
Bailian: typeof BailianChat;
|
|
219
233
|
};
|
|
220
234
|
type ProviderManagerConfig = {
|
|
221
235
|
provider: string;
|
|
@@ -430,5 +444,5 @@ declare class AIConfigParser {
|
|
|
430
444
|
};
|
|
431
445
|
}
|
|
432
446
|
|
|
433
|
-
export { AIConfigParser, BaseChat, ChatProviderMap, CustomProvider, DeepSeekProvider, KnowledgeBase, ModelScopeProvider, OllamaProvider, ProviderManager, SiliconFlowKnowledge, SiliconFlowProvider, VolcesProvider, decryptAES, encryptAES, getIsBrowser, readStream };
|
|
447
|
+
export { AIConfigParser, BailianProvider, BaseChat, ChatProviderMap, CustomProvider, DeepSeekProvider, KnowledgeBase, ModelScopeProvider, OllamaProvider, ProviderManager, SiliconFlowKnowledge, SiliconFlowProvider, VolcesProvider, decryptAES, encryptAES, getIsBrowser, readStream };
|
|
434
448
|
export type { AIConfig, AIModel, BaseChatInterface, BaseChatOptions, BaseChatUsageInterface, ChatMessage, ChatMessageComplete, ChatMessageOptions, ChatMessageStream, ChatStream, EmbeddingMessage, EmbeddingMessageComplete, GetProviderOpts, KnowledgeOptions, ProviderResult, RerankOptions, SecretKey };
|
|
@@ -24411,6 +24411,15 @@ class ModelScope extends BaseChat {
|
|
|
24411
24411
|
}
|
|
24412
24412
|
}
|
|
24413
24413
|
|
|
24414
|
+
// src/provider/chat-adapter/dashscope.ts
|
|
24415
|
+
class BailianChat extends BaseChat {
|
|
24416
|
+
static BASE_URL = "https://bailian.aliyuncs.com/compatible-mode/v1/";
|
|
24417
|
+
constructor(options) {
|
|
24418
|
+
const baseURL = options.baseURL || BailianChat.BASE_URL;
|
|
24419
|
+
super({ ...options, baseURL });
|
|
24420
|
+
}
|
|
24421
|
+
}
|
|
24422
|
+
|
|
24414
24423
|
// src/provider/chat.ts
|
|
24415
24424
|
var OllamaProvider = Ollama;
|
|
24416
24425
|
var SiliconFlowProvider = SiliconFlow;
|
|
@@ -24418,6 +24427,7 @@ var CustomProvider = Custom;
|
|
|
24418
24427
|
var VolcesProvider = Volces;
|
|
24419
24428
|
var DeepSeekProvider = DeepSeek;
|
|
24420
24429
|
var ModelScopeProvider = ModelScope;
|
|
24430
|
+
var BailianProvider = BailianChat;
|
|
24421
24431
|
var ChatProviderMap = {
|
|
24422
24432
|
Ollama: OllamaProvider,
|
|
24423
24433
|
SiliconFlow: SiliconFlowProvider,
|
|
@@ -24425,7 +24435,8 @@ var ChatProviderMap = {
|
|
|
24425
24435
|
Volces: VolcesProvider,
|
|
24426
24436
|
DeepSeek: DeepSeekProvider,
|
|
24427
24437
|
ModelScope: ModelScopeProvider,
|
|
24428
|
-
BaseChat
|
|
24438
|
+
BaseChat,
|
|
24439
|
+
Bailian: BailianProvider
|
|
24429
24440
|
};
|
|
24430
24441
|
|
|
24431
24442
|
class ProviderManager {
|
|
@@ -24648,5 +24659,6 @@ export {
|
|
|
24648
24659
|
CustomProvider,
|
|
24649
24660
|
ChatProviderMap,
|
|
24650
24661
|
BaseChat,
|
|
24662
|
+
BailianProvider,
|
|
24651
24663
|
AIConfigParser
|
|
24652
24664
|
};
|
package/dist/ai-provider.d.ts
CHANGED
|
@@ -5,7 +5,13 @@ import * as _kevisual_permission from '@kevisual/permission';
|
|
|
5
5
|
import { Permission } from '@kevisual/permission';
|
|
6
6
|
|
|
7
7
|
type ChatMessage = OpenAI.Chat.Completions.ChatCompletionMessageParam;
|
|
8
|
-
type ChatMessageOptions = Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams
|
|
8
|
+
type ChatMessageOptions = Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> & {
|
|
9
|
+
/**
|
|
10
|
+
* 是否能够思考
|
|
11
|
+
* 如果会话是千文,服务器的接口,默认为 true
|
|
12
|
+
*/
|
|
13
|
+
enable_thinking?: boolean;
|
|
14
|
+
};
|
|
9
15
|
type ChatMessageComplete = OpenAI.Chat.Completions.ChatCompletion;
|
|
10
16
|
type ChatMessageStream = OpenAI.Chat.Completions.ChatCompletion;
|
|
11
17
|
type EmbeddingMessage = Partial<OpenAI.Embeddings.EmbeddingCreateParams>;
|
|
@@ -202,12 +208,19 @@ declare class ModelScope extends BaseChat {
|
|
|
202
208
|
constructor(options: ModelScopeOptions);
|
|
203
209
|
}
|
|
204
210
|
|
|
211
|
+
type BailianOptions = Partial<BaseChatOptions>;
|
|
212
|
+
declare class BailianChat extends BaseChat {
|
|
213
|
+
static BASE_URL: string;
|
|
214
|
+
constructor(options: BailianOptions);
|
|
215
|
+
}
|
|
216
|
+
|
|
205
217
|
declare const OllamaProvider: typeof Ollama;
|
|
206
218
|
declare const SiliconFlowProvider: typeof SiliconFlow;
|
|
207
219
|
declare const CustomProvider: typeof Custom;
|
|
208
220
|
declare const VolcesProvider: typeof Volces;
|
|
209
221
|
declare const DeepSeekProvider: typeof DeepSeek;
|
|
210
222
|
declare const ModelScopeProvider: typeof ModelScope;
|
|
223
|
+
declare const BailianProvider: typeof BailianChat;
|
|
211
224
|
declare const ChatProviderMap: {
|
|
212
225
|
Ollama: typeof Ollama;
|
|
213
226
|
SiliconFlow: typeof SiliconFlow;
|
|
@@ -216,6 +229,7 @@ declare const ChatProviderMap: {
|
|
|
216
229
|
DeepSeek: typeof DeepSeek;
|
|
217
230
|
ModelScope: typeof ModelScope;
|
|
218
231
|
BaseChat: typeof BaseChat;
|
|
232
|
+
Bailian: typeof BailianChat;
|
|
219
233
|
};
|
|
220
234
|
type ProviderManagerConfig = {
|
|
221
235
|
provider: string;
|
|
@@ -430,5 +444,5 @@ declare class AIConfigParser {
|
|
|
430
444
|
};
|
|
431
445
|
}
|
|
432
446
|
|
|
433
|
-
export { AIConfigParser, BaseChat, ChatProviderMap, CustomProvider, DeepSeekProvider, KnowledgeBase, ModelScopeProvider, OllamaProvider, ProviderManager, SiliconFlowKnowledge, SiliconFlowProvider, VolcesProvider, decryptAES, encryptAES, getIsBrowser, readStream };
|
|
447
|
+
export { AIConfigParser, BailianProvider, BaseChat, ChatProviderMap, CustomProvider, DeepSeekProvider, KnowledgeBase, ModelScopeProvider, OllamaProvider, ProviderManager, SiliconFlowKnowledge, SiliconFlowProvider, VolcesProvider, decryptAES, encryptAES, getIsBrowser, readStream };
|
|
434
448
|
export type { AIConfig, AIModel, BaseChatInterface, BaseChatOptions, BaseChatUsageInterface, ChatMessage, ChatMessageComplete, ChatMessageOptions, ChatMessageStream, ChatStream, EmbeddingMessage, EmbeddingMessageComplete, GetProviderOpts, KnowledgeOptions, ProviderResult, RerankOptions, SecretKey };
|
package/dist/ai-provider.js
CHANGED
|
@@ -13446,6 +13446,15 @@ class ModelScope extends BaseChat {
|
|
|
13446
13446
|
}
|
|
13447
13447
|
}
|
|
13448
13448
|
|
|
13449
|
+
// src/provider/chat-adapter/dashscope.ts
|
|
13450
|
+
class BailianChat extends BaseChat {
|
|
13451
|
+
static BASE_URL = "https://bailian.aliyuncs.com/compatible-mode/v1/";
|
|
13452
|
+
constructor(options) {
|
|
13453
|
+
const baseURL = options.baseURL || BailianChat.BASE_URL;
|
|
13454
|
+
super({ ...options, baseURL });
|
|
13455
|
+
}
|
|
13456
|
+
}
|
|
13457
|
+
|
|
13449
13458
|
// src/provider/chat.ts
|
|
13450
13459
|
var OllamaProvider = Ollama;
|
|
13451
13460
|
var SiliconFlowProvider = SiliconFlow;
|
|
@@ -13453,6 +13462,7 @@ var CustomProvider = Custom;
|
|
|
13453
13462
|
var VolcesProvider = Volces;
|
|
13454
13463
|
var DeepSeekProvider = DeepSeek;
|
|
13455
13464
|
var ModelScopeProvider = ModelScope;
|
|
13465
|
+
var BailianProvider = BailianChat;
|
|
13456
13466
|
var ChatProviderMap = {
|
|
13457
13467
|
Ollama: OllamaProvider,
|
|
13458
13468
|
SiliconFlow: SiliconFlowProvider,
|
|
@@ -13460,7 +13470,8 @@ var ChatProviderMap = {
|
|
|
13460
13470
|
Volces: VolcesProvider,
|
|
13461
13471
|
DeepSeek: DeepSeekProvider,
|
|
13462
13472
|
ModelScope: ModelScopeProvider,
|
|
13463
|
-
BaseChat
|
|
13473
|
+
BaseChat,
|
|
13474
|
+
Bailian: BailianProvider
|
|
13464
13475
|
};
|
|
13465
13476
|
|
|
13466
13477
|
class ProviderManager {
|
|
@@ -13683,5 +13694,6 @@ export {
|
|
|
13683
13694
|
CustomProvider,
|
|
13684
13695
|
ChatProviderMap,
|
|
13685
13696
|
BaseChat,
|
|
13697
|
+
BailianProvider,
|
|
13686
13698
|
AIConfigParser
|
|
13687
13699
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevisual/ai",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "后面需要把ai-center的provider模块提取出去",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"basename": "/root/ai-center-services",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
14
|
+
"src",
|
|
14
15
|
"types"
|
|
15
16
|
],
|
|
16
17
|
"scripts": {
|
|
@@ -20,7 +21,11 @@
|
|
|
20
21
|
"clean": "rm -rf dist",
|
|
21
22
|
"pub": "envision pack -p -u"
|
|
22
23
|
},
|
|
23
|
-
"keywords": [
|
|
24
|
+
"keywords": [
|
|
25
|
+
"kevisual",
|
|
26
|
+
"ai",
|
|
27
|
+
"tools"
|
|
28
|
+
],
|
|
24
29
|
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
|
|
25
30
|
"license": "MIT",
|
|
26
31
|
"packageManager": "pnpm@10.11.0",
|
|
@@ -44,9 +49,8 @@
|
|
|
44
49
|
"import": "./dist/ai-provider-browser.js",
|
|
45
50
|
"types": "./dist/ai-provider-browser.d.ts"
|
|
46
51
|
},
|
|
47
|
-
"./
|
|
48
|
-
"import": "./
|
|
49
|
-
"types": "./dist/ai-provider-browser.d.ts"
|
|
52
|
+
"./src/**/*": {
|
|
53
|
+
"import": "./src/**/*"
|
|
50
54
|
}
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
2
|
+
|
|
3
|
+
export type OllamaOptions = BaseChatOptions;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 自定义模型
|
|
7
|
+
*/
|
|
8
|
+
export class Custom extends BaseChat {
|
|
9
|
+
static BASE_URL = 'https://api.deepseek.com/v1/';
|
|
10
|
+
constructor(options: OllamaOptions) {
|
|
11
|
+
const baseURL = options.baseURL || Custom.BASE_URL;
|
|
12
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
2
|
+
|
|
3
|
+
export type BailianOptions = Partial<BaseChatOptions>;
|
|
4
|
+
export class BailianChat extends BaseChat {
|
|
5
|
+
static BASE_URL = 'https://bailian.aliyuncs.com/compatible-mode/v1/';
|
|
6
|
+
constructor(options: BailianOptions) {
|
|
7
|
+
const baseURL = options.baseURL || BailianChat.BASE_URL;
|
|
8
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
2
|
+
|
|
3
|
+
export type DeepSeekOptions = Partial<BaseChatOptions>;
|
|
4
|
+
export class DeepSeek extends BaseChat {
|
|
5
|
+
static BASE_URL = 'https://api.deepseek.com/v1/';
|
|
6
|
+
constructor(options: DeepSeekOptions) {
|
|
7
|
+
const baseURL = options.baseURL || DeepSeek.BASE_URL;
|
|
8
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// https://api-inference.modelscope.cn/v1/
|
|
2
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
3
|
+
|
|
4
|
+
export type ModelScopeOptions = Partial<BaseChatOptions>;
|
|
5
|
+
export class ModelScope extends BaseChat {
|
|
6
|
+
static BASE_URL = 'https://api-inference.modelscope.cn/v1/';
|
|
7
|
+
constructor(options: ModelScopeOptions) {
|
|
8
|
+
const baseURL = options.baseURL || ModelScope.BASE_URL;
|
|
9
|
+
super({ ...options, baseURL: baseURL } as any);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/index.ts';
|
|
2
|
+
import type { ChatMessage, ChatMessageOptions } from '../core/index.ts';
|
|
3
|
+
|
|
4
|
+
export type OllamaOptions = Partial<BaseChatOptions>;
|
|
5
|
+
|
|
6
|
+
type OllamaModel = {
|
|
7
|
+
name: string;
|
|
8
|
+
model: string;
|
|
9
|
+
modified_at: string;
|
|
10
|
+
|
|
11
|
+
size: number;
|
|
12
|
+
digest: string;
|
|
13
|
+
details: {
|
|
14
|
+
parent_model: string;
|
|
15
|
+
format: string; // example: gguf
|
|
16
|
+
family: string; // example qwen
|
|
17
|
+
families: string[];
|
|
18
|
+
parameter_size: string;
|
|
19
|
+
quantization_level: string; // example: Q4_K_M Q4_0
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export class Ollama extends BaseChat {
|
|
23
|
+
static BASE_URL = 'http://localhost:11434/v1';
|
|
24
|
+
constructor(options: OllamaOptions) {
|
|
25
|
+
const baseURL = options.baseURL || Ollama.BASE_URL;
|
|
26
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
27
|
+
}
|
|
28
|
+
async chat(messages: ChatMessage[], options?: ChatMessageOptions) {
|
|
29
|
+
const res = await super.chat(messages, options);
|
|
30
|
+
console.log('thunk', this.getChatUsage());
|
|
31
|
+
return res;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取模型列表
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
async listModels(): Promise<{ models: OllamaModel[] }> {
|
|
38
|
+
const _url = new URL(this.baseURL);
|
|
39
|
+
const tagsURL = new URL('/api/tags', _url);
|
|
40
|
+
return this.openai.get(tagsURL.toString());
|
|
41
|
+
}
|
|
42
|
+
async listRunModels(): Promise<{ models: OllamaModel[] }> {
|
|
43
|
+
const _url = new URL(this.baseURL);
|
|
44
|
+
const tagsURL = new URL('/api/ps', _url);
|
|
45
|
+
return this.openai.get(tagsURL.toString());
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
2
|
+
import { OpenAI } from 'openai';
|
|
3
|
+
|
|
4
|
+
export type SiliconFlowOptions = Partial<BaseChatOptions>;
|
|
5
|
+
|
|
6
|
+
type SiliconFlowUsageData = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
image: string;
|
|
10
|
+
email: string;
|
|
11
|
+
isAdmin: boolean;
|
|
12
|
+
balance: string;
|
|
13
|
+
status: 'normal' | 'suspended' | 'expired' | string; // 状态
|
|
14
|
+
introduce: string;
|
|
15
|
+
role: string;
|
|
16
|
+
chargeBalance: string;
|
|
17
|
+
totalBalance: string;
|
|
18
|
+
category: string;
|
|
19
|
+
};
|
|
20
|
+
type SiliconFlowUsageResponse = {
|
|
21
|
+
code: number;
|
|
22
|
+
message: string;
|
|
23
|
+
status: boolean;
|
|
24
|
+
data: SiliconFlowUsageData;
|
|
25
|
+
};
|
|
26
|
+
export class SiliconFlow extends BaseChat {
|
|
27
|
+
static BASE_URL = 'https://api.siliconflow.cn/v1';
|
|
28
|
+
constructor(options: SiliconFlowOptions) {
|
|
29
|
+
const baseURL = options.baseURL || SiliconFlow.BASE_URL;
|
|
30
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
31
|
+
}
|
|
32
|
+
async getUsageInfo(): Promise<SiliconFlowUsageResponse> {
|
|
33
|
+
return this.openai.get('/user/info');
|
|
34
|
+
}
|
|
35
|
+
async chat(messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[], options?: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams>) {
|
|
36
|
+
const res = await super.chat(messages, options);
|
|
37
|
+
return res;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseChat, BaseChatOptions } from '../core/chat.ts';
|
|
2
|
+
|
|
3
|
+
export type VolcesOptions = Partial<BaseChatOptions>;
|
|
4
|
+
export class Volces extends BaseChat {
|
|
5
|
+
static BASE_URL = 'https://ark.cn-beijing.volces.com/api/v3/';
|
|
6
|
+
constructor(options: VolcesOptions) {
|
|
7
|
+
const baseURL = options.baseURL || Volces.BASE_URL;
|
|
8
|
+
super({ ...(options as BaseChatOptions), baseURL: baseURL });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export * from './core/index.ts';
|
|
2
|
+
import { BaseChat } from './core/chat.ts';
|
|
3
|
+
|
|
4
|
+
import { Ollama } from './chat-adapter/ollama.ts';
|
|
5
|
+
import { SiliconFlow } from './chat-adapter/siliconflow.ts';
|
|
6
|
+
import { Custom } from './chat-adapter/custom.ts';
|
|
7
|
+
import { Volces } from './chat-adapter/volces.ts';
|
|
8
|
+
import { DeepSeek } from './chat-adapter/deepseek.ts';
|
|
9
|
+
import { ModelScope } from './chat-adapter/model-scope.ts';
|
|
10
|
+
import { BailianChat } from './chat-adapter/dashscope.ts';
|
|
11
|
+
|
|
12
|
+
import { ChatMessage } from './core/type.ts';
|
|
13
|
+
|
|
14
|
+
export const OllamaProvider = Ollama;
|
|
15
|
+
export const SiliconFlowProvider = SiliconFlow;
|
|
16
|
+
export const CustomProvider = Custom;
|
|
17
|
+
export const VolcesProvider = Volces;
|
|
18
|
+
export const DeepSeekProvider = DeepSeek;
|
|
19
|
+
export const ModelScopeProvider = ModelScope;
|
|
20
|
+
export const BailianProvider = BailianChat;
|
|
21
|
+
|
|
22
|
+
export const ChatProviderMap = {
|
|
23
|
+
Ollama: OllamaProvider,
|
|
24
|
+
SiliconFlow: SiliconFlowProvider,
|
|
25
|
+
Custom: CustomProvider,
|
|
26
|
+
Volces: VolcesProvider,
|
|
27
|
+
DeepSeek: DeepSeekProvider,
|
|
28
|
+
ModelScope: ModelScopeProvider,
|
|
29
|
+
BaseChat: BaseChat,
|
|
30
|
+
Bailian: BailianProvider,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type ProviderManagerConfig = {
|
|
34
|
+
provider: string;
|
|
35
|
+
model: string;
|
|
36
|
+
apiKey: string;
|
|
37
|
+
baseURL?: string;
|
|
38
|
+
};
|
|
39
|
+
export class ProviderManager {
|
|
40
|
+
provider: BaseChat;
|
|
41
|
+
constructor(config: ProviderManagerConfig) {
|
|
42
|
+
const { provider, model, apiKey, baseURL } = config;
|
|
43
|
+
const Provider = ChatProviderMap[provider] as typeof BaseChat;
|
|
44
|
+
if (!Provider) {
|
|
45
|
+
throw new Error(`Provider ${provider} not found`);
|
|
46
|
+
}
|
|
47
|
+
const providerConfig = {
|
|
48
|
+
model,
|
|
49
|
+
apiKey,
|
|
50
|
+
baseURL,
|
|
51
|
+
};
|
|
52
|
+
if (!providerConfig.baseURL) {
|
|
53
|
+
delete providerConfig.baseURL;
|
|
54
|
+
}
|
|
55
|
+
this.provider = new Provider(providerConfig);
|
|
56
|
+
}
|
|
57
|
+
static async createProvider(config: ProviderManagerConfig) {
|
|
58
|
+
if (!config.baseURL) {
|
|
59
|
+
delete config.baseURL;
|
|
60
|
+
}
|
|
61
|
+
const pm = new ProviderManager(config);
|
|
62
|
+
return pm.provider;
|
|
63
|
+
}
|
|
64
|
+
async chat(messages: ChatMessage[]) {
|
|
65
|
+
return this.provider.chat(messages);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { OpenAI } from 'openai';
|
|
2
|
+
import type {
|
|
3
|
+
BaseChatInterface,
|
|
4
|
+
ChatMessageComplete,
|
|
5
|
+
ChatMessage,
|
|
6
|
+
ChatMessageOptions,
|
|
7
|
+
BaseChatUsageInterface,
|
|
8
|
+
ChatStream,
|
|
9
|
+
EmbeddingMessage,
|
|
10
|
+
EmbeddingMessageComplete,
|
|
11
|
+
} from './type.ts';
|
|
12
|
+
|
|
13
|
+
export type BaseChatOptions<T = Record<string, any>> = {
|
|
14
|
+
/**
|
|
15
|
+
* 默认baseURL
|
|
16
|
+
*/
|
|
17
|
+
baseURL?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 默认模型
|
|
20
|
+
*/
|
|
21
|
+
model?: string;
|
|
22
|
+
/**
|
|
23
|
+
* 默认apiKey
|
|
24
|
+
*/
|
|
25
|
+
apiKey: string;
|
|
26
|
+
/**
|
|
27
|
+
* 是否在浏览器中使用
|
|
28
|
+
*/
|
|
29
|
+
isBrowser?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 是否流式输出, 默认 false
|
|
32
|
+
*/
|
|
33
|
+
stream?: boolean;
|
|
34
|
+
} & T;
|
|
35
|
+
export const getIsBrowser = () => {
|
|
36
|
+
try {
|
|
37
|
+
// @ts-ignore
|
|
38
|
+
return IS_BROWSER;
|
|
39
|
+
} catch (e) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export class BaseChat implements BaseChatInterface, BaseChatUsageInterface {
|
|
44
|
+
/**
|
|
45
|
+
* 默认baseURL
|
|
46
|
+
*/
|
|
47
|
+
baseURL: string;
|
|
48
|
+
/**
|
|
49
|
+
* 默认模型
|
|
50
|
+
*/
|
|
51
|
+
model: string;
|
|
52
|
+
/**
|
|
53
|
+
* 默认apiKey
|
|
54
|
+
*/
|
|
55
|
+
apiKey: string;
|
|
56
|
+
/**
|
|
57
|
+
* 是否在浏览器中使用
|
|
58
|
+
*/
|
|
59
|
+
isBrowser: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* openai实例
|
|
62
|
+
*/
|
|
63
|
+
openai: OpenAI;
|
|
64
|
+
|
|
65
|
+
prompt_tokens: number;
|
|
66
|
+
total_tokens: number;
|
|
67
|
+
completion_tokens: number;
|
|
68
|
+
|
|
69
|
+
constructor(options: BaseChatOptions) {
|
|
70
|
+
this.baseURL = options.baseURL;
|
|
71
|
+
this.model = options.model;
|
|
72
|
+
this.apiKey = options.apiKey;
|
|
73
|
+
// @ts-ignore
|
|
74
|
+
const DEFAULT_IS_BROWSER = getIsBrowser();
|
|
75
|
+
this.isBrowser = options.isBrowser ?? DEFAULT_IS_BROWSER;
|
|
76
|
+
this.openai = new OpenAI({
|
|
77
|
+
apiKey: this.apiKey,
|
|
78
|
+
baseURL: this.baseURL,
|
|
79
|
+
dangerouslyAllowBrowser: this.isBrowser,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 聊天
|
|
84
|
+
*/
|
|
85
|
+
async chat(messages: ChatMessage[], options?: ChatMessageOptions): Promise<ChatMessageComplete> {
|
|
86
|
+
const createParams: OpenAI.Chat.Completions.ChatCompletionCreateParams = {
|
|
87
|
+
model: this.model,
|
|
88
|
+
messages,
|
|
89
|
+
...options,
|
|
90
|
+
stream: false,
|
|
91
|
+
};
|
|
92
|
+
const res = (await this.openai.chat.completions.create(createParams)) as ChatMessageComplete;
|
|
93
|
+
this.prompt_tokens = res.usage?.prompt_tokens ?? 0;
|
|
94
|
+
this.total_tokens = res.usage?.total_tokens ?? 0;
|
|
95
|
+
this.completion_tokens = res.usage?.completion_tokens ?? 0;
|
|
96
|
+
return res;
|
|
97
|
+
}
|
|
98
|
+
async chatStream(messages: ChatMessage[], options?: ChatMessageOptions) {
|
|
99
|
+
const createParams: OpenAI.Chat.Completions.ChatCompletionCreateParams = {
|
|
100
|
+
model: this.model,
|
|
101
|
+
messages,
|
|
102
|
+
...options,
|
|
103
|
+
stream: true,
|
|
104
|
+
};
|
|
105
|
+
if (createParams.response_format) {
|
|
106
|
+
throw new Error('response_format is not supported in stream mode');
|
|
107
|
+
}
|
|
108
|
+
return this.openai.chat.completions.create(createParams) as unknown as ChatStream;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 测试
|
|
113
|
+
*/
|
|
114
|
+
test() {
|
|
115
|
+
return this.chat([{ role: 'user', content: 'Hello, world!' }]);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 获取聊天使用情况
|
|
119
|
+
* @returns
|
|
120
|
+
*/
|
|
121
|
+
getChatUsage() {
|
|
122
|
+
return {
|
|
123
|
+
prompt_tokens: this.prompt_tokens,
|
|
124
|
+
total_tokens: this.total_tokens,
|
|
125
|
+
completion_tokens: this.completion_tokens,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
getHeaders(headers?: Record<string, string>) {
|
|
129
|
+
return {
|
|
130
|
+
'Content-Type': 'application/json',
|
|
131
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
132
|
+
...headers,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 生成embedding 内部
|
|
137
|
+
* @param text
|
|
138
|
+
* @returns
|
|
139
|
+
*/
|
|
140
|
+
async generateEmbeddingCore(text: string | string[], options?: EmbeddingMessage): Promise<EmbeddingMessageComplete> {
|
|
141
|
+
const embeddingModel = options?.model || this.model;
|
|
142
|
+
const res = await this.openai.embeddings.create({
|
|
143
|
+
model: embeddingModel,
|
|
144
|
+
input: text,
|
|
145
|
+
encoding_format: 'float',
|
|
146
|
+
...options,
|
|
147
|
+
});
|
|
148
|
+
this.prompt_tokens += res.usage.prompt_tokens;
|
|
149
|
+
this.total_tokens += res.usage.total_tokens;
|
|
150
|
+
return res;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ChatStream } from './type.ts';
|
|
2
|
+
|
|
3
|
+
// export type { BaseChat, BaseChatOptions } from './chat.ts';
|
|
4
|
+
export * from './chat.ts'
|
|
5
|
+
// export {
|
|
6
|
+
// ChatMessage,
|
|
7
|
+
// ChatMessageOptions, //
|
|
8
|
+
// ChatMessageComplete,
|
|
9
|
+
// ChatMessageStream,
|
|
10
|
+
// BaseChatInterface,
|
|
11
|
+
// BaseChatUsageInterface,
|
|
12
|
+
// ChatStream,
|
|
13
|
+
// EmbeddingMessage,
|
|
14
|
+
// EmbeddingMessageComplete,
|
|
15
|
+
// } from './type.ts';
|
|
16
|
+
export * from './type.ts'
|
|
17
|
+
/**
|
|
18
|
+
* for await (const chunk of chatStream) {
|
|
19
|
+
* console.log(chunk);
|
|
20
|
+
* }
|
|
21
|
+
* @param chatStream
|
|
22
|
+
*/
|
|
23
|
+
export const readStream = async (chatStream: ChatStream) => {
|
|
24
|
+
for await (const chunk of chatStream) {
|
|
25
|
+
console.log(chunk);
|
|
26
|
+
}
|
|
27
|
+
};
|