AbstractAgent 0.3.14__tar.gz → 0.3.16__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 (126) hide show
  1. {abstractagent-0.3.14/src/abstractagent.egg-info → abstractagent-0.3.16}/PKG-INFO +2 -2
  2. {abstractagent-0.3.14 → abstractagent-0.3.16}/README.md +1 -1
  3. {abstractagent-0.3.14 → abstractagent-0.3.16}/pyproject.toml +1 -1
  4. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/codeact_runtime.py +1 -0
  5. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/memact_runtime.py +1 -0
  6. {abstractagent-0.3.14 → abstractagent-0.3.16/src/abstractagent.egg-info}/PKG-INFO +2 -2
  7. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_reasoning_first_citizen_agent.py +78 -0
  8. {abstractagent-0.3.14 → abstractagent-0.3.16}/LICENSE +0 -0
  9. {abstractagent-0.3.14 → abstractagent-0.3.16}/setup.cfg +0 -0
  10. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/__init__.py +0 -0
  11. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/__init__.py +0 -0
  12. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/emit_inventory.py +0 -0
  13. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/generation_params.py +0 -0
  14. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/loop_hooks.py +0 -0
  15. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/media.py +0 -0
  16. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/native_loop_registry.py +0 -0
  17. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/progress.py +0 -0
  18. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/react_runtime.py +0 -0
  19. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/read_orchestration.py +0 -0
  20. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/tool_allowlist.py +0 -0
  21. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/tool_failure_hints.py +0 -0
  22. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/adapters/transcripts.py +0 -0
  23. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/__init__.py +0 -0
  24. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/base.py +0 -0
  25. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/codeact.py +0 -0
  26. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/defaults.py +0 -0
  27. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/memact.py +0 -0
  28. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/react.py +0 -0
  29. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/task_reset.py +0 -0
  30. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/agents/unattended.py +0 -0
  31. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/__init__.py +0 -0
  32. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/builtins.py +0 -0
  33. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/codeact.py +0 -0
  34. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/memact.py +0 -0
  35. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/react.py +0 -0
  36. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/logic/types.py +0 -0
  37. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/metrics/__init__.py +0 -0
  38. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/metrics/prefix_reuse.py +0 -0
  39. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/repl.py +0 -0
  40. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/sandbox/__init__.py +0 -0
  41. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/sandbox/interface.py +0 -0
  42. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/sandbox/local.py +0 -0
  43. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/scripts/__init__.py +0 -0
  44. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/scripts/lmstudio_tool_eval.py +0 -0
  45. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/tools/__init__.py +0 -0
  46. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/tools/code_execution.py +0 -0
  47. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent/tools/self_improve.py +0 -0
  48. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent.egg-info/SOURCES.txt +0 -0
  49. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent.egg-info/dependency_links.txt +0 -0
  50. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent.egg-info/entry_points.txt +0 -0
  51. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent.egg-info/requires.txt +0 -0
  52. {abstractagent-0.3.14 → abstractagent-0.3.16}/src/abstractagent.egg-info/top_level.txt +0 -0
  53. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_active_context_policy_adoption.py +0 -0
  54. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_adversary_hardening_2026_07_13.py +0 -0
  55. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_agent_plan_review_modes.py +0 -0
  56. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_agent_speculation_inheritance.py +0 -0
  57. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_agent_stream_inheritance.py +0 -0
  58. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_agents_integration_llm.py +0 -0
  59. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_base_agent_trace_accessors.py +0 -0
  60. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_batching_prompt_rule.py +0 -0
  61. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_budget_triage_tail.py +0 -0
  62. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_builtin_tool_specs_optional_defaults.py +0 -0
  63. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_c2447_visit_lane_honesty.py +0 -0
  64. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_claim_0029_residue_2026_07_14.py +0 -0
  65. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_codeact_logic.py +0 -0
  66. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_codeact_runtime_verifier_policy.py +0 -0
  67. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_delegate_session_route_composition.py +0 -0
  68. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_emit_inventory_drift.py +0 -0
  69. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_gated_remainder_wave_2026_07_14.py +0 -0
  70. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_generation_params_media_policies.py +0 -0
  71. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_history_monster_clamp.py +0 -0
  72. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_improvement_wave_2026_07_13.py +0 -0
  73. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_llm_call_payload_requires_prompt_or_messages.py +0 -0
  74. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_lmstudio_tool_eval_metrics.py +0 -0
  75. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_loop_hooks.py +0 -0
  76. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_loop_hooks_0026_follow_ups.py +0 -0
  77. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_memact_codeact_guidance_durable_transcript.py +0 -0
  78. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_memact_session_memory.py +0 -0
  79. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_memact_workflow.py +0 -0
  80. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_memory_recall_tool.py +0 -0
  81. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_native_loop_registry.py +0 -0
  82. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_open_attachment_tool_available.py +0 -0
  83. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_operator_conclude.py +0 -0
  84. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_optimal_wave_batch2_2026_07_13.py +0 -0
  85. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_packaging_profiles.py +0 -0
  86. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_parse_prompt_cache_capture.py +0 -0
  87. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_prefix_reuse_metric.py +0 -0
  88. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_progress_detection.py +0 -0
  89. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_act_only_observation.py +0 -0
  90. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_active_attachments_disable_tools_first_iteration.py +0 -0
  91. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_adapter_forwards_context_attachments_media.py +0 -0
  92. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_delegate_agent_tool.py +0 -0
  93. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_election_fence_conformance.py +0 -0
  94. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_entity_dress_conformance.py +0 -0
  95. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_guidance_durable_transcript.py +0 -0
  96. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_logic.py +0 -0
  97. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_loop_aborted_generation_retry.py +0 -0
  98. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_loop_context_transcript_levels.py +0 -0
  99. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_loop_followthrough_retry.py +0 -0
  100. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_loop_side_effect_dedupe_comms.py +0 -0
  101. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_loop_truncated_output_retry.py +0 -0
  102. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_max_iterations_concludes.py +0 -0
  103. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_phase_grant_boundary.py +0 -0
  104. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_planish_heuristic.py +0 -0
  105. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_prompt_prefix_stability.py +0 -0
  106. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_sight_lane_media_fold.py +0 -0
  107. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_turn_byte_stability.py +0 -0
  108. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_verifier_and_plan.py +0 -0
  109. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_visit_composition.py +0 -0
  110. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_visit_merge.py +0 -0
  111. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_workflow_system_prompt_and_tools_override.py +0 -0
  112. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_react_workflow_toolset_refresh.py +0 -0
  113. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_read_orchestration_guidance.py +0 -0
  114. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_review_failure_containment.py +0 -0
  115. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_run_start_seeds_runtime_provider_model.py +0 -0
  116. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_session_memory.py +0 -0
  117. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_sibling_loop_defects_batch.py +0 -0
  118. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_sibling_strict_transcripts_0011.py +0 -0
  119. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_stuck_streak_termination.py +0 -0
  120. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_tool_failure_hints.py +0 -0
  121. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_tool_loop_prefix_extension_a3.py +0 -0
  122. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_tool_observe_emits_result_for_tui.py +0 -0
  123. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_tools_editing.py +0 -0
  124. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_unseeded_render_limits.py +0 -0
  125. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_verifier_execution_preference.py +0 -0
  126. {abstractagent-0.3.14 → abstractagent-0.3.16}/tests/test_verifier_schema_strict.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractagent
