fix(teacher): 合并续接工具活动并修正暂停状态

This commit is contained in:
2026-09-27 09:11:27 +08:00
parent 60c20f996e
commit 8a74721337
7 changed files with 141 additions and 16 deletions

View File

@@ -320,13 +320,13 @@ export function prepareCloudTeacher(
const call = object(raw);
if (typeof call.tool_call_id !== 'string' || typeof call.name !== 'string')
throw new TeacherError(502, 'teacher_protocol_invalid', '智能体读取请求无效。');
reportActivity({ id: runId + ':' + call.tool_call_id, name: call.name, status: 'running' });
reportActivity({ id: requestId + ':' + call.tool_call_id, name: call.name, status: 'running' });
const result = await tools.executeResult(call.name, JSON.stringify(call.arguments), bounded);
results.push({
tool_call_id: call.tool_call_id,
...result,
});
reportActivity({ id: runId + ':' + call.tool_call_id, name: call.name, status: result.status === 'success' ? 'completed' : 'failed' });
reportActivity({ id: requestId + ':' + call.tool_call_id, name: call.name, status: result.status === 'success' ? 'completed' : 'failed' });
}
// POST 重试使用完全相同的结果,文件变化也不会导致重复续接或不同输入。
const resumed = await transport.json(
@@ -383,7 +383,8 @@ export function prepareCloudTeacher(
? [payload.chunk]
: []) {
const chunk = object(item);
const activity = cloudToolActivity(chunk, runId);
// A checkpoint continuation changes Run, not the logical tool call.
const activity = cloudToolActivity(chunk, requestId);
if (activity) reportActivity(activity);
const event = chunk.stream_event ? object(chunk.stream_event) : {};
if (event.type === 'message_delta' && typeof event.content === 'string') {
@@ -409,6 +410,9 @@ export function prepareCloudTeacher(
throw new TeacherError(408, 'teacher_question_expired', '本次智能体提问已超时,请重新提问。');
} finally {
if (!completed) {
for (const activity of activities.values()) {
if (activity.status === 'running') reportActivity({ ...activity, status: 'failed' });
}
await transport
.json(
'/questions/' + encodeURIComponent(requestId) + '/cancel',