@celljs/ai-core 3.4.4 → 3.5.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/README.md CHANGED
@@ -44,7 +44,7 @@ yarn add @celljs/ai-ollama
44
44
 
45
45
  ```typescript
46
46
  import { AssistantMessage, PromptTemplate } from '@celljs/ai-core';
47
- import { Component Autowired } from '@celljs/core';
47
+ import { Component, Autowired } from '@celljs/core';
48
48
 
49
49
  @Component()
50
50
  export class OllamaDemo {
@@ -103,6 +103,31 @@ export class OllamaDemo {
103
103
  }
104
104
  ```
105
105
 
106
+ 另外也可以使用 `ProxyChatModel` 类统一调用所有的模型服务商的模型:
107
+
108
+ ```typescript
109
+ import { ProxyChatModel } from '@celljs/ai-core';
110
+ import { Component Autowired } from '@celljs/core';
111
+
112
+ @Component()
113
+ export class OllamaDemo {
114
+ @Autowired(ProxyChatModel)
115
+ private chatModel: ChatModel;
116
+
117
+ /**
118
+ * Chat with Ollama
119
+ */
120
+ async chat() {
121
+ const response = await this.chatModel.call({
122
+ prompt: 'Hello {name}',
123
+ variables: { name: 'Ollama' },
124
+ chatOptions: { model: 'ollama:llama3.2' }
125
+ });
126
+ console.log(response.result.output);
127
+ }
128
+ }
129
+ ```
130
+
106
131
  ## 许可证
107
132
 
108
133
  本项目采用 MIT 许可证。
@@ -1,2 +1,3 @@
1
1
  export * from './chat-protocol';
