ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

agno 如何用 continue_from 回退到历史消息点,或 fork 出新的 run 与 session?

2026/9/10 5:58:21 拓冰建站 浏览量
agno 如何用 continue_from 回退到历史消息点,或 fork 出新的 run 与 session? agno 如何用 continue_from 回退到历史消息点或 fork 出新的 run 与 session【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno如果你已经跑完或跑挂过一个 agno Agent 的 run想在某个历史消息位置重新接上去、或者从某个状态分叉出一条互不影响的新对话就需要用/continue能力用continue_from指定回退到哪个消息点用forkTrue显式 fork 出新的 sibling run或用fork_session()把整个 session 复制到一个新 session。本文基于 cookbook 中的三个可运行示例01_continue_from.py、02_fork_run.py、01_fork_session.py给出完整操作路径。前提先让 run 可回退/continue系列能力建立在持久化的 run 之上。按 18_checkpointing/README.md 的说明默认的checkpointruns只在终态COMPLETED、PAUSED、CANCELLED、ERROR写库checkpointtool-batch在每个 tool batch 之后写一次这份中途持久化正是/continue能回退、能 fork 的基础checkpointtools逐 tool 写留给 3.0目前会抛NotImplementedError。所以示例中的 Agent 统一配置了db和checkpointtool-batch。示例使用的模型为OpenAIResponses(idgpt-5.4)运行前需要OPENAI_API_KEYTEST_LOG.md 中标注了示例依赖该 key。01 示例用本地 SQLitetmp/checkpoint_time_travel.db02 示例用 Postgresfrom agno.agent import Agent from agno.db.sqlite import SqliteDb from agno.models.openai import OpenAIResponses agent Agent( nametravel-agent, modelOpenAIResponses(idgpt-5.4), dbSqliteDb( session_tablecheckpoint_demo, db_filetmp/checkpoint_time_travel.db, ), checkpointtool-batch, tools[get_population], # 示例中的 mock 工具 )continue_from 的三种边界写法continue_from决定回退到哪个消息位置有三种写法见 20_time_travel/README.md写法语义end默认保留完整 transcript等同于普通追问last_user保留到最后一个 user 消息为止丢弃 user 之后的尾部tool 会被重新调用Kint保留messages[:K]精确的消息索引边界无论选哪种边界边界都会自动吸附到 tool-call 安全索引如果截断会把 assistant 的 tool_call 与其 result 拆散边界会回移到该 exchange 的开头保证恢复后的 transcript 始终合法。回退到历史消息点并继续先跑一个基础 run拿到run_id和session_idfirst await agent.arun(inputWhat is the population of Paris?) # first.run_id / first.session_id 是后续所有 /continue 操作的定位参数然后用acontinue_run指定边界回退并传入新的input。回退到最后一条 user 消息之后、换一个问题rewound await agent.acontinue_run( run_idfirst.run_id, session_idfirst.session_id, continue_fromlast_user, inputActually, what is the population of Tokyo instead?, )当end/last_user落不到你想要的位置时比如还要多丢掉一组 tool 结果用数字索引。示例中先用 1 起序号打印first.messages找出目标位置再把索引从len(run.messages)往前数出 K 传入for i, m in enumerate(first.messages or [], start1): print(f [{i}] {m.role}: {(m.content or )[:60]}) rewound_to_index await agent.acontinue_run( run_idfirst.run_id, session_idfirst.session_id, continue_from1, # 只保留第 1 条消息原始用户问题 inputInstead, what is the population of Tokyo?, )需要说明对COMPLETED的 run 执行/continue会自动 fork出一个新的 sibling run保持 1 run 1 model loop 约定源 run 原样保留。所以这里的rewound并不是在原地改写first而是同一 session 里的一个新 run。显式 fork 出新的 run如果对象不是 COMPLETED run例如中途被取消、还在 RUNNING想让/continue明确创建 sibling 而不是原地恢复传forkTrue。02 示例02_fork_run.py展示了从已知状态分叉的用法——例如从同一个状态出发跑不同 prompt 做 eval 或 A/B 对比fork await agent.acontinue_run( run_idoriginal.run_id, session_idoriginal.session_id, continue_fromlast_user, inputWhats the weather in Tokyo and Lagos?, )fork 出来的 run 带三个可核对的字段run_id全新的 run idforked_from_run_id指向源 runforked_from_message_index截断索引session_id与源 run 相同——fork 和源 run 共存于同一个 sessionsession 的runs数组因此形成一个 DAG每个 fork 通过forked_from_run_id指回来源。对应的服务端入口是POST /runs/{run_id}/continue见 21_fork_session/README.md 中的对照表。fork 出新的 sessionrun 级 fork 是同一个 session 内多一条 run如果你想把整个对话复制出去、开一条完全独立的对话线用fork_session()。它会深拷贝源 session 的每个 run生成全新的session_id和全新的run_id源 session 不受影响对应入口POST /sessions/{session_id}/forkoriginal_sid trip-planning-original user_id demo-user # 先在源 session 里积累两轮对话 await agent.arun(inputIm planning a trip to Japan..., session_idoriginal_sid, user_iduser_id) await agent.arun(inputTell me more about Kyoto., session_idoriginal_sid, user_iduser_id) # 分叉拿到一个全新的 session_id new_sid await agent.afork_session( source_session_idoriginal_sid, user_iduser_id, )之后可以在两个 session 中各自独立继续互不影响forked_run await agent.arun( inputActually, what about Osakas street food scene?, session_idnew_sid, user_iduser_id, ) original_run await agent.arun( inputWhich Kyoto temples are must-see?, session_idoriginal_sid, user_iduser_id, )两点注意源 session 按调用方的user_id作用域读取——你只能 fork 自己的 session血缘字段有两层run.forked_from_session_id记录 run 的最初源 session跨嵌套 fork 保持不变session.session_data[forked_from_session_id]记录直接父 session每次再 fork 会被覆盖。对 root → mid → leaf 的链leaf.runs[*].forked_from_session_id root而leaf.session.session_data[forked_from_session_id] mid。fork 与 fork_session 的区分forkTruerun 级fork_session()session 级粒度RunSession结果同 session 内的新 sibling run含所有 run 副本的新 session入口POST /runs/{run_id}/continuePOST /sessions/{session_id}/fork血缘字段run.forked_from_run_idrun.forked_from_session_id验证回退与 fork 的结果三个示例都给出了同一类核对方式直接查库里的 session确认源 run 保留、fork 已加入。run 级01 / 02 示例末尾session agent.db.get_session(session_idfirst.session_id, session_typeagent) print(fRuns in session: {len(session.runs or [])} (source preserved, forks added)) # 02 示例进一步逐条打印每个 run 的来源 for r in session.runs or []: marker f (forked from {r.forked_from_run_id}) if r.forked_from_run_id else print(f - {r.run_id} [{r.status}]{marker})判断依据len(session.runs)随每次 fork 增加新 run 的forked_from_run_id非空且指向源 run源 run 的status保持原值。session 级01_fork_session.py 末尾for sid, label in [(original_sid, original), (new_sid, forked)]: s agent.db.get_session(session_idsid, session_typeagent) forked_from_session_id (s.session_data or {}).get(forked_from_session_id) print(f{label}: {sid} ({len(s.runs or [])} runs) (f forked_from_session_id{forked_from_session_id} if forked_from_session_id else ))判断依据original 的 run 数不变、无forked_from_session_idforked session 携带forked_from_session_id且 run 数与源一致全部为副本。限制与相近能力continue_fromlast_user会丢掉 user 之后的整段尾部tool_calls、结果、回复tool 会被重新调用如果只想重跑最后的总结、保留工具结果用regenerateTrue——它只丢弃末尾无 tool 调用的 assistant 回合永不重调 tool且总是 fork 出新 runreplace_originalFalse可让源 run 保持可见以便对比。对照见 19_regenerate/README.md 中的比较表。数字边界K的取值需要先发现合法索引直接检查run.messages示例做法或调用 checkpoint timeline 接口参考 03_checkpoint_endpoints.py。边界自动吸附到 tool-call 安全索引无需手工保证 K 落在安全位置。回退/fork 依赖checkpointtool-batch提供的中途持久化它是session.runsJSON 列上的真实写放大文档建议用于长研究类 run而非高频闲聊 agent。运行示例.venvs/demo/bin/python cookbook/02_agents/20_time_travel/01_continue_from.py .venvs/demo/bin/python cookbook/02_agents/20_time_travel/02_fork_run.py .venvs/demo/bin/python cookbook/02_agents/21_fork_session/01_fork_session.py需要进一步看 checkpoint 与/continue的接口细节可继续读 18_checkpointing/只想重做最后一条回答则看 19_regenerate/。【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考