feat: inject run_id as cache_salt for per-epoch resampling (algo #10)

This commit is contained in:
2026-07-16 06:33:09 -04:00
parent 58a0203522
commit 9be3bdb8eb
4 changed files with 27 additions and 3 deletions
+10 -3
View File
@@ -108,6 +108,7 @@ class AgentLoop:
plugins: list[object] | None = None,
*,
session_id: str | None = None,
cache_salt: str | None = None,
) -> LoopResult:
"""执行 Thinking+JSON 推理循环。
@@ -117,6 +118,7 @@ class AgentLoop:
tool_dispatcher: 工具调度器,ToolDispatcher Protocol 实例。
plugins: pluggy 插件列表。
session_id: 会话 ID,透传给 LLMProvider。
cache_salt: 缓存盐,透传给 LLMProvider(如训练用 run_id 跨 epoch 重采样)。
返回:
LoopResult 实例,包含推理步骤、token 用量、终止原因。
@@ -138,7 +140,7 @@ class AgentLoop:
# Phase 1: LLM 调用(步级重试:防穿透 GovernedLLMClient 的瞬时异常)
try:
response = await self._call_llm_with_step_retry(
messages, token_usage, session_id=session_id
messages, token_usage, session_id=session_id, cache_salt=cache_salt
)
except Exception as e:
logger.error("LLM API 调用失败({}: {}", type(e).__name__, e)
@@ -269,6 +271,7 @@ class AgentLoop:
token_usage: dict[str, int],
*,
session_id: str | None = None,
cache_salt: str | None = None,
) -> LLMResponse:
"""带步级重试的 LLM 调用,兜底穿透治理层重试栈的瞬时异常。
@@ -292,7 +295,9 @@ class AgentLoop:
step_attempt = 0
while True:
try:
return await self._call_llm(messages, token_usage, session_id=session_id)
return await self._call_llm(
messages, token_usage, session_id=session_id, cache_salt=cache_salt
)
except self._retryable_exceptions as e:
step_attempt += 1
if step_attempt > self._step_retries:
@@ -315,6 +320,7 @@ class AgentLoop:
token_usage: dict[str, int],
*,
session_id: str | None = None,
cache_salt: str | None = None,
) -> LLMResponse:
"""调用 LLMProvider 并累加 token 使用量。
@@ -322,11 +328,12 @@ class AgentLoop:
messages: 消息历史。
token_usage: 可变字典,就地累加。
session_id: 会话 ID,透传给 LLMProvider。
cache_salt: 缓存盐,透传给 LLMProvider(跨 epoch 重采样)。
返回:
LLMResponse 实例。
"""
response = await self._llm.chat(messages, session_id=session_id)
response = await self._llm.chat(messages, session_id=session_id, cache_salt=cache_salt)
token_usage["prompt_tokens"] += response.prompt_tokens
token_usage["completion_tokens"] += response.completion_tokens
return response