@plolink/sdk 0.0.4 → 0.0.5
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/modules/video-psych-analysis/index.cjs +317 -0
- package/dist/modules/video-psych-analysis/index.cjs.map +1 -0
- package/dist/modules/video-psych-analysis/index.d.cts +562 -0
- package/dist/modules/video-psych-analysis/index.d.ts +562 -0
- package/dist/modules/video-psych-analysis/index.js +315 -0
- package/dist/modules/video-psych-analysis/index.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJR4HYYQI_cjs = require('../../chunk-JR4HYYQI.cjs');
|
|
4
|
+
var chunkY3UJVC2L_cjs = require('../../chunk-Y3UJVC2L.cjs');
|
|
5
|
+
|
|
6
|
+
// src/modules/video-psych-analysis/index.ts
|
|
7
|
+
var VideoPsychAnalysis = class {
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 查询分析任务列表
|
|
13
|
+
*
|
|
14
|
+
* @param params - 查询参数(可选)
|
|
15
|
+
* @returns 任务列表
|
|
16
|
+
* @throws {PlolinkError} 当查询失败时抛出
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // 查询所有已完成的任务
|
|
21
|
+
* const result = await videoPsych.list({
|
|
22
|
+
* status: 'COMPLETED',
|
|
23
|
+
* page: 1,
|
|
24
|
+
* pageSize: 20
|
|
25
|
+
* });
|
|
26
|
+
* console.log(`共 ${result.total} 个任务`);
|
|
27
|
+
* result.list.forEach(item => {
|
|
28
|
+
* console.log(`${item.name}: ${item.status}`);
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
async list(params) {
|
|
33
|
+
return this.client.axiosInstance.get("/api/v1/video-psych-analysis", { params });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 创建视频心理分析任务
|
|
37
|
+
*
|
|
38
|
+
* @param params - 创建参数
|
|
39
|
+
* @returns 创建结果,包含任务ID和初始状态
|
|
40
|
+
* @throws {PlolinkError} 当参数验证失败或创建失败时抛出
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const result = await videoPsych.create({
|
|
45
|
+
* name: '候选人A面试分析',
|
|
46
|
+
* videoFileIds: ['file1', 'file2', 'file3'],
|
|
47
|
+
* referenceImageFileId: 'refImage1',
|
|
48
|
+
* prompt: '请以专业心理分析师的视角,分析候选人的情绪、态度和心理状态',
|
|
49
|
+
* frameFps: 3,
|
|
50
|
+
* language: 'zh'
|
|
51
|
+
* });
|
|
52
|
+
* console.log(`任务ID: ${result.id}, 状态: ${result.status}`);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
async create(params) {
|
|
56
|
+
const { videoFileIds, referenceImageFileId, prompt, frameFps, language, name } = params;
|
|
57
|
+
if (!videoFileIds || videoFileIds.length === 0) {
|
|
58
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("videoFileIds is required and must not be empty", "INVALID_PARAMS");
|
|
59
|
+
}
|
|
60
|
+
if (!referenceImageFileId) {
|
|
61
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("referenceImageFileId is required", "INVALID_PARAMS");
|
|
62
|
+
}
|
|
63
|
+
if (!prompt) {
|
|
64
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("prompt is required", "INVALID_PARAMS");
|
|
65
|
+
}
|
|
66
|
+
if (frameFps !== void 0 && (frameFps < 1 || frameFps > 30)) {
|
|
67
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("frameFps must be between 1 and 30", "INVALID_PARAMS");
|
|
68
|
+
}
|
|
69
|
+
return this.client.axiosInstance.post("/api/v1/video-psych-analysis", {
|
|
70
|
+
name,
|
|
71
|
+
videoFileIds,
|
|
72
|
+
referenceImageFileId,
|
|
73
|
+
prompt,
|
|
74
|
+
frameFps,
|
|
75
|
+
language
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 获取分析任务详情
|
|
80
|
+
*
|
|
81
|
+
* @param id - 任务ID
|
|
82
|
+
* @returns 任务详情信息
|
|
83
|
+
* @throws {PlolinkError} 当任务不存在或无权访问时抛出
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const detail = await videoPsych.getDetail('analysis_123');
|
|
88
|
+
* console.log(`任务: ${detail.name}`);
|
|
89
|
+
* console.log(`状态: ${detail.status}`);
|
|
90
|
+
* console.log(`进度: ${detail.progress.done}/${detail.progress.total}`);
|
|
91
|
+
*
|
|
92
|
+
* if (detail.reportContent) {
|
|
93
|
+
* console.log('报告已生成');
|
|
94
|
+
* }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
async getDetail(id) {
|
|
98
|
+
if (!id) {
|
|
99
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
100
|
+
}
|
|
101
|
+
return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}`);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 更新分析任务
|
|
105
|
+
*
|
|
106
|
+
* @description
|
|
107
|
+
* 更新分析任务的基本信息(仅限 PENDING 和 FAILED 状态的任务)。
|
|
108
|
+
*
|
|
109
|
+
* @param id - 任务ID
|
|
110
|
+
* @param params - 更新参数
|
|
111
|
+
* @returns 更新后的任务信息
|
|
112
|
+
* @throws {PlolinkError} 当任务不存在、状态不允许更新或更新失败时抛出
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const updated = await videoPsych.update('analysis_123', {
|
|
117
|
+
* name: '李四的心理分析',
|
|
118
|
+
* prompt: '请以临床心理学专家的视角进行分析'
|
|
119
|
+
* });
|
|
120
|
+
* console.log(`已更新: ${updated.name}`);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
async update(id, params) {
|
|
124
|
+
if (!id) {
|
|
125
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
126
|
+
}
|
|
127
|
+
if (!params.name && !params.prompt) {
|
|
128
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("At least one field (name or prompt) must be provided", "INVALID_PARAMS");
|
|
129
|
+
}
|
|
130
|
+
return this.client.axiosInstance.patch(`/api/v1/video-psych-analysis/${id}`, params);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 删除分析任务
|
|
134
|
+
*
|
|
135
|
+
* @description
|
|
136
|
+
* 删除分析任务(软删除)。
|
|
137
|
+
*
|
|
138
|
+
* @param id - 任务ID
|
|
139
|
+
* @throws {PlolinkError} 当任务不存在或删除失败时抛出
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* await videoPsych.delete('analysis_123');
|
|
144
|
+
* console.log('任务已删除');
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
async delete(id) {
|
|
148
|
+
if (!id) {
|
|
149
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
150
|
+
}
|
|
151
|
+
return this.client.axiosInstance.delete(`/api/v1/video-psych-analysis/${id}`);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 同步任务状态
|
|
155
|
+
*
|
|
156
|
+
* @description
|
|
157
|
+
* 主动触发后端从 AI TOOLS API 同步最新状态和中间结果。
|
|
158
|
+
*
|
|
159
|
+
* **注意**:通常不需要手动调用此方法,系统会每30秒自动轮询同步所有非完成态的任务。
|
|
160
|
+
*
|
|
161
|
+
* @param id - 任务ID
|
|
162
|
+
* @returns 同步后的状态信息
|
|
163
|
+
* @throws {PlolinkError} 当任务不存在或同步失败时抛出
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* const status = await videoPsych.syncStatus('analysis_123');
|
|
168
|
+
* console.log(`当前状态: ${status.status}`);
|
|
169
|
+
* console.log(`进度: ${status.progress.done}/${status.progress.total}`);
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
async syncStatus(id) {
|
|
173
|
+
if (!id) {
|
|
174
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
175
|
+
}
|
|
176
|
+
return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/status`);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 轮询分析任务状态
|
|
180
|
+
*
|
|
181
|
+
* @description
|
|
182
|
+
* 创建一个轮询器持续监听任务状态变化,直到任务达到终态(COMPLETED/FAILED)。
|
|
183
|
+
* 使用指数退避策略,初始间隔5秒,最大间隔30秒。
|
|
184
|
+
*
|
|
185
|
+
* @param id - 任务ID
|
|
186
|
+
* @param onStatusChange - 状态变化回调函数
|
|
187
|
+
* @returns Poller实例,可用于手动停止轮询
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const poller = videoPsych.watchAnalysisStatus('analysis_123', (detail) => {
|
|
192
|
+
* console.log(`状态: ${detail.status}`);
|
|
193
|
+
* console.log(`进度: ${detail.progress.done}/${detail.progress.total} (${detail.progress.stage})`);
|
|
194
|
+
*
|
|
195
|
+
* if (detail.status === 'COMPLETED') {
|
|
196
|
+
* console.log('分析完成,报告已生成!');
|
|
197
|
+
* console.log(detail.reportContent);
|
|
198
|
+
* } else if (detail.status === 'FAILED') {
|
|
199
|
+
* console.error(`分析失败: ${detail.errorMessage}`);
|
|
200
|
+
* }
|
|
201
|
+
* });
|
|
202
|
+
*
|
|
203
|
+
* // 开始轮询
|
|
204
|
+
* poller.start();
|
|
205
|
+
*
|
|
206
|
+
* // 需要时可以手动停止
|
|
207
|
+
* // poller.stop();
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
watchAnalysisStatus(id, onStatusChange) {
|
|
211
|
+
const poller = new chunkJR4HYYQI_cjs.Poller({
|
|
212
|
+
task: async () => {
|
|
213
|
+
await this.syncStatus(id);
|
|
214
|
+
return this.getDetail(id);
|
|
215
|
+
},
|
|
216
|
+
onResult: onStatusChange,
|
|
217
|
+
shouldStop: (detail) => {
|
|
218
|
+
return ["COMPLETED", "FAILED"].includes(detail.status);
|
|
219
|
+
},
|
|
220
|
+
initialInterval: 5e3,
|
|
221
|
+
// 5秒
|
|
222
|
+
maxInterval: 3e4,
|
|
223
|
+
// 30秒
|
|
224
|
+
backoffFactor: 1.5,
|
|
225
|
+
onError: (error) => {
|
|
226
|
+
this.client.logger.error("Analysis polling error", { error, id });
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
void poller.start();
|
|
230
|
+
return poller;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* 获取文本维度分析结果
|
|
234
|
+
*
|
|
235
|
+
* @param id - 任务ID
|
|
236
|
+
* @returns 文本维度分析数据
|
|
237
|
+
* @throws {PlolinkError} 当任务不存在或分析未完成时抛出
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* const texts = await videoPsych.getTexts('analysis_123');
|
|
242
|
+
* console.log(`共 ${texts.total} 条文本`);
|
|
243
|
+
* texts.items.forEach(item => {
|
|
244
|
+
* console.log(`${item.start_time}s: ${item.text}`);
|
|
245
|
+
* if (item.nlp_result) {
|
|
246
|
+
* console.log(` 情绪: ${item.nlp_result.speaker_emotion}`);
|
|
247
|
+
* console.log(` 态度: ${item.nlp_result.real_attitude}`);
|
|
248
|
+
* }
|
|
249
|
+
* });
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
async getTexts(id) {
|
|
253
|
+
if (!id) {
|
|
254
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
255
|
+
}
|
|
256
|
+
return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/texts`);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* 获取帧维度分析结果
|
|
260
|
+
*
|
|
261
|
+
* @param id - 任务ID
|
|
262
|
+
* @returns 帧维度分析数据
|
|
263
|
+
* @throws {PlolinkError} 当任务不存在或分析未完成时抛出
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```typescript
|
|
267
|
+
* const frames = await videoPsych.getFrames('analysis_123');
|
|
268
|
+
* console.log(`共 ${frames.total} 帧`);
|
|
269
|
+
* frames.items.forEach(item => {
|
|
270
|
+
* console.log(`${item.timestamp}s: ${item.image_url}`);
|
|
271
|
+
* if (item.vision_result) {
|
|
272
|
+
* console.log(` 表情: ${item.vision_result.expression}`);
|
|
273
|
+
* console.log(` 动作: ${item.vision_result.action}`);
|
|
274
|
+
* }
|
|
275
|
+
* });
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
async getFrames(id) {
|
|
279
|
+
if (!id) {
|
|
280
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
281
|
+
}
|
|
282
|
+
return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/frames`);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 获取段落分析结果
|
|
286
|
+
*
|
|
287
|
+
* @param id - 任务ID
|
|
288
|
+
* @returns 段落分析数据
|
|
289
|
+
* @throws {PlolinkError} 当任务不存在或分析未完成时抛出
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* const paragraphs = await videoPsych.getParagraphs('analysis_123');
|
|
294
|
+
* console.log(`共 ${paragraphs.total} 段`);
|
|
295
|
+
* paragraphs.items.forEach(item => {
|
|
296
|
+
* console.log(`段落 ${item.id}:`);
|
|
297
|
+
* console.log(` 时间: ${item.start_time}s - ${item.end_time}s`);
|
|
298
|
+
* console.log(` 内容: ${item.text}`);
|
|
299
|
+
* console.log(` 摘要: ${item.summary}`);
|
|
300
|
+
* if (item.nlp_result) {
|
|
301
|
+
* console.log(` 情绪: ${item.nlp_result.speaker_emotion}`);
|
|
302
|
+
* console.log(` 态度: ${item.nlp_result.real_attitude}`);
|
|
303
|
+
* }
|
|
304
|
+
* });
|
|
305
|
+
* ```
|
|
306
|
+
*/
|
|
307
|
+
async getParagraphs(id) {
|
|
308
|
+
if (!id) {
|
|
309
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("id is required", "INVALID_PARAMS");
|
|
310
|
+
}
|
|
311
|
+
return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/paragraphs`);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
exports.VideoPsychAnalysis = VideoPsychAnalysis;
|
|
316
|
+
//# sourceMappingURL=index.cjs.map
|
|
317
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/video-psych-analysis/index.ts"],"names":["PlolinkError","Poller"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 视频人物心理分析模块\n * \n * @description\n * 提供视频人物心理分析相关功能,包括:\n * - 创建分析任务\n * - 查询任务详情和状态\n * - 同步任务状态(轮询)\n * - 获取分析结果(文本/帧/段落维度)\n * - 生成心理分析报告\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { VideoPsychAnalysis } from '@plolink/sdk/video-psych-analysis';\n * \n * const client = new PlolinkClient({\n * mode: 'apiKey',\n * apiKey: 'your-api-key'\n * });\n * \n * const videoPsych = new VideoPsychAnalysis(client);\n * \n * // 创建分析任务\n * const result = await videoPsych.create({\n * name: '候选人A面试分析',\n * videoFileIds: ['file1', 'file2'],\n * referenceImageFileId: 'refImage1',\n * prompt: '请以专业心理分析师的视角进行分析',\n * frameFps: 3,\n * language: 'zh'\n * });\n * console.log(`任务已创建: ${result.id}`);\n * \n * // 轮询任务状态\n * const poller = videoPsych.watchAnalysisStatus(result.id, (detail) => {\n * console.log(`分析进度: ${detail.progress.done}/${detail.progress.total}`);\n * if (detail.status === 'COMPLETED') {\n * console.log('分析完成,报告已生成!');\n * console.log(detail.reportContent);\n * }\n * });\n * ```\n * \n * @module video-psych-analysis\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { Poller } from '../../common/poller';\nimport { PlolinkError } from '../../core/error';\nimport type {\n CreateVideoPsychAnalysisParams,\n CreateVideoPsychAnalysisResponse,\n VideoPsychAnalysisDetail,\n SyncStatusResponse,\n TextsData,\n FramesData,\n ParagraphsData,\n ListVideoPsychAnalysesParams,\n ListVideoPsychAnalysesResponse,\n UpdateVideoPsychAnalysisParams,\n UpdateVideoPsychAnalysisResponse,\n} from '../../types/video-psych-analysis';\n\nexport type {\n VideoPsychAnalysisStatus,\n CreateVideoPsychAnalysisParams,\n VideoInfo,\n AnalysisProgress,\n CreateVideoPsychAnalysisResponse,\n VideoPsychAnalysisDetail,\n SyncStatusResponse,\n TextAnalysisItem,\n TextsData,\n FrameAnalysisItem,\n FramesData,\n ParagraphAnalysisItem,\n ParagraphsData,\n ListVideoPsychAnalysesParams,\n VideoPsychAnalysisSummary,\n ListVideoPsychAnalysesResponse,\n UpdateVideoPsychAnalysisParams,\n UpdateVideoPsychAnalysisResponse,\n} from '../../types/video-psych-analysis';\n\n/**\n * 视频人物心理分析模块\n */\nexport class VideoPsychAnalysis {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 查询分析任务列表\n * \n * @param params - 查询参数(可选)\n * @returns 任务列表\n * @throws {PlolinkError} 当查询失败时抛出\n * \n * @example\n * ```typescript\n * // 查询所有已完成的任务\n * const result = await videoPsych.list({\n * status: 'COMPLETED',\n * page: 1,\n * pageSize: 20\n * });\n * console.log(`共 ${result.total} 个任务`);\n * result.list.forEach(item => {\n * console.log(`${item.name}: ${item.status}`);\n * });\n * ```\n */\n public async list(params?: ListVideoPsychAnalysesParams): Promise<ListVideoPsychAnalysesResponse> {\n return this.client.axiosInstance.get('/api/v1/video-psych-analysis', { params });\n }\n\n /**\n * 创建视频心理分析任务\n * \n * @param params - 创建参数\n * @returns 创建结果,包含任务ID和初始状态\n * @throws {PlolinkError} 当参数验证失败或创建失败时抛出\n * \n * @example\n * ```typescript\n * const result = await videoPsych.create({\n * name: '候选人A面试分析',\n * videoFileIds: ['file1', 'file2', 'file3'],\n * referenceImageFileId: 'refImage1',\n * prompt: '请以专业心理分析师的视角,分析候选人的情绪、态度和心理状态',\n * frameFps: 3,\n * language: 'zh'\n * });\n * console.log(`任务ID: ${result.id}, 状态: ${result.status}`);\n * ```\n */\n public async create(params: CreateVideoPsychAnalysisParams): Promise<CreateVideoPsychAnalysisResponse> {\n const { videoFileIds, referenceImageFileId, prompt, frameFps, language, name } = params;\n\n // 参数验证\n if (!videoFileIds || videoFileIds.length === 0) {\n throw new PlolinkError('videoFileIds is required and must not be empty', 'INVALID_PARAMS');\n }\n\n if (!referenceImageFileId) {\n throw new PlolinkError('referenceImageFileId is required', 'INVALID_PARAMS');\n }\n\n if (!prompt) {\n throw new PlolinkError('prompt is required', 'INVALID_PARAMS');\n }\n\n if (frameFps !== undefined && (frameFps < 1 || frameFps > 30)) {\n throw new PlolinkError('frameFps must be between 1 and 30', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.post('/api/v1/video-psych-analysis', {\n name,\n videoFileIds,\n referenceImageFileId,\n prompt,\n frameFps,\n language,\n });\n }\n\n /**\n * 获取分析任务详情\n * \n * @param id - 任务ID\n * @returns 任务详情信息\n * @throws {PlolinkError} 当任务不存在或无权访问时抛出\n * \n * @example\n * ```typescript\n * const detail = await videoPsych.getDetail('analysis_123');\n * console.log(`任务: ${detail.name}`);\n * console.log(`状态: ${detail.status}`);\n * console.log(`进度: ${detail.progress.done}/${detail.progress.total}`);\n * \n * if (detail.reportContent) {\n * console.log('报告已生成');\n * }\n * ```\n */\n public async getDetail(id: string): Promise<VideoPsychAnalysisDetail> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}`);\n }\n\n /**\n * 更新分析任务\n * \n * @description\n * 更新分析任务的基本信息(仅限 PENDING 和 FAILED 状态的任务)。\n * \n * @param id - 任务ID\n * @param params - 更新参数\n * @returns 更新后的任务信息\n * @throws {PlolinkError} 当任务不存在、状态不允许更新或更新失败时抛出\n * \n * @example\n * ```typescript\n * const updated = await videoPsych.update('analysis_123', {\n * name: '李四的心理分析',\n * prompt: '请以临床心理学专家的视角进行分析'\n * });\n * console.log(`已更新: ${updated.name}`);\n * ```\n */\n public async update(id: string, params: UpdateVideoPsychAnalysisParams): Promise<UpdateVideoPsychAnalysisResponse> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n if (!params.name && !params.prompt) {\n throw new PlolinkError('At least one field (name or prompt) must be provided', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.patch(`/api/v1/video-psych-analysis/${id}`, params);\n }\n\n /**\n * 删除分析任务\n * \n * @description\n * 删除分析任务(软删除)。\n * \n * @param id - 任务ID\n * @throws {PlolinkError} 当任务不存在或删除失败时抛出\n * \n * @example\n * ```typescript\n * await videoPsych.delete('analysis_123');\n * console.log('任务已删除');\n * ```\n */\n public async delete(id: string): Promise<{ message: string }> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.delete(`/api/v1/video-psych-analysis/${id}`);\n }\n\n /**\n * 同步任务状态\n * \n * @description\n * 主动触发后端从 AI TOOLS API 同步最新状态和中间结果。\n * \n * **注意**:通常不需要手动调用此方法,系统会每30秒自动轮询同步所有非完成态的任务。\n * \n * @param id - 任务ID\n * @returns 同步后的状态信息\n * @throws {PlolinkError} 当任务不存在或同步失败时抛出\n * \n * @example\n * ```typescript\n * const status = await videoPsych.syncStatus('analysis_123');\n * console.log(`当前状态: ${status.status}`);\n * console.log(`进度: ${status.progress.done}/${status.progress.total}`);\n * ```\n */\n public async syncStatus(id: string): Promise<SyncStatusResponse> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/status`);\n }\n\n /**\n * 轮询分析任务状态\n * \n * @description\n * 创建一个轮询器持续监听任务状态变化,直到任务达到终态(COMPLETED/FAILED)。\n * 使用指数退避策略,初始间隔5秒,最大间隔30秒。\n * \n * @param id - 任务ID\n * @param onStatusChange - 状态变化回调函数\n * @returns Poller实例,可用于手动停止轮询\n * \n * @example\n * ```typescript\n * const poller = videoPsych.watchAnalysisStatus('analysis_123', (detail) => {\n * console.log(`状态: ${detail.status}`);\n * console.log(`进度: ${detail.progress.done}/${detail.progress.total} (${detail.progress.stage})`);\n * \n * if (detail.status === 'COMPLETED') {\n * console.log('分析完成,报告已生成!');\n * console.log(detail.reportContent);\n * } else if (detail.status === 'FAILED') {\n * console.error(`分析失败: ${detail.errorMessage}`);\n * }\n * });\n * \n * // 开始轮询\n * poller.start();\n * \n * // 需要时可以手动停止\n * // poller.stop();\n * ```\n */\n public watchAnalysisStatus(\n id: string,\n onStatusChange: (detail: VideoPsychAnalysisDetail) => void\n ): Poller<VideoPsychAnalysisDetail> {\n const poller = new Poller<VideoPsychAnalysisDetail>({\n task: async () => {\n // 先同步状态,再获取详情\n await this.syncStatus(id);\n return this.getDetail(id);\n },\n onResult: onStatusChange,\n shouldStop: (detail) => {\n return ['COMPLETED', 'FAILED'].includes(detail.status);\n },\n initialInterval: 5000, // 5秒\n maxInterval: 30000, // 30秒\n backoffFactor: 1.5,\n onError: (error) => {\n this.client.logger.error('Analysis polling error', { error, id });\n },\n });\n\n // 自动启动\n void poller.start();\n\n return poller;\n }\n\n /**\n * 获取文本维度分析结果\n * \n * @param id - 任务ID\n * @returns 文本维度分析数据\n * @throws {PlolinkError} 当任务不存在或分析未完成时抛出\n * \n * @example\n * ```typescript\n * const texts = await videoPsych.getTexts('analysis_123');\n * console.log(`共 ${texts.total} 条文本`);\n * texts.items.forEach(item => {\n * console.log(`${item.start_time}s: ${item.text}`);\n * if (item.nlp_result) {\n * console.log(` 情绪: ${item.nlp_result.speaker_emotion}`);\n * console.log(` 态度: ${item.nlp_result.real_attitude}`);\n * }\n * });\n * ```\n */\n public async getTexts(id: string): Promise<TextsData> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/texts`);\n }\n\n /**\n * 获取帧维度分析结果\n * \n * @param id - 任务ID\n * @returns 帧维度分析数据\n * @throws {PlolinkError} 当任务不存在或分析未完成时抛出\n * \n * @example\n * ```typescript\n * const frames = await videoPsych.getFrames('analysis_123');\n * console.log(`共 ${frames.total} 帧`);\n * frames.items.forEach(item => {\n * console.log(`${item.timestamp}s: ${item.image_url}`);\n * if (item.vision_result) {\n * console.log(` 表情: ${item.vision_result.expression}`);\n * console.log(` 动作: ${item.vision_result.action}`);\n * }\n * });\n * ```\n */\n public async getFrames(id: string): Promise<FramesData> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/frames`);\n }\n\n /**\n * 获取段落分析结果\n * \n * @param id - 任务ID\n * @returns 段落分析数据\n * @throws {PlolinkError} 当任务不存在或分析未完成时抛出\n * \n * @example\n * ```typescript\n * const paragraphs = await videoPsych.getParagraphs('analysis_123');\n * console.log(`共 ${paragraphs.total} 段`);\n * paragraphs.items.forEach(item => {\n * console.log(`段落 ${item.id}:`);\n * console.log(` 时间: ${item.start_time}s - ${item.end_time}s`);\n * console.log(` 内容: ${item.text}`);\n * console.log(` 摘要: ${item.summary}`);\n * if (item.nlp_result) {\n * console.log(` 情绪: ${item.nlp_result.speaker_emotion}`);\n * console.log(` 态度: ${item.nlp_result.real_attitude}`);\n * }\n * });\n * ```\n */\n public async getParagraphs(id: string): Promise<ParagraphsData> {\n if (!id) {\n throw new PlolinkError('id is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.get(`/api/v1/video-psych-analysis/${id}/paragraphs`);\n }\n}\n"]}
|