@isdk/ai-tool 0.0.2

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 (87) hide show
  1. package/README.cn.md +261 -0
  2. package/README.md +3 -0
  3. package/dist/chunk-EZFPVSGF.mjs +22 -0
  4. package/dist/chunk-PKECBABP.mjs +5085 -0
  5. package/dist/funcs.d.mts +6 -0
  6. package/dist/funcs.d.ts +6 -0
  7. package/dist/funcs.js +5016 -0
  8. package/dist/funcs.mjs +37 -0
  9. package/dist/index-D4KjfAKl.d.mts +606 -0
  10. package/dist/index-D4KjfAKl.d.ts +606 -0
  11. package/dist/index.d.mts +1097 -0
  12. package/dist/index.d.ts +1097 -0
  13. package/dist/index.js +5239 -0
  14. package/dist/index.mjs +399 -0
  15. package/dist/test/util.d.mts +7 -0
  16. package/dist/test/util.d.ts +7 -0
  17. package/dist/test/util.js +98 -0
  18. package/dist/test/util.mjs +61 -0
  19. package/docs/.nojekyll +1 -0
  20. package/docs/README.md +5 -0
  21. package/docs/classes/AbortError.md +359 -0
  22. package/docs/classes/AlreadyExistsError.md +339 -0
  23. package/docs/classes/BaseError.md +346 -0
  24. package/docs/classes/ClientTools.md +2705 -0
  25. package/docs/classes/CommonError.md +368 -0
  26. package/docs/classes/ConfigFile.md +346 -0
  27. package/docs/classes/EventClient.md +3183 -0
  28. package/docs/classes/EventServer.md +3138 -0
  29. package/docs/classes/EventToolFunc.md +2498 -0
  30. package/docs/classes/FStringPromptTemplate.md +1236 -0
  31. package/docs/classes/FewShotPromptTemplate.md +1286 -0
  32. package/docs/classes/GolangPromptTemplate.md +1236 -0
  33. package/docs/classes/HFEnvironment.md +212 -0
  34. package/docs/classes/HFInterpreter.md +386 -0
  35. package/docs/classes/HFTemplate.md +79 -0
  36. package/docs/classes/HfPromptTemplate.md +1236 -0
  37. package/docs/classes/NotFoundError.md +339 -0
  38. package/docs/classes/NotImplementationError.md +339 -0
  39. package/docs/classes/PromptExampleSelector.md +207 -0
  40. package/docs/classes/PromptTemplate.md +1163 -0
  41. package/docs/classes/ReadableStreamError.md +359 -0
  42. package/docs/classes/ResClientTools.md +2859 -0
  43. package/docs/classes/ResServerTools.md +2783 -0
  44. package/docs/classes/SSEChannel.md +289 -0
  45. package/docs/classes/ServerTools.md +2633 -0
  46. package/docs/classes/ToolFunc.md +2124 -0
  47. package/docs/enums/ErrorCode.md +217 -0
  48. package/docs/enums/XXHashAlgorithm.md +30 -0
  49. package/docs/interfaces/AIChatAssistantMessageParam.md +84 -0
  50. package/docs/interfaces/AIChatContentPartImage.md +36 -0
  51. package/docs/interfaces/AIChatContentPartText.md +30 -0
  52. package/docs/interfaces/AIChatMessageParamBase.md +35 -0
  53. package/docs/interfaces/AIChatMessageToolCall.md +48 -0
  54. package/docs/interfaces/AIChatSystemMessageParam.md +51 -0
  55. package/docs/interfaces/AIChatToolMessageParam.md +62 -0
  56. package/docs/interfaces/AIChatUserMessageParam.md +95 -0
  57. package/docs/interfaces/AIResult.md +65 -0
  58. package/docs/interfaces/AIStreamCallbacksAndOptions.md +158 -0
  59. package/docs/interfaces/AIStreamParser.md +33 -0
  60. package/docs/interfaces/AIStreamParserOptions.md +23 -0
  61. package/docs/interfaces/BaseFunc.md +145 -0
  62. package/docs/interfaces/BaseFuncItem.md +99 -0
  63. package/docs/interfaces/ClientFuncItem.md +181 -0
  64. package/docs/interfaces/DotenvExpandOptions.md +51 -0
  65. package/docs/interfaces/DotenvExpandOutput.md +30 -0
  66. package/docs/interfaces/DotenvParseInput.md +7 -0
  67. package/docs/interfaces/DotenvParseOutput.md +7 -0
  68. package/docs/interfaces/DotenvPopulateInput.md +7 -0
  69. package/docs/interfaces/EventClientFuncParams.md +66 -0
  70. package/docs/interfaces/EventServerFuncParams.md +79 -0
  71. package/docs/interfaces/FewShotPromptTemplateOptions.md +179 -0
  72. package/docs/interfaces/FuncItem.md +130 -0
  73. package/docs/interfaces/FuncParam.md +67 -0
  74. package/docs/interfaces/FuncParams.md +7 -0
  75. package/docs/interfaces/Funcs.md +7 -0
  76. package/docs/interfaces/IOptions.md +30 -0
  77. package/docs/interfaces/JsonFilter.md +7 -0
  78. package/docs/interfaces/PromptExampleSelectorOptions.md +39 -0
  79. package/docs/interfaces/PromptTemplateOptions.md +84 -0
  80. package/docs/interfaces/RemoteFuncItem.md +167 -0
  81. package/docs/interfaces/ResClientFuncParams.md +34 -0
  82. package/docs/interfaces/ResServerFuncParams.md +79 -0
  83. package/docs/interfaces/SanitizeFilenameOptions.md +30 -0
  84. package/docs/interfaces/ServerFuncItem.md +192 -0
  85. package/docs/interfaces/ServerFuncParams.md +44 -0
  86. package/docs/modules.md +2707 -0
  87. package/package.json +112 -0
