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.
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/CHANGELOG.md +72 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/LICENSE +21 -21
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/PKG-INFO +16 -3
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/README.md +1160 -1156
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Agents/Agent.py +527 -527
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Agents/__init__.py +10 -10
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/AsyncTools.py +160 -160
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/AutoSetup.py +164 -164
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Cache.py +471 -471
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/ChatModel.py +2274 -2191
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Compiler.py +308 -308
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Config.py +144 -144
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/DefaultTools.py +76 -9
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Embeddings.py +681 -681
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Evals.py +514 -514
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Handoffs.py +420 -420
- agentx_dev-3.4.3/agentx_dev/Media.py +864 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Memory.py +474 -474
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Observability.py +494 -494
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Planner.py +271 -271
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/AgentRun.py +2870 -2870
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/AsyncAgentRun.py +1061 -1061
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/__init__.py +13 -13
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Runner/promptTemplate.yaml +139 -139
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Splitters.py +306 -306
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Streaming.py +297 -297
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Supervisor.py +1937 -1937
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Tools.py +246 -246
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/__init__.py +43 -43
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/chroma_store.py +171 -171
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/pg_store.py +237 -237
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/VectorStores/qdrant_store.py +239 -239
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/WebTools.py +501 -501
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/__init__.py +236 -236
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/resources/__init__.py +3 -3
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/PKG-INFO +16 -3
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/requires.txt +10 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/agentic_rag_demo.py +270 -270
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/async_quickstart.py +81 -81
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/chatbot_example.py +206 -206
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/mcp_github_triage_demo.py +248 -248
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/planner_example.py +93 -93
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/supervisor_codebase_analysis_demo.py +257 -257
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/supervisor_example.py +97 -97
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/sync_quickstart.py +75 -75
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_1_features_demo.py +246 -246
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_comprehensive_demo.py +446 -446
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/v3_1_features_demo.py +260 -260
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/pyproject.toml +10 -1
- agentx_dev-3.4.1/agentx_dev/Media.py +0 -565
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/AGENTX.md +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/CONTRIBUTING.md +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/MANIFEST.in +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Loader.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/MCP.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/Session.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev/resources/promptTemplate.yaml +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/SOURCES.txt +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/dependency_links.txt +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/agentx_dev.egg-info/top_level.txt +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/README.md +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/async_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/auto_features_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/caching_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/complete_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/concurrent_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/concurrent_tool_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/file_agent_demo.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/function_calling_demo.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/mcp_demo.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/observability_example.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/orchestration_demo.py +0 -0
- {agentx_dev-3.4.1 → agentx_dev-3.4.3}/examples/robust_link_scraper.py +0 -0
- {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.
|
|
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`. [
|
|
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.
|
|
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
|
|