fix: 支持模型异常后继续文档对话
- 将本轮文档上下文纳入可持久化的 Agent 用户消息 =- 在异常提示中提供请重试动作并自动发送继续
This commit is contained in:
@@ -423,7 +423,7 @@ public class AgentRunService {
|
||||
chatContext.getExt().put(DOCUMENT_CONTEXT_TOKEN_ESTIMATE_EXT_KEY,
|
||||
documentContext.tokenEstimate());
|
||||
String runtimePrompt = effectivePrompt(prompt, !boundDocuments.isEmpty(), !boundMedia.isEmpty());
|
||||
AgentMessage userMessage = buildAgentMessage(runtimePrompt, boundMedia);
|
||||
AgentMessage userMessage = buildAgentMessage(runtimePrompt, boundMedia, documentContext);
|
||||
threadPoolTaskExecutor.execute(() -> startRuntime(
|
||||
agent, userMessage, documentContext, account, requestId, traceId, runtimeSessionId,
|
||||
assistantCode, chatContext, runOutput, persistChatlog, runtimeSessionStore, lockHandle));
|
||||
@@ -646,24 +646,6 @@ public class AgentRunService {
|
||||
return agentDocumentService.bindDraft(documentUploads);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将本轮文档正文追加到临时运行定义的系统提示词中。
|
||||
*
|
||||
* <p>正文只存在于本轮模型调用定义,不写入 chatlog 或 AgentScope 消息记忆。</p>
|
||||
*
|
||||
* @param bundle 临时运行时编译结果
|
||||
* @param documentContext 本轮文档上下文
|
||||
*/
|
||||
private void appendDocumentContext(AgentRuntimeBundle bundle, AgentDocumentContext documentContext) {
|
||||
if (bundle == null || bundle.getDefinition() == null
|
||||
|| documentContext == null || documentContext.text().isBlank()) {
|
||||
return;
|
||||
}
|
||||
String current = bundle.getDefinition().getSystemPrompt();
|
||||
bundle.getDefinition().setSystemPrompt(
|
||||
(current == null ? "" : current) + documentContext.text());
|
||||
}
|
||||
|
||||
/**
|
||||
* 为仅附件输入生成可持久化的最小用户意图。
|
||||
*
|
||||
@@ -1206,7 +1188,6 @@ public class AgentRunService {
|
||||
}
|
||||
AgentRuntimeContext runtimeContext = buildAgentRuntimeContext(chatContext, traceId, runtimeSessionId);
|
||||
AgentRuntimeBundle bundle = agentRuntimeCompiler.compile(agent, runtimeContext, !persistChatlog);
|
||||
appendDocumentContext(bundle, documentContext);
|
||||
AgentRuntime runtime = agentRuntimeFactory.create();
|
||||
// 会话初始化请求
|
||||
AgentInitRequest request = new AgentInitRequest();
|
||||
@@ -2340,13 +2321,30 @@ public class AgentRunService {
|
||||
return message;
|
||||
}
|
||||
|
||||
private AgentMessage buildAgentMessage(String prompt, List<AgentBoundMedia> media) {
|
||||
/**
|
||||
* 构建发送给 AgentScope 的用户消息。
|
||||
*
|
||||
* <p>文档正文属于用户提供的不可信材料,作为用户内容块进入本轮模型调用和 AgentScope
|
||||
* memory。聊天记录仍单独保存原始输入与附件引用,页面不会展示正文内容块。</p>
|
||||
*
|
||||
* @param prompt 用户输入
|
||||
* @param media 图片附件
|
||||
* @param documentContext 本轮选中的文档上下文
|
||||
* @return 可持久化的运行时用户消息
|
||||
*/
|
||||
private AgentMessage buildAgentMessage(String prompt,
|
||||
List<AgentBoundMedia> media,
|
||||
AgentDocumentContext documentContext) {
|
||||
AgentMessage message = new AgentMessage();
|
||||
message.setRole(AgentMessageRole.USER);
|
||||
List<com.easyagents.agent.runtime.message.AgentContentBlock> blocks = new ArrayList<>();
|
||||
if (prompt != null && !prompt.isBlank()) {
|
||||
blocks.add(new AgentTextBlock(prompt));
|
||||
}
|
||||
if (documentContext != null && documentContext.text() != null
|
||||
&& !documentContext.text().isBlank()) {
|
||||
blocks.add(new AgentTextBlock(documentContext.text()));
|
||||
}
|
||||
if (media != null) {
|
||||
for (AgentBoundMedia item : media) {
|
||||
AgentMediaBlock image = new AgentMediaBlock("image");
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.easyagents.agent.runtime.event.AgentRuntimeEventType;
|
||||
import com.easyagents.agent.runtime.message.AgentKnowledgeReference;
|
||||
import com.easyagents.agent.runtime.message.AgentMessage;
|
||||
import com.easyagents.agent.runtime.message.AgentMessageRole;
|
||||
import com.easyagents.agent.runtime.message.AgentTextBlock;
|
||||
import com.easyagents.agent.runtime.persistence.session.AgentSessionStore;
|
||||
import com.easyagents.agent.runtime.persistence.session.memory.InMemoryAgentSessionStore;
|
||||
import org.junit.Assert;
|
||||
@@ -69,6 +70,28 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
*/
|
||||
public class AgentRunServiceDraftAndHitlTest {
|
||||
|
||||
/**
|
||||
* 验证文档上下文随用户消息进入可持久化 memory,同时保持独立内容块边界。
|
||||
*
|
||||
* @throws Exception 反射调用失败时抛出
|
||||
*/
|
||||
@Test
|
||||
public void buildAgentMessageShouldIncludeDocumentContext() throws Exception {
|
||||
AgentRunService service = new AgentRunService();
|
||||
AgentDocumentContext documentContext = new AgentDocumentContext(
|
||||
"\n<<<DOCUMENT name=\"demo.docx\">>>\n正文\n<<<END_DOCUMENT>>>", 8, List.of());
|
||||
|
||||
AgentMessage message = invoke(service, "buildAgentMessage",
|
||||
new Class<?>[]{String.class, List.class, AgentDocumentContext.class},
|
||||
"请介绍文档", List.of(), documentContext);
|
||||
|
||||
Assert.assertEquals(2, message.getContentBlocks().size());
|
||||
Assert.assertEquals("请介绍文档",
|
||||
((AgentTextBlock) message.getContentBlocks().get(0)).getText());
|
||||
Assert.assertEquals(documentContext.text(),
|
||||
((AgentTextBlock) message.getContentBlocks().get(1)).getText());
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用于 owner 恢复测试的运行描述。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user