feat:记忆&上下文管理

This commit is contained in:
2026-10-14 08:19:52 -07:00
parent 41b769adde
commit 58604e0f1c
15 changed files with 357 additions and 49 deletions
+23 -9
View File
@@ -16,6 +16,7 @@ from app.observability.tracing import astream_screen
from app.processor.history import trim_history
from app.processor.state import RunContext
from app.schemas.agent import AgentResult, ResumeRequest
from app.schemas.base import JsonObject
from app.schemas.conversation import Turn
from app.schemas.data_file import DataFileRecord, RequestDataFile
from app.schemas.request import DesignRequest
@@ -58,15 +59,7 @@ class AgentService:
payload = request.model_dump(mode="json")
# 历史只信任服务端记录,覆盖前端可能携带的同名扩展字段;记录是完整的,这里按 token 预算裁剪
payload["history"] = trim_history(
[
{
"user": turn.prompt,
"assistant": turn.summary,
"outcome": turn.outcome,
}
for turn in turns
],
settings.history_max_tokens,
[self._history_turn(turn) for turn in turns], settings.history_max_tokens
)
# 同样只信任服务端读取的结果;会话内的文件每一轮都可用,不附带也能查询
# 请求会进检查点,只放摘要;工具要用的列概况和路径通过运行上下文传给图
@@ -153,6 +146,21 @@ class AgentService:
self.release(thread_id)
raise
@staticmethod
def _history_turn(turn: Turn) -> JsonObject:
"""一轮历史:原话、回复、结果,有轮次记录时一并带上,由各节点决定给模型看哪些"""
item: JsonObject = {
"user": turn.prompt,
"assistant": turn.summary,
"outcome": turn.outcome,
}
for key in ("changes", "queries"):
if records := getattr(turn, key):
item[key] = [record.model_dump(mode="json") for record in records]
if turn.clarifications:
item["clarifications"] = turn.clarifications
return item
def _run_context(self, records: list[DataFileRecord]) -> RunContext:
return RunContext(data=DataContext(tuple(records), self.data_files.root))
@@ -192,6 +200,8 @@ class AgentService:
async def _save_turn(self, state, result: AgentResult) -> None:
# 历史写入失败不影响本次结果交付,只记录日志
completed = result.status == "completed"
context = state.get("input_context")
try:
await self.store.save_turn(
Turn(
@@ -202,6 +212,10 @@ class AgentService:
outcome=result.status,
summary=self._summarize(result),
created_at=datetime.now(UTC),
# 只有完成的轮次交付了修改、问答成功;其余结果下状态里即使有也不记
changes=(state.get("changes") or []) if completed else [],
queries=(state.get("queries") or []) if completed else [],
clarifications=context.clarification_history if context else [],
)
)
except Exception: