AbstractAgent 0.3.12__tar.gz → 0.3.14__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.
Files changed (135) hide show
  1. {abstractagent-0.3.12 → abstractagent-0.3.14}/PKG-INFO +35 -14
  2. abstractagent-0.3.12/src/abstractagent.egg-info/PKG-INFO → abstractagent-0.3.14/README.md +28 -28
  3. {abstractagent-0.3.12 → abstractagent-0.3.14}/pyproject.toml +7 -7
  4. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/__init__.py +15 -0
  5. abstractagent-0.3.14/src/abstractagent/adapters/__init__.py +21 -0
  6. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/adapters/codeact_runtime.py +771 -145
  7. abstractagent-0.3.14/src/abstractagent/adapters/emit_inventory.py +170 -0
  8. abstractagent-0.3.14/src/abstractagent/adapters/generation_params.py +661 -0
  9. abstractagent-0.3.14/src/abstractagent/adapters/loop_hooks.py +384 -0
  10. abstractagent-0.3.14/src/abstractagent/adapters/media.py +180 -0
  11. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/adapters/memact_runtime.py +516 -64
  12. abstractagent-0.3.14/src/abstractagent/adapters/native_loop_registry.py +325 -0
  13. abstractagent-0.3.14/src/abstractagent/adapters/progress.py +182 -0
  14. abstractagent-0.3.14/src/abstractagent/adapters/react_runtime.py +3983 -0
  15. abstractagent-0.3.14/src/abstractagent/adapters/read_orchestration.py +261 -0
  16. abstractagent-0.3.14/src/abstractagent/adapters/tool_allowlist.py +59 -0
  17. abstractagent-0.3.14/src/abstractagent/adapters/tool_failure_hints.py +320 -0
  18. abstractagent-0.3.14/src/abstractagent/adapters/transcripts.py +434 -0
  19. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/agents/base.py +33 -1
  20. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/agents/codeact.py +75 -20
  21. abstractagent-0.3.14/src/abstractagent/agents/defaults.py +131 -0
  22. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/agents/memact.py +65 -32
  23. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/agents/react.py +69 -20
  24. abstractagent-0.3.14/src/abstractagent/agents/task_reset.py +134 -0
  25. abstractagent-0.3.14/src/abstractagent/agents/unattended.py +68 -0
  26. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/logic/builtins.py +72 -0
  27. abstractagent-0.3.14/src/abstractagent/logic/codeact.py +273 -0
  28. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/logic/memact.py +35 -6
  29. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/logic/react.py +45 -10
  30. abstractagent-0.3.14/src/abstractagent/metrics/__init__.py +5 -0
  31. abstractagent-0.3.14/src/abstractagent/metrics/prefix_reuse.py +123 -0
  32. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/repl.py +6 -3
  33. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/sandbox/interface.py +3 -1
  34. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/sandbox/local.py +20 -4
  35. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/scripts/lmstudio_tool_eval.py +57 -1
  36. abstractagent-0.3.14/src/abstractagent/tools/code_execution.py +66 -0
  37. abstractagent-0.3.12/README.md → abstractagent-0.3.14/src/abstractagent.egg-info/PKG-INFO +49 -7
  38. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent.egg-info/SOURCES.txt +59 -1
  39. abstractagent-0.3.14/src/abstractagent.egg-info/requires.txt +16 -0
  40. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_active_context_policy_adoption.py +7 -2
  41. abstractagent-0.3.14/tests/test_adversary_hardening_2026_07_13.py +230 -0
  42. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_agent_plan_review_modes.py +35 -19
  43. abstractagent-0.3.14/tests/test_agent_speculation_inheritance.py +59 -0
  44. abstractagent-0.3.14/tests/test_agent_stream_inheritance.py +56 -0
  45. abstractagent-0.3.14/tests/test_batching_prompt_rule.py +58 -0
  46. abstractagent-0.3.14/tests/test_budget_triage_tail.py +147 -0
  47. abstractagent-0.3.14/tests/test_c2447_visit_lane_honesty.py +495 -0
  48. abstractagent-0.3.14/tests/test_claim_0029_residue_2026_07_14.py +303 -0
  49. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_codeact_logic.py +1 -1
  50. abstractagent-0.3.14/tests/test_delegate_session_route_composition.py +253 -0
  51. abstractagent-0.3.14/tests/test_emit_inventory_drift.py +50 -0
  52. abstractagent-0.3.14/tests/test_gated_remainder_wave_2026_07_14.py +364 -0
  53. abstractagent-0.3.14/tests/test_generation_params_media_policies.py +207 -0
  54. abstractagent-0.3.14/tests/test_history_monster_clamp.py +335 -0
  55. abstractagent-0.3.14/tests/test_improvement_wave_2026_07_13.py +228 -0
  56. abstractagent-0.3.14/tests/test_lmstudio_tool_eval_metrics.py +40 -0
  57. abstractagent-0.3.14/tests/test_loop_hooks.py +460 -0
  58. abstractagent-0.3.14/tests/test_loop_hooks_0026_follow_ups.py +287 -0
  59. abstractagent-0.3.14/tests/test_memact_codeact_guidance_durable_transcript.py +134 -0
  60. abstractagent-0.3.14/tests/test_native_loop_registry.py +275 -0
  61. abstractagent-0.3.14/tests/test_operator_conclude.py +163 -0
  62. abstractagent-0.3.14/tests/test_optimal_wave_batch2_2026_07_13.py +210 -0
  63. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_packaging_profiles.py +6 -6
  64. abstractagent-0.3.14/tests/test_parse_prompt_cache_capture.py +102 -0
  65. abstractagent-0.3.14/tests/test_prefix_reuse_metric.py +135 -0
  66. abstractagent-0.3.14/tests/test_progress_detection.py +169 -0
  67. abstractagent-0.3.14/tests/test_react_act_only_observation.py +174 -0
  68. abstractagent-0.3.14/tests/test_react_delegate_agent_tool.py +269 -0
  69. abstractagent-0.3.14/tests/test_react_election_fence_conformance.py +181 -0
  70. abstractagent-0.3.14/tests/test_react_entity_dress_conformance.py +233 -0
  71. abstractagent-0.3.14/tests/test_react_guidance_durable_transcript.py +179 -0
  72. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_logic.py +5 -3
  73. abstractagent-0.3.14/tests/test_react_loop_aborted_generation_retry.py +224 -0
  74. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_loop_context_transcript_levels.py +148 -5
  75. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_loop_followthrough_retry.py +5 -2
  76. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_loop_truncated_output_retry.py +8 -3
  77. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_max_iterations_concludes.py +8 -2
  78. abstractagent-0.3.14/tests/test_react_phase_grant_boundary.py +274 -0
  79. abstractagent-0.3.14/tests/test_react_prompt_prefix_stability.py +288 -0
  80. abstractagent-0.3.14/tests/test_react_sight_lane_media_fold.py +381 -0
  81. abstractagent-0.3.14/tests/test_react_turn_byte_stability.py +221 -0
  82. abstractagent-0.3.14/tests/test_react_verifier_and_plan.py +167 -0
  83. abstractagent-0.3.14/tests/test_react_visit_composition.py +334 -0
  84. abstractagent-0.3.14/tests/test_react_visit_merge.py +282 -0
  85. abstractagent-0.3.14/tests/test_read_orchestration_guidance.py +409 -0
  86. abstractagent-0.3.14/tests/test_reasoning_first_citizen_agent.py +284 -0
  87. abstractagent-0.3.14/tests/test_review_failure_containment.py +259 -0
  88. abstractagent-0.3.14/tests/test_sibling_loop_defects_batch.py +328 -0
  89. abstractagent-0.3.14/tests/test_sibling_strict_transcripts_0011.py +166 -0
  90. abstractagent-0.3.14/tests/test_stuck_streak_termination.py +525 -0
  91. abstractagent-0.3.14/tests/test_tool_failure_hints.py +244 -0
  92. abstractagent-0.3.14/tests/test_tool_loop_prefix_extension_a3.py +202 -0
  93. abstractagent-0.3.14/tests/test_unseeded_render_limits.py +116 -0
  94. abstractagent-0.3.14/tests/test_verifier_execution_preference.py +462 -0
  95. abstractagent-0.3.14/tests/test_verifier_schema_strict.py +197 -0
  96. abstractagent-0.3.12/src/abstractagent/adapters/__init__.py +0 -7
  97. abstractagent-0.3.12/src/abstractagent/adapters/generation_params.py +0 -115
  98. abstractagent-0.3.12/src/abstractagent/adapters/media.py +0 -45
  99. abstractagent-0.3.12/src/abstractagent/adapters/react_runtime.py +0 -1612
  100. abstractagent-0.3.12/src/abstractagent/logic/codeact.py +0 -176
  101. abstractagent-0.3.12/src/abstractagent/tools/code_execution.py +0 -45
  102. abstractagent-0.3.12/src/abstractagent.egg-info/requires.txt +0 -16
  103. abstractagent-0.3.12/tests/test_generation_params_media_policies.py +0 -78
  104. abstractagent-0.3.12/tests/test_react_delegate_agent_tool.py +0 -85
  105. {abstractagent-0.3.12 → abstractagent-0.3.14}/LICENSE +0 -0
  106. {abstractagent-0.3.12 → abstractagent-0.3.14}/setup.cfg +0 -0
  107. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/agents/__init__.py +0 -0
  108. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/logic/__init__.py +0 -0
  109. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/logic/types.py +0 -0
  110. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/sandbox/__init__.py +0 -0
  111. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/scripts/__init__.py +0 -0
  112. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/tools/__init__.py +0 -0
  113. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent/tools/self_improve.py +0 -0
  114. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent.egg-info/dependency_links.txt +0 -0
  115. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent.egg-info/entry_points.txt +0 -0
  116. {abstractagent-0.3.12 → abstractagent-0.3.14}/src/abstractagent.egg-info/top_level.txt +0 -0
  117. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_agents_integration_llm.py +0 -0
  118. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_base_agent_trace_accessors.py +0 -0
  119. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_builtin_tool_specs_optional_defaults.py +0 -0
  120. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_codeact_runtime_verifier_policy.py +0 -0
  121. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_llm_call_payload_requires_prompt_or_messages.py +0 -0
  122. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_memact_session_memory.py +0 -0
  123. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_memact_workflow.py +0 -0
  124. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_memory_recall_tool.py +0 -0
  125. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_open_attachment_tool_available.py +0 -0
  126. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_active_attachments_disable_tools_first_iteration.py +0 -0
  127. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_adapter_forwards_context_attachments_media.py +0 -0
  128. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_loop_side_effect_dedupe_comms.py +0 -0
  129. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_planish_heuristic.py +0 -0
  130. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_workflow_system_prompt_and_tools_override.py +0 -0
  131. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_react_workflow_toolset_refresh.py +0 -0
  132. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_run_start_seeds_runtime_provider_model.py +0 -0
  133. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_session_memory.py +0 -0
  134. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_tool_observe_emits_result_for_tui.py +0 -0
  135. {abstractagent-0.3.12 → abstractagent-0.3.14}/tests/test_tools_editing.py +0 -0
@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractagent
3
- Version: 0.3.12
3
+ Version: 0.3.14
4
4
  Summary: Agent implementations using AbstractRuntime and AbstractCore
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
8
- Requires-Dist: abstractcore[tools]>=2.13.38
9
- Requires-Dist: abstractruntime>=0.4.29
8
+ Requires-Dist: abstractcore[tools]>=2.13.41
9
+ Requires-Dist: abstractruntime>=0.5.0
10
10
  Provides-Extra: apple
11
- Requires-Dist: abstractcore[all-apple]>=2.13.38; extra == "apple"
12
- Requires-Dist: abstractruntime[apple]>=0.4.29; extra == "apple"
11
+ Requires-Dist: abstractcore[all-apple]>=2.13.41; extra == "apple"
12
+ Requires-Dist: abstractruntime[apple]>=0.5.0; extra == "apple"
13
13
  Provides-Extra: gpu
14
- Requires-Dist: abstractcore[all-gpu]>=2.13.38; extra == "gpu"
15
- Requires-Dist: abstractruntime[gpu]>=0.4.29; extra == "gpu"
14
+ Requires-Dist: abstractcore[all-gpu]>=2.13.41; extra == "gpu"
15
+ Requires-Dist: abstractruntime[gpu]>=0.5.0; extra == "gpu"
16
16
  Provides-Extra: dev
17
17
  Requires-Dist: pytest>=7.0; extra == "dev"
18
18
  Provides-Extra: test
@@ -45,22 +45,29 @@ flowchart LR
45
45
 
46
46
  - Getting started: [`docs/getting-started.md`](docs/getting-started.md)
47
47
  - API reference: [`docs/api.md`](docs/api.md)
48
- - FAQ / troubleshooting: [`docs/faq.md`](docs/faq.md)
48
+ - Loop hooks (listen/steer/capture): [`docs/hooks.md`](docs/hooks.md)
49
+ - FAQ: [`docs/faq.md`](docs/faq.md)
50
+ - Troubleshooting: [`docs/troubleshooting.md`](docs/troubleshooting.md)
49
51
  - Architecture (diagrams): [`docs/architecture.md`](docs/architecture.md)
50
52
  - Changelog: [`CHANGELOG.md`](CHANGELOG.md)
51
53
  - Contributing: [`CONTRIBUTING.md`](CONTRIBUTING.md)
52
54
  - Security: [`SECURITY.md`](SECURITY.md)
53
55
  - Acknowledgements: [`ACKNOWLEDMENTS.md`](ACKNOWLEDMENTS.md)
56
+ - Code of conduct: [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
54
57
 
55
58
  ## What you get
56
59
 
57
60
  - **ReAct**: tool-first Reason → Act → Observe loop
58
- - **CodeAct**: executes Python (tool call or fenced ` ```python``` ` blocks)
59
- - **MemAct**: memory-enhanced agent using runtime-owned Active Memory
61
+ - **CodeAct**: executes Python (tool calls; on prompted-tools models also fenced ` ```python``` ` blocks)
62
+ - **MemAct** (experimental): memory-enhanced agent using runtime-owned Active Memory — distinct architecture, less production mileage; import from `abstractagent.agents.memact` (deliberately not top-level)
60
63
  - **Durable runs**: pause/resume via `run_id` + runtime stores
61
- - **Tool control**: explicit tool bundles + per-run allowlists
62
- - **Generation controls**: temperature, seed, media policy, prompt-cache binding,
63
- and Core `thinking` are normalized before LLM calls
64
+ - **Tool control**: explicit tool bundles + per-run allowlists (unresolvable
65
+ grant names are recorded loudly, never dropped silently)
66
+ - **Loop hooks**: listen/steer/capture on the running loop via `LoopHooks`
67
+ (see [`docs/hooks.md`](docs/hooks.md)); the flat `on_step` callback remains
68
+ - **Generation controls**: temperature, seed, media policy, prompt-cache
69
+ identity, streaming, Core `thinking` and `speculation` (MTP) are normalized
70
+ before LLM calls and inherited by delegated children
64
71
  - **Observability**: durable ledger of LLM calls, tool calls, and waits
65
72
 
66
73
  Where this lives in code (source of truth):
@@ -98,6 +105,11 @@ Native Python hardware profile cascades are available for deployment manifests:
98
105
  AbstractCore and AbstractRuntime profiles; AbstractAgent itself remains
99
106
  provider/runtime agnostic.
100
107
 
108
+ AbstractAgent 0.3.14 requires `abstractcore[tools]>=2.13.41` and
109
+ `AbstractRuntime>=0.5.0` (the runtime release that provides live token
110
+ streaming, on top of turn grounding, in-flight cancellation and speculation
111
+ inheritance). AbstractRuntime 0.5.0 itself requires AbstractCore 2.16.0 or newer.
112
+
101
113
  Note: the repository may be ahead of the latest published PyPI release. To verify what you installed:
102
114
 
103
115
  ```bash
@@ -109,12 +121,21 @@ python -c "import importlib.metadata as md; print(md.version('abstractagent'))"
109
121
  ```python
110
122
  from abstractagent import create_react_agent
111
123
 
112
- agent = create_react_agent(provider="ollama", model="qwen3:1.7b-q4_K_M")
124
+ # provider/model resolve from your AbstractCore config defaults
125
+ # (`abstractcore --config`) when omitted; pass them explicitly to pin.
126
+ agent = create_react_agent(provider="ollama", model="qwen3:4b")
113
127
  agent.start("List the files in the current directory")
114
128
  state = agent.run_to_completion()
115
129
  print(state.output["answer"])
116
130
  ```
117
131
 
132
+ Tip: these loops send the full transcript plus ~19 tool schemas every cycle —
133
+ prefer a tool-capable model. On Ollama, raise the context window to the model's
134
+ maximum available context or the server silently truncates from the oldest
135
+ content first: per-call `llm_kwargs={"num_ctx": <model max>}` or server-side `OLLAMA_CONTEXT_LENGTH=<model max> ollama serve`.
136
+ House rule: maximum available context unless you explicitly choose otherwise —
137
+ a fixed lower number is a hidden ceiling (see [`docs/faq.md`](docs/faq.md)).
138
+
118
139
  ## Persistence (resume across restarts)
119
140
 
120
141
  By default, the factory helpers use an in-memory runtime store. For resume across process restarts,
@@ -1,24 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: abstractagent
3
- Version: 0.3.12
4
- Summary: Agent implementations using AbstractRuntime and AbstractCore
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
7
- License-File: LICENSE
8
- Requires-Dist: abstractcore[tools]>=2.13.38
9
- Requires-Dist: abstractruntime>=0.4.29
10
- Provides-Extra: apple
11
- Requires-Dist: abstractcore[all-apple]>=2.13.38; extra == "apple"
12
- Requires-Dist: abstractruntime[apple]>=0.4.29; extra == "apple"
13
- Provides-Extra: gpu
14
- Requires-Dist: abstractcore[all-gpu]>=2.13.38; extra == "gpu"
15
- Requires-Dist: abstractruntime[gpu]>=0.4.29; extra == "gpu"
16
- Provides-Extra: dev
17
- Requires-Dist: pytest>=7.0; extra == "dev"
18
- Provides-Extra: test
19
- Requires-Dist: pytest>=7.0; extra == "test"
20
- Dynamic: license-file
21
-
22
1
  # AbstractAgent
23
2
 
24
3
  Agent patterns (ReAct / CodeAct / MemAct) built on **AbstractRuntime** (durable execution) and **AbstractCore** (tools + LLM integration).
@@ -45,22 +24,29 @@ flowchart LR
45
24
 
46
25
  - Getting started: [`docs/getting-started.md`](docs/getting-started.md)
47
26
  - API reference: [`docs/api.md`](docs/api.md)
48
- - FAQ / troubleshooting: [`docs/faq.md`](docs/faq.md)
27
+ - Loop hooks (listen/steer/capture): [`docs/hooks.md`](docs/hooks.md)
28
+ - FAQ: [`docs/faq.md`](docs/faq.md)
29
+ - Troubleshooting: [`docs/troubleshooting.md`](docs/troubleshooting.md)
49
30
  - Architecture (diagrams): [`docs/architecture.md`](docs/architecture.md)
50
31
  - Changelog: [`CHANGELOG.md`](CHANGELOG.md)
51
32
  - Contributing: [`CONTRIBUTING.md`](CONTRIBUTING.md)
52
33
  - Security: [`SECURITY.md`](SECURITY.md)
53
34
  - Acknowledgements: [`ACKNOWLEDMENTS.md`](ACKNOWLEDMENTS.md)
35
+ - Code of conduct: [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
54
36
 
55
37
  ## What you get
56
38
 
57
39
  - **ReAct**: tool-first Reason → Act → Observe loop
58
- - **CodeAct**: executes Python (tool call or fenced ` ```python``` ` blocks)
59
- - **MemAct**: memory-enhanced agent using runtime-owned Active Memory
40
+ - **CodeAct**: executes Python (tool calls; on prompted-tools models also fenced ` ```python``` ` blocks)
41
+ - **MemAct** (experimental): memory-enhanced agent using runtime-owned Active Memory — distinct architecture, less production mileage; import from `abstractagent.agents.memact` (deliberately not top-level)
60
42
  - **Durable runs**: pause/resume via `run_id` + runtime stores
61
- - **Tool control**: explicit tool bundles + per-run allowlists
62
- - **Generation controls**: temperature, seed, media policy, prompt-cache binding,
63
- and Core `thinking` are normalized before LLM calls
43
+ - **Tool control**: explicit tool bundles + per-run allowlists (unresolvable
44
+ grant names are recorded loudly, never dropped silently)
45
+ - **Loop hooks**: listen/steer/capture on the running loop via `LoopHooks`
46
+ (see [`docs/hooks.md`](docs/hooks.md)); the flat `on_step` callback remains
47
+ - **Generation controls**: temperature, seed, media policy, prompt-cache
48
+ identity, streaming, Core `thinking` and `speculation` (MTP) are normalized
49
+ before LLM calls and inherited by delegated children
64
50
  - **Observability**: durable ledger of LLM calls, tool calls, and waits
65
51
 
66
52
  Where this lives in code (source of truth):
@@ -98,6 +84,11 @@ Native Python hardware profile cascades are available for deployment manifests:
98
84
  AbstractCore and AbstractRuntime profiles; AbstractAgent itself remains
99
85
  provider/runtime agnostic.
100
86
 
87
+ AbstractAgent 0.3.14 requires `abstractcore[tools]>=2.13.41` and
88
+ `AbstractRuntime>=0.5.0` (the runtime release that provides live token
89
+ streaming, on top of turn grounding, in-flight cancellation and speculation
90
+ inheritance). AbstractRuntime 0.5.0 itself requires AbstractCore 2.16.0 or newer.
91
+
101
92
  Note: the repository may be ahead of the latest published PyPI release. To verify what you installed:
102
93
 
103
94
  ```bash
@@ -109,12 +100,21 @@ python -c "import importlib.metadata as md; print(md.version('abstractagent'))"
109
100
  ```python
110
101
  from abstractagent import create_react_agent
111
102
 
112
- agent = create_react_agent(provider="ollama", model="qwen3:1.7b-q4_K_M")
103
+ # provider/model resolve from your AbstractCore config defaults
104
+ # (`abstractcore --config`) when omitted; pass them explicitly to pin.
105
+ agent = create_react_agent(provider="ollama", model="qwen3:4b")
113
106
  agent.start("List the files in the current directory")
114
107
  state = agent.run_to_completion()
115
108
  print(state.output["answer"])
116
109
  ```
117
110
 
111
+ Tip: these loops send the full transcript plus ~19 tool schemas every cycle —
112
+ prefer a tool-capable model. On Ollama, raise the context window to the model's
113
+ maximum available context or the server silently truncates from the oldest
114
+ content first: per-call `llm_kwargs={"num_ctx": <model max>}` or server-side `OLLAMA_CONTEXT_LENGTH=<model max> ollama serve`.
115
+ House rule: maximum available context unless you explicitly choose otherwise —
116
+ a fixed lower number is a hidden ceiling (see [`docs/faq.md`](docs/faq.md)).
117
+
118
118
  ## Persistence (resume across restarts)
119
119
 
120
120
  By default, the factory helpers use an in-memory runtime store. For resume across process restarts,
@@ -4,23 +4,23 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "abstractagent"
7
- version = "0.3.12"
7
+ version = "0.3.14"
8
8
  description = "Agent implementations using AbstractRuntime and AbstractCore"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  dependencies = [
12
- "abstractcore[tools]>=2.13.38",
13
- "abstractruntime>=0.4.29",
12
+ "abstractcore[tools]>=2.13.41",
13
+ "abstractruntime>=0.5.0",
14
14
  ]
15
15
 
16
16
  [project.optional-dependencies]
17
17
  apple = [
18
- "abstractcore[all-apple]>=2.13.38",
19
- "abstractruntime[apple]>=0.4.29",
18
+ "abstractcore[all-apple]>=2.13.41",
19
+ "abstractruntime[apple]>=0.5.0",
20
20
  ]
21
21
  gpu = [
22
- "abstractcore[all-gpu]>=2.13.38",
23
- "abstractruntime[gpu]>=0.4.29",
22
+ "abstractcore[all-gpu]>=2.13.41",
23
+ "abstractruntime[gpu]>=0.5.0",
24
24
  ]
25
25
  dev = [
26
26
  "pytest>=7.0",
@@ -1,5 +1,12 @@
1
1
  """AbstractAgent - Agent implementations using AbstractRuntime and AbstractCore."""
2
2
 
3
+ from .adapters.loop_hooks import DEFAULT_EVENT_MAP, HookEvent, LoopHooks
4
+ from .adapters.native_loop_registry import (
5
+ audit_native_loop_manifest,
6
+ build_native_loop_manifest,
7
+ materialize_native_loop_spec,
8
+ pack_native_loop_bundle,
9
+ )
3
10
  from .agents import (
4
11
  BaseAgent,
5
12
  ReactAgent,
@@ -26,6 +33,14 @@ from .tools import (
26
33
  __all__ = [
27
34
  # Base class for custom agents
28
35
  "BaseAgent",
36
+ # First-class loop hooks (listen + steer + capture)
37
+ "DEFAULT_EVENT_MAP",
38
+ "HookEvent",
39
+ "LoopHooks",
40
+ "audit_native_loop_manifest",
41
+ "materialize_native_loop_spec",
42
+ "build_native_loop_manifest",
43
+ "pack_native_loop_bundle",
29
44
  # ReAct agent
30
45
  "ReactAgent",
31
46
  "create_react_workflow",
@@ -0,0 +1,21 @@
1
+ """Runtime adapters for agent logic."""
2
+
3
+ from .codeact_runtime import create_codeact_workflow
4
+ from .native_loop_registry import (
5
+ audit_native_loop_manifest,
6
+ build_native_loop_manifest,
7
+ materialize_native_loop_spec,
8
+ pack_native_loop_bundle,
9
+ )
10
+ from .react_runtime import create_react_workflow
11
+ from .memact_runtime import create_memact_workflow
12
+
13
+ __all__ = [
14
+ "create_react_workflow",
15
+ "create_codeact_workflow",
16
+ "create_memact_workflow",
17
+ "audit_native_loop_manifest",
18
+ "materialize_native_loop_spec",
19
+ "build_native_loop_manifest",
20
+ "pack_native_loop_bundle",
21
+ ]