@plolink/sdk 0.0.9 → 0.0.11

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/llm/index.ts"],"names":[],"mappings":";;;AAgEO,IAAM,MAAN,MAAU;AAAA,EAGf,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAa,KAAK,MAAA,EAA+D;AAE/E,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAI,YAAA,CAAa,mBAAA,EAAqB,gBAAgB,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,YAAA,CAAa,gCAAA,EAAkC,gBAAgB,CAAA;AAAA,IAC3E;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5E,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,CAAA,sBAAA,EAAyB,QAAQ,IAAI,CAAA,yCAAA,CAAA;AAAA,UACrC;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,QAAA,MAAM,IAAI,YAAA,CAAa,iCAAA,EAAmC,gBAAgB,CAAA;AAAA,MAC5E;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,MAAA,IAAI,MAAA,CAAO,WAAA,GAAc,CAAA,IAAK,MAAA,CAAO,cAAc,CAAA,EAAG;AACpD,QAAA,MAAM,IAAI,YAAA,CAAa,qCAAA,EAAuC,gBAAgB,CAAA;AAAA,MAChF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,cAAc,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,YAAA,CAAa,sCAAA,EAAwC,gBAAgB,CAAA;AAAA,IACjF;AAEA,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAC9B,MAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,IAAK,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,YAAA,CAAa,+BAAA,EAAiC,gBAAgB,CAAA;AAAA,MAC1E;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,6BAAA,EAA+B;AAAA,MACrD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAA,EAAc,OAAO,QAAA,CAAS;AAAA,KAC/B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,gCAAgC,MAAM,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAa,SAAA,GAAkC;AAC7C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,2BAA2B,CAAA;AAEnD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,oBAAoB,CAAA;AAAA,EAC3D;AACF","file":"index.js","sourcesContent":["/**\n * LLM 模块\n * \n * @description\n * 提供通用的 LLM 调用能力,兼容 OpenAI API 格式。\n * 支持:\n * - 聊天完成(chat completions)\n * - 模型列表查询\n * - 自动计费扣费\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { LLM } from '@plolink/sdk/llm';\n * \n * const client = new PlolinkClient({\n * token: 'sk-your-api-key'\n * });\n * \n * const llm = new LLM(client);\n * \n * // 获取模型列表\n * const models = await llm.getModels();\n * console.log('可用模型:', models.map(m => m.id));\n * \n * // 调用聊天完成\n * const response = await llm.chat({\n * model: 'deepseek-v3-1-terminus',\n * messages: [\n * { role: 'system', content: '你是一个有帮助的助手' },\n * { role: 'user', content: '你好,请介绍一下自己' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log('回复:', response.choices[0].message.content);\n * console.log('消耗 tokens:', response.usage);\n * ```\n * \n * @module llm\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n ChatCompletionParams,\n ChatCompletionResponse,\n ModelInfo,\n} from '../../types/llm';\n\n// Re-export 类型\nexport type {\n MessageRole,\n ChatMessage,\n ChatCompletionParams,\n ChatCompletionChoice,\n TokenUsage,\n ChatCompletionResponse,\n ModelInfo,\n} from '../../types/llm';\n\n/**\n * LLM 模块类\n */\nexport class LLM {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 聊天完成\n * \n * @description\n * 调用 LLM 模型进行聊天对话。支持多轮对话,自动处理计费扣费。\n * \n * @param params - 聊天完成参数\n * @returns 聊天完成响应,包含生成的内容和 token 使用信息\n * @throws {PlolinkError} 当参数无效、余额不足或调用失败时抛出\n * \n * @example\n * ```typescript\n * const response = await llm.chat({\n * model: 'deepseek-v3-1-terminus',\n * messages: [\n * { role: 'system', content: '你是一个专业的编程助手' },\n * { role: 'user', content: '如何用 TypeScript 实现单例模式?' }\n * ],\n * temperature: 0.7\n * });\n * \n * console.log('回复:', response.choices[0].message.content);\n * console.log('输入 tokens:', response.usage.prompt_tokens);\n * console.log('输出 tokens:', response.usage.completion_tokens);\n * ```\n */\n public async chat(params: ChatCompletionParams): Promise<ChatCompletionResponse> {\n // 参数验证\n if (!params.model) {\n throw new PlolinkError('Model is required', 'INVALID_PARAMS');\n }\n\n if (!params.messages || params.messages.length === 0) {\n throw new PlolinkError('Messages array cannot be empty', 'INVALID_PARAMS');\n }\n\n // 验证每条消息\n for (const message of params.messages) {\n if (!message.role || !['system', 'user', 'assistant'].includes(message.role)) {\n throw new PlolinkError(\n `Invalid message role: ${message.role}. Must be one of: system, user, assistant`,\n 'INVALID_PARAMS'\n );\n }\n if (!message.content) {\n throw new PlolinkError('Message content cannot be empty', 'INVALID_PARAMS');\n }\n }\n\n // 验证可选参数\n if (params.temperature !== undefined) {\n if (params.temperature < 0 || params.temperature > 2) {\n throw new PlolinkError('Temperature must be between 0 and 2', 'INVALID_PARAMS');\n }\n }\n\n if (params.max_tokens !== undefined && params.max_tokens <= 0) {\n throw new PlolinkError('max_tokens must be a positive number', 'INVALID_PARAMS');\n }\n\n if (params.top_p !== undefined) {\n if (params.top_p < 0 || params.top_p > 1) {\n throw new PlolinkError('top_p must be between 0 and 1', 'INVALID_PARAMS');\n }\n }\n\n this.client.logger.info('Calling LLM chat completion', {\n model: params.model,\n messageCount: params.messages.length,\n });\n\n return this.client.axiosInstance.post('/api/v1/llm/chat/completions', params);\n }\n\n /**\n * 获取所有可用模型列表\n * \n * @description\n * 获取所有可用的 LLM 模型及其详细信息,包括供应商和价格信息。\n * \n * @returns 模型信息列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * const models = await llm.getModels();\n * \n * console.log(`共有 ${models.length} 个可用模型`);\n * \n * models.forEach(model => {\n * console.log(`模型:${model.name}`);\n * console.log(` ID: ${model.id}`);\n * console.log(` 供应商: ${model.provider}`);\n * console.log(` 输入价格: ${model.inputPrice} 元/1000 tokens`);\n * console.log(` 输出价格: ${model.outputPrice} 元/1000 tokens`);\n * });\n * ```\n */\n public async getModels(): Promise<ModelInfo[]> {\n this.client.logger.info('Fetching available models');\n\n return this.client.axiosInstance.get('/api/v1/llm/models');\n }\n}\n"]}
@@ -0,0 +1,360 @@
1
+ 'use strict';
2
+
3
+ // src/modules/preset-agent-task/index.ts
4
+ var PresetAgentTask = class {
5
+ constructor(client) {
6
+ this.baseUrl = "/api/v1/preset-agent-tasks";
7
+ this.client = client;
8
+ }
9
+ /**
10
+ * 创建预设
11
+ *
12
+ * @param params - 创建参数
13
+ * @returns 预设ID和code
14
+ * @throws {PlolinkError} 当参数无效或创建失败时抛出
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const result = await presetAgentTask.create({
19
+ * code: 'talent-resume-parse',
20
+ * name: '简历解析预设',
21
+ * description: '自动解析简历并提取关键信息',
22
+ * prompt: '请解析上传的简历文件,提取候选人的基本信息、教育背景、工作经历等关键数据',
23
+ * model: 'doubao-seed-1-6-lite-251015',
24
+ * selectedSkills: ['talent/resume-parse', 'common/file-extract'],
25
+ * timeoutMs: 1800000,
26
+ * businessKey: 'talent-resume-parse'
27
+ * });
28
+ *
29
+ * console.log('预设ID:', result.id);
30
+ * console.log('预设标识:', result.code);
31
+ * ```
32
+ */
33
+ async create(params) {
34
+ return this.client.axiosInstance.post(this.baseUrl, params);
35
+ }
36
+ /**
37
+ * 获取预设列表
38
+ *
39
+ * @param options - 查询选项
40
+ * @returns 分页的预设列表
41
+ * @throws {PlolinkError} 当请求失败时抛出
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // 获取所有启用的预设
46
+ * const result = await presetAgentTask.list({
47
+ * enabled: true,
48
+ * page: 1,
49
+ * pageSize: 20
50
+ * });
51
+ *
52
+ * console.log('总数:', result.total);
53
+ * result.list.forEach(preset => {
54
+ * console.log(`${preset.code}: ${preset.name}`);
55
+ * });
56
+ * ```
57
+ */
58
+ async list(options) {
59
+ return this.client.axiosInstance.get(this.baseUrl, {
60
+ params: options
61
+ });
62
+ }
63
+ /**
64
+ * 获取预设详情
65
+ *
66
+ * @param id - 预设ID
67
+ * @returns 预设详细信息
68
+ * @throws {PlolinkError} 当预设不存在时抛出
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const preset = await presetAgentTask.getById('clx_preset_123');
73
+ * console.log('预设名称:', preset.name);
74
+ * console.log('预设指令:', preset.prompt);
75
+ * console.log('AI模型:', preset.model);
76
+ * ```
77
+ */
78
+ async getById(id) {
79
+ return this.client.axiosInstance.get(`${this.baseUrl}/${id}`);
80
+ }
81
+ /**
82
+ * 通过code获取预设
83
+ *
84
+ * @param code - 预设唯一标识
85
+ * @returns 预设详细信息
86
+ * @throws {PlolinkError} 当预设不存在时抛出
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * const preset = await presetAgentTask.getByCode('talent-resume-parse');
91
+ * console.log('预设ID:', preset.id);
92
+ * console.log('预设名称:', preset.name);
93
+ * ```
94
+ */
95
+ async getByCode(code) {
96
+ const result = await this.list({ enabled: true, pageSize: 100 });
97
+ const preset = result.list.find((p) => p.code === code);
98
+ if (!preset) {
99
+ throw new Error(`Preset not found with code: ${code}`);
100
+ }
101
+ return this.getById(preset.id);
102
+ }
103
+ /**
104
+ * 更新预设
105
+ *
106
+ * @param id - 预设ID
107
+ * @param params - 更新参数
108
+ * @throws {PlolinkError} 当预设不存在或更新失败时抛出
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * await presetAgentTask.update('clx_preset_123', {
113
+ * name: '简历解析预设(更新)',
114
+ * enabled: false
115
+ * });
116
+ *
117
+ * console.log('预设更新成功');
118
+ * ```
119
+ */
120
+ async update(id, params) {
121
+ await this.client.axiosInstance.put(`${this.baseUrl}/${id}`, params);
122
+ }
123
+ /**
124
+ * 删除预设
125
+ *
126
+ * @param id - 预设ID
127
+ * @throws {PlolinkError} 当预设不存在或删除失败时抛出
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * await presetAgentTask.delete('clx_preset_123');
132
+ * console.log('预设删除成功');
133
+ * ```
134
+ */
135
+ async delete(id) {
136
+ await this.client.axiosInstance.delete(`${this.baseUrl}/${id}`);
137
+ }
138
+ /**
139
+ * 执行预设(核心方法)
140
+ *
141
+ * @description
142
+ * 通过预设code执行预设任务。可以附加额外指令和输入文件。
143
+ *
144
+ * 执行后可以通过以下方式获取结果:
145
+ * - 方式1:轮询查询 - 使用 getExecutionById() 定期查询执行状态
146
+ * - 方式2:Webhook推送 - 配置Webhook接收执行完成通知
147
+ *
148
+ * @param params - 执行参数
149
+ * @returns 执行ID和初始状态
150
+ * @throws {PlolinkError} 当预设不存在或执行失败时抛出
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * // 执行预设
155
+ * const result = await presetAgentTask.execute({
156
+ * code: 'talent-resume-parse',
157
+ * additionalPrompt: '请特别关注技能匹配度',
158
+ * inputFileId: 'file-resume-123'
159
+ * });
160
+ *
161
+ * console.log('执行ID:', result.executionId);
162
+ * console.log('初始状态:', result.status); // 'INITIALIZING'
163
+ *
164
+ * // 方式1:轮询查询结果
165
+ * let execution;
166
+ * do {
167
+ * await new Promise(resolve => setTimeout(resolve, 5000)); // 等待5秒
168
+ * execution = await presetAgentTask.getExecutionById(result.executionId);
169
+ * console.log('当前状态:', execution.status);
170
+ * } while (execution.status === 'INITIALIZING' || execution.status === 'RUNNING');
171
+ *
172
+ * console.log('执行完成!');
173
+ * console.log('输出文件:', execution.outputFileId);
174
+ * console.log('Token消耗:', execution.metrics.inputTokens);
175
+ * console.log('费用:', execution.metrics.totalCost);
176
+ *
177
+ * // 方式2:通过Webhook接收结果(需要在系统中配置)
178
+ * // Webhook URL会收到POST请求:
179
+ * // {
180
+ * // module: "preset-agent-task",
181
+ * // action: "execution.completed",
182
+ * // data: {
183
+ * // executionId: "...",
184
+ * // outputFileId: "...",
185
+ * // metrics: {...}
186
+ * // }
187
+ * // }
188
+ * ```
189
+ */
190
+ async execute(params) {
191
+ return this.client.axiosInstance.post(`${this.baseUrl}/execute`, params);
192
+ }
193
+ /**
194
+ * 获取执行记录列表
195
+ *
196
+ * @param options - 查询选项
197
+ * @returns 分页的执行记录列表
198
+ * @throws {PlolinkError} 当请求失败时抛出
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * // 查询特定预设的执行记录
203
+ * const result = await presetAgentTask.listExecutions({
204
+ * presetId: 'clx_preset_123',
205
+ * status: 'COMPLETED',
206
+ * page: 1,
207
+ * pageSize: 20
208
+ * });
209
+ *
210
+ * console.log('总数:', result.total);
211
+ * result.list.forEach(execution => {
212
+ * console.log(`执行ID: ${execution.id}, 状态: ${execution.status}`);
213
+ * });
214
+ * ```
215
+ */
216
+ async listExecutions(options) {
217
+ return this.client.axiosInstance.get(
218
+ `${this.baseUrl}/executions`,
219
+ { params: options }
220
+ );
221
+ }
222
+ /**
223
+ * 获取执行详情
224
+ *
225
+ * @description
226
+ * 获取执行记录的完整信息,包括输出文件ID、Token消耗、费用等。
227
+ * 注意:不包含agentTaskId、runId(完全隐藏Agent Task细节)
228
+ *
229
+ * @param executionId - 执行ID
230
+ * @returns 执行详细信息
231
+ * @throws {PlolinkError} 当执行记录不存在时抛出
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * const execution = await presetAgentTask.getExecutionById('clx_exec_789');
236
+ *
237
+ * console.log('执行状态:', execution.status);
238
+ * console.log('预设名称:', execution.presetName);
239
+ * console.log('输入文件:', execution.inputFileId);
240
+ * console.log('输出文件:', execution.outputFileId);
241
+ * console.log('执行时长:', execution.duration, 'ms');
242
+ * console.log('Token消耗:', execution.metrics.inputTokens, '+', execution.metrics.outputTokens);
243
+ * console.log('总费用:', execution.metrics.totalCost, 'USD');
244
+ *
245
+ * if (execution.status === 'FAILED') {
246
+ * console.error('错误信息:', execution.errorMessage);
247
+ * }
248
+ * ```
249
+ */
250
+ async getExecutionById(executionId) {
251
+ return this.client.axiosInstance.get(`${this.baseUrl}/executions/${executionId}`);
252
+ }
253
+ /**
254
+ * 取消执行
255
+ *
256
+ * @param executionId - 执行ID
257
+ * @param reason - 取消原因(可选)
258
+ * @throws {PlolinkError} 当执行不存在或取消失败时抛出
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * await presetAgentTask.cancelExecution('clx_exec_789', '用户主动取消');
263
+ * console.log('执行已取消');
264
+ * ```
265
+ */
266
+ async cancelExecution(executionId, reason) {
267
+ await this.client.axiosInstance.post(`${this.baseUrl}/executions/${executionId}/cancel`, { reason });
268
+ }
269
+ /**
270
+ * 重新执行
271
+ *
272
+ * @description
273
+ * 使用相同的参数重新执行预设任务。
274
+ *
275
+ * @param executionId - 原执行ID
276
+ * @returns 新的执行ID和状态
277
+ * @throws {PlolinkError} 当原执行不存在或重试失败时抛出
278
+ *
279
+ * @example
280
+ * ```typescript
281
+ * const result = await presetAgentTask.retryExecution('clx_exec_789');
282
+ * console.log('新执行ID:', result.executionId);
283
+ * console.log('初始状态:', result.status);
284
+ * ```
285
+ */
286
+ async retryExecution(executionId) {
287
+ return this.client.axiosInstance.post(`${this.baseUrl}/executions/${executionId}/retry`);
288
+ }
289
+ /**
290
+ * 导出预设配置
291
+ *
292
+ * @description
293
+ * 导出选中的预设配置为JSON格式,可用于跨团队/环境迁移。
294
+ * 注意:extendedSkillsFileId需要手动处理(文件不跨团队)
295
+ *
296
+ * @param presetIds - 预设ID数组
297
+ * @returns 导出的配置(JSON格式)
298
+ * @throws {PlolinkError} 当预设不存在或导出失败时抛出
299
+ *
300
+ * @example
301
+ * ```typescript
302
+ * const config = await presetAgentTask.export(['clx_preset_123', 'clx_preset_456']);
303
+ *
304
+ * console.log('配置版本:', config.version);
305
+ * console.log('导出时间:', config.exportedAt);
306
+ * console.log('预设数量:', config.presets.length);
307
+ *
308
+ * // 保存到文件(Node.js环境)
309
+ * const fs = require('fs');
310
+ * fs.writeFileSync('presets.json', JSON.stringify(config, null, 2));
311
+ * ```
312
+ */
313
+ async export(presetIds) {
314
+ return this.client.axiosInstance.post(`${this.baseUrl}/export`, { presetIds });
315
+ }
316
+ /**
317
+ * 导入预设配置
318
+ *
319
+ * @description
320
+ * 从导出的JSON配置导入预设到当前团队。
321
+ * 支持冲突处理策略:skip(跳过已存在)或 overwrite(覆盖已存在)
322
+ *
323
+ * @param config - 导出的配置
324
+ * @param conflictStrategy - 冲突策略('skip' 或 'overwrite'),默认 'skip'
325
+ * @returns 导入结果
326
+ * @throws {PlolinkError} 当配置无效或导入失败时抛出
327
+ *
328
+ * @example
329
+ * ```typescript
330
+ * // 从文件读取(Node.js环境)
331
+ * const fs = require('fs');
332
+ * const config = JSON.parse(fs.readFileSync('presets.json', 'utf-8'));
333
+ *
334
+ * // 导入(跳过已存在的code)
335
+ * const result = await presetAgentTask.import(config, 'skip');
336
+ * console.log('导入成功:', result.imported);
337
+ * console.log('跳过:', result.skipped);
338
+ * console.log('失败:', result.failed);
339
+ *
340
+ * result.details.forEach(detail => {
341
+ * console.log(`${detail.code}: ${detail.status}`);
342
+ * if (detail.status === 'imported') {
343
+ * console.log(' 新预设ID:', detail.presetId);
344
+ * } else if (detail.status === 'failed') {
345
+ * console.log(' 错误:', detail.error);
346
+ * }
347
+ * });
348
+ * ```
349
+ */
350
+ async import(config, conflictStrategy = "skip") {
351
+ return this.client.axiosInstance.post(`${this.baseUrl}/import`, {
352
+ ...config,
353
+ conflictStrategy
354
+ });
355
+ }
356
+ };
357
+
358
+ exports.PresetAgentTask = PresetAgentTask;
359
+ //# sourceMappingURL=index.cjs.map
360
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/preset-agent-task/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 预设Agent任务模块\n * \n * @description\n * 预设Agent任务是对Agent Task能力的封装,提供开箱即用的业务能力。\n * \n * 核心功能:\n * - 预设配置管理(CRUD)\n * - 预设执行(通过code调用)\n * - 执行记录查询\n * - 执行管理(取消、重试)\n * - 配置导出/导入\n * \n * 注意:完全隐藏Agent Task实现细节,不暴露agentTaskId、runId\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { PresetAgentTask } from '@plolink/sdk/preset-agent-task';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const presetAgentTask = new PresetAgentTask(client);\n * \n * // 执行预设\n * const result = await presetAgentTask.execute({\n * code: 'talent-resume-parse',\n * additionalPrompt: '请特别关注技能匹配度',\n * inputFileId: 'file-resume-123'\n * });\n * \n * console.log('执行ID:', result.executionId);\n * console.log('初始状态:', result.status);\n * \n * // 方式1:轮询查询结果\n * const execution = await presetAgentTask.getExecutionById(result.executionId);\n * console.log('输出文件:', execution.outputFileId);\n * \n * // 方式2:通过Webhook接收结果(需要在系统中配置Webhook)\n * // POST /your-webhook-url\n * // { module: \"preset-agent-task\", action: \"execution.completed\", data: {...} }\n * ```\n * \n * @module preset-agent-task\n */\n\nimport type { PlolinkClient } from '../../core/client';\nimport type {\n PresetConfig,\n PresetListItem,\n CreatePresetParams,\n UpdatePresetParams,\n ExecutePresetParams,\n PresetExecution,\n PresetExecutionListItem,\n PresetListQuery,\n ExecutionListQuery,\n PaginatedResult,\n ExecutionResult,\n ExportedConfig,\n ImportResult,\n ConflictStrategy,\n} from '../../types/preset-agent-task';\n\n// Re-export types\nexport type {\n PresetConfig,\n PresetListItem,\n CreatePresetParams,\n UpdatePresetParams,\n ExecutePresetParams,\n PresetExecution,\n PresetExecutionListItem,\n PresetListQuery,\n ExecutionListQuery,\n PaginatedResult,\n ExecutionResult,\n ExportedConfig,\n ImportResult,\n ConflictStrategy,\n PresetExecutionStatus,\n ExecutionMetrics,\n PresetConfigForExport,\n ImportResultDetail,\n PresetExecutionWebhookPayload,\n} from '../../types/preset-agent-task';\n\n/**\n * 预设Agent任务模块\n */\nexport class PresetAgentTask {\n private client: PlolinkClient;\n private baseUrl = '/api/v1/preset-agent-tasks';\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 创建预设\n * \n * @param params - 创建参数\n * @returns 预设ID和code\n * @throws {PlolinkError} 当参数无效或创建失败时抛出\n * \n * @example\n * ```typescript\n * const result = await presetAgentTask.create({\n * code: 'talent-resume-parse',\n * name: '简历解析预设',\n * description: '自动解析简历并提取关键信息',\n * prompt: '请解析上传的简历文件,提取候选人的基本信息、教育背景、工作经历等关键数据',\n * model: 'doubao-seed-1-6-lite-251015',\n * selectedSkills: ['talent/resume-parse', 'common/file-extract'],\n * timeoutMs: 1800000,\n * businessKey: 'talent-resume-parse'\n * });\n * \n * console.log('预设ID:', result.id);\n * console.log('预设标识:', result.code);\n * ```\n */\n public async create(params: CreatePresetParams): Promise<{ id: string; code: string }> {\n return this.client.axiosInstance.post(this.baseUrl, params);\n }\n\n /**\n * 获取预设列表\n * \n * @param options - 查询选项\n * @returns 分页的预设列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * // 获取所有启用的预设\n * const result = await presetAgentTask.list({\n * enabled: true,\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log('总数:', result.total);\n * result.list.forEach(preset => {\n * console.log(`${preset.code}: ${preset.name}`);\n * });\n * ```\n */\n public async list(options?: PresetListQuery): Promise<PaginatedResult<PresetListItem>> {\n return this.client.axiosInstance.get(this.baseUrl, {\n params: options,\n });\n }\n\n /**\n * 获取预设详情\n * \n * @param id - 预设ID\n * @returns 预设详细信息\n * @throws {PlolinkError} 当预设不存在时抛出\n * \n * @example\n * ```typescript\n * const preset = await presetAgentTask.getById('clx_preset_123');\n * console.log('预设名称:', preset.name);\n * console.log('预设指令:', preset.prompt);\n * console.log('AI模型:', preset.model);\n * ```\n */\n public async getById(id: string): Promise<PresetConfig> {\n return this.client.axiosInstance.get(`${this.baseUrl}/${id}`);\n }\n\n /**\n * 通过code获取预设\n * \n * @param code - 预设唯一标识\n * @returns 预设详细信息\n * @throws {PlolinkError} 当预设不存在时抛出\n * \n * @example\n * ```typescript\n * const preset = await presetAgentTask.getByCode('talent-resume-parse');\n * console.log('预设ID:', preset.id);\n * console.log('预设名称:', preset.name);\n * ```\n */\n public async getByCode(code: string): Promise<PresetConfig> {\n // 通过列表查找匹配的code\n const result = await this.list({ enabled: true, pageSize: 100 });\n const preset = result.list.find((p) => p.code === code);\n \n if (!preset) {\n throw new Error(`Preset not found with code: ${code}`);\n }\n \n return this.getById(preset.id);\n }\n\n /**\n * 更新预设\n * \n * @param id - 预设ID\n * @param params - 更新参数\n * @throws {PlolinkError} 当预设不存在或更新失败时抛出\n * \n * @example\n * ```typescript\n * await presetAgentTask.update('clx_preset_123', {\n * name: '简历解析预设(更新)',\n * enabled: false\n * });\n * \n * console.log('预设更新成功');\n * ```\n */\n public async update(id: string, params: UpdatePresetParams): Promise<void> {\n await this.client.axiosInstance.put(`${this.baseUrl}/${id}`, params);\n }\n\n /**\n * 删除预设\n * \n * @param id - 预设ID\n * @throws {PlolinkError} 当预设不存在或删除失败时抛出\n * \n * @example\n * ```typescript\n * await presetAgentTask.delete('clx_preset_123');\n * console.log('预设删除成功');\n * ```\n */\n public async delete(id: string): Promise<void> {\n await this.client.axiosInstance.delete(`${this.baseUrl}/${id}`);\n }\n\n /**\n * 执行预设(核心方法)\n * \n * @description\n * 通过预设code执行预设任务。可以附加额外指令和输入文件。\n * \n * 执行后可以通过以下方式获取结果:\n * - 方式1:轮询查询 - 使用 getExecutionById() 定期查询执行状态\n * - 方式2:Webhook推送 - 配置Webhook接收执行完成通知\n * \n * @param params - 执行参数\n * @returns 执行ID和初始状态\n * @throws {PlolinkError} 当预设不存在或执行失败时抛出\n * \n * @example\n * ```typescript\n * // 执行预设\n * const result = await presetAgentTask.execute({\n * code: 'talent-resume-parse',\n * additionalPrompt: '请特别关注技能匹配度',\n * inputFileId: 'file-resume-123'\n * });\n * \n * console.log('执行ID:', result.executionId);\n * console.log('初始状态:', result.status); // 'INITIALIZING'\n * \n * // 方式1:轮询查询结果\n * let execution;\n * do {\n * await new Promise(resolve => setTimeout(resolve, 5000)); // 等待5秒\n * execution = await presetAgentTask.getExecutionById(result.executionId);\n * console.log('当前状态:', execution.status);\n * } while (execution.status === 'INITIALIZING' || execution.status === 'RUNNING');\n * \n * console.log('执行完成!');\n * console.log('输出文件:', execution.outputFileId);\n * console.log('Token消耗:', execution.metrics.inputTokens);\n * console.log('费用:', execution.metrics.totalCost);\n * \n * // 方式2:通过Webhook接收结果(需要在系统中配置)\n * // Webhook URL会收到POST请求:\n * // {\n * // module: \"preset-agent-task\",\n * // action: \"execution.completed\",\n * // data: {\n * // executionId: \"...\",\n * // outputFileId: \"...\",\n * // metrics: {...}\n * // }\n * // }\n * ```\n */\n public async execute(params: ExecutePresetParams): Promise<ExecutionResult> {\n return this.client.axiosInstance.post(`${this.baseUrl}/execute`, params);\n }\n\n /**\n * 获取执行记录列表\n * \n * @param options - 查询选项\n * @returns 分页的执行记录列表\n * @throws {PlolinkError} 当请求失败时抛出\n * \n * @example\n * ```typescript\n * // 查询特定预设的执行记录\n * const result = await presetAgentTask.listExecutions({\n * presetId: 'clx_preset_123',\n * status: 'COMPLETED',\n * page: 1,\n * pageSize: 20\n * });\n * \n * console.log('总数:', result.total);\n * result.list.forEach(execution => {\n * console.log(`执行ID: ${execution.id}, 状态: ${execution.status}`);\n * });\n * ```\n */\n public async listExecutions(options?: ExecutionListQuery): Promise<PaginatedResult<PresetExecutionListItem>> {\n return this.client.axiosInstance.get(\n `${this.baseUrl}/executions`,\n { params: options }\n );\n }\n\n /**\n * 获取执行详情\n * \n * @description\n * 获取执行记录的完整信息,包括输出文件ID、Token消耗、费用等。\n * 注意:不包含agentTaskId、runId(完全隐藏Agent Task细节)\n * \n * @param executionId - 执行ID\n * @returns 执行详细信息\n * @throws {PlolinkError} 当执行记录不存在时抛出\n * \n * @example\n * ```typescript\n * const execution = await presetAgentTask.getExecutionById('clx_exec_789');\n * \n * console.log('执行状态:', execution.status);\n * console.log('预设名称:', execution.presetName);\n * console.log('输入文件:', execution.inputFileId);\n * console.log('输出文件:', execution.outputFileId);\n * console.log('执行时长:', execution.duration, 'ms');\n * console.log('Token消耗:', execution.metrics.inputTokens, '+', execution.metrics.outputTokens);\n * console.log('总费用:', execution.metrics.totalCost, 'USD');\n * \n * if (execution.status === 'FAILED') {\n * console.error('错误信息:', execution.errorMessage);\n * }\n * ```\n */\n public async getExecutionById(executionId: string): Promise<PresetExecution> {\n return this.client.axiosInstance.get(`${this.baseUrl}/executions/${executionId}`);\n }\n\n /**\n * 取消执行\n * \n * @param executionId - 执行ID\n * @param reason - 取消原因(可选)\n * @throws {PlolinkError} 当执行不存在或取消失败时抛出\n * \n * @example\n * ```typescript\n * await presetAgentTask.cancelExecution('clx_exec_789', '用户主动取消');\n * console.log('执行已取消');\n * ```\n */\n public async cancelExecution(executionId: string, reason?: string): Promise<void> {\n await this.client.axiosInstance.post(`${this.baseUrl}/executions/${executionId}/cancel`, { reason });\n }\n\n /**\n * 重新执行\n * \n * @description\n * 使用相同的参数重新执行预设任务。\n * \n * @param executionId - 原执行ID\n * @returns 新的执行ID和状态\n * @throws {PlolinkError} 当原执行不存在或重试失败时抛出\n * \n * @example\n * ```typescript\n * const result = await presetAgentTask.retryExecution('clx_exec_789');\n * console.log('新执行ID:', result.executionId);\n * console.log('初始状态:', result.status);\n * ```\n */\n public async retryExecution(executionId: string): Promise<ExecutionResult> {\n return this.client.axiosInstance.post(`${this.baseUrl}/executions/${executionId}/retry`);\n }\n\n /**\n * 导出预设配置\n * \n * @description\n * 导出选中的预设配置为JSON格式,可用于跨团队/环境迁移。\n * 注意:extendedSkillsFileId需要手动处理(文件不跨团队)\n * \n * @param presetIds - 预设ID数组\n * @returns 导出的配置(JSON格式)\n * @throws {PlolinkError} 当预设不存在或导出失败时抛出\n * \n * @example\n * ```typescript\n * const config = await presetAgentTask.export(['clx_preset_123', 'clx_preset_456']);\n * \n * console.log('配置版本:', config.version);\n * console.log('导出时间:', config.exportedAt);\n * console.log('预设数量:', config.presets.length);\n * \n * // 保存到文件(Node.js环境)\n * const fs = require('fs');\n * fs.writeFileSync('presets.json', JSON.stringify(config, null, 2));\n * ```\n */\n public async export(presetIds: string[]): Promise<ExportedConfig> {\n return this.client.axiosInstance.post(`${this.baseUrl}/export`, { presetIds });\n }\n\n /**\n * 导入预设配置\n * \n * @description\n * 从导出的JSON配置导入预设到当前团队。\n * 支持冲突处理策略:skip(跳过已存在)或 overwrite(覆盖已存在)\n * \n * @param config - 导出的配置\n * @param conflictStrategy - 冲突策略('skip' 或 'overwrite'),默认 'skip'\n * @returns 导入结果\n * @throws {PlolinkError} 当配置无效或导入失败时抛出\n * \n * @example\n * ```typescript\n * // 从文件读取(Node.js环境)\n * const fs = require('fs');\n * const config = JSON.parse(fs.readFileSync('presets.json', 'utf-8'));\n * \n * // 导入(跳过已存在的code)\n * const result = await presetAgentTask.import(config, 'skip');\n * console.log('导入成功:', result.imported);\n * console.log('跳过:', result.skipped);\n * console.log('失败:', result.failed);\n * \n * result.details.forEach(detail => {\n * console.log(`${detail.code}: ${detail.status}`);\n * if (detail.status === 'imported') {\n * console.log(' 新预设ID:', detail.presetId);\n * } else if (detail.status === 'failed') {\n * console.log(' 错误:', detail.error);\n * }\n * });\n * ```\n */\n public async import(config: ExportedConfig, conflictStrategy: ConflictStrategy = 'skip'): Promise<ImportResult> {\n return this.client.axiosInstance.post(`${this.baseUrl}/import`, {\n ...config,\n conflictStrategy,\n });\n }\n}\n"]}