@zhin.js/core 1.0.25 → 1.0.27

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.
Files changed (202) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +84 -342
  3. package/lib/adapter.d.ts +17 -0
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +84 -2
  6. package/lib/adapter.js.map +1 -1
  7. package/lib/ai/agent.d.ts +126 -0
  8. package/lib/ai/agent.d.ts.map +1 -0
  9. package/lib/ai/agent.js +645 -0
  10. package/lib/ai/agent.js.map +1 -0
  11. package/lib/ai/context-manager.d.ts +213 -0
  12. package/lib/ai/context-manager.d.ts.map +1 -0
  13. package/lib/ai/context-manager.js +313 -0
  14. package/lib/ai/context-manager.js.map +1 -0
  15. package/lib/ai/conversation-memory.d.ts +181 -0
  16. package/lib/ai/conversation-memory.d.ts.map +1 -0
  17. package/lib/ai/conversation-memory.js +581 -0
  18. package/lib/ai/conversation-memory.js.map +1 -0
  19. package/lib/ai/follow-up.d.ts +131 -0
  20. package/lib/ai/follow-up.d.ts.map +1 -0
  21. package/lib/ai/follow-up.js +265 -0
  22. package/lib/ai/follow-up.js.map +1 -0
  23. package/lib/ai/index.d.ts +29 -0
  24. package/lib/ai/index.d.ts.map +1 -0
  25. package/lib/ai/index.js +34 -0
  26. package/lib/ai/index.js.map +1 -0
  27. package/lib/ai/init.d.ts +30 -0
  28. package/lib/ai/init.d.ts.map +1 -0
  29. package/lib/ai/init.js +424 -0
  30. package/lib/ai/init.js.map +1 -0
  31. package/lib/ai/output.d.ts +93 -0
  32. package/lib/ai/output.d.ts.map +1 -0
  33. package/lib/ai/output.js +176 -0
  34. package/lib/ai/output.js.map +1 -0
  35. package/lib/ai/providers/anthropic.d.ts +23 -0
  36. package/lib/ai/providers/anthropic.d.ts.map +1 -0
  37. package/lib/ai/providers/anthropic.js +322 -0
  38. package/lib/ai/providers/anthropic.js.map +1 -0
  39. package/lib/ai/providers/base.d.ts +43 -0
  40. package/lib/ai/providers/base.d.ts.map +1 -0
  41. package/lib/ai/providers/base.js +135 -0
  42. package/lib/ai/providers/base.js.map +1 -0
  43. package/lib/ai/providers/index.d.ts +12 -0
  44. package/lib/ai/providers/index.d.ts.map +1 -0
  45. package/lib/ai/providers/index.js +9 -0
  46. package/lib/ai/providers/index.js.map +1 -0
  47. package/lib/ai/providers/ollama.d.ts +25 -0
  48. package/lib/ai/providers/ollama.d.ts.map +1 -0
  49. package/lib/ai/providers/ollama.js +243 -0
  50. package/lib/ai/providers/ollama.js.map +1 -0
  51. package/lib/ai/providers/openai.d.ts +46 -0
  52. package/lib/ai/providers/openai.d.ts.map +1 -0
  53. package/lib/ai/providers/openai.js +132 -0
  54. package/lib/ai/providers/openai.js.map +1 -0
  55. package/lib/ai/rate-limiter.d.ts +38 -0
  56. package/lib/ai/rate-limiter.d.ts.map +1 -0
  57. package/lib/ai/rate-limiter.js +86 -0
  58. package/lib/ai/rate-limiter.js.map +1 -0
  59. package/lib/ai/service.d.ts +81 -0
  60. package/lib/ai/service.d.ts.map +1 -0
  61. package/lib/ai/service.js +274 -0
  62. package/lib/ai/service.js.map +1 -0
  63. package/lib/ai/session.d.ts +186 -0
  64. package/lib/ai/session.d.ts.map +1 -0
  65. package/lib/ai/session.js +443 -0
  66. package/lib/ai/session.js.map +1 -0
  67. package/lib/ai/tone-detector.d.ts +19 -0
  68. package/lib/ai/tone-detector.d.ts.map +1 -0
  69. package/lib/ai/tone-detector.js +72 -0
  70. package/lib/ai/tone-detector.js.map +1 -0
  71. package/lib/ai/tools.d.ts +45 -0
  72. package/lib/ai/tools.d.ts.map +1 -0
  73. package/lib/ai/tools.js +206 -0
  74. package/lib/ai/tools.js.map +1 -0
  75. package/lib/ai/types.d.ts +264 -0
  76. package/lib/ai/types.d.ts.map +1 -0
  77. package/lib/ai/types.js +6 -0
  78. package/lib/ai/types.js.map +1 -0
  79. package/lib/ai/user-profile.d.ts +56 -0
  80. package/lib/ai/user-profile.d.ts.map +1 -0
  81. package/lib/ai/user-profile.js +130 -0
  82. package/lib/ai/user-profile.js.map +1 -0
  83. package/lib/ai/zhin-agent.d.ts +165 -0
  84. package/lib/ai/zhin-agent.d.ts.map +1 -0
  85. package/lib/ai/zhin-agent.js +707 -0
  86. package/lib/ai/zhin-agent.js.map +1 -0
  87. package/lib/built/ai-trigger.d.ts.map +1 -1
  88. package/lib/built/ai-trigger.js +7 -3
  89. package/lib/built/ai-trigger.js.map +1 -1
  90. package/lib/built/command.d.ts +33 -17
  91. package/lib/built/command.d.ts.map +1 -1
  92. package/lib/built/command.js +71 -44
  93. package/lib/built/command.js.map +1 -1
  94. package/lib/built/component.d.ts +42 -15
  95. package/lib/built/component.d.ts.map +1 -1
  96. package/lib/built/component.js +84 -52
  97. package/lib/built/component.js.map +1 -1
  98. package/lib/built/config.d.ts +64 -5
  99. package/lib/built/config.d.ts.map +1 -1
  100. package/lib/built/config.js +129 -12
  101. package/lib/built/config.js.map +1 -1
  102. package/lib/built/cron.d.ts +41 -18
  103. package/lib/built/cron.d.ts.map +1 -1
  104. package/lib/built/cron.js +106 -63
  105. package/lib/built/cron.js.map +1 -1
  106. package/lib/built/database.d.ts +55 -6
  107. package/lib/built/database.d.ts.map +1 -1
  108. package/lib/built/database.js +93 -22
  109. package/lib/built/database.js.map +1 -1
  110. package/lib/built/dispatcher.d.ts +118 -0
  111. package/lib/built/dispatcher.d.ts.map +1 -0
  112. package/lib/built/dispatcher.js +196 -0
  113. package/lib/built/dispatcher.js.map +1 -0
  114. package/lib/built/permission.d.ts +45 -5
  115. package/lib/built/permission.d.ts.map +1 -1
  116. package/lib/built/permission.js +56 -11
  117. package/lib/built/permission.js.map +1 -1
  118. package/lib/built/skill.d.ts +117 -0
  119. package/lib/built/skill.d.ts.map +1 -0
  120. package/lib/built/skill.js +191 -0
  121. package/lib/built/skill.js.map +1 -0
  122. package/lib/built/tool.d.ts +71 -164
  123. package/lib/built/tool.d.ts.map +1 -1
  124. package/lib/built/tool.js +212 -297
  125. package/lib/built/tool.js.map +1 -1
  126. package/lib/feature.d.ts +75 -0
  127. package/lib/feature.d.ts.map +1 -0
  128. package/lib/feature.js +69 -0
  129. package/lib/feature.js.map +1 -0
  130. package/lib/index.d.ts +4 -0
  131. package/lib/index.d.ts.map +1 -1
  132. package/lib/index.js +7 -0
  133. package/lib/index.js.map +1 -1
  134. package/lib/plugin.d.ts +25 -17
  135. package/lib/plugin.d.ts.map +1 -1
  136. package/lib/plugin.js +180 -20
  137. package/lib/plugin.js.map +1 -1
  138. package/lib/types.d.ts +4 -9
  139. package/lib/types.d.ts.map +1 -1
  140. package/package.json +6 -6
  141. package/src/adapter.ts +101 -2
  142. package/src/ai/agent.ts +772 -0
  143. package/src/ai/context-manager.ts +440 -0
  144. package/src/ai/conversation-memory.ts +774 -0
  145. package/src/ai/follow-up.ts +357 -0
  146. package/src/ai/index.ts +128 -0
  147. package/src/ai/init.ts +502 -0
  148. package/src/ai/output.ts +261 -0
  149. package/src/ai/providers/anthropic.ts +375 -0
  150. package/src/ai/providers/base.ts +173 -0
  151. package/src/ai/providers/index.ts +13 -0
  152. package/src/ai/providers/ollama.ts +292 -0
  153. package/src/ai/providers/openai.ts +167 -0
  154. package/src/ai/rate-limiter.ts +129 -0
  155. package/src/ai/service.ts +319 -0
  156. package/src/ai/session.ts +544 -0
  157. package/src/ai/tone-detector.ts +89 -0
  158. package/src/ai/tools.ts +218 -0
  159. package/src/ai/types.ts +296 -0
  160. package/src/ai/user-profile.ts +181 -0
  161. package/src/ai/zhin-agent.ts +845 -0
  162. package/src/built/ai-trigger.ts +6 -3
  163. package/src/built/command.ts +75 -69
  164. package/src/built/component.ts +94 -76
  165. package/src/built/config.ts +288 -128
  166. package/src/built/cron.ts +117 -101
  167. package/src/built/database.ts +128 -33
  168. package/src/built/dispatcher.ts +332 -0
  169. package/src/built/permission.ts +146 -54
  170. package/src/built/skill.ts +280 -0
  171. package/src/built/tool.ts +245 -366
  172. package/src/feature.ts +113 -0
  173. package/src/index.ts +7 -0
  174. package/src/plugin.ts +198 -33
  175. package/src/types.ts +6 -10
  176. package/tests/adapter.test.ts +153 -1
  177. package/tests/ai/agent.test.ts +614 -0
  178. package/tests/ai/ai-trigger.test.ts +368 -0
  179. package/tests/ai/context-manager.test.ts +413 -0
  180. package/tests/ai/conversation-memory.test.ts +128 -0
  181. package/tests/ai/follow-up.test.ts +175 -0
  182. package/tests/ai/integration.test.ts +584 -0
  183. package/tests/ai/output.test.ts +128 -0
  184. package/tests/ai/providers.integration.test.ts +227 -0
  185. package/tests/ai/rate-limiter.test.ts +108 -0
  186. package/tests/ai/session.test.ts +375 -0
  187. package/tests/ai/setup.ts +308 -0
  188. package/tests/ai/tone-detector.test.ts +80 -0
  189. package/tests/ai/tool.test.ts +800 -0
  190. package/tests/ai/tools-builtin.test.ts +346 -0
  191. package/tests/ai/user-profile.test.ts +73 -0
  192. package/tests/ai/zhin-agent.test.ts +177 -0
  193. package/tests/config.test.ts +46 -0
  194. package/tests/cron.test.ts +94 -5
  195. package/tests/dispatcher.test.ts +146 -0
  196. package/tests/feature.test.ts +145 -0
  197. package/tests/features-builtin.test.ts +191 -0
  198. package/tests/plugin.test.ts +88 -14
  199. package/tests/skill-feature.test.ts +179 -0
  200. package/tests/tool-feature.test.ts +254 -0
  201. package/test/minimal-bot.ts +0 -31
  202. package/test/stress-test.ts +0 -123
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @zhin.js/ai - Base Provider
3
+ * AI Provider 抽象基类
4
+ */
5
+ /**
6
+ * Provider 基类
7
+ * 提供通用的 HTTP 请求和流式解析能力
8
+ */
9
+ export class BaseProvider {
10
+ config;
11
+ abortControllers = new Map();
12
+ constructor(config = {}) {
13
+ this.config = {
14
+ timeout: 60000,
15
+ maxRetries: 3,
16
+ ...config,
17
+ };
18
+ }
19
+ /**
20
+ * 发送 HTTP 请求
21
+ */
22
+ async fetch(url, options = {}) {
23
+ const { json, ...fetchOptions } = options;
24
+ const headers = {
25
+ 'Content-Type': 'application/json',
26
+ ...this.config.headers,
27
+ ...options.headers,
28
+ };
29
+ if (this.config.apiKey) {
30
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
31
+ }
32
+ const controller = new AbortController();
33
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
34
+ try {
35
+ const response = await fetch(url, {
36
+ ...fetchOptions,
37
+ headers,
38
+ body: json ? JSON.stringify(json) : fetchOptions.body,
39
+ signal: controller.signal,
40
+ });
41
+ if (!response.ok) {
42
+ const error = await response.text();
43
+ throw new Error(`API Error (${response.status}): ${error}`);
44
+ }
45
+ return response.json();
46
+ }
47
+ finally {
48
+ clearTimeout(timeoutId);
49
+ }
50
+ }
51
+ /**
52
+ * 发送流式请求
53
+ */
54
+ async *fetchStream(url, options = {}) {
55
+ const { json, ...fetchOptions } = options;
56
+ const headers = {
57
+ 'Content-Type': 'application/json',
58
+ Accept: 'text/event-stream',
59
+ ...this.config.headers,
60
+ ...options.headers,
61
+ };
62
+ if (this.config.apiKey) {
63
+ headers['Authorization'] = `Bearer ${this.config.apiKey}`;
64
+ }
65
+ const controller = new AbortController();
66
+ const requestId = Math.random().toString(36).slice(2);
67
+ this.abortControllers.set(requestId, controller);
68
+ try {
69
+ const response = await fetch(url, {
70
+ ...fetchOptions,
71
+ headers,
72
+ body: json ? JSON.stringify(json) : fetchOptions.body,
73
+ signal: controller.signal,
74
+ });
75
+ if (!response.ok) {
76
+ const error = await response.text();
77
+ throw new Error(`API Error (${response.status}): ${error}`);
78
+ }
79
+ if (!response.body) {
80
+ throw new Error('Response body is empty');
81
+ }
82
+ const reader = response.body.getReader();
83
+ const decoder = new TextDecoder();
84
+ let buffer = '';
85
+ while (true) {
86
+ const { done, value } = await reader.read();
87
+ if (done)
88
+ break;
89
+ buffer += decoder.decode(value, { stream: true });
90
+ const lines = buffer.split('\n');
91
+ buffer = lines.pop() || '';
92
+ for (const line of lines) {
93
+ const trimmed = line.trim();
94
+ if (trimmed.startsWith('data: ')) {
95
+ const data = trimmed.slice(6);
96
+ if (data !== '[DONE]') {
97
+ yield data;
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ finally {
104
+ this.abortControllers.delete(requestId);
105
+ }
106
+ }
107
+ /**
108
+ * 取消所有进行中的请求
109
+ */
110
+ cancelAll() {
111
+ for (const controller of this.abortControllers.values()) {
112
+ controller.abort();
113
+ }
114
+ this.abortControllers.clear();
115
+ }
116
+ /**
117
+ * 健康检查
118
+ */
119
+ async healthCheck() {
120
+ try {
121
+ await this.listModels?.();
122
+ return true;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * 列出可用模型(子类可覆盖)
130
+ */
131
+ async listModels() {
132
+ return this.models;
133
+ }
134
+ }
135
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/ai/providers/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @zhin.js/ai - Providers Index
3
+ * 导出所有 Provider
4
+ */
5
+ export { BaseProvider } from './base.js';
6
+ export { OpenAIProvider, DeepSeekProvider, MoonshotProvider, ZhipuProvider } from './openai.js';
7
+ export { AnthropicProvider } from './anthropic.js';
8
+ export { OllamaProvider } from './ollama.js';
9
+ export type { OpenAIConfig } from './openai.js';
10
+ export type { AnthropicConfig } from './anthropic.js';
11
+ export type { OllamaConfig } from './ollama.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @zhin.js/ai - Providers Index
3
+ * 导出所有 Provider
4
+ */
5
+ export { BaseProvider } from './base.js';
6
+ export { OpenAIProvider, DeepSeekProvider, MoonshotProvider, ZhipuProvider } from './openai.js';
7
+ export { AnthropicProvider } from './anthropic.js';
8
+ export { OllamaProvider } from './ollama.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @zhin.js/ai - Ollama Provider
3
+ * 支持本地 Ollama 模型
4
+ */
5
+ import { BaseProvider } from './base.js';
6
+ import type { ProviderConfig, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChunk } from '../types.js';
7
+ export interface OllamaConfig extends ProviderConfig {
8
+ host?: string;
9
+ models?: string[];
10
+ }
11
+ export declare class OllamaProvider extends BaseProvider {
12
+ name: string;
13
+ models: string[];
14
+ private host;
15
+ constructor(config?: OllamaConfig);
16
+ chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse>;
17
+ chatStream(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk>;
18
+ listModels(): Promise<string[]>;
19
+ /**
20
+ * 拉取模型
21
+ */
22
+ pullModel(model: string): Promise<void>;
23
+ healthCheck(): Promise<boolean>;
24
+ }
25
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AA2DD,qBAAa,cAAe,SAAQ,YAAY;IAC9C,IAAI,SAAY;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,GAAE,YAAiB;IAoB/B,IAAI,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA2EpE,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAiF/E,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWrC;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @zhin.js/ai - Ollama Provider
3
+ * 支持本地 Ollama 模型
4
+ */
5
+ import { Logger } from '@zhin.js/logger';
6
+ import { BaseProvider } from './base.js';
7
+ const logger = new Logger(null, 'Ollama');
8
+ /**
9
+ * 转换消息格式
10
+ */
11
+ function toOllamaMessages(messages) {
12
+ return messages.map(msg => {
13
+ let content;
14
+ const images = [];
15
+ if (typeof msg.content === 'string') {
16
+ content = msg.content;
17
+ }
18
+ else {
19
+ content = msg.content
20
+ .filter(p => p.type === 'text')
21
+ .map(p => p.text)
22
+ .join('');
23
+ for (const part of msg.content) {
24
+ if (part.type === 'image_url') {
25
+ const url = part.image_url.url;
26
+ if (url.startsWith('data:')) {
27
+ // 提取 base64 数据
28
+ const base64 = url.split(',')[1];
29
+ if (base64)
30
+ images.push(base64);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ const result = {
36
+ role: msg.role === 'tool' ? 'user' : msg.role,
37
+ content,
38
+ };
39
+ if (images.length > 0) {
40
+ result.images = images;
41
+ }
42
+ return result;
43
+ });
44
+ }
45
+ /**
46
+ * 转换工具定义
47
+ */
48
+ function toOllamaTools(tools) {
49
+ if (!tools?.length)
50
+ return undefined;
51
+ return tools.map(tool => ({
52
+ type: 'function',
53
+ function: {
54
+ name: tool.function.name,
55
+ description: tool.function.description,
56
+ parameters: tool.function.parameters,
57
+ },
58
+ }));
59
+ }
60
+ export class OllamaProvider extends BaseProvider {
61
+ name = 'ollama';
62
+ models;
63
+ host;
64
+ constructor(config = {}) {
65
+ super(config);
66
+ this.host = config.host || config.baseUrl || 'http://localhost:11434';
67
+ // 使用配置中的模型列表,如果没有则使用默认列表
68
+ this.models = config.models?.length ? config.models : [
69
+ 'llama3.3',
70
+ 'llama3.2',
71
+ 'llama3.1',
72
+ 'qwen2.5',
73
+ 'qwen2.5-coder',
74
+ 'deepseek-r1',
75
+ 'deepseek-v3',
76
+ 'mistral',
77
+ 'mixtral',
78
+ 'phi4',
79
+ 'gemma2',
80
+ ];
81
+ logger.debug(`初始化完成, host: ${this.host}`);
82
+ }
83
+ async chat(request) {
84
+ const messages = toOllamaMessages(request.messages);
85
+ logger.debug(`请求 ${request.model}, 消息: ${messages.length}`);
86
+ const ollamaRequest = {
87
+ model: request.model,
88
+ messages,
89
+ stream: false,
90
+ options: {},
91
+ };
92
+ // think 参数:控制 qwen3 等模型的思考模式
93
+ if (request.think !== undefined) {
94
+ ollamaRequest.think = request.think;
95
+ }
96
+ if (request.temperature !== undefined) {
97
+ ollamaRequest.options.temperature = request.temperature;
98
+ }
99
+ if (request.top_p !== undefined) {
100
+ ollamaRequest.options.top_p = request.top_p;
101
+ }
102
+ if (request.max_tokens !== undefined) {
103
+ ollamaRequest.options.num_predict = request.max_tokens;
104
+ }
105
+ const tools = toOllamaTools(request.tools);
106
+ if (tools) {
107
+ ollamaRequest.tools = tools;
108
+ }
109
+ const startTime = Date.now();
110
+ const response = await this.fetch(`${this.host}/api/chat`, {
111
+ method: 'POST',
112
+ json: ollamaRequest,
113
+ });
114
+ logger.debug(`响应耗时: ${Date.now() - startTime}ms, 工具调用: ${response.message?.tool_calls?.length || 0}`);
115
+ // 转换响应格式
116
+ const toolCalls = response.message?.tool_calls?.map((tc, i) => ({
117
+ id: `call_${i}`,
118
+ type: 'function',
119
+ function: {
120
+ name: tc.function.name,
121
+ arguments: JSON.stringify(tc.function.arguments),
122
+ },
123
+ }));
124
+ return {
125
+ id: `ollama-${Date.now()}`,
126
+ object: 'chat.completion',
127
+ created: Date.now(),
128
+ model: response.model,
129
+ choices: [{
130
+ index: 0,
131
+ message: {
132
+ role: 'assistant',
133
+ content: response.message?.content || '',
134
+ tool_calls: toolCalls?.length ? toolCalls : undefined,
135
+ },
136
+ finish_reason: toolCalls?.length ? 'tool_calls' : 'stop',
137
+ }],
138
+ usage: {
139
+ prompt_tokens: response.prompt_eval_count || 0,
140
+ completion_tokens: response.eval_count || 0,
141
+ total_tokens: (response.prompt_eval_count || 0) + (response.eval_count || 0),
142
+ },
143
+ };
144
+ }
145
+ async *chatStream(request) {
146
+ const messages = toOllamaMessages(request.messages);
147
+ const ollamaRequest = {
148
+ model: request.model,
149
+ messages,
150
+ stream: true,
151
+ options: {},
152
+ };
153
+ if (request.think !== undefined) {
154
+ ollamaRequest.think = request.think;
155
+ }
156
+ if (request.temperature !== undefined) {
157
+ ollamaRequest.options.temperature = request.temperature;
158
+ }
159
+ if (request.top_p !== undefined) {
160
+ ollamaRequest.options.top_p = request.top_p;
161
+ }
162
+ const response = await globalThis.fetch(`${this.host}/api/chat`, {
163
+ method: 'POST',
164
+ headers: { 'Content-Type': 'application/json' },
165
+ body: JSON.stringify(ollamaRequest),
166
+ });
167
+ if (!response.ok) {
168
+ const error = await response.text();
169
+ throw new Error(`Ollama API Error (${response.status}): ${error}`);
170
+ }
171
+ if (!response.body) {
172
+ throw new Error('Response body is empty');
173
+ }
174
+ const reader = response.body.getReader();
175
+ const decoder = new TextDecoder();
176
+ let buffer = '';
177
+ const id = `ollama-${Date.now()}`;
178
+ while (true) {
179
+ const { done, value } = await reader.read();
180
+ if (done)
181
+ break;
182
+ buffer += decoder.decode(value, { stream: true });
183
+ const lines = buffer.split('\n');
184
+ buffer = lines.pop() || '';
185
+ for (const line of lines) {
186
+ if (!line.trim())
187
+ continue;
188
+ try {
189
+ const data = JSON.parse(line);
190
+ yield {
191
+ id,
192
+ object: 'chat.completion.chunk',
193
+ created: Date.now(),
194
+ model: data.model || request.model,
195
+ choices: [{
196
+ index: 0,
197
+ delta: data.done
198
+ ? {}
199
+ : { content: data.message?.content || '' },
200
+ finish_reason: data.done ? 'stop' : null,
201
+ }],
202
+ usage: data.done ? {
203
+ prompt_tokens: data.prompt_eval_count || 0,
204
+ completion_tokens: data.eval_count || 0,
205
+ total_tokens: (data.prompt_eval_count || 0) + (data.eval_count || 0),
206
+ } : undefined,
207
+ };
208
+ }
209
+ catch {
210
+ // 忽略解析错误
211
+ }
212
+ }
213
+ }
214
+ }
215
+ async listModels() {
216
+ try {
217
+ const response = await this.fetch(`${this.host}/api/tags`);
218
+ return response.models.map(m => m.name);
219
+ }
220
+ catch {
221
+ return this.models;
222
+ }
223
+ }
224
+ /**
225
+ * 拉取模型
226
+ */
227
+ async pullModel(model) {
228
+ await this.fetch(`${this.host}/api/pull`, {
229
+ method: 'POST',
230
+ json: { name: model },
231
+ });
232
+ }
233
+ async healthCheck() {
234
+ try {
235
+ await globalThis.fetch(`${this.host}/api/tags`);
236
+ return true;
237
+ }
238
+ catch {
239
+ return false;
240
+ }
241
+ }
242
+ }
243
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/ai/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @zhin.js/ai - OpenAI Provider
3
+ * 支持 OpenAI API 及兼容接口(DeepSeek、Moonshot 等)
4
+ */
5
+ import { BaseProvider } from './base.js';
6
+ import type { ProviderConfig, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChunk } from '../types.js';
7
+ export interface OpenAIConfig extends ProviderConfig {
8
+ organization?: string;
9
+ }
10
+ export declare class OpenAIProvider extends BaseProvider {
11
+ name: string;
12
+ models: string[];
13
+ private baseUrl;
14
+ constructor(config?: OpenAIConfig);
15
+ chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse>;
16
+ chatStream(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk>;
17
+ listModels(): Promise<string[]>;
18
+ }
19
+ /**
20
+ * DeepSeek Provider(基于 OpenAI 兼容接口)
21
+ */
22
+ export declare class DeepSeekProvider extends OpenAIProvider {
23
+ name: string;
24
+ models: string[];
25
+ constructor(config?: ProviderConfig);
26
+ listModels(): Promise<string[]>;
27
+ }
28
+ /**
29
+ * Moonshot Provider(基于 OpenAI 兼容接口)
30
+ */
31
+ export declare class MoonshotProvider extends OpenAIProvider {
32
+ name: string;
33
+ models: string[];
34
+ constructor(config?: ProviderConfig);
35
+ listModels(): Promise<string[]>;
36
+ }
37
+ /**
38
+ * 智谱 AI Provider(基于 OpenAI 兼容接口)
39
+ */
40
+ export declare class ZhipuProvider extends OpenAIProvider {
41
+ name: string;
42
+ models: string[];
43
+ constructor(config?: ProviderConfig);
44
+ listModels(): Promise<string[]>;
45
+ }
46
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,IAAI,SAAY;IAChB,MAAM,WAUJ;IAEF,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,YAAiB;IAY/B,IAAI,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAapE,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IAuB/E,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CActC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,IAAI,SAAc;IAClB,MAAM,WAIJ;gBAEU,MAAM,GAAE,cAAmB;IAOjC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGtC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,IAAI,SAAc;IAClB,MAAM,WAIJ;gBAEU,MAAM,GAAE,cAAmB;IAOjC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGtC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,IAAI,SAAW;IACf,MAAM,WAMJ;gBAEU,MAAM,GAAE,cAAmB;IAOjC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGtC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @zhin.js/ai - OpenAI Provider
3
+ * 支持 OpenAI API 及兼容接口(DeepSeek、Moonshot 等)
4
+ */
5
+ import { BaseProvider } from './base.js';
6
+ export class OpenAIProvider extends BaseProvider {
7
+ name = 'openai';
8
+ models = [
9
+ 'gpt-4o',
10
+ 'gpt-4o-mini',
11
+ 'gpt-4-turbo',
12
+ 'gpt-4',
13
+ 'gpt-3.5-turbo',
14
+ 'o1',
15
+ 'o1-mini',
16
+ 'o1-preview',
17
+ 'o3-mini',
18
+ ];
19
+ baseUrl;
20
+ constructor(config = {}) {
21
+ super(config);
22
+ this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';
23
+ if (config.organization) {
24
+ this.config.headers = {
25
+ ...this.config.headers,
26
+ 'OpenAI-Organization': config.organization,
27
+ };
28
+ }
29
+ }
30
+ async chat(request) {
31
+ return this.fetch(`${this.baseUrl}/chat/completions`, {
32
+ method: 'POST',
33
+ json: {
34
+ ...request,
35
+ stream: false,
36
+ },
37
+ });
38
+ }
39
+ async *chatStream(request) {
40
+ const stream = this.fetchStream(`${this.baseUrl}/chat/completions`, {
41
+ method: 'POST',
42
+ json: {
43
+ ...request,
44
+ stream: true,
45
+ stream_options: { include_usage: true },
46
+ },
47
+ });
48
+ for await (const data of stream) {
49
+ try {
50
+ const chunk = JSON.parse(data);
51
+ yield chunk;
52
+ }
53
+ catch {
54
+ // 忽略解析错误的行
55
+ }
56
+ }
57
+ }
58
+ async listModels() {
59
+ try {
60
+ const response = await this.fetch(`${this.baseUrl}/models`);
61
+ return response.data
62
+ .map((m) => m.id)
63
+ .filter((id) => id.includes('gpt') || id.includes('o1') || id.includes('o3'));
64
+ }
65
+ catch {
66
+ return this.models;
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * DeepSeek Provider(基于 OpenAI 兼容接口)
72
+ */
73
+ export class DeepSeekProvider extends OpenAIProvider {
74
+ name = 'deepseek';
75
+ models = [
76
+ 'deepseek-chat',
77
+ 'deepseek-coder',
78
+ 'deepseek-reasoner',
79
+ ];
80
+ constructor(config = {}) {
81
+ super({
82
+ ...config,
83
+ baseUrl: config.baseUrl || 'https://api.deepseek.com/v1',
84
+ });
85
+ }
86
+ async listModels() {
87
+ return this.models;
88
+ }
89
+ }
90
+ /**
91
+ * Moonshot Provider(基于 OpenAI 兼容接口)
92
+ */
93
+ export class MoonshotProvider extends OpenAIProvider {
94
+ name = 'moonshot';
95
+ models = [
96
+ 'moonshot-v1-8k',
97
+ 'moonshot-v1-32k',
98
+ 'moonshot-v1-128k',
99
+ ];
100
+ constructor(config = {}) {
101
+ super({
102
+ ...config,
103
+ baseUrl: config.baseUrl || 'https://api.moonshot.cn/v1',
104
+ });
105
+ }
106
+ async listModels() {
107
+ return this.models;
108
+ }
109
+ }
110
+ /**
111
+ * 智谱 AI Provider(基于 OpenAI 兼容接口)
112
+ */
113
+ export class ZhipuProvider extends OpenAIProvider {
114
+ name = 'zhipu';
115
+ models = [
116
+ 'glm-4-plus',
117
+ 'glm-4',
118
+ 'glm-4-air',
119
+ 'glm-4-flash',
120
+ 'glm-4v-plus',
121
+ ];
122
+ constructor(config = {}) {
123
+ super({
124
+ ...config,
125
+ baseUrl: config.baseUrl || 'https://open.bigmodel.cn/api/paas/v4',
126
+ });
127
+ }
128
+ async listModels() {
129
+ return this.models;
130
+ }
131
+ }
132
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"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"}