3
- Version: 0.3.14
3
+ Version: 0.3.16
4
4
  Summary: Agent implementations using AbstractRuntime and AbstractCore
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -105,7 +105,7 @@ Native Python hardware profile cascades are available for deployment manifests:
105
105
  AbstractCore and AbstractRuntime profiles; AbstractAgent itself remains
106
106
  provider/runtime agnostic.
107
107
 
108
- AbstractAgent 0.3.14 requires `abstractcore[tools]>=2.13.41` and
108
+ AbstractAgent 0.3.16 requires `abstractcore[tools]>=2.13.41` and
109
109
  `AbstractRuntime>=0.5.0` (the runtime release that provides live token
110
110
  streaming, on top of turn grounding, in-flight cancellation and speculation
111
111
  inheritance). AbstractRuntime 0.5.0 itself requires AbstractCore 2.16.0 or newer.
@@ -84,7 +84,7 @@ Native Python hardware profile cascades are available for deployment manifests:
84
84
  AbstractCore and AbstractRuntime profiles; AbstractAgent itself remains
85
85
  provider/runtime agnostic.
86
86
 
87
- AbstractAgent 0.3.14 requires `abstractcore[tools]>=2.13.41` and
87
+ AbstractAgent 0.3.16 requires `abstractcore[tools]>=2.13.41` and
88
88
  `AbstractRuntime>=0.5.0` (the runtime release that provides live token
89
89
  streaming, on top of turn grounding, in-flight cancellation and speculation
90
90
  inheritance). AbstractRuntime 0.5.0 itself requires AbstractCore 2.16.0 or newer.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "abstractagent"
