langchain-agentx-python 2.1.7__py3-none-any.whl → 2.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@ from langchain_agentx import create_loop_agent
11
11
  ```
12
12
  """
13
13
 
14
- __version__ = "2.1.7"
14
+ __version__ = "2.1.9"
15
15
 
16
16
  from .loop import ( # noqa: F401
17
17
  create_loop_agent,
@@ -81,8 +81,13 @@ class TraceConfig:
81
81
  """观测追踪配置。
82
82
 
83
83
  CC 对照:options.debug / queryTracking 等。
84
+
85
+ - ``enabled``:是否挂 TraceCollector 埋点(lifecycle / callback)。
86
+ - ``persist``:是否挂 ``SqliteTraceStore`` 写 traces.db;默认 False,避免盘胀。
87
+ 亦可经环境变量 ``LANGCHAIN_AGENTX_TRACE_PERSIST=1`` 打开(见 persist_policy)。
84
88
  """
85
89
  enabled: bool = True
90
+ persist: bool = False
86
91
  visibility: str | None = None
87
92
  parent_run_id: str | None = None
88
93
  parent_tool_call_id: str | None = None
@@ -9,7 +9,8 @@ loop_runtime_overlay.py — L4 graph_factory 运行期 overlay(IF-G6)
9
9
  → graph_factory(overlay) → apply_to(AgentLoopConfig) → create_loop_agent
10
10
 
11
11
  当前裁剪范围:
12
- 仅 session_id、trace 父链、subagent 标记、capabilities、enable_trace;不含 container_type。
12
+ 仅 session_id、trace 父链、subagent 标记、capabilities、enable_trace / trace_persist;
13
+ 不含 container_type。
13
14
  """
14
15
 
15
16
  from __future__ import annotations
@@ -26,6 +27,7 @@ class LoopRuntimeOverlay:
26
27
 
27
28
  session_id: str | None = None
28
29
  enable_trace: bool | None = None
30
+ trace_persist: bool | None = None
29
31
  capabilities: Any = None
30
32
  parent_conversation_session_id: str | None = None
31
33
  is_subagent: bool | None = None
@@ -41,6 +43,9 @@ class LoopRuntimeOverlay:
41
43
  if self.enable_trace is not None:
42
44
  trace = replace(trace, enabled=self.enable_trace)
43
45
  trace_changed = True
46
+ if self.trace_persist is not None:
47
+ trace = replace(trace, persist=self.trace_persist)
48
+ trace_changed = True
44
49
  if self.parent_conversation_session_id is not None:
45
50
  trace = replace(trace, parent_conversation_session_id=self.parent_conversation_session_id)
46
51
  trace_changed = True
@@ -305,6 +305,7 @@ def _flatten_config_for_runtime(config: AgentLoopConfig) -> _FlatLoopConfig:
305
305
  agent_depth=config.agent_depth,
306
306
  subagent_type=config.subagent.subagent_type,
307
307
  trace_enabled=config.trace.enabled,
308
+ trace_persist=config.trace.persist,
308
309
  headless=config.headless,
309
310
  model_profile=config.model_profile,
310
311
  model_profile_registry=config.model_profile_registry,
@@ -1143,9 +1144,28 @@ class LoopGraphBuilder:
1143
1144
  if not self._config.trace.enabled:
1144
1145
  return None
1145
1146
  if self._services.trace_collector is not None:
1147
+ # 显式注入:调用方自管 store 生命周期(测试 / 宿主)
1146
1148
  return self._services.trace_collector
1147
- if self._services.capabilities is not None and self._services.capabilities.trace_collector is not None:
1148
- return self._services.capabilities.trace_collector
1149
+
1150
+ from ...observability.trace.persist_policy import resolve_trace_persist
1151
+
1152
+ persist = resolve_trace_persist(configured=bool(self._config.trace.persist))
1153
+ caps = self._services.capabilities
1154
+ caps_collector = (
1155
+ caps.trace_collector
1156
+ if caps is not None and getattr(caps, "trace_collector", None) is not None
1157
+ else None
1158
+ )
1159
+
1160
+ if not persist:
1161
+ # 不落盘:复用 caps 上无 store 的 collector;若 caps 误带 store 则改用内存 collector,避免写库。
1162
+ if caps_collector is not None and getattr(caps_collector, "_store", None) is None:
1163
+ return caps_collector
1164
+ return TraceCollector(store=None)
1165
+
1166
+ # persist=True:必须挂有 store 的 collector;caps 无 store 时兜底 from_env,避免「开了 persist 仍不落盘」。
1167
+ if caps_collector is not None and getattr(caps_collector, "_store", None) is not None:
1168
+ return caps_collector
1149
1169
  return TraceCollector(SqliteTraceStore.from_env())
1150
1170
 
1151
1171
  def _resolve_response_format_setup(
@@ -167,6 +167,7 @@ class RuntimeContextFactory:
167
167
  ),
168
168
  trace=TraceConfig(
169
169
  enabled=bool(getattr(parent_ctx, "trace_enabled", True)),
170
+ persist=bool(getattr(parent_ctx, "trace_persist", False)),
170
171
  ),
171
172
  subagent=SubagentLinkage(
172
173
  is_subagent=True,
@@ -91,6 +91,7 @@ class SubagentContext:
91
91
  parent_tool_call_id: str | None = None # 触发本子 Agent 的 tool_call_id
92
92
  parent_conversation_session_id: str | None = None
93
93
  enable_trace: bool = True
94
+ trace_persist: bool = False
94
95
  runnable_config: Any = None # 父 runnable_config:仅供 tool_progress custom event 回调链;非子 raw 合并
95
96
  isolation: str = "none"
96
97
  worktree_dir: str | None = None
@@ -324,6 +325,7 @@ def create_subagent_context(
324
325
  parent_tool_call_id=parent_tool_call_id,
325
326
  parent_conversation_session_id=parent_conversation_id,
326
327
  enable_trace=bool(getattr(parent_ctx, "trace_enabled", True)),
328
+ trace_persist=bool(getattr(parent_ctx, "trace_persist", False)),
327
329
  isolation=isolation,
328
330
  worktree_dir=worktree_dir,
329
331
  workspace_root=str(parent_workspace_root),
@@ -476,6 +478,7 @@ class SubagentContextFactory:
476
478
  parent_run_id=parent_runtime.parent_run_id,
477
479
  parent_conversation_session_id=parent_runtime.parent_conversation_session_id,
478
480
  enable_trace=not skip_transcript,
481
+ trace_persist=bool(getattr(parent_runtime, "trace_persist", False)),
479
482
  workspace_root=workspace_root,
480
483
  agent_home_segment=agent_home_segment,
481
484
  cwd=effective_cwd,
@@ -108,6 +108,7 @@ def create_subagent_graph(
108
108
  ),
109
109
  trace=TraceConfig(
110
110
  enabled=ctx.enable_trace,
111
+ persist=ctx.trace_persist,
111
112
  # 背景 fork / 异步子代理默认隐藏
112
113
  visibility=(
113
114
  "hidden"
@@ -13,6 +13,11 @@ from .sqlite_store import SqliteTraceStore
13
13
  from .trace_lifecycle_collector import TraceLifecycleCollector
14
14
  from .trace_callback import TraceCallbackHandler
15
15
  from .hook_event_emitter import HookEventEmitter
16
+ from .persist_policy import (
17
+ ENV_TRACE_PERSIST,
18
+ env_trace_persist_enabled,
19
+ resolve_trace_persist,
20
+ )
16
21
 
17
22
  __all__ = [
18
23
  "TraceSession",
@@ -22,4 +27,7 @@ __all__ = [
22
27
  "TraceLifecycleCollector",
23
28
  "TraceCallbackHandler",
24
29
  "HookEventEmitter",
30
+ "ENV_TRACE_PERSIST",
31
+ "env_trace_persist_enabled",
32
+ "resolve_trace_persist",
25
33
  ]
@@ -0,0 +1,40 @@
1
+ """
2
+ persist_policy.py — Trace SQLite 落盘开关解析
3
+
4
+ 职责:
5
+ 统一 ``TraceConfig.persist`` 与环境变量的合成规则;默认不落盘。
6
+
7
+ 链路位置:
8
+ RuntimeCapabilities / Loop factory / AgentSession → resolve_trace_persist
9
+
10
+ 当前裁剪范围:
11
+ 仅布尔开关;不负责 db 路径(路径仍由 SqliteTraceStore / AGENTX_TRACE_DB_PATH)。
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+
18
+ ENV_TRACE_PERSIST = "LANGCHAIN_AGENTX_TRACE_PERSIST"
19
+
20
+
21
+ def env_trace_persist_enabled() -> bool:
22
+ """环境变量是否打开落盘(``1`` / ``true`` / ``yes`` / ``on``)。"""
23
+ val = os.getenv(ENV_TRACE_PERSIST, "").strip().lower()
24
+ return val in ("1", "true", "yes", "on")
25
+
26
+
27
+ def resolve_trace_persist(*, configured: bool = False) -> bool:
28
+ """合成是否挂 SqliteTraceStore。
29
+
30
+ 规则:``configured`` OR env;默认 False。
31
+ 单独设置 ``AGENTX_TRACE_DB_PATH`` **不会**自动打开 persist。
32
+ """
33
+ return bool(configured) or env_trace_persist_enabled()
34
+
35
+
36
+ __all__ = [
37
+ "ENV_TRACE_PERSIST",
38
+ "env_trace_persist_enabled",
39
+ "resolve_trace_persist",
40
+ ]
@@ -82,6 +82,7 @@ class AgentSession:
82
82
  transcript_writer: SubagentTranscriptStore | None = None,
83
83
  container_type: str = "interactive",
84
84
  enable_trace: bool = True,
85
+ trace_persist: bool = False,
85
86
  capabilities: RuntimeCapabilities | None = None,
86
87
  ) -> None:
87
88
  self._graph = graph
@@ -93,6 +94,7 @@ class AgentSession:
93
94
  self._messages: list[Any] = []
94
95
  self._container_type = container_type
95
96
  self._enable_trace = enable_trace
97
+ self._trace_persist = trace_persist
96
98
  self._transcript_writer = transcript_writer
97
99
  self._last_transcript_uuid: str | None = None
98
100
  self._last_finish_outcome: dict[str, Any] | None = None
@@ -100,6 +102,7 @@ class AgentSession:
100
102
  self._capabilities = capabilities or RuntimeCapabilities.build(
101
103
  resource_root=workspace_cfg.workspace_root,
102
104
  agent_home_segment=workspace_cfg.agent_home_segment,
105
+ trace_persist=trace_persist,
103
106
  )
104
107
  self._skill_registry = SkillRegistry(workspace_root=workspace_cfg.workspace_root)
105
108
  self._command_registry = PluginCommandRegistry()
@@ -544,6 +547,7 @@ class AgentSession:
544
547
  return self._graph_factory(
545
548
  LoopRuntimeOverlay(
546
549
  enable_trace=self._enable_trace,
550
+ trace_persist=self._trace_persist,
547
551
  capabilities=self._capabilities,
548
552
  ),
549
553
  active_files_getter=getter,
@@ -94,6 +94,7 @@ def create_agent_session(
94
94
  transcript_writer=transcript_writer,
95
95
  container_type=cfg.container_type,
96
96
  enable_trace=cfg.trace.enabled,
97
+ trace_persist=cfg.trace.persist,
97
98
  capabilities=svcs.capabilities,
98
99
  )
99
100
 
@@ -653,10 +653,15 @@ class LangChainAdapter:
653
653
 
654
654
  @staticmethod
655
655
  def _envelope_to_event_artifact_dict(env: ToolResultEnvelope) -> dict[str, Any]:
656
+ from langchain_agentx.tool_runtime.cancel_projection import (
657
+ resolve_artifact_terminal_state,
658
+ )
659
+
656
660
  raw = asdict(env)
657
661
  raw["schema_version"] = "2"
658
662
  result = LangChainAdapter._json_safe_value(raw)
659
- result["terminal_state"] = "completed"
663
+ meta = result.get("meta") if isinstance(result.get("meta"), dict) else {}
664
+ result["terminal_state"] = resolve_artifact_terminal_state(meta=meta)
660
665
  # B1/C3 方案 B:blocks/hints/artifacts 同时落 meta.envelope_extensions,
661
666
  # CLI Bridge 只消费 meta/display/payload,不扩字段面。
662
667
  extensions: dict[str, Any] = {}
@@ -0,0 +1,85 @@
1
+ """
2
+ tool_runtime/cancel_projection.py — 工具取消投影(层 C · D-TR)
3
+
4
+ 职责:判定取消窄条件,解析 artifact ``terminal_state`` 与 model payload 双轨哨兵。
5
+ 链路位置:``AgentRuntimeTool.present`` → adapter/pipeline ``envelope → artifact``。
6
+ 对照 CC:``CANCEL_MESSAGE`` / ``INTERRUPT_MESSAGE_FOR_TOOL_USE``;设计 D-TR-1…4。
7
+ 当前裁剪:不扩 ``ToolResultEnvelope.status``;禁止仅凭散文含 cancel 推断。
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Any, Literal, Mapping
13
+
14
+ from langchain_agentx.loop.exit.reason_codes import (
15
+ TERMINAL_REASON_ABORTED_STREAMING,
16
+ TERMINAL_REASON_ABORTED_TOOLS,
17
+ TERMINAL_REASON_HOOK_STOPPED,
18
+ )
19
+ from langchain_agentx.tool_runtime.messages import (
20
+ CANCEL_MESSAGE,
21
+ INTERRUPT_MESSAGE_FOR_TOOL_USE,
22
+ )
23
+
24
+ CANCEL_ERROR_KINDS = frozenset({"aborted", "user_cancelled", "cancelled"})
25
+
26
+ ABORT_LIKE_TERMINAL_REASONS = frozenset(
27
+ {
28
+ TERMINAL_REASON_ABORTED_STREAMING,
29
+ TERMINAL_REASON_ABORTED_TOOLS,
30
+ TERMINAL_REASON_HOOK_STOPPED,
31
+ }
32
+ )
33
+
34
+
35
+ def is_cancel_projection(
36
+ *,
37
+ source_status: str | None = None,
38
+ error_kind: str | None = None,
39
+ terminal_reason: str | None = None,
40
+ ) -> bool:
41
+ """D-TR-3:满足其一即视为用户取消投影(窄条件)。"""
42
+ if source_status == "interrupted":
43
+ return True
44
+ if error_kind in CANCEL_ERROR_KINDS:
45
+ return True
46
+ if terminal_reason in ABORT_LIKE_TERMINAL_REASONS:
47
+ return True
48
+ return False
49
+
50
+
51
+ def resolve_cancel_model_payload(*, error_kind: str | None) -> str:
52
+ """D-TR-4:Stop 轨 ``user_cancelled`` → CANCEL;其余取消 → INTERRUPT_FOR_TOOL_USE。"""
53
+ if error_kind == "user_cancelled":
54
+ return CANCEL_MESSAGE
55
+ return INTERRUPT_MESSAGE_FOR_TOOL_USE
56
+
57
+
58
+ def resolve_artifact_terminal_state(
59
+ *,
60
+ meta: Mapping[str, Any] | None = None,
61
+ terminal_reason: str | None = None,
62
+ ) -> Literal["completed", "cancelled"]:
63
+ """adapter/pipeline 共用:取消 → ``cancelled``,否则 ``completed``。"""
64
+ m = meta if isinstance(meta, Mapping) else {}
65
+ reason = terminal_reason if terminal_reason is not None else m.get("terminal_reason")
66
+ kind = m.get("error_kind")
67
+ source = m.get("source_status")
68
+ if is_cancel_projection(
69
+ source_status=str(source) if source is not None else None,
70
+ error_kind=str(kind) if kind is not None else None,
71
+ terminal_reason=str(reason) if reason is not None else None,
72
+ ):
73
+ return "cancelled"
74
+ return "completed"
75
+
76
+
77
+ __all__ = [
78
+ "ABORT_LIKE_TERMINAL_REASONS",
79
+ "CANCEL_ERROR_KINDS",
80
+ "CANCEL_MESSAGE",
81
+ "INTERRUPT_MESSAGE_FOR_TOOL_USE",
82
+ "is_cancel_projection",
83
+ "resolve_artifact_terminal_state",
84
+ "resolve_cancel_model_payload",
85
+ ]
@@ -684,7 +684,12 @@ class ToolExecutorPipeline:
684
684
 
685
685
  artifact = json_safe(asdict(envelope))
686
686
  artifact["schema_version"] = "2"
687
- artifact["terminal_state"] = "completed"
687
+ from langchain_agentx.tool_runtime.cancel_projection import (
688
+ resolve_artifact_terminal_state,
689
+ )
690
+
691
+ meta = artifact.get("meta") if isinstance(artifact.get("meta"), dict) else {}
692
+ artifact["terminal_state"] = resolve_artifact_terminal_state(meta=meta)
688
693
 
689
694
  # display 可选(CC renderToolResultMessage?);无 Output 跳过;抛错不炸 pipeline
690
695
  if (
@@ -17,6 +17,10 @@ import logging
17
17
  from typing import Any, Literal
18
18
 
19
19
  from langchain_agentx.tool_runtime.base import RuntimeTool
20
+ from langchain_agentx.tool_runtime.cancel_projection import (
21
+ is_cancel_projection,
22
+ resolve_cancel_model_payload,
23
+ )
20
24
  from langchain_agentx.tool_runtime.models import (
21
25
  AuthorizationDecision,
22
26
  L1PermissionResult,
@@ -355,7 +359,14 @@ class AgentRuntimeTool(RuntimeTool):
355
359
  },
356
360
  )
357
361
  if out.status == "error":
358
- payload = out.error_message or (out.errors[0] if out.errors else "Subagent execution failed")
362
+ if is_cancel_projection(
363
+ error_kind=out.error_kind,
364
+ terminal_reason=out.terminal_reason,
365
+ ):
366
+ return self._present_cancelled(inp, out, source_status="error")
367
+ payload = out.error_message or (
368
+ out.errors[0] if out.errors else "Subagent execution failed"
369
+ )
359
370
  return ToolResultEnvelope(
360
371
  status="error",
361
372
  tool_name=self.name,
@@ -368,16 +379,31 @@ class AgentRuntimeTool(RuntimeTool):
368
379
  **_agent_termination_meta(out),
369
380
  },
370
381
  )
382
+ # interrupted(及未知非 completed/async)→ 取消投影(D-TR-3/4)
383
+ return self._present_cancelled(inp, out, source_status="interrupted")
384
+
385
+ def _present_cancelled(
386
+ self,
387
+ inp: AgentToolInput,
388
+ out: AgentToolOutput,
389
+ *,
390
+ source_status: str,
391
+ ) -> ToolResultEnvelope:
392
+ """层 C:取消双轨 payload;Envelope.status 仍为 error(D-TR-2)。"""
393
+ error_kind = out.error_kind or "aborted"
394
+ term = _agent_termination_meta(out)
395
+ term["error_kind"] = error_kind
371
396
  return ToolResultEnvelope(
372
397
  status="error",
373
398
  tool_name=self.name,
374
399
  summary=f"Agent({inp.subagent_type}) interrupted",
375
- payload=out.content or "Subagent execution interrupted",
400
+ payload=resolve_cancel_model_payload(error_kind=error_kind),
376
401
  meta={
377
402
  "agent_id": out.agent_id,
378
403
  "terminal_reason": out.terminal_reason,
379
404
  "mode": self._mode,
380
- **_agent_termination_meta(out),
405
+ "source_status": source_status,
406
+ **term,
381
407
  },
382
408
  )
383
409
 
@@ -18,7 +18,8 @@ workspace/capabilities.py — RuntimeCapabilities 单例与分档协作者
18
18
  - B 档:WorkspaceDefaults(default_skills_dir / default_agents_dir)
19
19
  - Overrides:NodeWorkspaceOverrides(skills_dir / agents_dir + validate)
20
20
  - provider 凭证管理暂沿用原 provider 模块,后续另迁
21
- - 不承载目录副作用创建;trace_collector 失败降级不写磁盘,仅发 hook 告警
21
+ - 不承载目录副作用创建;trace_collector 默认不挂 Sqlite(persist=False);
22
+ 失败降级不写磁盘,仅发 hook 告警
22
23
  """
23
24
 
24
25
  from __future__ import annotations
@@ -145,7 +146,8 @@ class _TraceCollectorFactory:
145
146
  """trace_collector 构造 + 失败降级的小协作者。
146
147
 
147
148
  将"构造 / retry / 降级 / hook 告警"聚合为一个职责,避免 capabilities.build
148
- 变成过程式堆叠。失败降级为 ``TraceCollector(store=None)``(内存空操作)。
149
+ 变成过程式堆叠。``persist=False`` 时直接 ``TraceCollector(store=None)``,
150
+ 不建库;失败降级同样为 store=None(内存空操作)。
149
151
  """
150
152
 
151
153
  _RETRYABLE_ERRORS: tuple[type[BaseException], ...] = (ConnectionError, TimeoutError)
@@ -154,16 +156,21 @@ class _TraceCollectorFactory:
154
156
  self,
155
157
  *,
156
158
  primary_home_dir: Path,
159
+ persist: bool = False,
157
160
  hook_registry: Any | None = None,
158
161
  store_builder: Optional[Callable[[Path], Any]] = None,
159
162
  ) -> None:
160
163
  self._primary_home_dir = primary_home_dir
164
+ self._persist = persist
161
165
  self._hook_registry = hook_registry
162
166
  self._store_builder = store_builder
163
167
 
164
168
  def build(self) -> Any:
165
169
  from langchain_agentx.observability.trace import TraceCollector
166
170
 
171
+ if not self._persist:
172
+ return TraceCollector(store=None)
173
+
167
174
  try:
168
175
  return self._build_once()
169
176
  except self._RETRYABLE_ERRORS as e:
@@ -237,6 +244,7 @@ class RuntimeCapabilities:
237
244
  hook_registry: Any | None = None,
238
245
  profile_registry_loader: Optional[Callable[[Path], ModelProfileRegistry]] = None,
239
246
  trace_store_builder: Optional[Callable[[Path], Any]] = None,
247
+ trace_persist: bool | None = None,
240
248
  ) -> "RuntimeCapabilities":
241
249
  """构造 RuntimeCapabilities 单例。
242
250
 
@@ -248,7 +256,10 @@ class RuntimeCapabilities:
248
256
  hook_registry: 可选 hook 注册表,用于 trace_collector 失败告警。
249
257
  profile_registry_loader: 注入点,便于测试 mock ``ModelProfileRegistry.from_files``。
250
258
  trace_store_builder: 注入点,便于测试替换 store 构造。
259
+ trace_persist: 是否挂 SqliteTraceStore;``None`` 时仅看环境变量,默认不落盘。
251
260
  """
261
+ from langchain_agentx.observability.trace.persist_policy import resolve_trace_persist
262
+
252
263
  from .resolver import resolve_agent_home_string, resolve_workspace_root_path
253
264
 
254
265
  resolved_root = resolve_workspace_root_path(resource_root)
@@ -258,8 +269,10 @@ class RuntimeCapabilities:
258
269
  lambda home: ModelProfileRegistry.from_files(agent_home_dir=home)
259
270
  )
260
271
  registry = loader(primary_home_dir)
272
+ persist = resolve_trace_persist(configured=bool(trace_persist))
261
273
  collector = _TraceCollectorFactory(
262
274
  primary_home_dir=primary_home_dir,
275
+ persist=persist,
263
276
  hook_registry=hook_registry,
264
277
  store_builder=trace_store_builder,
265
278
  ).build()
@@ -286,6 +299,7 @@ class RuntimeCapabilities:
286
299
  hook_registry: Any | None = None,
287
300
  profile_registry_loader: Optional[Callable[[Path], ModelProfileRegistry]] = None,
288
301
  trace_store_builder: Optional[Callable[[Path], Any]] = None,
302
+ trace_persist: bool | None = None,
289
303
  ) -> "RuntimeCapabilities":
290
304
  """从 ResolvedAgentStateConfig 构造 RuntimeCapabilities 的便捷入口。
291
305
 
@@ -296,6 +310,7 @@ class RuntimeCapabilities:
296
310
  hook_registry: 可选 hook 注册表,用于 trace_collector 失败告警
297
311
  profile_registry_loader: 注入点,便于测试 mock ModelProfileRegistry.from_files
298
312
  trace_store_builder: 注入点,便于测试替换 store 构造
313
+ trace_persist: 是否挂 SqliteTraceStore;默认不落盘(见 ``resolve_trace_persist``)
299
314
 
300
315
  Returns:
301
316
  构造好的 RuntimeCapabilities 实例
@@ -319,6 +334,7 @@ class RuntimeCapabilities:
319
334
  hook_registry=hook_registry,
320
335
  profile_registry_loader=profile_registry_loader,
321
336
  trace_store_builder=trace_store_builder,
337
+ trace_persist=trace_persist,
322
338
  )
323
339
 
324
340
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langchain-agentx-python
3
- Version: 2.1.7
3
+ Version: 2.1.9
4
4
  Summary: LangChain/LangGraph-based agent utilities for CodeBaseX.
5
5
  Author-email: GoodMood2008 <GoodMood2008@users.noreply.github.com>
6
6
  License: Apache License
@@ -1,4 +1,4 @@
1
- langchain_agentx/__init__.py,sha256=YCgjkZ-ETOiTsxprdpJbKhr-a726t37vZ6KsVTZcr2M,1614
1
+ langchain_agentx/__init__.py,sha256=Ap7xVSHcnVF6vuJw2G3SKTcI2QDzn2JSGQZSj-zuHjY,1614
2
2
  langchain_agentx/command/__init__.py,sha256=Ej260S5uFQcmEtGZQG_NH7BYjHoStrpBLtGUsBTxyZk,631
3
3
  langchain_agentx/command/allowed_tools.py,sha256=TVA0VM8rm98H-QbLK_GRiX5RhEAZFxKawliMi4kk96A,3359
4
4
  langchain_agentx/command/context.py,sha256=DIGOGPBw5UGDBm0WNNJlKx1h_9rCRmcdROv4DT61Qug,731
@@ -32,8 +32,8 @@ langchain_agentx/loop/run_context.py,sha256=dhNiLhvqD_QYacGMA0B5P3wWpSe3O6wU_XcV
32
32
  langchain_agentx/loop/config/__init__.py,sha256=WdRQVXuvGU4myaGOZ8guFFvUb66jfsAIp9DLANJGieg,1083
33
33
  langchain_agentx/loop/config/agent_config.py,sha256=tOnAHFor6dkle3FvUOVx0YsmiYVTH11UrWSyTmOLV0c,3100
34
34
  langchain_agentx/loop/config/interaction_profile.py,sha256=UWrlI3aTWjYRq1mDeXL-xL-iCrQU-bXDXhETP6q9icY,10020
35
- langchain_agentx/loop/config/loop_config.py,sha256=jZfjC8msbNTtYDZ2bJxTOMlWj9l1kt0qlM-DI1csCQg,15375
36
- langchain_agentx/loop/config/loop_runtime_overlay.py,sha256=70FDSWs9b-Y5tZ8O3D_7PricJa8mxpy0NCDpA6wbxCo,2242
35
+ langchain_agentx/loop/config/loop_config.py,sha256=f_McUyP8xJAhBka3bPOkk7dkPCe1ZLRX0HI5gsEb370,15680
36
+ langchain_agentx/loop/config/loop_runtime_overlay.py,sha256=PuB4vFdqCHXRbAFhAJIrtwq9pUIrHafyn0ApD4s06KU,2440
37
37
  langchain_agentx/loop/config/model_context_resolver.py,sha256=o9RR0Vnu07TD4Y3V8jk5V1NfkMcPcLjE8uaaLOe22Qo,4067
38
38
  langchain_agentx/loop/config/model_retry_config.py,sha256=bakCbGeNRO-_SXMT_LLE3nu3m9scZe1MSxPdyEGO99w,8178
39
39
  langchain_agentx/loop/config/runtime_settings.py,sha256=uKkwyxgx5u34qbjP1DFrIRt0EygRCtsH8tMN0kWA0Yo,1551
@@ -68,7 +68,7 @@ langchain_agentx/loop/exit/terminal.py,sha256=_DAZk-kS4Xd0nxMlayLo60-uj1Y5ozgBjL
68
68
  langchain_agentx/loop/exit/withheld_error.py,sha256=LfX3j7Rgd9VoMzlz7GOs9TPuRe7RXr_Gxweyotx3tqQ,1846
69
69
  langchain_agentx/loop/graph/__init__.py,sha256=9pUUqn7G87n3lV45iYIU24j0wcTHyCD--SSdtv3urh4,136
70
70
  langchain_agentx/loop/graph/builtin_loop_control.py,sha256=QpiHe8b_yp4fyLlZ8nSXlW19cTrWGvYUkOGQZrXE9Ow,8722
71
- langchain_agentx/loop/graph/factory.py,sha256=vo98tu_tbWI0s5q_fcCJgoN1yVQ5E2l0OG8LTJP9BZo,103009
71
+ langchain_agentx/loop/graph/factory.py,sha256=TthwQtNiOeT5K-bgBhuW89yrkdP6iyYXCcL4tn-puJk,103958
72
72
  langchain_agentx/loop/graph/graph_edges.py,sha256=kW6Npx-nMIPzcaisCxVPkTwf5Y9GOKy1NWCNkJWeJBQ,47370
73
73
  langchain_agentx/loop/graph/reactive_compact_node.py,sha256=633b5hTnR3BK8GBEKWhzOwGB0BQrVRKozNxDomWFjLo,8762
74
74
  langchain_agentx/loop/graph/runtime_tools_node.py,sha256=Elppfi83hgSy_9_st4-eZ4sX_usBm2l5dlJyLDqwFjw,7062
@@ -128,7 +128,7 @@ langchain_agentx/loop/prompt/tool_aware_sections.py,sha256=vST7Z5y2eoITTTcsBo9ol
128
128
  langchain_agentx/loop/prompt/using_your_tools.py,sha256=NVLscfx2jzCHOx5R1jcoTwcOMsFkPx2Y9p_XD0Von3U,5251
129
129
  langchain_agentx/loop/runtime/__init__.py,sha256=7FEIC1nvNHIbe2azfJzg5AWH9GWYfCQopQWx8a5OMqM,555
130
130
  langchain_agentx/loop/runtime/context.py,sha256=dJHQvhs79c6xJZMrkB6-aUNFVax2R7V20Oj48nFePJs,1242
131
- langchain_agentx/loop/runtime/context_factory.py,sha256=w6VyDH5eQjMY_abZ4VDQpf_LPB0fiK19DdcHMlbffuE,7669
131
+ langchain_agentx/loop/runtime/context_factory.py,sha256=m3ics_dOTqEKNlf6ETIOnVj6LxVLTayuE8NIMoEl0kY,7744
132
132
  langchain_agentx/loop/runtime/subagent_execution_paths.py,sha256=Bgyiom48uta1FZcnIE7fIxyrD-VFCRsw7s8IxIxmLb4,4033
133
133
  langchain_agentx/loop/stream/graph_driver.py,sha256=qMZHEw3wJ19Tfbz31-VPLy8Mt6e90xKougIjAoaEFCE,3935
134
134
  langchain_agentx/loop/stream/helpers.py,sha256=b2sqtwrAa5ic5B5AzNqItU8pmDHw13iGs3hBiShSIZk,1390
@@ -141,13 +141,13 @@ langchain_agentx/loop/subagent/active_run_registry.py,sha256=KurhAMDTBnRkdxNidaM
141
141
  langchain_agentx/loop/subagent/async_runner.py,sha256=gGx8UMZbsnxUMPzc_7-XkWgd1EiuRcFAoOVUfjhFltE,13740
142
142
  langchain_agentx/loop/subagent/boundary_snapshot.py,sha256=9cQuqN29nJDRnHnx9c8b09KRmODE2zv15Z06QyjVJps,10008
143
143
  langchain_agentx/loop/subagent/cache_safe_params.py,sha256=-qcgdazEYRy6s4ILQuttpxraE3gsxq17Ro7LYBnuv3E,4460
144
- langchain_agentx/loop/subagent/context.py,sha256=skkSPvnshEN4Lh5kWoD7zjUtCOKcjdb4Ho1eM1apXFo,22297
144
+ langchain_agentx/loop/subagent/context.py,sha256=tjUKMOCdgrWXdQokCoA0IHI2WR8Q73pWaDGFfR_rxTs,22483
145
145
  langchain_agentx/loop/subagent/display_projector.py,sha256=AKsGWS1c9reH0kuD5u4oQ24KsBgyt7X10iZM3ere6Fs,3504
146
146
  langchain_agentx/loop/subagent/fork_boilerplate.py,sha256=2Uh3cwegL7V-DvtLIxjX7ik5uW5mXfY2NBzP-biREso,5005
147
147
  langchain_agentx/loop/subagent/fork_ports.py,sha256=hZATCvlYOxNVZtR3PoOVbI1GkA0KhHEyux6lUIjG5_4,1323
148
148
  langchain_agentx/loop/subagent/fork_worktree_notice.py,sha256=WKAJVxvRMJfbzRe_07Mgrm_zQIQCYx4RwsUnWSSOnkg,1389
149
149
  langchain_agentx/loop/subagent/forked_runner.py,sha256=ZEwkNlbwp1-PlJB5COHMKUu_w8EnSMLRc8s0umZ4NuM,6667
150
- langchain_agentx/loop/subagent/graph.py,sha256=EbwEE9A1-pDdLADsGdWuNQwl-cw7j1_Xia5lW7Wb-kQ,5215
150
+ langchain_agentx/loop/subagent/graph.py,sha256=2UnkvIFzwtYAERJ7mTpK-YeQOsotPZyayMyV85SFRjw,5254
151
151
  langchain_agentx/loop/subagent/orchestrator.py,sha256=jO4312_4ReCja3Lvv0PZ6WniWtrVqwGURYtewiwLQb0,34338
152
152
  langchain_agentx/loop/subagent/progress.py,sha256=_4YCDnVDH8sBiwXhCQVB8OHaUQwsCOGdUTP_Z_yOdsU,6522
153
153
  langchain_agentx/loop/subagent/progress_dispatcher.py,sha256=e1Kd16WRUOAJSeAjupukrlxHoyCR_JO84SHqntMCzdQ,3831
@@ -241,11 +241,12 @@ langchain_agentx/observability/replay/cli.py,sha256=qqF6zY0I8PHl59C5MvgXBHfcNub0
241
241
  langchain_agentx/observability/replay/service.py,sha256=1sogs2sepaapj2pi6Uf1dW2GjuzRngZHBbdM9Ptdc1A,2706
242
242
  langchain_agentx/observability/replay/store.py,sha256=R7_v2mXb1lRSmIdN--tV2TVzuQRjsTsoSvJ0r5XvhrQ,9539
243
243
  langchain_agentx/observability/replay/ui.py,sha256=EE8Hk9IPSudMHD6pYIqn4MTmU99-Cr1Yf8P1LH3Kh8I,1456
244
- langchain_agentx/observability/trace/__init__.py,sha256=eoOpjOgASSqYNUUerOpkq-RePj7VeqDRMeWvvDgo2cM,685
244
+ langchain_agentx/observability/trace/__init__.py,sha256=nFg9C3WPbhQxP61niPiFmPn7XZL26V8bfDOXJIk1nUg,885
245
245
  langchain_agentx/observability/trace/collector.py,sha256=ySah82wEU1CRCsSvk317wsK1PVBEoDoekWGXHtXmLtA,25103
246
246
  langchain_agentx/observability/trace/event_emitter.py,sha256=gElYR4VSpGvJWznDmFAFXVD07qOo2m-rPEBEEdB7Wdc,5054
247
247
  langchain_agentx/observability/trace/hook_event_emitter.py,sha256=B9errn3PjRjk6JKCYvmRUMAwGdq5HVrmqYcT8ib4E4o,3536
248
248
  langchain_agentx/observability/trace/models.py,sha256=COcD-_8rNx0TYQOrlYfR2TizkzlFolEZc2VI3xsGJy0,5010
249
+ langchain_agentx/observability/trace/persist_policy.py,sha256=Q-IaQkIGPc2FDsTYZc-ip-tDOYtSs8YvWArvJAI8b2A,1125
249
250
  langchain_agentx/observability/trace/sqlite_store.py,sha256=Ix9GkAgS8LDJK0jGtHqpN3hhrXjuz_DecnxOJGlGBDw,36316
250
251
  langchain_agentx/observability/trace/trace_callback.py,sha256=K3tFiS_i5FruZbQlWIwrqYQKbkmFbETaQr0RHoZHRd4,12551
251
252
  langchain_agentx/observability/trace/trace_lifecycle_collector.py,sha256=b5QN2LPr45ifBHg8VmuLIoZJ7FY8RpGXp28W0vOBtvk,4309
@@ -293,12 +294,12 @@ langchain_agentx/provider/semantics/families/openai_finish_reason.py,sha256=t5eb
293
294
  langchain_agentx/provider/semantics/families/openai_interpreter.py,sha256=zT7EFfHJ5fmYZ_F59vDfyrYdEwcMJANxkoW1Pt3iocI,1915
294
295
  langchain_agentx/provider/semantics/families/openai_normalizer.py,sha256=oaf2Riz8EY6VQpc6SNKtsb-naMELw3gYV3IsnZoRBYU,2155
295
296
  langchain_agentx/session/__init__.py,sha256=uXxjBzhW1FtvSfDTTaGZPbyeSFRzRQb2MfxDumKViug,1234
296
- langchain_agentx/session/agent_session.py,sha256=NEIKJIjp-whbpmduSatBaF1b6YIcebvUYB1ginu12WE,24617
297
+ langchain_agentx/session/agent_session.py,sha256=u2tyI82FTZVbH8MoRSxja_6Ggor1rkQDSqJllExEphw,24790
297
298
  langchain_agentx/session/cleanup_registry.py,sha256=aaPUn9psCwgZ27fB1qW7lzc1TeKaBvQAxhcHDiNs2Rs,4137
298
299
  langchain_agentx/session/conversation_factory.py,sha256=zsGBx9OwAOW21sqFsjK4d9mYLRRyxC5Bp1R9OCijxzI,5911
299
300
  langchain_agentx/session/conversation_recovery.py,sha256=OXzaxywRmqRwNA2Q1UNOpUvMlIjBzgdbsNPxPGHwoaA,5803
300
301
  langchain_agentx/session/conversation_session.py,sha256=aQJBZlQsgg2-q_it4qvRwhPkvKNODDZ1TDsrMXMwvCE,17563
301
- langchain_agentx/session/factory.py,sha256=qzZF8EkELFKPzQ-fRI2C72Usnqk_hASWB1GM8_mYjZ8,6172
302
+ langchain_agentx/session/factory.py,sha256=9sRKDXTPe1LYphCK3qpUKUdfracv0ckKV4Es2BQdhe4,6213
302
303
  langchain_agentx/session/plan_mode.py,sha256=GjPLBG6eVrTB7M-CeMwLqkHCQDdD93cCgwIAvOF0wRM,4710
303
304
  langchain_agentx/session/plan_mode_attachments.py,sha256=byIJC2F3RTJ9BTWVhpbE1e1rRwahAH5anPKsMXFvUE8,13861
304
305
  langchain_agentx/session/protocol.py,sha256=uNkNiQ2MD9ReJgPaYe5bF0x6JzVqv2TL-hAG8ME1Obs,622
@@ -389,9 +390,10 @@ langchain_agentx/task_runtime/tasks/trace_cleanup/executor.py,sha256=qez3WnzBTag
389
390
  langchain_agentx/task_runtime/tasks/trace_cleanup/scheduler.py,sha256=lqWlCqucs26fhr4M9LfgY8I0xuNDxwSLkre6XjAJDhA,6877
390
391
  langchain_agentx/tool_runtime/__init__.py,sha256=C4ZrS6UWSL65ErfNWMvBuZBnht6ZuGb0PBXwA0Xke74,5144
391
392
  langchain_agentx/tool_runtime/accept_edits_fast_path.py,sha256=UMCOF9Ws7hx3pcYvL-Kq7vzIAGvOGdEfx69ccUDXT-k,2281
392
- langchain_agentx/tool_runtime/adapter.py,sha256=vl2o9aTx4wb2-1KIn41gOtqArbw9hFbowIny5PZFriE,33608
393
+ langchain_agentx/tool_runtime/adapter.py,sha256=rM-Y2zSZ--N-TIvx1HtI1J7ralPU0w4jJuX3bBvIVxM,33847
393
394
  langchain_agentx/tool_runtime/agent_home_bypass.py,sha256=na9xQPgJ02qA3YiJ1F8jN0Uv4uBDPzqRk3lfPPE089g,8010
394
395
  langchain_agentx/tool_runtime/base.py,sha256=Ez9W42DsaiZcWDDO8UfRKv3E7_Z6WBcABkwdAi6qTK8,21390
396
+ langchain_agentx/tool_runtime/cancel_projection.py,sha256=81_Bvg8ZiuPdl1usePt7ykXFuO6Sg7UXogYQBX6aysQ,2788
395
397
  langchain_agentx/tool_runtime/capabilities.py,sha256=KHwu5KLqrpPKLOTwHhnvIIs9MTmQYeuS2hAFmI_Nsy8,3837
396
398
  langchain_agentx/tool_runtime/classifier_denial_bridge.py,sha256=Wv40rYc5U3Mn7G3H7sUWrcG78HyLKnrRXvv7Yv9wI5U,2743
397
399
  langchain_agentx/tool_runtime/classifier_denial_limit.py,sha256=RVLELUNO346_0ssg46bap52TRTp1dVzCOqdfjpuOpek,3793
@@ -419,7 +421,7 @@ langchain_agentx/tool_runtime/permission_rules.py,sha256=ev6-Hm3N8YtbJO3SLGpoGMU
419
421
  langchain_agentx/tool_runtime/permission_settings_loader.py,sha256=Xu6dso0ghh4pb7Puf8nj20nXxjGeQvL4kIGycavwG_o,5624
420
422
  langchain_agentx/tool_runtime/permission_settings_sync.py,sha256=g6TvjWwa7D0kw5rDznPsoMv7xylESPOyWA2vZW4HDm0,4590
421
423
  langchain_agentx/tool_runtime/permission_snapshot.py,sha256=xFoi9fIcZjSw_zrIoyglneM-vJsDOLCEjiVoazr5Ack,1947
422
- langchain_agentx/tool_runtime/pipeline.py,sha256=gdpYiv3_TT68insZm--5LWcbEdVzGbJLDFdWThe2Xhw,54041
424
+ langchain_agentx/tool_runtime/pipeline.py,sha256=b4ZlEMH5i3_rqWjPx3g7BD6Yv2hvk-R6qgKFgo-b3eU,54284
423
425
  langchain_agentx/tool_runtime/policy.py,sha256=PLk_-5wu69_Gjqig0pj71brcu6VfLvGSIHsAUHOiYIQ,30068
424
426
  langchain_agentx/tool_runtime/policy_decorator.py,sha256=XWbgh_TRlPJ-J-RFo1FKjIN_n_Z9rtLTfSwBQoyLTTg,2264
425
427
  langchain_agentx/tool_runtime/process_loader.py,sha256=1YMn6ntnpdbIHJbO7wF1xuz7gNKYxK0UJAOxq96dZX4,6166
@@ -505,7 +507,7 @@ langchain_agentx/tools/agent/models.py,sha256=jPxah6JgPt0UlZVyrAQxQeZmVUDOBV7xyl
505
507
  langchain_agentx/tools/agent/prompt.py,sha256=QQA40AfA5sEIl_LG7kn7UlUKFBOzsHSs_M8c5n-p7YU,8093
506
508
  langchain_agentx/tools/agent/prompt_scope.py,sha256=xQup3hosuN0B6TFq7jYV5SE6gzZNwR6BOQ552dfef5I,2677
507
509
  langchain_agentx/tools/agent/scope.py,sha256=6F2ZJgSvt-gFeciyKIQxaIiW5PBW9zUeTj3P0uxqrrg,6324
508
- langchain_agentx/tools/agent/tool.py,sha256=X2_o5QdoaDnyQV09k_taTpbMJUbia68WV3GIFOONb_w,17006
510
+ langchain_agentx/tools/agent/tool.py,sha256=h6yw2vDsla6teu47D5drOlVOn0KO_e973n_aih24qSU,17972
509
511
  langchain_agentx/tools/agent/built_in/__init__.py,sha256=4YUHj8nUcUOvJW9p158W_t_RBoQt8Uh7eTt0idnCTE4,657
510
512
  langchain_agentx/tools/agent/built_in/agentx_guide.py,sha256=Wz4791lK_URpAGtKWceEMvJlD_cu79KfmNQka5yXeUs,2719
511
513
  langchain_agentx/tools/agent/built_in/explore.py,sha256=H5757yjmudceFVaMN0O4YDH267DKfFPMSxGR83waNkk,3504
@@ -742,7 +744,7 @@ langchain_agentx/workflow/patterns/routing.py,sha256=jsMcFEbV7T3bU5O1MpQXuA8Ygdl
742
744
  langchain_agentx/workflow/patterns/specs.py,sha256=nR_TPOxO7qNEpaj-hYvDkpjLz3dgG4HDHGa8trlljNw,1696
743
745
  langchain_agentx/workspace/__init__.py,sha256=QhrN4zcq4vX9Sh2td632-nyFiBDXCGl_AUGU1wcJ4-U,2821
744
746
  langchain_agentx/workspace/boundary.py,sha256=5XyWXXLyshc1Nl3cSMKGwcy0QayDZVIdz7aMl7Y1JpM,4102
745
- langchain_agentx/workspace/capabilities.py,sha256=dSsbwBkUn-bOArg08s7wJK65K2t96hERaDeWKg7f2ck,13339
747
+ langchain_agentx/workspace/capabilities.py,sha256=KQxGsnB8RtNi_wtXgTo4K6bDLDfwnouYnL78CAlsp3c,14129
746
748
  langchain_agentx/workspace/config.py,sha256=w3p2usd9LNJ6_alZ_VTZw3Vpm9ceITLW-gvTFvt9DqM,9537
747
749
  langchain_agentx/workspace/errors.py,sha256=qeqf4LdhnroC867aKRXkrGsUxFN-HdnFiyzG3_2ghKo,1481
748
750
  langchain_agentx/workspace/grant.py,sha256=bhqmrHx_iH1UuXINdGswZ4q3VnQOS8ltzgVG2V0fZag,911
@@ -757,8 +759,8 @@ langchain_agentx/workspace/root_grant_manager.py,sha256=W3gy8HTevbERbXqIgRcjzOXO
757
759
  langchain_agentx/workspace/tool_boundary.py,sha256=UDwX6swpSLsx9HNkYuuRRiV5o7ZZG_Bru2Yn0c5kNX8,5724
758
760
  langchain_agentx/workspace/validators.py,sha256=tQt-6TOcL8Fw7Ig5ebA9S7vGWh1rby920eFW6x8Tk9E,1439
759
761
  langchain_agentx/workspace/view.py,sha256=PGasqTaqhlD03SXXazHuw4RHfV681AIdlsYqL70pEjc,4774
760
- langchain_agentx_python-2.1.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
761
- langchain_agentx_python-2.1.7.dist-info/METADATA,sha256=l7wjAieBJ28Tvtsfo0pNg503DMYjggzW8kQHm8t4T3M,24250
762
- langchain_agentx_python-2.1.7.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
763
- langchain_agentx_python-2.1.7.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
764
- langchain_agentx_python-2.1.7.dist-info/RECORD,,
762
+ langchain_agentx_python-2.1.9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
763
+ langchain_agentx_python-2.1.9.dist-info/METADATA,sha256=6jvj-EwhulXBUBtaJgpJEaiyiFDPgxUnU7nX6dvS6Zk,24250
764
+ langchain_agentx_python-2.1.9.dist-info/WHEEL,sha256=51RkbunBAw4BWsgaQWTpPhg4Diwp3c9P5iaLk67Hdtg,92
765
+ langchain_agentx_python-2.1.9.dist-info/top_level.txt,sha256=Ge284pniNt8xea0OLk2o9o32GqVpDhOYk20fwE-0xxA,17
766
+ langchain_agentx_python-2.1.9.dist-info/RECORD,,