feat:记忆&上下文管理
This commit is contained in:
+23
-9
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user