2
+ export * from './proxy-chat-model';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/chat/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/common/chat/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -2,4 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./chat-protocol"), exports);
5
+ tslib_1.__exportStar(require("./proxy-chat-model"), exports);
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/common/chat/model/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/common/chat/model/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAChC,6DAAmC"}
@@ -0,0 +1,12 @@
1
+ import { ChatModel, ChatResponse } from './chat-protocol';
2
+ import { Observable } from 'rxjs';
3
+ import { Prompt } from '../prompt';
4
+ export declare class ProxyChatModel implements ChatModel {
5
+ protected readonly chatModels: ChatModel[];
6
+ protected readonly chatModelMap: Map<string, ChatModel>;
7
+ protected init(): void;
8
+ protected resolveChatModelAndPrompt(prompt: Prompt): [ChatModel, Prompt];
9
+ call(prompt: Prompt): Promise<ChatResponse>;
10
+ stream(prompt: Prompt): Promise<Observable<ChatResponse>>;
11
+ }
12
+ //# sourceMappingURL=proxy-chat-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-chat-model.d.ts","sourceRoot":"","sources":["../../../../src/common/chat/model/proxy-chat-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,qBACa,cAAe,YAAW,SAAS;IAG5C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IAE3C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IAEpE,SAAS,CAAC,IAAI;IAYd,SAAS,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;IAkBxE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK3C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;CAK5D"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var ProxyChatModel_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ProxyChatModel = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const core_1 = require("@celljs/core");
7
+ const chat_protocol_1 = require("./chat-protocol");
8
+ let ProxyChatModel = ProxyChatModel_1 = class ProxyChatModel {
9
+ constructor() {
10
+ this.chatModelMap = new Map();
11
+ }
12
+ init() {
13
+ for (const chatModel of this.chatModels) {
14
+ if ('provider' in chatModel) {
15
+ // @ts-ignore
16
+ this.chatModelMap.set(chatModel.provider, chatModel);
17
+ }
18
+ else {
19
+ const provider = chatModel.constructor.name.split('ChatModel')[0].toLowerCase();
20
+ this.chatModelMap.set(provider, chatModel);
21
+ }
22
+ }
23
+ }
24
+ resolveChatModelAndPrompt(prompt) {
25
+ const model = prompt.options.model;
26
+ if (!model) {
27
+ throw new core_1.IllegalArgumentError('Model not specified in prompt options.');
28
+ }
29
+ if (!model.includes(':')) {
30
+ throw new core_1.IllegalArgumentError('Invalid model name format. Expected "<provider>:<model-name>".');
31
+ }
32
+ const [provider, modelName] = model.split(':');
33
+ const chatModel = this.chatModelMap.get(provider);
34
+ if (!chatModel) {
35
+ throw new core_1.IllegalArgumentError(`Chat model provider "${provider}" not found.`);
36
+ }
37
+ const newPrompt = prompt.copy();
38
+ newPrompt.options.model = modelName;
39
+ return [chatModel, newPrompt];
40
+ }
41
+ call(prompt) {
42
+ const [chatModel, newPrompt] = this.resolveChatModelAndPrompt(prompt);
43
+ return chatModel.call(newPrompt);
44
+ }
45
+ stream(prompt) {
46
+ const [chatModel, newPrompt] = this.resolveChatModelAndPrompt(prompt);
47
+ return chatModel.stream(newPrompt);
48
+ }
49
+ };
50
+ tslib_1.__decorate([
51
+ (0, core_1.Autowired)(chat_protocol_1.ChatModel),
52
+ tslib_1.__metadata("design:type", Array)
53
+ ], ProxyChatModel.prototype, "chatModels", void 0);
54
+ ProxyChatModel = ProxyChatModel_1 = tslib_1.__decorate([
55
+ (0, core_1.Component)(ProxyChatModel_1)
56
+ ], ProxyChatModel);
57
+ exports.ProxyChatModel = ProxyChatModel;
58
+ //# sourceMappingURL=proxy-chat-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-chat-model.js","sourceRoot":"","sources":["../../../../src/common/chat/model/proxy-chat-model.ts"],"names":[],"mappings":";;;;;AAAA,uCAA0E;AAC1E,mDAA0D;AAKnD,IAAM,cAAc,sBAApB,MAAM,cAAc;IAApB;QAKgB,iBAAY,GAA2B,IAAI,GAAG,EAAE,CAAC;IA0CxE,CAAC;IAxCa,IAAI;QACV,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YACrC,IAAI,UAAU,IAAI,SAAS,EAAE;gBACzB,aAAa;gBACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,QAAkB,EAAE,SAAS,CAAC,CAAC;aAClE;iBAAM;gBACH,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;aAC9C;SACJ;IACL,CAAC;IAES,yBAAyB,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE;YACR,MAAM,IAAI,2BAAoB,CAAC,wCAAwC,CAAC,CAAC;SAC5E;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtB,MAAM,IAAI,2BAAoB,CAAC,gEAAgE,CAAC,CAAC;SACpG;QACD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,IAAI,2BAAoB,CAAC,wBAAwB,QAAQ,cAAc,CAAC,CAAC;SAClF;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QACpC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,MAAc;QACf,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,MAAc;QACjB,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;CAEJ,CAAA;AA7CG;IAAC,IAAA,gBAAS,EAAC,yBAAS,CAAC;;kDACsB;AAHlC,cAAc;IAD1B,IAAA,gBAAS,EAAC,gBAAc,CAAC;GACb,cAAc,CA+C1B;AA/CY,wCAAc"}
@@ -16,6 +16,7 @@ export interface ChatOptions extends ModelOptions {
16
16
  }
17
17
  export interface Prompt extends ModelRequest<Message[]> {
18
18
  readonly contents: string;
19
+ readonly options: ChatOptions;
19
20
  copy(): Prompt;
20
21
  }
21
22
  export interface PromptTemplateContext {
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-protocol.d.ts","sourceRoot":"","sources":["../../../../src/common/chat/prompt/prompt-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEnE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAO,SAAQ,YAAY,CAAC,OAAO,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtF"}
1
+ {"version":3,"file":"prompt-protocol.d.ts","sourceRoot":"","sources":["../../../../src/common/chat/prompt/prompt-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEnE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAO,SAAQ,YAAY,CAAC,OAAO,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,IAAI,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtF"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@celljs/ai-core",
3
- "version": "3.4.4",
3
+ "version": "3.5.1",
4
4
  "description": "Core domain for AI programming",
5
5
  "main": "lib/common/index.js",
6
6
  "typings": "lib/common/index.d.ts",
7
7
  "dependencies": {
8
- "@celljs/core": "3.4.4",
9
- "@celljs/http": "3.4.4",
8
+ "@celljs/core": "3.5.1",
9
+ "@celljs/http": "3.5.1",
10
10
  "rxjs": "^6.6.0",
11
11
  "tslib": "^2.8.0"
12
12
  },
@@ -38,7 +38,7 @@
38
38
  "test": "cell-component test:js"
39
39
  },
40
40
  "devDependencies": {
41
- "@celljs/component": "3.4.4"
41
+ "@celljs/component": "3.5.1"
42
42
  },
43
- "gitHead": "5d4a2384da3a67b3c16de24d4692bf754acfeda1"
43
+ "gitHead": "ed90939e4770c2f6d18bdd1721ffc58a25828777"
44
44
  }
@@ -1 +1,2 @@
1
1
  export * from './chat-protocol';
2
+ export * from './proxy-chat-model';
@@ -0,0 +1,54 @@
1
+ import { Autowired, Component, IllegalArgumentError } from '@celljs/core';
2
+ import { ChatModel, ChatResponse } from './chat-protocol';
3
+ import { Observable } from 'rxjs';
4
+ import { Prompt } from '../prompt';
5
+
6
+ @Component(ProxyChatModel)
7
+ export class ProxyChatModel implements ChatModel {
8
+
9
+ @Autowired(ChatModel)
10
+ protected readonly chatModels: ChatModel[];
11
+
12
+ protected readonly chatModelMap: Map<string, ChatModel> = new Map();
13
+
14
+ protected init() {
15
+ for (const chatModel of this.chatModels) {
16
+ if ('provider' in chatModel) {
17
+ // @ts-ignore
18
+ this.chatModelMap.set(chatModel.provider as string, chatModel);
19
+ } else {
20
+ const provider = chatModel.constructor.name.split('ChatModel')[0].toLowerCase();
21
+ this.chatModelMap.set(provider, chatModel);
22
+ }
23
+ }
24
+ }
25
+
26
+ protected resolveChatModelAndPrompt(prompt: Prompt): [ChatModel, Prompt] {
27
+ const model = prompt.options.model;
28
+ if (!model) {
29
+ throw new IllegalArgumentError('Model not specified in prompt options.');
30
+ }
31
+ if (!model.includes(':')) {
32
+ throw new IllegalArgumentError('Invalid model name format. Expected "<provider>:<model-name>".');
33
+ }
34
+ const [provider, modelName] = model.split(':');
35
+ const chatModel = this.chatModelMap.get(provider);
36
+ if (!chatModel) {
37
+ throw new IllegalArgumentError(`Chat model provider "${provider}" not found.`);
38
+ }
39
+ const newPrompt = prompt.copy();
40
+ newPrompt.options.model = modelName;
41
+ return [chatModel, newPrompt];
42
+ }
43
+
44
+ call(prompt: Prompt): Promise<ChatResponse> {
45
+ const [chatModel, newPrompt] = this.resolveChatModelAndPrompt(prompt);
46
+ return chatModel.call(newPrompt);
47
+ }
48
+
49
+ stream(prompt: Prompt): Promise<Observable<ChatResponse>> {
50
+ const [chatModel, newPrompt] = this.resolveChatModelAndPrompt(prompt);
51
+ return chatModel.stream(newPrompt);
52
+ }
53
+
54
+ }
@@ -19,6 +19,7 @@ export interface ChatOptions extends ModelOptions {
19
19
 
20
20
  export interface Prompt extends ModelRequest<Message[]> {
21
21
  readonly contents: string;
22
+ readonly options: ChatOptions;
22
23
  copy(): Prompt;
23
24
  }
24
25