package/README.cn.md ADDED
@@ -0,0 +1,261 @@
1
+ ## @isdk/ai-tool
2
+
3
+ 所有的Tool Function 参数都是Obj参数,而不是位置参数
4
+
5
+ ### ToolFunc
6
+
7
+ 所有本地执行的,注册在这里
8
+
9
+ * func: 执行的工具函数主体
10
+ * name: 工具函数的名称
11
+ * params: 工具函数的参数描述schema
12
+ * result: 工具函数返回结果类型
13
+ * scope: 作用域
14
+ * description: 工具函数说明
15
+ * setup: 将在ctor ToolFunc实例的时候被执行
16
+ * depends: `{[name: string]: ToolFunc}`, 放在这里的将会被自动注册
17
+
18
+ ### ServerTools
19
+
20
+ 服务器端至少需要两个入口,一个获得所有tools api,另一个执行指定的tool api.
21
+ 未来再加一个EventSource入口,感知tool注册变动。
22
+
23
+ 所有需要暴露给服务器的,注册在这里,实质就是ToolFunc
24
+
25
+ * 增加 `static toJSON()` 导出所有的服务API定义
26
+
27
+ 特点: 允许导出func,使得函数功能可以本地执行。
28
+
29
+ 属性:
30
+
31
+ ```ts
32
+ interface ServerFuncItem extends FuncItem {
33
+ apiRoot?: string
34
+ /**
35
+ * API request method, can be 'get' or 'post'
36
+ */
37
+ action?: 'get'|'post'
38
+ // Options for the Node.js fetch function
39
+ fetchOptions?: any
40
+ // Whether to allow exporting the func body itself, default to false
41
+ allowExportFunc?: boolean
42
+ }
43
+ ```
44
+
45
+ 如果是`get`那么参数应该被放在query string(`p`): `p=${encodeURIComponent(JSON.stringify(objParams))}`
46
+ 如果是`post`参数在body中,同样是json格式。
47
+
48
+ ### ClientTools
49
+
50
+ 所有的远程调用没有真正的执行体,都是统一的远程API调用。
51
+
52
+ * 增加 `static loadFromSync(items)` 加载所有的远程调用,如果有item上有func,那么就是server调用的本地化,还是注册在ClientTools上。
53
+ * `static async loadFrom()` 如果没有items,那么从 `ClientTools.apiRoot` 上 fetch items. 所以是异步
54
+ * 本地执行优先:先找本地调用,没有再找远程调用
55
+
56
+ 特有属性:
57
+
58
+ ```ts
59
+ interface ClientFuncItem extends FuncItem {
60
+ apiRoot?: string
61
+ action?: 'get'|'post'
62
+ fetchOptions?: any
63
+ }
64
+ ```
65
+
66
+ ~~stream 参数~~(已经废弃,使用`isStream()`方法代替,这样更加灵活,因为后面的ResAPI中会有多个方法,有的支持流,有的不支持)加上,但是没有想好,如何在 ClientTools 上使用,因为ClientTools是抽象的,而stream需要有具体的值.
67
+ 除非我这里约定为 Object stream, 一次发送一个object. 这样才能在 ClientTools 实现流.
68
+
69
+ 另外如果是stream,是否能固化headers为:
70
+
71
+ ```js
72
+ headers.Connection = 'keep-alive' // 已加上
73
+ headers.Accept = 'text/event-stream' // 这个可能不必要
74
+ ```
75
+
76
+ 如果是stream,则func直接返回res,留待后代处理.
77
+
78
+ ### ResServerTools
79
+
80
+ TODO: 需要约定方法是否为stream?,而不是Func是否为stream.
81
+
82
+ 基于资源CRUD的ServerTools, 资源是ToolFunc的名称。如果是资源Func,那么就会存在如下的(可选的)方法:
83
+
84
+ * GET /api/res/[resID]: 获取资源 `get({_req, _res, id, options?})`
85
+ * GET /api/res: 获取资源列表 `list({_req, _res, options?})`
86
+ * POST /api/res: 创建资源 `post({_req, _res, id, options?})`
87
+ * PUT /api/res/[resID]: 更新资源 `put({_req, _res, id, options?})`
88
+ * DELETE /api/res/[resID]: 删除资源 `delete({_req, _res, id, options?})`
89
+
90
+ 约定的params:
91
+
92
+ * action: 'res' 则表示是资源函数
93
+
94
+ 传入的参数在某些方法中可能会有`id`和`options`
95
+
96
+ RES基本都是约定,可以没有实质的类?还是需要一个类,来告诉后代get,list,post,put,delete方法的存在?
97
+
98
+ 新增约定,以`$`打头的方法为供客户端调用的自定义资源方法method, 然后它们的HTTP Method统一为`POST`
99
+
100
+ ```ts
101
+ class TestResTool extends ResServerTools {
102
+ items: any = {}
103
+ params: FuncParams = {
104
+ 'id': {type: 'number'},
105
+ 'val': {type: 'any'},
106
+ }
107
+ $customMethod({id}: ResServerFuncParams) {
108
+ if (id) {
109
+ const item = this.items[id]
110
+ if (!item) {
111
+ throw new NotFoundError(id, 'res')
112
+ }
113
+ return {name: 'customMethod', id, item}
114
+ }
115
+ }
116
+ get({id}: ResServerFuncParams) {
117
+ if (id) {
118
+ const item = this.items[id]
119
+ if (!item) {
120
+ throw new NotFoundError(id, 'res')
121
+ }
122
+ return item
123
+ }
124
+ }
125
+ post({id, val}: ResServerFuncParams) {
126
+ if (id !== undefined && val !== undefined) {
127
+ this.items[id] = val
128
+ return {id}
129
+ } else {
130
+ throwError('id or val is undefined')
131
+ }
132
+ }
133
+ list() {
134
+ return Object.keys(this.items)
135
+ }
136
+ delete({id}: ResServerFuncParams) {
137
+ if (id) {
138
+ const item = this.items[id]
139
+ if (item === undefined) {
140
+ throw new NotFoundError(id, 'res')
141
+ }
142
+ delete this.items[id]
143
+ return {id}
144
+ }
145
+ }
146
+ }
147
+ ResServerTools.apiRoot = apiRoot
148
+ const res = new TestResTool('res')
149
+ res.register()
150
+ ```
151
+
152
+ 在Server中路由的参考实现
153
+
154
+ ```ts
155
+ const method = request.method
156
+ if (method === 'GET' || method == 'DELETE') {
157
+ params = (request.query as any).p
158
+ if (params) {
159
+ params = JSON.parse(params)
160
+ } else {
161
+ params = {}
162
+ }
163
+ } else {
164
+ params = request.body;
165
+ if (typeof params === 'string') {params = JSON.parse(params)}
166
+ }
167
+ params._req = request.raw
168
+ params._res = reply.raw
169
+ if (id !== undefined) {params.id = id}
170
+
171
+ try {
172
+ let result = await func.run(params)
173
+ // 注意这里没有考虑 stream
174
+ result = JSON.stringify(result)
175
+ // console.log('🚀 ~ server.all ~ result:', result)
176
+
177
+ reply.send(result)
178
+ // reply.send({params: request.params as any, query: request.query, url: request.url})
179
+ } catch(e) {
180
+ // console.log('🚀 ~ server.all ~ e:', e)
181
+ if (e.code !== undefined) {
182
+ if (e.stack) {e.stack = undefined}
183
+ reply.code(e.code).send(JSON.stringify(e))
184
+ } else if (e.message) {
185
+ reply.code(500).send({error: e.message})
186
+ } else {
187
+ reply.code(500).send({error: e})
188
+ }
189
+ }
190
+ ```
191
+
192
+ ### ResClientTools
193
+
194
+ 基于资源CRUD的ClientTools, 资源是ToolFunc的名称。
195
+
196
+ 根据ServerTools的加载项中的methods约定,生成对应ClientTools中的方法.
197
+
198
+ 如果是调用自定义资源方法,那么去掉服务器中自定义方法的前缀(`$`)即可.
199
+
200
+ ```ts
201
+ ResClientTools.apiRoot = apiRoot
202
+ await ResClientTools.loadFrom()
203
+
204
+ const resFunc = ResClientTools.getFunc(funcName)
205
+ if (resFunc) {
206
+ let result = await res.post({id: '...', val: '...'})
207
+ result = await res.put({id: '...', val: '...'})
208
+ result = await res.get({id: '...'})
209
+ result = await res.customMethod({id: '...'})
210
+ }
211
+ ```
212
+
213
+ ### SSE
214
+
215
+ 1. `GET /api/event` `list` 服务器事件通道 (stream)
216
+ 2. `POST /api/event` 订阅服务器事件
217
+ 3. `DELETE /api/event` 取消订阅服务器事件
218
+ 4. `PUT /api/event` 发布消息给服务器事件
219
+
220
+ 也可以将其它三个方法合并为`POST /api/event`,或者自定义方法:
221
+
222
+ 1. `GET /api/event` list 服务器事件通道 (stream)
223
+ 2. `sub/unsub/publish`
224
+
225
+ #### EventClient
226
+
227
+ 作用有2 主要功能为订阅与发布
228
+
229
+ * 订阅: 订阅服务器事件,并转发到本地客户端Event-Bus
230
+ * 发布: 发布消息到服务器
231
+
232
+ EventSource上的事件不支持RegExp(匹配)事件监听
233
+
234
+ 1. 将本地事件转发到服务器,通过特定的`Post` API
235
+ 2. 通过`GET`API 以SSE的方式接收服务器事件,并服务器事件转发到Event-Bus
236
+
237
+ * initEventSource(events): 告诉服务器只接收指定的events,如果events存在,否则接收全部
238
+ * subscribe(events): 订阅服务器SSE消息,并转发到Event-Bus
239
+ * 注意区分是本地消息,还是来自服务器的消息,来自服务器的消息如果是forward的本地消息,就不要再次转发到Event-Bus,不然就要无限循环
240
+ * unsubscribe(events): 取消订阅服务器SSE消息
241
+ * forwardEvent(events): 将指定的本地事件(通过本地订阅)转发到服务器
242
+ * unforwardEvent(events): 取消转发指定的本地事件
243
+
244
+ 本地事件需要转发到服务器上的有哪些?是和订阅服务器的事件一样?
245
+ 现在是可以不一样,单独通过forwardEvent来决定要转发的本地事件
246
+
247
+ 还有在哪里启用事件化? ToolFunc? 还是EventClient?
248
+
249
+ 我以为是在ToolFunc,这样所有的ToolFunc都支持事件! 但是作为一个基类,ToolFunc应该不关心事件,只关心执行体。
250
+
251
+ 这样,还是在我的ai-tools上执行初始化的时候,加载核心函数,以及将ToolFunc事件化. 这样基类具有更大的灵活性.
252
+
253
+ #### EventServer
254
+
255
+ func: 没有act,或者只传入events则是供服务器使用,有events则是限制在events范围内.
256
+
257
+ act有:
258
+
259
+ * pub: 发布sse事件
260
+ * sub: 转发服务器上的事件
261
+ * unsub: 撤销转发服务器上的事件
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ ## @isdk/ai-tool
2
+
3
+ All Tool Function parameters are Obj parameters, not positional arguments.
@@ -0,0 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+
19
+ export {
20
+ __export,
21
+ __reExport
22
+ };