agentx-dev 3.4.1__tar.gz → 3.4.3__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 (74) hide show
  1. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/CHANGELOG.md +72 -0
  2. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/LICENSE +21 -21
  3. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/PKG-INFO +16 -3
  4. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/README.md +1160 -1156
  5. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Agents/Agent.py +527 -527
  6. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Agents/__init__.py +10 -10
  7. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/AsyncTools.py +160 -160
  8. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/AutoSetup.py +164 -164
  9. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Cache.py +471 -471
  10. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/ChatModel.py +2274 -2191
  11. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Compiler.py +308 -308
  12. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Config.py +144 -144
  13. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/DefaultTools.py +76 -9
  14. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Embeddings.py +681 -681
  15. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Evals.py +514 -514
  16. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Handoffs.py +420 -420
  17. agentx_dev-3.4.3/agentx_dev/Media.py +864 -0
  18. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Memory.py +474 -474
  19. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Observability.py +494 -494
  20. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Planner.py +271 -271
  21. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/AgentRun.py +2870 -2870
  22. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/AsyncAgentRun.py +1061 -1061
  23. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/__init__.py +13 -13
  24. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/promptTemplate.yaml +139 -139
  25. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Splitters.py +306 -306
  26. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Streaming.py +297 -297
  27. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Supervisor.py +1937 -1937
  28. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Tools.py +246 -246
  29. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/__init__.py +43 -43
  30. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/chroma_store.py +171 -171
  31. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/pg_store.py +237 -237
  32. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/qdrant_store.py +239 -239
  33. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/WebTools.py +501 -501
  34. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/__init__.py +236 -236
  35. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/resources/__init__.py +3 -3
  36. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/PKG-INFO +16 -3
  37. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/requires.txt +10 -0
  38. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/agentic_rag_demo.py +270 -270
  39. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/async_quickstart.py +81 -81
  40. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/chatbot_example.py +206 -206
  41. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/mcp_github_triage_demo.py +248 -248
  42. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/planner_example.py +93 -93
  43. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/supervisor_codebase_analysis_demo.py +257 -257
  44. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/supervisor_example.py +97 -97
  45. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/sync_quickstart.py +75 -75
  46. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_1_features_demo.py +246 -246
  47. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_comprehensive_demo.py +446 -446
  48. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_features_demo.py +260 -260
  49. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/pyproject.toml +10 -1
  50. agentx_dev-3.4.1/agentx_dev/Media.py +0 -565
  51. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/AGENTX.md +0 -0
  52. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/CONTRIBUTING.md +0 -0
  53. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/MANIFEST.in +0 -0
  54. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Loader.py +0 -0
  55. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/MCP.py +0 -0
  56. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Session.py +0 -0
  57. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/resources/promptTemplate.yaml +0 -0
  58. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/SOURCES.txt +0 -0
  59. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/dependency_links.txt +0 -0
  60. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/top_level.txt +0 -0
  61. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/README.md +0 -0
  62. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/async_example.py +0 -0
  63. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/auto_features_example.py +0 -0
  64. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/caching_example.py +0 -0
  65. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/complete_example.py +0 -0
  66. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/concurrent_example.py +0 -0
  67. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/concurrent_tool_example.py +0 -0
  68. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/file_agent_demo.py +0 -0
  69. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/function_calling_demo.py +0 -0
  70. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/mcp_demo.py +0 -0
  71. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/observability_example.py +0 -0
  72. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/orchestration_demo.py +0 -0
  73. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/robust_link_scraper.py +0 -0
  74. {agentx_dev-3.4.1 → agentx_dev-3.4.3}/setup.cfg +0 -0