7
- version = "0.3.14"
7
+ version = "0.3.16"
8
8
  description = "Agent implementations using AbstractRuntime and AbstractCore"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -21,6 +21,7 @@ from .generation_params import (
21
21
  context_usage_warning,
22
22
  executor_tool_names,
23
23
  guidance_wrapper,
24
+ normalize_thinking,
24
25
  prompt_cache_capture,
25
26
  resolve_max_iterations,
26
27
  runtime_llm_params,
@@ -19,6 +19,7 @@ from .generation_params import (
19
19
  compose_prompt_slots,
20
20
  context_usage_warning,
21
21
  guidance_wrapper,
22
+ normalize_thinking,
22
23
  prompt_cache_capture,
23
24
  resolve_max_iterations,
24
25
  runtime_llm_params,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractagent
3
- Version: 0.3.14
3
+ Version: 0.3.16
4
4
  Summary: Agent implementations using AbstractRuntime and AbstractCore
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -105,7 +105,7 @@ Native Python hardware profile cascades are available for deployment manifests:
105
105
  AbstractCore and AbstractRuntime profiles; AbstractAgent itself remains
106
106
  provider/runtime agnostic.
107
107
 
108
- AbstractAgent 0.3.14 requires `abstractcore[tools]>=2.13.41` and
108
+ AbstractAgent 0.3.16 requires `abstractcore[tools]>=2.13.41` and
109
109
  `AbstractRuntime>=0.5.0` (the runtime release that provides live token
110
110
  streaming, on top of turn grounding, in-flight cancellation and speculation
111
111
  inheritance). AbstractRuntime 0.5.0 itself requires AbstractCore 2.16.0 or newer.
@@ -282,3 +282,81 @@ def test_substrate_profile_thinking_is_a_known_key_not_skew() -> None:
282
282
  )
283
283
  for skew in _events_named(events, "delegate_agent_substrate_skew"):
284
284
  assert "thinking" not in (skew.get("ignored_keys") or [])
285
+
286
+
287
+ # ---------------------------------------------------------------------------
288
+ # 4. CodeAct / MemAct: the same thinking profile must not crash (NameError)
289
+ # ---------------------------------------------------------------------------
290
+ # Until 2026-09-26 both adapters called `normalize_thinking` in their
291
+ # delegate_agent substrate branch without importing it, so a host-granted
292
+ # profile carrying `thinking` raised NameError and failed the parent run.
293
+
294
+
295
+ @pytest.mark.parametrize(
296
+ "factory,logic_cls,workflow_id",
297
+ [
298
+ (create_codeact_workflow, CodeActLogic, "codeact_agent"),
299
+ (create_memact_workflow, MemActLogic, "memact_agent"),
300
+ ],
301
+ ids=["codeact", "memact"],
302
+ )
303
+ def test_sibling_substrate_profile_thinking_pins_the_child_without_crashing(factory, logic_cls, workflow_id) -> None:
304
+ events: List[Tuple[str, Dict[str, Any]]] = []
305
+ delegated = {"done": False}
306
+
307
+ def llm_handler(run: RunState, effect: Effect, default_next_node: Optional[str]) -> EffectOutcome:
308
+ del effect, default_next_node
309
+ if getattr(run, "parent_run_id", None):
310
+ return EffectOutcome.completed({"content": "FINAL: child done", "tool_calls": [], "finish_reason": "stop"})
311
+ if not delegated["done"]:
312
+ delegated["done"] = True
313
+ return EffectOutcome.completed(
314
+ {
315
+ "content": "Delegating.",
316
+ "tool_calls": [
317
+ {
318
+ "name": "delegate_agent",
319
+ "arguments": {"task": "Draft it.", "substrate": "drafting"},
320
+ "call_id": "d1",
321
+ }
322
+ ],
323
+ "finish_reason": "tool_calls",
324
+ }
325
+ )
326
+ return EffectOutcome.completed({"content": "FINAL: parent done", "tool_calls": [], "finish_reason": "stop"})
327
+
328
+ runtime = Runtime(
329
+ run_store=InMemoryRunStore(),
330
+ ledger_store=InMemoryLedgerStore(),
331
+ effect_handlers={EffectType.LLM_CALL: llm_handler},
332
+ workflow_registry=WorkflowRegistry(),
333
+ )
334
+ workflow = factory(
335
+ logic=logic_cls(tools=[DELEGATE_AGENT_TOOL]),
336
+ workflow_id=workflow_id,
337
+ on_step=lambda s, d: events.append((s, dict(d))),
338
+ )
339
+ runtime.workflow_registry.register(workflow)
340
+ run_id = runtime.start(
341
+ workflow=workflow,
342
+ vars={
343
+ "context": {"task": "Delegate the task.", "messages": []},
344
+ "_runtime": {
345
+ "inbox": [],
346
+ "thinking": "high",
347
+ "delegate_substrates": {"drafting": {**PALETTE_BASE, "thinking": "low"}},
348
+ },
349
+ },
350
+ actor_id=None,
351
+ session_id=None,
352
+ )
353
+ for _ in range(300):
354
+ state = runtime.tick(workflow=workflow, run_id=run_id, max_steps=1)
355
+ if state.status in (RunStatus.COMPLETED, RunStatus.FAILED):
356
+ break
357
+ final = runtime.get_state(run_id)
358
+ assert final.status == RunStatus.COMPLETED, final.error
359
+ assert _child_runtime_ns(runtime, run_id).get("thinking") == "low"
360
+ assert runtime.get_state(run_id).vars["_runtime"].get("thinking") == "high"
361
+ applied = _events_named(events, "delegate_agent_substrate")
362
+ assert applied and applied[0].get("thinking") == "low"
File without changes
File without changes