agentx-dev 3.4.0__tar.gz → 3.4.2__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.0 → agentx_dev-3.4.2}/CHANGELOG.md +78 -0
  2. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/LICENSE +21 -21
  3. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/PKG-INFO +16 -3
  4. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/README.md +6 -2
  5. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Agents/Agent.py +527 -527
  6. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Agents/__init__.py +10 -10
  7. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/AsyncTools.py +160 -160
  8. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/AutoSetup.py +164 -164
  9. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Cache.py +471 -471
  10. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/ChatModel.py +379 -15
  11. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Compiler.py +308 -308
  12. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Config.py +144 -144
  13. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Embeddings.py +681 -681
  14. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Evals.py +514 -514
  15. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Handoffs.py +420 -420
  16. agentx_dev-3.4.2/agentx_dev/Media.py +864 -0
  17. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Memory.py +474 -474
  18. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Observability.py +494 -494
  19. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Planner.py +271 -271
  20. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Runner/__init__.py +13 -13
  21. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Runner/promptTemplate.yaml +139 -139
  22. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Splitters.py +306 -306
  23. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Streaming.py +297 -297
  24. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Supervisor.py +1937 -1937
  25. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Tools.py +246 -246
  26. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/VectorStores/__init__.py +43 -43
  27. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/VectorStores/chroma_store.py +171 -171
  28. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/VectorStores/pg_store.py +237 -237
  29. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/VectorStores/qdrant_store.py +239 -239
  30. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/WebTools.py +501 -501
  31. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/resources/__init__.py +3 -3
  32. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev.egg-info/PKG-INFO +16 -3
  33. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev.egg-info/requires.txt +10 -0
  34. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/agentic_rag_demo.py +270 -270
  35. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/async_quickstart.py +81 -81
  36. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/chatbot_example.py +206 -206
  37. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/mcp_github_triage_demo.py +248 -248
  38. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/planner_example.py +93 -93
  39. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/supervisor_codebase_analysis_demo.py +257 -257
  40. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/supervisor_example.py +97 -97
  41. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/sync_quickstart.py +75 -75
  42. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/v3_1_1_features_demo.py +246 -246
  43. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/v3_1_comprehensive_demo.py +446 -446
  44. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/v3_1_features_demo.py +260 -260
  45. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/pyproject.toml +10 -1
  46. agentx_dev-3.4.0/agentx_dev/Media.py +0 -500
  47. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/AGENTX.md +0 -0
  48. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/CONTRIBUTING.md +0 -0
  49. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/MANIFEST.in +0 -0
  50. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/DefaultTools.py +0 -0
  51. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Loader.py +0 -0
  52. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/MCP.py +0 -0
  53. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Runner/AgentRun.py +0 -0
  54. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Runner/AsyncAgentRun.py +0 -0
  55. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/Session.py +0 -0
  56. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/__init__.py +0 -0
  57. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev/resources/promptTemplate.yaml +0 -0
  58. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev.egg-info/SOURCES.txt +0 -0
  59. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev.egg-info/dependency_links.txt +0 -0
  60. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/agentx_dev.egg-info/top_level.txt +0 -0
  61. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/README.md +0 -0
  62. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/async_example.py +0 -0
  63. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/auto_features_example.py +0 -0
  64. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/caching_example.py +0 -0
  65. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/complete_example.py +0 -0
  66. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/concurrent_example.py +0 -0
  67. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/concurrent_tool_example.py +0 -0
  68. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/file_agent_demo.py +0 -0
  69. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/function_calling_demo.py +0 -0
  70. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/mcp_demo.py +0 -0
  71. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/observability_example.py +0 -0
  72. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/orchestration_demo.py +0 -0
  73. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/examples/robust_link_scraper.py +0 -0
  74. {agentx_dev-3.4.0 → agentx_dev-3.4.2}/setup.cfg +0 -0