@@ -4,6 +4,78 @@ All notable changes to `agentx-dev` are documented here. Format loosely
4
4
  follows [Keep a Changelog](https://keepachangelog.com/); versioning is
5
5
  [Semver](https://semver.org/).
6
6
 
7
+ ## [3.4.3] - 2026-09-26
8
+
9
+ Two path-resolution fixes for Windows sandboxes. Non-breaking.
10
+
11
+ ### Fixed
12
+
13
+ - **`full_access(["/workspace"])` now means the project's workspace
14
+ folder, not the drive root.** On Windows a rooted path without a drive
15
+ letter resolves to the current drive, so the sandbox became
16
+ `C:\workspace`; `auto_create_paths` then created it, and an agent
17
+ asked for `workspace/spam.csv` searched an empty directory outside the
18
+ project and reported the file missing. Slash-rooted sandbox roots are
19
+ now re-rooted at the running project, matching what a leading slash
20
+ already meant for tool arguments. POSIX absolute paths (`/workspace`
21
+ as a Docker mount) and drive-qualified paths are untouched.
22
+ - **`workspace/report.md` no longer nests into
23
+ `<workspace>/workspace/report.md`.** The `workspace` field documented
24
+ this pass-through, but only the `./workspace/...` spelling had it.
25
+ Models name the workspace folder constantly, so the missing case hit
26
+ often; new files still resolve into the workspace as before.
27
+
28
+ ## [3.4.2] - 2026-09-19
29
+
30
+ `media=` everywhere, CSV / text / Excel attachments, and structured output
31
+ on models that need the Responses API. Non-breaking.
32
+
33
+ ### Added
34
+
35
+ - **`media=` on chat models and structured output.** `llm.invoke`,
36
+ `llm.ainvoke`, and `with_structured_output(...).invoke` / `.ainvoke` take
37
+ `media=[...]` (paths, URLs, `Media`, part dicts), appended to the last
38
+ user turn, matching the agent runner. Media inside `content` lists
39
+ already worked; this adds the argument.
40
+ - **CSV, text files, and Excel in `media=`.** Text-like files (CSV, TSV,
41
+ TXT, Markdown, JSON, XML, YAML, HTML) are read as text -- exactly as
42
+ written, UTF-8 or Windows-1252, CRLF normalised -- and spreadsheets
43
+ (.xlsx / .xls / .ods) are converted with pandas (`dtype=object`, so
44
+ cell values aren't re-inferred) to one CSV block per sheet. Both reach
45
+ GPT (chat and Responses) and Claude as a labelled text block, which
46
+ every model accepts. New `Media.text()` / `Media.spreadsheet()`; a
47
+ 100,000-character cap (`max_chars=`, `truncate=True`). pandas and
48
+ openpyxl are now core dependencies, so spreadsheets work after a plain
49
+ `pip install agentx-dev` (`[excel]` still works). Date cells without a
50
+ time are written as dates, not `... 00:00:00`.
51
+ - **Media docs section.** Its own nav group: Overview & flow, With chat
52
+ models, With agents, Reference (constructors, per-provider wire
53
+ formats, errors). `docs/guides/media.md` is now a pointer to it.
54
+
55
+ ### Fixed
56
+
57
+ - **`with_structured_output` on models that need the Responses API.**
58
+ Structured output forces a single tool; if the Responses API rejects a
59
+ forced tool choice for the model, `GPT` retries with
60
+ `tool_choice="required"` (the same tool when there is only one), then
61
+ `"auto"`, remembering it per model. `StructuredOutputRunnable` also
62
+ accepts a JSON text answer that validates against the schema.
63
+ - **`.txt` media failed on Claude.** 3.4.0 stored text files as base64
64
+ documents, which Anthropic only accepts for PDFs. Text files now go
65
+ out as text; older base64 text parts in saved histories are decoded
66
+ on the way out.
67
+ - **Unsupported files reached the provider.** `Media.document()`
68
+ accepted any file type -- including CSV, which Windows' own type table
69
+ labels `application/vnd.ms-excel` -- and sent it as an attachment
70
+ neither provider accepts. Word, PowerPoint and archives now raise
71
+ `ValueError` with the fix before any request; a text file or
72
+ spreadsheet by URL raises too, since only PDFs can be fetched by URL.
73
+ - **Misleading WARNING on recovered calls.** The retry wrapper logged
74
+ every non-retryable 400 at WARNING before the caller could recover, so a
75
+ call that switched to the Responses API and succeeded still printed the
76
+ original "Function tools with reasoning_effort are not supported" text.
77
+ Now DEBUG; recoveries log their own WARNING and real failures log ERROR.
78
+
7
79
  ## [3.4.1] - 2026-09-18
8
80
 
9
81
  Tool calls on OpenAI models that require the Responses API.
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Bruce-Arhin Shadrach
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bruce-Arhin Shadrach
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-dev
3
- Version: 3.4.1
3
+ Version: 3.4.3
4
4
  Summary: A production-grade Python framework for building LLM agents. Multi-provider chat, permission-gated tools, RAG (in-mem + Chroma/Qdrant/pgvector), semantic memory, Supervisor + Handoffs multi-agent orchestration with streaming, evals harness, prompt caching, Batch API, prompt-optimizer, MCP integration.
5
5
  Author-email: Bruce-Arhin Shadrach <brucearhin098@gmail.com>
6
6
  License: MIT License
@@ -35,6 +35,8 @@ Requires-Dist: openai>=1.0.0
35
35
  Requires-Dist: pydantic>=2.0
36
36
  Requires-Dist: PyYAML>=5.3.1
37
37
  Requires-Dist: rich>=10.0
38
+ Requires-Dist: pandas>=1.5
39
+ Requires-Dist: openpyxl>=3.1
38
40
  Provides-Extra: anthropic
39
41
  Requires-Dist: anthropic>=0.36; extra == "anthropic"
40
42
  Provides-Extra: mcp
@@ -48,10 +50,15 @@ Provides-Extra: qdrant
48
50
  Requires-Dist: qdrant-client>=1.6; extra == "qdrant"
49
51
  Provides-Extra: pgvector
50
52
  Requires-Dist: psycopg[binary]>=3.1; extra == "pgvector"
53
+ Provides-Extra: excel
54
+ Requires-Dist: pandas>=1.5; extra == "excel"
55
+ Requires-Dist: openpyxl>=3.1; extra == "excel"
51
56
  Provides-Extra: dev
52
57
  Requires-Dist: pytest>=7.4; extra == "dev"
53
58
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
54
59
  Requires-Dist: numpy>=1.24; extra == "dev"
60
+ Requires-Dist: pandas>=1.5; extra == "dev"
61
+ Requires-Dist: openpyxl>=3.1; extra == "dev"
55
62
  Provides-Extra: all
56
63
  Requires-Dist: anthropic>=0.36; extra == "all"
57
64
  Requires-Dist: mcp>=0.1; extra == "all"
@@ -60,6 +67,8 @@ Requires-Dist: opentelemetry-sdk>=1.20; extra == "all"
60
67
  Requires-Dist: chromadb>=0.4; extra == "all"
61
68
  Requires-Dist: qdrant-client>=1.6; extra == "all"
62
69
  Requires-Dist: psycopg[binary]>=3.1; extra == "all"
70
+ Requires-Dist: pandas>=1.5; extra == "all"
71
+ Requires-Dist: openpyxl>=3.1; extra == "all"
63
72
  Dynamic: license-file
64
73
 
65
74
  # agentx_dev
@@ -82,7 +91,7 @@ breaks — see [Upgrading](docs/guides/upgrading.md).
82
91
 
83
92
  | Feature | What you get |
84
93
  |---|---|
85
- | **Media input** | `runner.invoke("Describe this", media=["photo.jpg", "report.pdf"])`. Paths, URLs, bytes or `Media` objects. The same code works on `GPT()` and `Claude()`: each model gets its own format, and either provider's native part shape is accepted too. Unsupported pairs — audio to Claude, a PDF URL to GPT — fail fast with a clear `ValueError`. [Guide](docs/guides/media.md). |
94
+ | **Media input** | `runner.invoke("Describe this", media=["photo.jpg", "report.pdf"])`. Paths, URLs, bytes or `Media` objects. The same code works on `GPT()` and `Claude()`: each model gets its own format, and either provider's native part shape is accepted too. Unsupported pairs — audio to Claude, a PDF URL to GPT — fail fast with a clear `ValueError`. [Media docs](docs/media/overview.md). |
86
95
  | **Models that adapt** | Parameter support changes between model generations — `reasoning_effort`'s allowed values, `max_tokens` vs `max_completion_tokens`, Claude's `temperature` + `top_p` conflict. When a model rejects a parameter, `GPT` and `Claude` make the smallest change the error asks for (`'none'` → `'low'`), retry, and remember it for that model. Logged at WARNING; `adapt_params=False` opts out. [Details](docs/concepts/models.md#old-and-new-models). |
87
96
  | **More Claude settings** | `Claude(top_p=, top_k=, thinking=, stop_sequences=)`. `temperature` is only sent when you set it. |
88
97
  | **Workspace paths** | With a workspace set, `/notes.txt` means the workspace's `notes.txt`, not `C:\notes.txt`. `run_python` now starts in the workspace, so `open("notes.txt")` finds it. |
@@ -972,10 +981,14 @@ llm.invoke([{"role": "user", "content": ["What's in this photo?", Media.image("c
972
981
  |---|---|---|
973
982
  | image (file or URL) | yes | yes |
974
983
  | PDF | file | file or URL |
984
+ | CSV, TXT, JSON, Markdown ... | yes, as text | yes, as text |
985
+ | Excel (`.xlsx`) | yes, CSV per sheet (pandas, installed with agentx-dev) | same |
975
986
  | audio (wav / mp3) | audio models | no — `ValueError` |
976
987
 
977
988
  Paths are relative to where your program runs, not the agent's
978
- workspace. See [Media](docs/guides/media.md).
989
+ workspace. The same `media=` works on `llm.invoke(...)` and
990
+ `llm.with_structured_output(Schema).invoke(...)`. See
991
+ [Media](docs/media/overview.md).
979
992
 
980
993
  ## Get a typed result back
981
994