langchain-agentx-python 0.1.5__tar.gz → 0.1.6__tar.gz
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.
- {langchain-agentx-python-0.1.5/langchain_agentx_python.egg-info → langchain-agentx-python-0.1.6}/PKG-INFO +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/__init__.py +1 -1
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/__init__.py +24 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/base.py +544 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/batch.py +134 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/dag.py +130 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/__init__.py +32 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/adapter.py +298 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/depth_resolver.py +147 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/handlers/__init__.py +22 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/handlers/parallel_handler.py +181 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/handlers/route_handler.py +134 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/handlers/stage_handler.py +142 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/stack.py +145 -0
- langchain-agentx-python-0.1.6/langchain_agentx/workflow/event_adapter/types.py +152 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/chaining.py +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/evaluator_optimizer.py +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/orchestrator.py +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/parallelization.py +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/routing.py +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6/langchain_agentx_python.egg-info}/PKG-INFO +1 -1
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx_python.egg-info/SOURCES.txt +9 -3
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/pyproject.toml +1 -1
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/__init__.py +0 -7
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/base.py +0 -97
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/base_spike.py +0 -47
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/base_v2.py +0 -255
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/base_v3_streaming.py +0 -366
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/batch.py +0 -55
- langchain-agentx-python-0.1.5/langchain_agentx/workflow/dag.py +0 -54
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/LICENSE +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/README.md +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/builtin/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/builtin/clear.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/builtin/compact.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/builtin/memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/builtin/reload_plugins.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/context.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/dispatcher.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/registry.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/result.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/command/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/config/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/agent_config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/agent_loop_config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/model_context_resolver.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/runtime_settings.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/config/token_estimator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/blocking_guard.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/compaction_service.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/message_utils.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/pipeline.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/settings.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/autocompact.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/base.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/collapse.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/microcompact.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/noop.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/snip.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/stages/tool_result_budget.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/context/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/exit/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/exit/exit_logic.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/exit/reason_codes.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/graph/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/graph/builtin_loop_control.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/graph/factory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/graph/graph_edges.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/async_hook_runner.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/engine.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/executors/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/executors/agent.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/executors/command.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/executors/http.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/executors/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/graph_wiring.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/registry.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/trust.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/hook/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/injection/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/injection/dedup.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/loop_abort.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/model_node.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/model_nodes.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/orphan_tool_results.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/retrier.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/retry_bridge.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/retry_events.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/retry_policy.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/schema_and_format.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/tool_and_model_binding.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/tool_call_degradation_corrector.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/model/tool_transcript_guard.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/prompt/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/prompt/builder.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/prompt/builtin.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/prompt/compact.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/prompt/sections.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/runtime/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/runtime/context.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/runtime/context_factory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/runtime/subagent_execution_paths.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/async_runner.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/context.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/fork_worktree_notice.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/graph.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/orchestrator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/progress.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/runner.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/loop/subagent/transcript.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/resolver.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/sections.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/instruction/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/age.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/agent_memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/extractor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/paths.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/recall.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/scan.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/memdir/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/session/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/session/compact_bridge.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/session/prompts.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/memory/session/session_memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/base.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/compaction.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/degradation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/exit_quality.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/session_memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/checkers/tool_behavior.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/retention_scheduler.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/service.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/state.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/evaluation/store.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/events/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/events/langchain_agentx_event_adapter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/logging/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/logging/debug_burst.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/logging/logging_config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/logging/logging_contract.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/replay/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/replay/cli.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/replay/service.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/replay/store.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/replay/ui.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/collector.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/event_emitter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/hook_event_emitter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/sqlite_store.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/trace_callback.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/observability/trace/trace_lifecycle_collector.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/builtin.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/manifest.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/registries.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/plugin/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/anthropic.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/compatible_chat_openai.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/env.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/model_profile.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/provider/openai.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/agent_session.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/conversation_factory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/conversation_recovery.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/conversation_session.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/factory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/session/protocol.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/core/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/core/ids.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/core/interfaces.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/core/notification_priority.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/core/types.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/loop_adapter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/loop_integration.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/prefetch_providers.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/provider_factory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/queued_command_provider.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/sqlite_queued_command_provider.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/integrations/tool_use_summary_provider.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/orchestrator/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/orchestrator/runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/output/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/output/sink.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/policy/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/policy/withhold_visibility.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/queue/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/queue/in_memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/skill_prefetch/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/skill_prefetch/attachments.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/skill_prefetch/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/skill_prefetch/provider.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/store/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/store/in_memory.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/store/sqlite_store.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/ai_analysis/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/ai_analysis/base.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/ai_analysis/evaluation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/ai_analysis/registry.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/ai_analysis/scheduler.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/base/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/base/contracts.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/custom/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/custom/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/custom/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/custom/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/custom/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/dream_task/state.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/in_process_teammate/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/in_process_teammate/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/in_process_teammate/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/in_process_teammate/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/in_process_teammate/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/runner.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_agent/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_bash/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_bash/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_bash/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_bash/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/local_bash/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/notification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/remote_agent/spec.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/trace_cleanup/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/trace_cleanup/bootstrap.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/trace_cleanup/executor.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/task_runtime/tasks/trace_cleanup/scheduler.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/adapter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/base.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/errors.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/identical_call_cache.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/permission_context.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/pipeline.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/policy.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/registry.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/agent_session.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/background.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/base.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/conversation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/resolvers/workflow.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/session_store.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/smoke_test_runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tool_runtime/state_bridge.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/agentx_guide.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/explore.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/general.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/plan.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/statusline_setup.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/built_in/verification.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/builtin_subagent_loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/cwd_resolution.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/limits.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/registry/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/registry/config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/registry/registry.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/scope.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/agent/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/ast_security.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/bash_hardening.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/bash_runtime_contract.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/cwd_reporter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/limits.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/mode_validation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/observability.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/output_utils.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/path_security.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/read_only_validation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/result_presenter.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/sandbox_decision.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/security.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/sed_edit_parser.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/sed_validation.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/semantics.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/session_manager.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/session_runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/shell_locator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/task_runtime.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/bash/windows_shell_quoting.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/batch_tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/diff_generator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/git_diff_generator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/limits.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/quote_match.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/quote_normalizer.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/settings_validator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/staleness.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/edit/validator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/pagination.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/rg_list_backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/rg_pattern.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/glob/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/rg_subprocess_controller.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/grep/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/limits.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/read/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/ripgrep_plugin_exclusions.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/argument_substitution.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/loader.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/policy.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/skill/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/attachments.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/runtime_config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/user_message/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/backend.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/limits.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/models.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/prompt.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/tool.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/tools/write/validator.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/cwd.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/host_platform.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/path_hierarchy.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/path_user_input.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/rg_executable.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/subprocess_text.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/temp_paths.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/unc_path.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/utils/win_reserved_paths.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/node.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/patterns/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workflow/state.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workspace/__init__.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workspace/config.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workspace/path_key_normalizer.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workspace/resolver.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx/workspace/validators.py +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx_python.egg-info/dependency_links.txt +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx_python.egg-info/not-zip-safe +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx_python.egg-info/requires.txt +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/langchain_agentx_python.egg-info/top_level.txt +0 -0
- {langchain-agentx-python-0.1.5 → langchain-agentx-python-0.1.6}/setup.cfg +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Workflow 容器导出。"""
|
|
2
|
+
|
|
3
|
+
from .base import BaseWorkflow
|
|
4
|
+
from .batch import BatchWorkflow
|
|
5
|
+
from .dag import DagWorkflow
|
|
6
|
+
|
|
7
|
+
# Workflow 事件适配器导出(Phase 4)
|
|
8
|
+
from .event_adapter import (
|
|
9
|
+
WorkflowEventAdapter,
|
|
10
|
+
WorkflowEvent,
|
|
11
|
+
WorkflowEventType,
|
|
12
|
+
WorkflowAdapterState,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"BaseWorkflow",
|
|
17
|
+
"DagWorkflow",
|
|
18
|
+
"BatchWorkflow",
|
|
19
|
+
# 事件适配器
|
|
20
|
+
"WorkflowEventAdapter",
|
|
21
|
+
"WorkflowEvent",
|
|
22
|
+
"WorkflowEventType",
|
|
23
|
+
"WorkflowAdapterState",
|
|
24
|
+
]
|
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
"""
|
|
2
|
+
base.py — BaseWorkflow 基础设施层
|
|
3
|
+
|
|
4
|
+
职责:
|
|
5
|
+
- 定义 Workflow 的标准接口(build_graph + run + as_node)
|
|
6
|
+
- 提供通用能力(Hook 发射、Trace 映射、并发控制)
|
|
7
|
+
- 支持层级关系(workflow_session_id、workflow_path)
|
|
8
|
+
- 支持内存提取清理(drain_pending_memory_extractions)
|
|
9
|
+
|
|
10
|
+
链路位置:
|
|
11
|
+
- Layer 2: 基础设施层
|
|
12
|
+
- 被 Layer 3 (特殊 Workflow) 继承
|
|
13
|
+
- 可作为其他 Workflow 的节点(as_node)
|
|
14
|
+
|
|
15
|
+
当前裁剪范围:
|
|
16
|
+
- 不提供具体的拓扑结构(由 Layer 3 实现)
|
|
17
|
+
- 仅支持 Workflow 级 Hook 事件(WORKFLOW_START、WORKFLOW_END)
|
|
18
|
+
- 不支持 per-item Hook 事件(Phase 2+)
|
|
19
|
+
|
|
20
|
+
设计原则(Phase 1):
|
|
21
|
+
- 使用 AgentNode 路径,废弃 graph_factory / _invoke_agent / _astream_agent
|
|
22
|
+
- parent_workflow 在运行时注入(run() / as_node() 参数),避免循环依赖
|
|
23
|
+
- as_node() 直接返回完整 state,让 LangGraph reducer 处理合并
|
|
24
|
+
- max_concurrency 仅存储配置值,不实例化 Semaphore(由子类按需创建)
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import asyncio
|
|
30
|
+
import logging
|
|
31
|
+
from abc import ABC, abstractmethod
|
|
32
|
+
from typing import Any, AsyncIterator
|
|
33
|
+
from uuid import uuid4
|
|
34
|
+
|
|
35
|
+
from langgraph.graph import StateGraph
|
|
36
|
+
from langchain_core.runnables import RunnableConfig
|
|
37
|
+
|
|
38
|
+
from ..loop.hook.types import HookContext, HookEvent
|
|
39
|
+
from ..loop.hook.registry import HookRegistry
|
|
40
|
+
from ..loop.hook.engine import HookEngine
|
|
41
|
+
from ..memory.memdir.agent_memory import drain_pending_agent_memory_extraction
|
|
42
|
+
from .state import WorkflowState
|
|
43
|
+
|
|
44
|
+
# Lazy import for event_adapter(避免循环依赖)
|
|
45
|
+
# 实际使用时通过 _get_event_adapter() 延迟导入
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
logger = logging.getLogger(__name__)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BaseWorkflow(ABC):
|
|
52
|
+
"""基础设施层基类:定义 Workflow 的标准契约和通用能力。
|
|
53
|
+
|
|
54
|
+
双重身份:
|
|
55
|
+
- 作为基类:Layer 3 继承 BaseWorkflow,复用通用能力
|
|
56
|
+
- 作为组件:run() 方法签名与 LangGraph 节点函数一致,可作为其他 Workflow 的节点
|
|
57
|
+
|
|
58
|
+
设计原则(Phase 1):
|
|
59
|
+
- __init__ 只接收 workflow_id 和 hook_registry,不存储 parent_workflow
|
|
60
|
+
- parent_workflow 在运行时注入(run() / as_node() 参数),避免循环依赖
|
|
61
|
+
- max_concurrency 仅存储配置值,不实例化 Semaphore(由子类按需创建)
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(
|
|
65
|
+
self,
|
|
66
|
+
workflow_id: str,
|
|
67
|
+
hook_registry: HookRegistry,
|
|
68
|
+
trace_collector: Any = None,
|
|
69
|
+
max_concurrency: int | None = None,
|
|
70
|
+
graph_factory: Any = None,
|
|
71
|
+
):
|
|
72
|
+
"""初始化 BaseWorkflow。
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
workflow_id: Workflow 标识符
|
|
76
|
+
hook_registry: Hook 注册表
|
|
77
|
+
trace_collector: Trace 收集器(可选)
|
|
78
|
+
max_concurrency: 并发控制限制(仅存储,不实例化 Semaphore)
|
|
79
|
+
graph_factory: 兼容层参数(用于 Batch/Dag 迁移,可选)
|
|
80
|
+
"""
|
|
81
|
+
self._workflow_id = workflow_id
|
|
82
|
+
self._hook_registry = hook_registry
|
|
83
|
+
self._hook_engine = HookEngine(hook_registry.build_snapshot())
|
|
84
|
+
self._trace_collector = trace_collector
|
|
85
|
+
self._max_concurrency = max_concurrency or 4
|
|
86
|
+
|
|
87
|
+
# 初始化 _workflow_path(在 run() 中会更新)
|
|
88
|
+
self._workflow_path = workflow_id
|
|
89
|
+
self._workflow_session_id = None
|
|
90
|
+
|
|
91
|
+
# === 兼容层:支持 Batch/Dag 迁移 ===
|
|
92
|
+
self._graph_factory = graph_factory
|
|
93
|
+
self._semaphore = asyncio.Semaphore(self._max_concurrency)
|
|
94
|
+
self.container_type = "workflow_task"
|
|
95
|
+
|
|
96
|
+
# 注意:parent_workflow 移到 run() 参数,避免 __init__ 时的循环依赖(问题 20)
|
|
97
|
+
# 注意:graph_factory 仅用于兼容 Batch/Dag,新代码应使用 build_graph()
|
|
98
|
+
|
|
99
|
+
@abstractmethod
|
|
100
|
+
def build_graph(self) -> StateGraph:
|
|
101
|
+
"""子类实现:构建 LangGraph 图。
|
|
102
|
+
|
|
103
|
+
返回的 StateGraph 中:
|
|
104
|
+
- 节点可以是 AgentNode.build() 返回的节点函数(Layer 1)
|
|
105
|
+
- 也可以是其他 Workflow(Layer 2 或 Layer 3)
|
|
106
|
+
"""
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
def compile(self):
|
|
110
|
+
"""编译并返回可执行的图。"""
|
|
111
|
+
return self.build_graph().compile()
|
|
112
|
+
|
|
113
|
+
async def run(
|
|
114
|
+
self,
|
|
115
|
+
initial_state: dict,
|
|
116
|
+
*,
|
|
117
|
+
parent_workflow: "BaseWorkflow | None" = None,
|
|
118
|
+
) -> dict:
|
|
119
|
+
"""执行 Workflow(对外 API,用于顶层调用)。
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
initial_state: 初始状态
|
|
123
|
+
parent_workflow: 父 Workflow(用于构建层级关系,问题 20)
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
完整的 WorkflowState,包含所有字段的状态
|
|
127
|
+
|
|
128
|
+
注意:
|
|
129
|
+
- 作为顶层 Workflow 调用时使用此方法
|
|
130
|
+
- 作为其他 Workflow 的子节点时,应使用 as_node() 方法
|
|
131
|
+
|
|
132
|
+
层级关系(§2.7 问题 12、20):
|
|
133
|
+
- parent_workflow 在运行时注入,而不是 __init__
|
|
134
|
+
- 构建完整的 workflow_path(如 "wiki-build>wiki-l1")
|
|
135
|
+
|
|
136
|
+
内存提取(§2.7 问题 16):
|
|
137
|
+
- Workflow 结束时需要清理 pending 的 memory extraction
|
|
138
|
+
- 通过 try-finally 确保无论成功或失败都会执行清理
|
|
139
|
+
"""
|
|
140
|
+
# === 构建层级关系(问题 20)===
|
|
141
|
+
# parent_workflow 在运行时注入,而不是 __init__
|
|
142
|
+
if parent_workflow is None:
|
|
143
|
+
workflow_path = self._workflow_id
|
|
144
|
+
else:
|
|
145
|
+
workflow_path = f"{parent_workflow._workflow_path}>{self._workflow_id}"
|
|
146
|
+
|
|
147
|
+
# 生成唯一的 workflow_session_id
|
|
148
|
+
workflow_session_id = f"workflow-{self._workflow_id}-{uuid4().hex[:8]}"
|
|
149
|
+
|
|
150
|
+
# 保存当前 workflow_path(用于子 Workflow 构建)
|
|
151
|
+
self._workflow_path = workflow_path
|
|
152
|
+
self._workflow_session_id = workflow_session_id
|
|
153
|
+
|
|
154
|
+
await self._emit_hook(HookEvent.WORKFLOW_START, {
|
|
155
|
+
"workflow_id": self._workflow_id,
|
|
156
|
+
"workflow_session_id": workflow_session_id,
|
|
157
|
+
"workflow_path": workflow_path,
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
graph = self.compile()
|
|
161
|
+
|
|
162
|
+
try:
|
|
163
|
+
result = await graph.ainvoke(initial_state)
|
|
164
|
+
|
|
165
|
+
await self._emit_hook(HookEvent.WORKFLOW_END, {
|
|
166
|
+
"workflow_id": self._workflow_id,
|
|
167
|
+
"workflow_session_id": workflow_session_id,
|
|
168
|
+
"workflow_path": workflow_path,
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
return result
|
|
172
|
+
|
|
173
|
+
finally:
|
|
174
|
+
# === 内存提取清理(问题 16)===
|
|
175
|
+
# 确保无论成功或失败都清理 pending 的 memory extraction
|
|
176
|
+
# 注意:drain 与 trace_collector 无关,memory extraction 的清理永远执行
|
|
177
|
+
await self._drain_pending_memory_extractions()
|
|
178
|
+
|
|
179
|
+
def as_node(
|
|
180
|
+
self,
|
|
181
|
+
*,
|
|
182
|
+
parent_workflow: "BaseWorkflow | None" = None,
|
|
183
|
+
outer_semaphore: asyncio.Semaphore | None = None,
|
|
184
|
+
) -> callable:
|
|
185
|
+
"""返回符合 LangGraph 节点语义的 callable(用于子图嵌套)。
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
parent_workflow: 父 Workflow(用于构建层级关系,问题 20)
|
|
189
|
+
outer_semaphore: 外层并发控制信号量(问题 19)
|
|
190
|
+
|
|
191
|
+
与 run() 的区别:
|
|
192
|
+
- run(): 返回完整 WorkflowState(用于顶层调用)
|
|
193
|
+
- as_node(): 返回完整 WorkflowState(作为其他 Workflow 的节点)
|
|
194
|
+
|
|
195
|
+
实现原理:
|
|
196
|
+
- 直接调用 run() 返回完整 state
|
|
197
|
+
- 传递 parent_workflow 构建层级关系
|
|
198
|
+
- 使用 outer_semaphore 控制并发(如果提供)
|
|
199
|
+
- LangGraph 的 reducer 会自动处理合并
|
|
200
|
+
|
|
201
|
+
并发控制(问题 19):
|
|
202
|
+
- 如果 outer_workflow 提供 semaphore,子 workflow 的执行会被限流
|
|
203
|
+
- 这解决了 DeepSearch 场景下 45 个 sub-workflow 同时启动的问题
|
|
204
|
+
|
|
205
|
+
注意(问题 18 - as_node() diff 算法硬 bug):
|
|
206
|
+
- ✅ 新设计(正确):直接返回完整 state,让 LangGraph reducer 处理合并
|
|
207
|
+
- ❌ 旧设计(错误):手算 diff,硬编码字段名,假设 reducer 是 list append
|
|
208
|
+
"""
|
|
209
|
+
async def node_fn(state: dict) -> dict:
|
|
210
|
+
# === 并发控制(问题 19)===
|
|
211
|
+
if outer_semaphore is not None:
|
|
212
|
+
async with outer_semaphore:
|
|
213
|
+
return await self.run(state, parent_workflow=parent_workflow)
|
|
214
|
+
else:
|
|
215
|
+
return await self.run(state, parent_workflow=parent_workflow)
|
|
216
|
+
|
|
217
|
+
return node_fn
|
|
218
|
+
|
|
219
|
+
async def _invoke_agent(
|
|
220
|
+
self,
|
|
221
|
+
messages: list,
|
|
222
|
+
task_key: str,
|
|
223
|
+
parent_session_id: str | None = None,
|
|
224
|
+
) -> dict:
|
|
225
|
+
"""兼容层:为 Batch/Dag 提供 agent 调用接口。
|
|
226
|
+
|
|
227
|
+
迁移自 base.py:59-74,保留原有行为。
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
messages: 消息列表
|
|
231
|
+
task_key: 任务标识符,用于构建 session_id
|
|
232
|
+
parent_session_id: 父会话 ID(可选)
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
agent 执行结果字典
|
|
236
|
+
|
|
237
|
+
Raises:
|
|
238
|
+
RuntimeError: 如果 graph_factory 未提供
|
|
239
|
+
"""
|
|
240
|
+
if self._graph_factory is None:
|
|
241
|
+
raise RuntimeError(
|
|
242
|
+
"_invoke_agent() requires graph_factory parameter. "
|
|
243
|
+
"This method is for Batch/Dag compatibility only."
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
session_id = f"{self._workflow_id}-{task_key}"
|
|
247
|
+
async with self._semaphore:
|
|
248
|
+
graph = self._graph_factory(
|
|
249
|
+
session_id=session_id,
|
|
250
|
+
parent_conversation_session_id=parent_session_id,
|
|
251
|
+
is_subagent=parent_session_id is not None,
|
|
252
|
+
container_type=self.container_type,
|
|
253
|
+
)
|
|
254
|
+
result = await graph.ainvoke({"messages": messages})
|
|
255
|
+
return dict(result) if isinstance(result, dict) else {"result": result}
|
|
256
|
+
|
|
257
|
+
async def astream_events(
|
|
258
|
+
self,
|
|
259
|
+
initial_state: dict,
|
|
260
|
+
*,
|
|
261
|
+
parent_workflow: "BaseWorkflow | None" = None,
|
|
262
|
+
subgraphs: bool = True,
|
|
263
|
+
version: str = "v2",
|
|
264
|
+
**kwargs
|
|
265
|
+
) -> AsyncIterator[dict]:
|
|
266
|
+
"""流式执行 Workflow,返回所有事件(包括嵌套子图)。
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
initial_state: 初始状态
|
|
270
|
+
parent_workflow: 父 Workflow(用于构建层级关系)
|
|
271
|
+
subgraphs: 是否包含嵌套子图事件,默认 True
|
|
272
|
+
version: 事件格式版本,"v1" 或 "v2"
|
|
273
|
+
**kwargs: 传递给 LangGraph astream_events 的其他参数
|
|
274
|
+
|
|
275
|
+
Yields:
|
|
276
|
+
事件字典,格式由 LangGraph astream_events 定义
|
|
277
|
+
|
|
278
|
+
事件格式(v2):
|
|
279
|
+
{
|
|
280
|
+
"event": "on_chain_start" | "on_chain_end" | "on_chain_stream" | ...,
|
|
281
|
+
"data": {...},
|
|
282
|
+
"metadata": {
|
|
283
|
+
"langgraph_node": str,
|
|
284
|
+
"langgraph_checkpoint_ns": str, # 命名空间路径
|
|
285
|
+
...
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
Hook 事件:
|
|
290
|
+
- WORKFLOW_START 在开始时发射
|
|
291
|
+
- WORKFLOW_END 在结束时发射
|
|
292
|
+
|
|
293
|
+
注意(v2 合并):
|
|
294
|
+
- workflow_path 作为 local 变量传递,避免并发状态错乱
|
|
295
|
+
- 不写入 self._workflow_path / self._workflow_session_id
|
|
296
|
+
"""
|
|
297
|
+
# === 构建层级关系 ===
|
|
298
|
+
if parent_workflow is None:
|
|
299
|
+
workflow_path = self._workflow_id
|
|
300
|
+
else:
|
|
301
|
+
workflow_path = f"{parent_workflow._workflow_path}>{self._workflow_id}"
|
|
302
|
+
|
|
303
|
+
# 生成唯一的 workflow_session_id(local 变量)
|
|
304
|
+
workflow_session_id = f"workflow-{self._workflow_id}-{uuid4().hex[:8]}"
|
|
305
|
+
|
|
306
|
+
# === 发射 WORKFLOW_START Hook ===
|
|
307
|
+
await self._emit_hook(HookEvent.WORKFLOW_START, {
|
|
308
|
+
"workflow_id": self._workflow_id,
|
|
309
|
+
"workflow_session_id": workflow_session_id,
|
|
310
|
+
"workflow_path": workflow_path,
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
try:
|
|
314
|
+
# === 流式执行,传递 subgraphs 参数 ===
|
|
315
|
+
graph = self.compile()
|
|
316
|
+
|
|
317
|
+
# 注意:不注入 workflow_path 到 configurable(经验证不会透传到事件 metadata)
|
|
318
|
+
# workflow_path 由 WorkflowEventAdapter 通过 langgraph_checkpoint_ns 维护
|
|
319
|
+
config: RunnableConfig = {}
|
|
320
|
+
|
|
321
|
+
async for event in graph.astream_events(
|
|
322
|
+
initial_state,
|
|
323
|
+
config=config,
|
|
324
|
+
subgraphs=subgraphs,
|
|
325
|
+
version=version,
|
|
326
|
+
**kwargs,
|
|
327
|
+
):
|
|
328
|
+
yield event
|
|
329
|
+
|
|
330
|
+
# === 发射 WORKFLOW_END Hook ===
|
|
331
|
+
await self._emit_hook(HookEvent.WORKFLOW_END, {
|
|
332
|
+
"workflow_id": self._workflow_id,
|
|
333
|
+
"workflow_session_id": workflow_session_id,
|
|
334
|
+
"workflow_path": workflow_path,
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
finally:
|
|
338
|
+
# === 内存提取清理 ===
|
|
339
|
+
await self._drain_pending_memory_extractions()
|
|
340
|
+
|
|
341
|
+
async def run_stream(
|
|
342
|
+
self,
|
|
343
|
+
initial_state: dict,
|
|
344
|
+
*,
|
|
345
|
+
parent_workflow: "BaseWorkflow | None" = None,
|
|
346
|
+
filter_events: bool = True,
|
|
347
|
+
**kwargs
|
|
348
|
+
) -> AsyncIterator[tuple[str, dict]]:
|
|
349
|
+
"""便捷的流式执行方法,返回过滤后的事件。
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
initial_state: 初始状态
|
|
353
|
+
parent_workflow: 父 Workflow
|
|
354
|
+
filter_events: 是否过滤事件,只返回关键事件
|
|
355
|
+
**kwargs: 传递给 astream_events 的其他参数
|
|
356
|
+
|
|
357
|
+
Yields:
|
|
358
|
+
(event_type, event_data) 元组
|
|
359
|
+
|
|
360
|
+
当 filter_events=True 时,只返回:
|
|
361
|
+
- ("node_start", {...}) - 节点开始
|
|
362
|
+
- ("node_end", {...}) - 节点结束
|
|
363
|
+
- ("workflow_start", {...}) - Workflow 开始
|
|
364
|
+
- ("workflow_end", {...}) - Workflow 结束
|
|
365
|
+
- ("item_start", {...}) - 并行项开始
|
|
366
|
+
- ("item_done", {...}) - 并行项完成
|
|
367
|
+
|
|
368
|
+
当 filter_events=False 时,返回所有原始事件。
|
|
369
|
+
"""
|
|
370
|
+
if not filter_events:
|
|
371
|
+
async for event in self.astream_events(initial_state, parent_workflow=parent_workflow, **kwargs):
|
|
372
|
+
event_type = event.get("event", "unknown")
|
|
373
|
+
yield (event_type, event)
|
|
374
|
+
else:
|
|
375
|
+
async for event in self.astream_events(initial_state, parent_workflow=parent_workflow, **kwargs):
|
|
376
|
+
event_name = event.get("event", "")
|
|
377
|
+
metadata = event.get("metadata", {})
|
|
378
|
+
node = metadata.get("langgraph_node", "")
|
|
379
|
+
ns = metadata.get("langgraph_checkpoint_ns", "")
|
|
380
|
+
|
|
381
|
+
# 获取当前 workflow_path(从 parent 或 self)
|
|
382
|
+
if parent_workflow:
|
|
383
|
+
workflow_path = f"{parent_workflow._workflow_path}>{self._workflow_id}"
|
|
384
|
+
else:
|
|
385
|
+
workflow_path = self._workflow_id
|
|
386
|
+
|
|
387
|
+
# 过滤出关键事件
|
|
388
|
+
if event_name == "on_chain_start":
|
|
389
|
+
if node:
|
|
390
|
+
yield ("node_start", {
|
|
391
|
+
"node": node,
|
|
392
|
+
"ns": ns,
|
|
393
|
+
"workflow_path": workflow_path,
|
|
394
|
+
})
|
|
395
|
+
else:
|
|
396
|
+
yield ("workflow_start", {
|
|
397
|
+
"workflow_id": self._workflow_id,
|
|
398
|
+
"workflow_path": workflow_path,
|
|
399
|
+
})
|
|
400
|
+
|
|
401
|
+
elif event_name == "on_chain_end":
|
|
402
|
+
if node:
|
|
403
|
+
yield ("node_end", {
|
|
404
|
+
"node": node,
|
|
405
|
+
"ns": ns,
|
|
406
|
+
"workflow_path": workflow_path,
|
|
407
|
+
})
|
|
408
|
+
else:
|
|
409
|
+
yield ("workflow_end", {
|
|
410
|
+
"workflow_id": self._workflow_id,
|
|
411
|
+
"workflow_path": workflow_path,
|
|
412
|
+
})
|
|
413
|
+
|
|
414
|
+
# 检测并行项(parallel_N 格式的节点)
|
|
415
|
+
if node and node.startswith("parallel_"):
|
|
416
|
+
if event_name == "on_chain_start":
|
|
417
|
+
yield ("item_start", {
|
|
418
|
+
"node": node,
|
|
419
|
+
"ns": ns,
|
|
420
|
+
"workflow_path": workflow_path,
|
|
421
|
+
})
|
|
422
|
+
elif event_name == "on_chain_end":
|
|
423
|
+
yield ("item_done", {
|
|
424
|
+
"node": node,
|
|
425
|
+
"ns": ns,
|
|
426
|
+
"workflow_path": workflow_path,
|
|
427
|
+
})
|
|
428
|
+
|
|
429
|
+
async def astream_workflow_events(
|
|
430
|
+
self,
|
|
431
|
+
initial_state: dict,
|
|
432
|
+
*,
|
|
433
|
+
parent_workflow: "BaseWorkflow | None" = None,
|
|
434
|
+
enable_agent_events: bool = False,
|
|
435
|
+
workflow_structure: dict | None = None,
|
|
436
|
+
**kwargs
|
|
437
|
+
) -> AsyncIterator[Any]:
|
|
438
|
+
"""流式执行 Workflow,返回结构化事件(新 API)。
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
initial_state: 初始状态
|
|
442
|
+
parent_workflow: 父 Workflow
|
|
443
|
+
enable_agent_events: 是否同时输出 Agent 内部事件(需配合 CompositeEventAdapter)
|
|
444
|
+
workflow_structure: 结构信息,包含:
|
|
445
|
+
- total_stages: ChainingWorkflow 的 stage 总数
|
|
446
|
+
- total_parallel: ParallelizationWorkflow 的并行节点数
|
|
447
|
+
- routes: RoutingWorkflow 的路由 key 列表
|
|
448
|
+
**kwargs: 传递给 astream_events 的其他参数
|
|
449
|
+
|
|
450
|
+
Yields:
|
|
451
|
+
WorkflowEvent: 结构化的 Workflow 事件
|
|
452
|
+
|
|
453
|
+
嵌套语义说明:
|
|
454
|
+
- 本方法**只能在根 Workflow 上调用**
|
|
455
|
+
- 嵌套子 Workflow 通过 SUBWORKFLOW_START/END 事件表达
|
|
456
|
+
- workflow_path 从根开始构建(如 "wiki-build>parallel_0")
|
|
457
|
+
- 不允许在子 Workflow 上单独创建 adapter(避免路径不连续)
|
|
458
|
+
|
|
459
|
+
示例:
|
|
460
|
+
```python
|
|
461
|
+
workflow = ChainingWorkflow(
|
|
462
|
+
workflow_id="my-workflow",
|
|
463
|
+
stages=[...],
|
|
464
|
+
hook_registry=registry,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
async for event in workflow.astream_workflow_events(
|
|
468
|
+
initial_state={"messages": [...]},
|
|
469
|
+
workflow_structure={"total_stages": 3},
|
|
470
|
+
):
|
|
471
|
+
if event.event_type == WorkflowEventType.STAGE_DONE:
|
|
472
|
+
print(f"Stage {event.data['stage_index']} done")
|
|
473
|
+
```
|
|
474
|
+
"""
|
|
475
|
+
from .event_adapter import WorkflowEventAdapter, WorkflowEvent
|
|
476
|
+
|
|
477
|
+
# === 构建配置 ===
|
|
478
|
+
config = {}
|
|
479
|
+
if workflow_structure:
|
|
480
|
+
config.update(workflow_structure)
|
|
481
|
+
|
|
482
|
+
# === 生成 session_id ===
|
|
483
|
+
workflow_session_id = f"workflow-{self._workflow_id}-{uuid4().hex[:8]}"
|
|
484
|
+
|
|
485
|
+
# === 创建适配器 ===
|
|
486
|
+
adapter = WorkflowEventAdapter(
|
|
487
|
+
self._workflow_id,
|
|
488
|
+
session_id=workflow_session_id,
|
|
489
|
+
config=config,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
# === 流式处理事件 ===
|
|
493
|
+
async for event in self.astream_events(initial_state, parent_workflow=parent_workflow, **kwargs):
|
|
494
|
+
for wf_event in adapter.consume(event):
|
|
495
|
+
yield wf_event
|
|
496
|
+
|
|
497
|
+
# === 通用能力(由 Layer 3 复用)===
|
|
498
|
+
|
|
499
|
+
async def _emit_hook(self, event: HookEvent, ctx: dict) -> None:
|
|
500
|
+
"""发射 Hook 事件,构造 HookContext。
|
|
501
|
+
|
|
502
|
+
Args:
|
|
503
|
+
event: Hook 事件类型
|
|
504
|
+
ctx: 上下文数据(包含 workflow_id, workflow_session_id, workflow_path 等)
|
|
505
|
+
"""
|
|
506
|
+
hook_ctx = HookContext(
|
|
507
|
+
event=event,
|
|
508
|
+
state=ctx.get("state", {}),
|
|
509
|
+
session_id=ctx.get("session_id"),
|
|
510
|
+
tool_name=ctx.get("tool_name"),
|
|
511
|
+
tool_input=ctx.get("tool_input"),
|
|
512
|
+
tool_result=ctx.get("tool_result"),
|
|
513
|
+
# ← Workflow 级字段(Phase 1)
|
|
514
|
+
workflow_id=ctx.get("workflow_id"),
|
|
515
|
+
workflow_session_id=ctx.get("workflow_session_id"),
|
|
516
|
+
workflow_path=ctx.get("workflow_path"),
|
|
517
|
+
)
|
|
518
|
+
await self._hook_engine.execute(hook_ctx)
|
|
519
|
+
|
|
520
|
+
async def _drain_pending_memory_extractions(self) -> None:
|
|
521
|
+
"""清理 pending 的 memory extraction 任务。
|
|
522
|
+
|
|
523
|
+
这是为了确保 Workflow 结束时不会遗留未完成的 memory extraction。
|
|
524
|
+
与 create_loop_agent 内部的逻辑保持一致。
|
|
525
|
+
|
|
526
|
+
实现说明:
|
|
527
|
+
- 依赖于 trace_collector 的接口
|
|
528
|
+
- 如果 trace_collector 为 None,则跳过清理
|
|
529
|
+
- 清理失败不应抛出异常,只记录日志
|
|
530
|
+
"""
|
|
531
|
+
try:
|
|
532
|
+
# 调用模块级函数清理 memory extraction
|
|
533
|
+
# 注意:这是 memory 子系统的模块级函数,不是 TraceCollector 的方法
|
|
534
|
+
# 签名:drain_pending_agent_memory_extraction(timeout_ms: int = 60_000)
|
|
535
|
+
await drain_pending_agent_memory_extraction(
|
|
536
|
+
timeout_ms=60_000, # 默认 60 秒超时
|
|
537
|
+
)
|
|
538
|
+
except Exception as e:
|
|
539
|
+
# 清理失败不应抛出异常,避免掩盖主流程的错误
|
|
540
|
+
# 记录日志即可
|
|
541
|
+
logger.warning(f"Failed to drain pending memory extractions: {e}")
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
__all__ = ["BaseWorkflow"]
|