@@ -4,6 +4,84 @@ 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.2] - 2026-09-19
8
+
9
+ `media=` everywhere, CSV / text / Excel attachments, and structured output
10
+ on models that need the Responses API. Non-breaking.
11
+
12
+ ### Added
13
+
14
+ - **`media=` on chat models and structured output.** `llm.invoke`,
15
+ `llm.ainvoke`, and `with_structured_output(...).invoke` / `.ainvoke` take
16
+ `media=[...]` (paths, URLs, `Media`, part dicts), appended to the last
17
+ user turn, matching the agent runner. Media inside `content` lists
18
+ already worked; this adds the argument.
19
+ - **CSV, text files, and Excel in `media=`.** Text-like files (CSV, TSV,
20
+ TXT, Markdown, JSON, XML, YAML, HTML) are read as text -- exactly as
21
+ written, UTF-8 or Windows-1252, CRLF normalised -- and spreadsheets
22
+ (.xlsx / .xls / .ods) are converted with pandas (`dtype=object`, so
23
+ cell values aren't re-inferred) to one CSV block per sheet. Both reach
24
+ GPT (chat and Responses) and Claude as a labelled text block, which
25
+ every model accepts. New `Media.text()` / `Media.spreadsheet()`; a
26
+ 100,000-character cap (`max_chars=`, `truncate=True`). pandas and
27
+ openpyxl are now core dependencies, so spreadsheets work after a plain
28
+ `pip install agentx-dev` (`[excel]` still works). Date cells without a
29
+ time are written as dates, not `... 00:00:00`.
30
+ - **Media docs section.** Its own nav group: Overview & flow, With chat
31
+ models, With agents, Reference (constructors, per-provider wire
32
+ formats, errors). `docs/guides/media.md` is now a pointer to it.
33
+
34
+ ### Fixed
35
+
36
+ - **`with_structured_output` on models that need the Responses API.**
37
+ Structured output forces a single tool; if the Responses API rejects a
38
+ forced tool choice for the model, `GPT` retries with
39
+ `tool_choice="required"` (the same tool when there is only one), then
40
+ `"auto"`, remembering it per model. `StructuredOutputRunnable` also
41
+ accepts a JSON text answer that validates against the schema.
42
+ - **`.txt` media failed on Claude.** 3.4.0 stored text files as base64
43
+ documents, which Anthropic only accepts for PDFs. Text files now go
44
+ out as text; older base64 text parts in saved histories are decoded
45
+ on the way out.
46
+ - **Unsupported files reached the provider.** `Media.document()`
47
+ accepted any file type -- including CSV, which Windows' own type table
48
+ labels `application/vnd.ms-excel` -- and sent it as an attachment
49
+ neither provider accepts. Word, PowerPoint and archives now raise
50
+ `ValueError` with the fix before any request; a text file or
51
+ spreadsheet by URL raises too, since only PDFs can be fetched by URL.
52
+ - **Misleading WARNING on recovered calls.** The retry wrapper logged
53
+ every non-retryable 400 at WARNING before the caller could recover, so a
54
+ call that switched to the Responses API and succeeded still printed the
55
+ original "Function tools with reasoning_effort are not supported" text.
56
+ Now DEBUG; recoveries log their own WARNING and real failures log ERROR.
57
+
58
+ ## [3.4.1] - 2026-09-18
59
+
60
+ Tool calls on OpenAI models that require the Responses API.
61
+
62
+ ### Fixed
63
+
64
+ - **Tool calls failed on models that need the Responses API.** Some
65
+ OpenAI models (e.g. `gpt-6-astra`) reject function tools combined with
66
+ reasoning on `/v1/chat/completions`, and the error's suggested fix --
67
+ `reasoning_effort='none'` -- is itself rejected by those models, so
68
+ 3.4.0's parameter adaptation had nowhere to go. `GPT` now switches a
69
+ model's tool calls to `/v1/responses` when the provider says to,
70
+ retries, and remembers it (WARNING-logged). History is translated only
71
+ at the wire (`function_call` / `function_call_output` items paired by
72
+ `call_id`), so agents, `tool_calls`, and completions are unchanged.
73
+ Learned parameter fixes carry across endpoints (`reasoning.effort` maps
74
+ to `reasoning_effort`). Requests are sent with `store=False`, matching
75
+ chat completions. Plain text calls and streaming stay on chat
76
+ completions.
77
+ - Requests chat completions can't express (a document URL) go to the
78
+ Responses API, which accepts `file_url`, instead of raising.
79
+
80
+ ### Added
81
+
82
+ - `GPT(use_responses_api=None | True | False)`: automatic (default),
83
+ always, or never.
84
+
7
85
  ## [3.4.0] - 2026-09-18
8
86
 
9
87
  Media input for GPT and Claude, models that adapt to each generation's
@@ -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.0
3
+ Version: 3.4.2
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
 
@@ -18,7 +18,7 @@ breaks — see [Upgrading](docs/guides/upgrading.md).
18
18
 
19
19
  | Feature | What you get |
20
20
  |---|---|
21
- | **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). |
21
+ | **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). |
22
22
  | **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). |
23
23
  | **More Claude settings** | `Claude(top_p=, top_k=, thinking=, stop_sequences=)`. `temperature` is only sent when you set it. |
24
24
  | **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. |
@@ -908,10 +908,14 @@ llm.invoke([{"role": "user", "content": ["What's in this photo?", Media.image("c
908
908
  |---|---|---|
909
909
  | image (file or URL) | yes | yes |
910
910
  | PDF | file | file or URL |
911
+ | CSV, TXT, JSON, Markdown ... | yes, as text | yes, as text |
912
+ | Excel (`.xlsx`) | yes, CSV per sheet (pandas, installed with agentx-dev) | same |
911
913
  | audio (wav / mp3) | audio models | no — `ValueError` |
912
914
 
913
915
  Paths are relative to where your program runs, not the agent's
914
- workspace. See [Media](docs/guides/media.md).
916
+ workspace. The same `media=` works on `llm.invoke(...)` and
917
+ `llm.with_structured_output(Schema).invoke(...)`. See
918
+ [Media](docs/media/overview.md).
915
919
 
916
920
  ## Get a typed result back
917
921