agentx-python 0.6.15__tar.gz → 0.6.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 (67) hide show
  1. {agentx_python-0.6.15/agentx_python.egg-info → agentx_python-0.6.16}/PKG-INFO +66 -38
  2. {agentx_python-0.6.15 → agentx_python-0.6.16}/README.md +65 -37
  3. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/agentx.py +6 -0
  4. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/cli.py +1 -1
  5. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/_term.py +1 -1
  6. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/adapters/http_endpoint.py +1 -1
  7. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/adapters/precomputed.py +1 -1
  8. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/client.py +4 -4
  9. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/datasets.py +1 -1
  10. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/evaluation_settings.py +1 -1
  11. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/models.py +10 -10
  12. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/prompts.py +1 -1
  13. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/results.py +1 -1
  14. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/runner.py +12 -12
  15. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/_traced_call.py +4 -4
  16. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/anthropic.py +4 -4
  17. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/autogen.py +5 -5
  18. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/crewai.py +6 -6
  19. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/google_adk.py +9 -9
  20. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/google_genai.py +6 -6
  21. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/langchain.py +10 -10
  22. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/litellm.py +4 -4
  23. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/llamaindex.py +6 -6
  24. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/openai.py +6 -6
  25. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/openai_agents.py +10 -10
  26. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/client.py +1 -1
  27. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/models.py +5 -1
  28. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/online_evaluators.py +15 -2
  29. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/patterns.py +3 -3
  30. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/profile.py +1 -1
  31. agentx_python-0.6.16/agentx/outcomes.py +84 -0
  32. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/tracing/ingest_client.py +3 -3
  33. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/tracing/tracer.py +99 -54
  34. agentx_python-0.6.16/agentx/version.py +1 -0
  35. {agentx_python-0.6.15 → agentx_python-0.6.16/agentx_python.egg-info}/PKG-INFO +66 -38
  36. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/SOURCES.txt +1 -0
  37. agentx_python-0.6.15/agentx/version.py +0 -1
  38. {agentx_python-0.6.15 → agentx_python-0.6.16}/LICENSE +0 -0
  39. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/__init__.py +0 -0
  40. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/__init__.py +0 -0
  41. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/adapters/__init__.py +0 -0
  42. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/adapters/raw.py +0 -0
  43. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/redaction.py +0 -0
  44. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/reporting.py +0 -0
  45. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/evaluations/tracing.py +0 -0
  46. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/exceptions.py +0 -0
  47. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/integrations/__init__.py +0 -0
  48. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/__init__.py +0 -0
  49. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/monitor/signals.py +0 -0
  50. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/py.typed +0 -0
  51. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/resources/__init__.py +0 -0
  52. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/resources/agent.py +0 -0
  53. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/resources/conversation.py +0 -0
  54. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/resources/workforce.py +0 -0
  55. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/tracing/__init__.py +0 -0
  56. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/tracing/ci_types.py +0 -0
  57. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx/util.py +0 -0
  58. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/dependency_links.txt +0 -0
  59. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/entry_points.txt +0 -0
  60. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/not-zip-safe +0 -0
  61. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/requires.txt +0 -0
  62. {agentx_python-0.6.15 → agentx_python-0.6.16}/agentx_python.egg-info/top_level.txt +0 -0
  63. {agentx_python-0.6.15 → agentx_python-0.6.16}/setup.cfg +0 -0
  64. {agentx_python-0.6.15 → agentx_python-0.6.16}/setup.py +0 -0
  65. {agentx_python-0.6.15 → agentx_python-0.6.16}/tests/test_integration.py +0 -0
  66. {agentx_python-0.6.15 → agentx_python-0.6.16}/tests/test_integrations.py +0 -0
  67. {agentx_python-0.6.15 → agentx_python-0.6.16}/tests/test_span_tree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.6.15
3
+ Version: 0.6.16
4
4
  Summary: Official Python SDK for AgentX (https://www.agentx.so/)
5
5
  Home-page: https://github.com/AgentX-ai/AgentX-python
6
6
  Author: Robin Wang and AgentX Team
@@ -66,7 +66,7 @@ Dynamic: summary
66
66
  [![Python versions](https://img.shields.io/pypi/pyversions/agentx-python)](https://pypi.org/project/agentx-python/)
67
67
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
68
68
 
69
- The official Python SDK for **[AgentX](https://app.agentx.so/)** an evaluation, tracing, and monitoring framework for AI agents, plus a client for AgentX's own hosted agents.
69
+ The official Python SDK for **[AgentX](https://app.agentx.so/)** - an evaluation, tracing, and monitoring framework for AI agents, plus a client for AgentX's own hosted agents.
70
70
 
71
71
  Also see [SDK Developer Docs](https://developers.agentx.so), [API Reference Docs](https://docs.agentx.so/reference)
72
72
 
@@ -78,24 +78,24 @@ Also see [SDK Developer Docs](https://developers.agentx.so), [API Reference Docs
78
78
  - [Installation](#installation)
79
79
  - [Authentication](#authentication)
80
80
  - [Quick start](#quick-start)
81
- - [Custom agent evaluations](#custom-agent-evaluations) LLM-as-a-judge, cosine / Jaccard similarity, any framework
82
- - [Production tracing](#production-tracing) record live agent runs from any framework
83
- - [Monitor](#monitor) automatic production monitoring, patterns and signals
84
- - [Self-host](#self-host) run Trace/Evaluate/Monitor on your own machine instead of the hosted dashboard
85
- - [Agents & conversations](#agents--conversations) chat with and orchestrate AgentX's own hosted agents
81
+ - [Custom agent evaluations](#custom-agent-evaluations) - LLM-as-a-judge, cosine / Jaccard similarity, any framework
82
+ - [Production tracing](#production-tracing) - record live agent runs from any framework
83
+ - [Monitor](#monitor) - automatic production monitoring, patterns and signals
84
+ - [Self-host](#self-host) - run Trace/Evaluate/Monitor on your own machine instead of the hosted dashboard
85
+ - [Agents & conversations](#agents--conversations) - chat with and orchestrate AgentX's own hosted agents
86
86
  - [Links](#links)
87
87
 
88
88
  ---
89
89
 
90
90
  ## Why AgentX
91
91
 
92
- - **Agent Evaluations** score **any** agent (LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP, or plain Python) against a dataset with LLM-as-a-judge ratings plus optional cosine, Jaccard, and BLEU/ROUGE similarity metrics. Configurable judge prompt/model, per-question judge guidelines, smoke testing for phrasing robustness, and a durable multi-judge analysis pass for a qualitative report.
93
- - **Production tracing** one decorator or context manager records every agent run (input, output, latency, tool calls, token usage, and a real span tree) into your workspace, for any framework.
94
- - **Monitor** check live traces against detection patterns or a sampled LLM judge, and read back triage-ready signals, no dashboard setup required.
95
- - **Prompt registry** make AgentX the source of truth for your own agent's prompts: pull a version at runtime, tag eval runs and live traces with it, let a judge propose a rewrite from your worst-rated results.
96
- - **Self-host** run the whole Trace/Evaluate/Monitor stack locally, bring your own LLM keys, no account required.
97
- - **Bring any LLM** works across major open and closed-source vendors, for evaluation, tracing, and AgentX's own hosted agents alike.
98
- - **AgentX's own hosted agents** a simple `Agent → Conversation → Message` mental model, chain-of-thought built in, multi-agent workforces, MCP support, and A2A publishing, for when you want AgentX to run the agent too, not just evaluate/trace/monitor it.
92
+ - **Agent Evaluations** - score **any** agent (LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP, or plain Python) against a dataset with LLM-as-a-judge ratings plus optional cosine, Jaccard, and BLEU/ROUGE similarity metrics. Configurable judge prompt/model, per-question judge guidelines, smoke testing for phrasing robustness, and a durable multi-judge analysis pass for a qualitative report.
93
+ - **Production tracing** - one decorator or context manager records every agent run (input, output, latency, tool calls, token usage, and a real span tree) into your workspace, for any framework.
94
+ - **Monitor** - check live traces against detection patterns or a sampled LLM judge, and read back triage-ready signals, no dashboard setup required.
95
+ - **Prompt registry** - make AgentX the source of truth for your own agent's prompts: pull a version at runtime, tag eval runs and live traces with it, let a judge propose a rewrite from your worst-rated results.
96
+ - **Self-host** - run the whole Trace/Evaluate/Monitor stack locally, bring your own LLM keys, no account required.
97
+ - **Bring any LLM** - works across major open and closed-source vendors, for evaluation, tracing, and AgentX's own hosted agents alike.
98
+ - **AgentX's own hosted agents** - a simple `Agent → Conversation → Message` mental model, chain-of-thought built in, multi-agent workforces, MCP support, and A2A publishing, for when you want AgentX to run the agent too, not just evaluate/trace/monitor it.
99
99
 
100
100
  ---
101
101
 
@@ -114,11 +114,11 @@ Requires Python 3.9 or newer.
114
114
  Get your API key at [app.agentx.so](https://app.agentx.so), then either pass it inline or expose it as an environment variable.
115
115
 
116
116
  ```python
117
- # Option A pass the key inline
117
+ # Option A - pass the key inline
118
118
  from agentx import AgentX
119
119
  client = AgentX(api_key="your-api-key-here")
120
120
 
121
- # Option B set AGENTX_API_KEY in your environment, then:
121
+ # Option B - set AGENTX_API_KEY in your environment, then:
122
122
  client = AgentX.from_env()
123
123
  ```
124
124
 
@@ -126,7 +126,7 @@ client = AgentX.from_env()
126
126
 
127
127
  ## Quick start
128
128
 
129
- Evaluate your own agent any framework, or plain Python against a dataset:
129
+ Evaluate your own agent - any framework, or plain Python - against a dataset:
130
130
 
131
131
  ```python
132
132
  from agentx import AgentX
@@ -154,7 +154,7 @@ That's it. The rest of this section covers building the dataset, framework adapt
154
154
 
155
155
  ## Custom agent evaluations
156
156
 
157
- Evaluate **any** AI agent LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP endpoints, or plain Python using AgentX as the scoring and reporting backend. Includes optional **cosine**, **Jaccard**, and **BLEU/ROUGE** similarity metrics alongside LLM-graded ratings.
157
+ Evaluate **any** AI agent - LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP endpoints, or plain Python - using AgentX as the scoring and reporting backend. Includes optional **cosine**, **Jaccard**, and **BLEU/ROUGE** similarity metrics alongside LLM-graded ratings.
158
158
 
159
159
  ```python
160
160
  report = (
@@ -177,7 +177,7 @@ print(report.recommendations) # list of prioritized, actionable fixes
177
177
 
178
178
  Ask a case's question several extra ways each run, LLM-paraphrased server-side, to catch agents that break on phrasing rather than substance, and override the judge's prompt/model per config, see [Smoke testing](EVALUATIONS.md#smoke-testing-phrasing-robustness) and [Configuring the judge](EVALUATIONS.md#configuring-the-judge) in the full guide.
179
179
 
180
- Since AgentX doesn't own your agent's code, `client.evaluations.prompts` lets AgentX become your prompt's *source of truth* instead the same problem LangSmith's Prompt Hub and Langfuse's Prompt Management solve. Pull a version at runtime, tag your eval runs (or live traces) with it, and let a judge propose a rewrite from your real worst-rated results a human always has to approve before it publishes:
180
+ Since AgentX doesn't own your agent's code, `client.evaluations.prompts` lets AgentX become your prompt's *source of truth* instead - the same problem LangSmith's Prompt Hub and Langfuse's Prompt Management solve. Pull a version at runtime, tag your eval runs (or live traces) with it, and let a judge propose a rewrite from your real worst-rated results - a human always has to approve before it publishes:
181
181
 
182
182
  ```python
183
183
  prompt = client.evaluations.prompts.get("support-agent-system-prompt") # or prompt.id
@@ -189,15 +189,15 @@ client.evaluations.run(
189
189
  ).execute(my_agent_fn)
190
190
  ```
191
191
 
192
- See [Prompt registry](EVALUATIONS.md#prompt-registry) in the full guide, or [self-host's docs](https://docs.agentx.so/self-host#prompt-registry) for the "Suggest improvement" dashboard flow (self-host only no hosted-SaaS equivalent yet).
192
+ See [Prompt registry](EVALUATIONS.md#prompt-registry) in the full guide, or [self-host's docs](https://docs.agentx.so/self-host#prompt-management) for the "Suggest improvement" dashboard flow (self-host only - no hosted-SaaS equivalent yet).
193
193
 
194
- See **[EVALUATIONS.md](EVALUATIONS.md)** for the full guide dataset builder, framework adapters, similarity metrics, smoke testing, judge configuration, prompt registry, and the complete API reference.
194
+ See **[EVALUATIONS.md](EVALUATIONS.md)** for the full guide - dataset builder, framework adapters, similarity metrics, smoke testing, judge configuration, prompt registry, and the complete API reference.
195
195
 
196
196
  ---
197
197
 
198
198
  ## Production tracing
199
199
 
200
- Record live agent runs into your workspace with a single decorator or context manager no changes to your agent's logic. Traces appear in the **Live Traces** tab and can be evaluated against your test datasets with [`tracer.evaluate_trace()`](TRACING.md#tracerevaluate_trace).
200
+ Record live agent runs into your workspace with a single decorator or context manager - no changes to your agent's logic. Traces appear in the **Live Traces** tab and can be evaluated against your test datasets with [`tracer.evaluate_trace()`](TRACING.md#tracerevaluate_trace).
201
201
 
202
202
  ```python
203
203
  from agentx import AgentX
@@ -226,9 +226,18 @@ with tracer.trace("rag-agent", framework="langchain") as span:
226
226
  span.output = llm.invoke(f"Context: {kb_result}\n\nQuery: {query}")
227
227
  ```
228
228
 
229
+ To time a tool call and capture its failures automatically, wrap the execution itself instead of reporting it after the fact:
230
+
231
+ ```python
232
+ with tracer.trace_tool_call("search_knowledge_base", input=query) as t:
233
+ t.output = search_knowledge_base(query)
234
+ ```
235
+
236
+ An exception escaping the block records the call as failed (`success=False` plus the error text, which is what Monitor's built-in "Tool failure" check and the dashboard's Tool quality column read) and then propagates unchanged.
237
+
229
238
  ### Framework integrations
230
239
 
231
- Each integration auto-captures LLM calls, tool calls, and token usage including prompt-caching
240
+ Each integration auto-captures LLM calls, tool calls, and token usage - including prompt-caching
232
241
  token counts (Anthropic's cache write/read, OpenAI/LiteLLM's cached tokens, Google GenAI's cached
233
242
  content), reported as their own `cache_read_tokens`/`cache_write_tokens` fields alongside the
234
243
  regular totals, no extra config needed. Self-host's cost estimate prices these separately from a
@@ -248,11 +257,11 @@ extra:
248
257
  | LlamaIndex | `pip install "agentx-python[llamaindex]"` | `AgentXLlamaIndexHandler`|
249
258
  | AutoGen | `pip install "agentx-python[autogen]"` | `AgentXAutoGenObserver` |
250
259
 
251
- Or plain Python wrap any function with `@tracer.trace(...)` and it just works, no framework required.
260
+ Or plain Python - wrap any function with `@tracer.trace(...)` and it just works, no framework required.
252
261
 
253
- Running specialist agents in parallel with a `ThreadPoolExecutor`? Wrap each worker body in `tracer.use_span(span)` so their steps land on the parent trace instead of becoming independent traces see [TRACING.md](TRACING.md) for the full pattern.
262
+ Running specialist agents in parallel with a `ThreadPoolExecutor`? Wrap each worker body in `tracer.use_span(span)` so their steps land on the parent trace instead of becoming independent traces - see [TRACING.md](TRACING.md) for the full pattern.
254
263
 
255
- See **[TRACING.md](TRACING.md)** for the complete guide session grouping, error handling, async support, and the full API reference.
264
+ See **[TRACING.md](TRACING.md)** for the complete guide - session grouping, error handling, async support, and the full API reference.
256
265
 
257
266
  ---
258
267
 
@@ -302,13 +311,32 @@ evaluator = client.monitor.online_evaluators.builder(
302
311
  client.monitor.online_evaluators.ratings(evaluator.id, window="7d")
303
312
  ```
304
313
 
314
+ An online evaluator can also judge **whole conversations** instead of single traces: pass `scope="session"` and the engine scores each multi-turn session once it's been idle for `idle_seconds`, re-scoring if the conversation resumes. And to close the loop with reality, `client.outcomes.report(...)` records what actually happened after the fact (a reopened ticket, a human confirmation) against a trace, feeding the dashboard's Judge Calibration view, which measures how often AgentX's automated verdicts agree with real outcomes. Both are self-host features.
315
+
316
+ ```python
317
+ client.monitor.online_evaluators.builder(
318
+ name="Conversation resolution",
319
+ evaluation_settings_id=settings.id,
320
+ scope="session", # judge the whole session, not each trace
321
+ idle_seconds=120, # score once the conversation has been quiet this long
322
+ alert_threshold=5,
323
+ ).publish()
324
+
325
+ client.outcomes.report(
326
+ trace_id=trace_id,
327
+ outcome="reopened",
328
+ is_negative=True,
329
+ reason="Customer reopened the ticket within 3 days",
330
+ )
331
+ ```
332
+
305
333
  See **[TRACING.md](TRACING.md)** for the complete Monitor guide.
306
334
 
307
335
  ---
308
336
 
309
337
  ## Self-host
310
338
 
311
- Prefer to run Trace/Evaluate/Monitor locally instead of the hosted dashboard no account, bring your own LLM keys? This SDK ships a launcher for [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval), a separate, portable governance engine:
339
+ Prefer to run Trace/Evaluate/Monitor locally instead of the hosted dashboard - no account, bring your own LLM keys? This SDK ships a launcher for [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval), a separate, portable governance engine:
312
340
 
313
341
  ```bash
314
342
  agentx-trace-eval --dev
@@ -321,22 +349,22 @@ export AGENTX_API_BASE_URL=http://localhost:4700/api/v1
321
349
  export AGENTX_API_KEY=<printed by agentx-trace-eval on first run>
322
350
  ```
323
351
 
324
- `agentx-trace-eval` isn't this SDK's own code the engine itself is a separate, compiled binary, downloaded on demand rather than bundled into this package, so installing `agentx-python` doesn't get any heavier for the (much more common) case of just talking to the hosted AgentX API. See that repo's README for what's included, and `AGENTX_INSTALL_DIR`/`AGENTX_TRACE_EVAL_VERSION`/`AGENTX_TRACE_EVAL_SKIP_WEB` env vars to control where/what it installs.
352
+ `agentx-trace-eval` isn't this SDK's own code - the engine itself is a separate, compiled binary, downloaded on demand rather than bundled into this package, so installing `agentx-python` doesn't get any heavier for the (much more common) case of just talking to the hosted AgentX API. See that repo's README for what's included, and `AGENTX_INSTALL_DIR`/`AGENTX_TRACE_EVAL_VERSION`/`AGENTX_TRACE_EVAL_SKIP_WEB` env vars to control where/what it installs.
325
353
 
326
354
  ---
327
355
 
328
356
  ## Agents & conversations
329
357
 
330
- Beyond evaluation, tracing, and monitoring, this SDK is also a client for AgentX's own hosted agents build, chat with, and orchestrate them directly.
358
+ Beyond evaluation, tracing, and monitoring, this SDK is also a client for AgentX's own hosted agents - build, chat with, and orchestrate them directly.
331
359
 
332
360
  ```python
333
361
  agent = client.list_agents()[0]
334
362
  conversation = agent.new_conversation()
335
363
 
336
- # Blocking returns the full response once it's ready
364
+ # Blocking - returns the full response once it's ready
337
365
  print(conversation.chat("What can you help me with?"))
338
366
 
339
- # Streaming yields ChatResponse objects as the model produces them
367
+ # Streaming - yields ChatResponse objects as the model produces them
340
368
  for chunk in conversation.chat_stream("Hello!"):
341
369
  if chunk.text:
342
370
  print(chunk.text, end="")
@@ -359,10 +387,10 @@ for chunk in workforce.chat_stream(conversation.id, "How can you help me with th
359
387
 
360
388
  ## Links
361
389
 
362
- - **Dashboard** [app.agentx.so](https://app.agentx.so)
363
- - **Website** [agentx.so](https://www.agentx.so/)
364
- - **PyPI** [agentx-python](https://pypi.org/project/agentx-python/)
365
- - **Tracing docs** [TRACING.md](TRACING.md)
366
- - **Evaluations docs** [EVALUATIONS.md](EVALUATIONS.md)
367
- - **Monitor docs** [docs.agentx.so/sdk/monitor](https://docs.agentx.so/sdk/monitor)
368
- - **Self-host** [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval)
390
+ - **Dashboard** - [app.agentx.so](https://app.agentx.so)
391
+ - **Website** - [agentx.so](https://www.agentx.so/)
392
+ - **PyPI** - [agentx-python](https://pypi.org/project/agentx-python/)
393
+ - **Tracing docs** - [TRACING.md](TRACING.md)
394
+ - **Evaluations docs** - [EVALUATIONS.md](EVALUATIONS.md)
395
+ - **Monitor docs** - [docs.agentx.so/sdk/monitor](https://docs.agentx.so/sdk/monitor)
396
+ - **Self-host** - [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval)
@@ -4,7 +4,7 @@
4
4
  [![Python versions](https://img.shields.io/pypi/pyversions/agentx-python)](https://pypi.org/project/agentx-python/)
5
5
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
6
 
7
- The official Python SDK for **[AgentX](https://app.agentx.so/)** an evaluation, tracing, and monitoring framework for AI agents, plus a client for AgentX's own hosted agents.
7
+ The official Python SDK for **[AgentX](https://app.agentx.so/)** - an evaluation, tracing, and monitoring framework for AI agents, plus a client for AgentX's own hosted agents.
8
8
 
9
9
  Also see [SDK Developer Docs](https://developers.agentx.so), [API Reference Docs](https://docs.agentx.so/reference)
10
10
 
@@ -16,24 +16,24 @@ Also see [SDK Developer Docs](https://developers.agentx.so), [API Reference Docs
16
16
  - [Installation](#installation)
17
17
  - [Authentication](#authentication)
18
18
  - [Quick start](#quick-start)
19
- - [Custom agent evaluations](#custom-agent-evaluations) LLM-as-a-judge, cosine / Jaccard similarity, any framework
20
- - [Production tracing](#production-tracing) record live agent runs from any framework
21
- - [Monitor](#monitor) automatic production monitoring, patterns and signals
22
- - [Self-host](#self-host) run Trace/Evaluate/Monitor on your own machine instead of the hosted dashboard
23
- - [Agents & conversations](#agents--conversations) chat with and orchestrate AgentX's own hosted agents
19
+ - [Custom agent evaluations](#custom-agent-evaluations) - LLM-as-a-judge, cosine / Jaccard similarity, any framework
20
+ - [Production tracing](#production-tracing) - record live agent runs from any framework
21
+ - [Monitor](#monitor) - automatic production monitoring, patterns and signals
22
+ - [Self-host](#self-host) - run Trace/Evaluate/Monitor on your own machine instead of the hosted dashboard
23
+ - [Agents & conversations](#agents--conversations) - chat with and orchestrate AgentX's own hosted agents
24
24
  - [Links](#links)
25
25
 
26
26
  ---
27
27
 
28
28
  ## Why AgentX
29
29
 
30
- - **Agent Evaluations** score **any** agent (LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP, or plain Python) against a dataset with LLM-as-a-judge ratings plus optional cosine, Jaccard, and BLEU/ROUGE similarity metrics. Configurable judge prompt/model, per-question judge guidelines, smoke testing for phrasing robustness, and a durable multi-judge analysis pass for a qualitative report.
31
- - **Production tracing** one decorator or context manager records every agent run (input, output, latency, tool calls, token usage, and a real span tree) into your workspace, for any framework.
32
- - **Monitor** check live traces against detection patterns or a sampled LLM judge, and read back triage-ready signals, no dashboard setup required.
33
- - **Prompt registry** make AgentX the source of truth for your own agent's prompts: pull a version at runtime, tag eval runs and live traces with it, let a judge propose a rewrite from your worst-rated results.
34
- - **Self-host** run the whole Trace/Evaluate/Monitor stack locally, bring your own LLM keys, no account required.
35
- - **Bring any LLM** works across major open and closed-source vendors, for evaluation, tracing, and AgentX's own hosted agents alike.
36
- - **AgentX's own hosted agents** a simple `Agent → Conversation → Message` mental model, chain-of-thought built in, multi-agent workforces, MCP support, and A2A publishing, for when you want AgentX to run the agent too, not just evaluate/trace/monitor it.
30
+ - **Agent Evaluations** - score **any** agent (LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP, or plain Python) against a dataset with LLM-as-a-judge ratings plus optional cosine, Jaccard, and BLEU/ROUGE similarity metrics. Configurable judge prompt/model, per-question judge guidelines, smoke testing for phrasing robustness, and a durable multi-judge analysis pass for a qualitative report.
31
+ - **Production tracing** - one decorator or context manager records every agent run (input, output, latency, tool calls, token usage, and a real span tree) into your workspace, for any framework.
32
+ - **Monitor** - check live traces against detection patterns or a sampled LLM judge, and read back triage-ready signals, no dashboard setup required.
33
+ - **Prompt registry** - make AgentX the source of truth for your own agent's prompts: pull a version at runtime, tag eval runs and live traces with it, let a judge propose a rewrite from your worst-rated results.
34
+ - **Self-host** - run the whole Trace/Evaluate/Monitor stack locally, bring your own LLM keys, no account required.
35
+ - **Bring any LLM** - works across major open and closed-source vendors, for evaluation, tracing, and AgentX's own hosted agents alike.
36
+ - **AgentX's own hosted agents** - a simple `Agent → Conversation → Message` mental model, chain-of-thought built in, multi-agent workforces, MCP support, and A2A publishing, for when you want AgentX to run the agent too, not just evaluate/trace/monitor it.
37
37
 
38
38
  ---
39
39
 
@@ -52,11 +52,11 @@ Requires Python 3.9 or newer.
52
52
  Get your API key at [app.agentx.so](https://app.agentx.so), then either pass it inline or expose it as an environment variable.
53
53
 
54
54
  ```python
55
- # Option A pass the key inline
55
+ # Option A - pass the key inline
56
56
  from agentx import AgentX
57
57
  client = AgentX(api_key="your-api-key-here")
58
58
 
59
- # Option B set AGENTX_API_KEY in your environment, then:
59
+ # Option B - set AGENTX_API_KEY in your environment, then:
60
60
  client = AgentX.from_env()
61
61
  ```
62
62
 
@@ -64,7 +64,7 @@ client = AgentX.from_env()
64
64
 
65
65
  ## Quick start
66
66
 
67
- Evaluate your own agent any framework, or plain Python against a dataset:
67
+ Evaluate your own agent - any framework, or plain Python - against a dataset:
68
68
 
69
69
  ```python
70
70
  from agentx import AgentX
@@ -92,7 +92,7 @@ That's it. The rest of this section covers building the dataset, framework adapt
92
92
 
93
93
  ## Custom agent evaluations
94
94
 
95
- Evaluate **any** AI agent LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP endpoints, or plain Python using AgentX as the scoring and reporting backend. Includes optional **cosine**, **Jaccard**, and **BLEU/ROUGE** similarity metrics alongside LLM-graded ratings.
95
+ Evaluate **any** AI agent - LangChain, CrewAI, AutoGen, LlamaIndex, OpenAI, Anthropic, HTTP endpoints, or plain Python - using AgentX as the scoring and reporting backend. Includes optional **cosine**, **Jaccard**, and **BLEU/ROUGE** similarity metrics alongside LLM-graded ratings.
96
96
 
97
97
  ```python
98
98
  report = (
@@ -115,7 +115,7 @@ print(report.recommendations) # list of prioritized, actionable fixes
115
115
 
116
116
  Ask a case's question several extra ways each run, LLM-paraphrased server-side, to catch agents that break on phrasing rather than substance, and override the judge's prompt/model per config, see [Smoke testing](EVALUATIONS.md#smoke-testing-phrasing-robustness) and [Configuring the judge](EVALUATIONS.md#configuring-the-judge) in the full guide.
117
117
 
118
- Since AgentX doesn't own your agent's code, `client.evaluations.prompts` lets AgentX become your prompt's *source of truth* instead the same problem LangSmith's Prompt Hub and Langfuse's Prompt Management solve. Pull a version at runtime, tag your eval runs (or live traces) with it, and let a judge propose a rewrite from your real worst-rated results a human always has to approve before it publishes:
118
+ Since AgentX doesn't own your agent's code, `client.evaluations.prompts` lets AgentX become your prompt's *source of truth* instead - the same problem LangSmith's Prompt Hub and Langfuse's Prompt Management solve. Pull a version at runtime, tag your eval runs (or live traces) with it, and let a judge propose a rewrite from your real worst-rated results - a human always has to approve before it publishes:
119
119
 
120
120
  ```python
121
121
  prompt = client.evaluations.prompts.get("support-agent-system-prompt") # or prompt.id
@@ -127,15 +127,15 @@ client.evaluations.run(
127
127
  ).execute(my_agent_fn)
128
128
  ```
129
129
 
130
- See [Prompt registry](EVALUATIONS.md#prompt-registry) in the full guide, or [self-host's docs](https://docs.agentx.so/self-host#prompt-registry) for the "Suggest improvement" dashboard flow (self-host only no hosted-SaaS equivalent yet).
130
+ See [Prompt registry](EVALUATIONS.md#prompt-registry) in the full guide, or [self-host's docs](https://docs.agentx.so/self-host#prompt-management) for the "Suggest improvement" dashboard flow (self-host only - no hosted-SaaS equivalent yet).
131
131
 
132
- See **[EVALUATIONS.md](EVALUATIONS.md)** for the full guide dataset builder, framework adapters, similarity metrics, smoke testing, judge configuration, prompt registry, and the complete API reference.
132
+ See **[EVALUATIONS.md](EVALUATIONS.md)** for the full guide - dataset builder, framework adapters, similarity metrics, smoke testing, judge configuration, prompt registry, and the complete API reference.
133
133
 
134
134
  ---
135
135
 
136
136
  ## Production tracing
137
137
 
138
- Record live agent runs into your workspace with a single decorator or context manager no changes to your agent's logic. Traces appear in the **Live Traces** tab and can be evaluated against your test datasets with [`tracer.evaluate_trace()`](TRACING.md#tracerevaluate_trace).
138
+ Record live agent runs into your workspace with a single decorator or context manager - no changes to your agent's logic. Traces appear in the **Live Traces** tab and can be evaluated against your test datasets with [`tracer.evaluate_trace()`](TRACING.md#tracerevaluate_trace).
139
139
 
140
140
  ```python
141
141
  from agentx import AgentX
@@ -164,9 +164,18 @@ with tracer.trace("rag-agent", framework="langchain") as span:
164
164
  span.output = llm.invoke(f"Context: {kb_result}\n\nQuery: {query}")
165
165
  ```
166
166
 
167
+ To time a tool call and capture its failures automatically, wrap the execution itself instead of reporting it after the fact:
168
+
169
+ ```python
170
+ with tracer.trace_tool_call("search_knowledge_base", input=query) as t:
171
+ t.output = search_knowledge_base(query)
172
+ ```
173
+
174
+ An exception escaping the block records the call as failed (`success=False` plus the error text, which is what Monitor's built-in "Tool failure" check and the dashboard's Tool quality column read) and then propagates unchanged.
175
+
167
176
  ### Framework integrations
168
177
 
169
- Each integration auto-captures LLM calls, tool calls, and token usage including prompt-caching
178
+ Each integration auto-captures LLM calls, tool calls, and token usage - including prompt-caching
170
179
  token counts (Anthropic's cache write/read, OpenAI/LiteLLM's cached tokens, Google GenAI's cached
171
180
  content), reported as their own `cache_read_tokens`/`cache_write_tokens` fields alongside the
172
181
  regular totals, no extra config needed. Self-host's cost estimate prices these separately from a
@@ -186,11 +195,11 @@ extra:
186
195
  | LlamaIndex | `pip install "agentx-python[llamaindex]"` | `AgentXLlamaIndexHandler`|
187
196
  | AutoGen | `pip install "agentx-python[autogen]"` | `AgentXAutoGenObserver` |
188
197
 
189
- Or plain Python wrap any function with `@tracer.trace(...)` and it just works, no framework required.
198
+ Or plain Python - wrap any function with `@tracer.trace(...)` and it just works, no framework required.
190
199
 
191
- Running specialist agents in parallel with a `ThreadPoolExecutor`? Wrap each worker body in `tracer.use_span(span)` so their steps land on the parent trace instead of becoming independent traces see [TRACING.md](TRACING.md) for the full pattern.
200
+ Running specialist agents in parallel with a `ThreadPoolExecutor`? Wrap each worker body in `tracer.use_span(span)` so their steps land on the parent trace instead of becoming independent traces - see [TRACING.md](TRACING.md) for the full pattern.
192
201
 
193
- See **[TRACING.md](TRACING.md)** for the complete guide session grouping, error handling, async support, and the full API reference.
202
+ See **[TRACING.md](TRACING.md)** for the complete guide - session grouping, error handling, async support, and the full API reference.
194
203
 
195
204
  ---
196
205
 
@@ -240,13 +249,32 @@ evaluator = client.monitor.online_evaluators.builder(
240
249
  client.monitor.online_evaluators.ratings(evaluator.id, window="7d")
241
250
  ```
242
251
 
252
+ An online evaluator can also judge **whole conversations** instead of single traces: pass `scope="session"` and the engine scores each multi-turn session once it's been idle for `idle_seconds`, re-scoring if the conversation resumes. And to close the loop with reality, `client.outcomes.report(...)` records what actually happened after the fact (a reopened ticket, a human confirmation) against a trace, feeding the dashboard's Judge Calibration view, which measures how often AgentX's automated verdicts agree with real outcomes. Both are self-host features.
253
+
254
+ ```python
255
+ client.monitor.online_evaluators.builder(
256
+ name="Conversation resolution",
257
+ evaluation_settings_id=settings.id,
258
+ scope="session", # judge the whole session, not each trace
259
+ idle_seconds=120, # score once the conversation has been quiet this long
260
+ alert_threshold=5,
261
+ ).publish()
262
+
263
+ client.outcomes.report(
264
+ trace_id=trace_id,
265
+ outcome="reopened",
266
+ is_negative=True,
267
+ reason="Customer reopened the ticket within 3 days",
268
+ )
269
+ ```
270
+
243
271
  See **[TRACING.md](TRACING.md)** for the complete Monitor guide.
244
272
 
245
273
  ---
246
274
 
247
275
  ## Self-host
248
276
 
249
- Prefer to run Trace/Evaluate/Monitor locally instead of the hosted dashboard no account, bring your own LLM keys? This SDK ships a launcher for [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval), a separate, portable governance engine:
277
+ Prefer to run Trace/Evaluate/Monitor locally instead of the hosted dashboard - no account, bring your own LLM keys? This SDK ships a launcher for [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval), a separate, portable governance engine:
250
278
 
251
279
  ```bash
252
280
  agentx-trace-eval --dev
@@ -259,22 +287,22 @@ export AGENTX_API_BASE_URL=http://localhost:4700/api/v1
259
287
  export AGENTX_API_KEY=<printed by agentx-trace-eval on first run>
260
288
  ```
261
289
 
262
- `agentx-trace-eval` isn't this SDK's own code the engine itself is a separate, compiled binary, downloaded on demand rather than bundled into this package, so installing `agentx-python` doesn't get any heavier for the (much more common) case of just talking to the hosted AgentX API. See that repo's README for what's included, and `AGENTX_INSTALL_DIR`/`AGENTX_TRACE_EVAL_VERSION`/`AGENTX_TRACE_EVAL_SKIP_WEB` env vars to control where/what it installs.
290
+ `agentx-trace-eval` isn't this SDK's own code - the engine itself is a separate, compiled binary, downloaded on demand rather than bundled into this package, so installing `agentx-python` doesn't get any heavier for the (much more common) case of just talking to the hosted AgentX API. See that repo's README for what's included, and `AGENTX_INSTALL_DIR`/`AGENTX_TRACE_EVAL_VERSION`/`AGENTX_TRACE_EVAL_SKIP_WEB` env vars to control where/what it installs.
263
291
 
264
292
  ---
265
293
 
266
294
  ## Agents & conversations
267
295
 
268
- Beyond evaluation, tracing, and monitoring, this SDK is also a client for AgentX's own hosted agents build, chat with, and orchestrate them directly.
296
+ Beyond evaluation, tracing, and monitoring, this SDK is also a client for AgentX's own hosted agents - build, chat with, and orchestrate them directly.
269
297
 
270
298
  ```python
271
299
  agent = client.list_agents()[0]
272
300
  conversation = agent.new_conversation()
273
301
 
274
- # Blocking returns the full response once it's ready
302
+ # Blocking - returns the full response once it's ready
275
303
  print(conversation.chat("What can you help me with?"))
276
304
 
277
- # Streaming yields ChatResponse objects as the model produces them
305
+ # Streaming - yields ChatResponse objects as the model produces them
278
306
  for chunk in conversation.chat_stream("Hello!"):
279
307
  if chunk.text:
280
308
  print(chunk.text, end="")
@@ -297,10 +325,10 @@ for chunk in workforce.chat_stream(conversation.id, "How can you help me with th
297
325
 
298
326
  ## Links
299
327
 
300
- - **Dashboard** [app.agentx.so](https://app.agentx.so)
301
- - **Website** [agentx.so](https://www.agentx.so/)
302
- - **PyPI** [agentx-python](https://pypi.org/project/agentx-python/)
303
- - **Tracing docs** [TRACING.md](TRACING.md)
304
- - **Evaluations docs** [EVALUATIONS.md](EVALUATIONS.md)
305
- - **Monitor docs** [docs.agentx.so/sdk/monitor](https://docs.agentx.so/sdk/monitor)
306
- - **Self-host** [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval)
328
+ - **Dashboard** - [app.agentx.so](https://app.agentx.so)
329
+ - **Website** - [agentx.so](https://www.agentx.so/)
330
+ - **PyPI** - [agentx-python](https://pypi.org/project/agentx-python/)
331
+ - **Tracing docs** - [TRACING.md](TRACING.md)
332
+ - **Evaluations docs** - [EVALUATIONS.md](EVALUATIONS.md)
333
+ - **Monitor docs** - [docs.agentx.so/sdk/monitor](https://docs.agentx.so/sdk/monitor)
334
+ - **Self-host** - [AgentX-trace-eval](https://github.com/AgentX-ai/AgentX-trace-eval)
@@ -54,6 +54,12 @@ class AgentX:
54
54
  workspace_id=self.workspace_id,
55
55
  )
56
56
 
57
+ from agentx.outcomes import OutcomesClient
58
+
59
+ # Report real, after-the-fact outcomes ("the ticket got reopened") against traces - the
60
+ # ground truth behind the dashboard's Judge Calibration card. Self-host only.
61
+ self.outcomes = OutcomesClient(api_key=self.api_key)
62
+
57
63
  _ingest_client = IngestClient(
58
64
  api_key=self.api_key,
59
65
  sdk_version=VERSION,
@@ -1,5 +1,5 @@
1
1
  """
2
- `agentx-trace-eval` thin launcher for AgentX's self-hostable governance engine (Trace,
2
+ `agentx-trace-eval` - thin launcher for AgentX's self-hostable governance engine (Trace,
3
3
  Evaluate, Monitor), published separately at github.com/AgentX-ai/AgentX-trace-eval (a Go CLI
4
4
  wrapping a Bun-compiled TypeScript engine, not Python). That compiled engine binary is tens of
5
5
  megabytes; most `pip install agentx-python` installs are just this SDK talking to the hosted
@@ -1,4 +1,4 @@
1
- """Minimal ANSI terminal helpers no external dependencies."""
1
+ """Minimal ANSI terminal helpers - no external dependencies."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -12,7 +12,7 @@ from agentx.evaluations.results import normalize_error, normalize_result
12
12
  class HttpEndpointAdapter:
13
13
  """
14
14
  Calls a user-hosted HTTP endpoint for each evaluation case.
15
- The SDK (running locally) makes the request the AgentX API never
15
+ The SDK (running locally) makes the request - the AgentX API never
16
16
  touches the customer's endpoint.
17
17
 
18
18
  The endpoint receives a POST with::
@@ -8,7 +8,7 @@ from agentx.evaluations.results import normalize_result
8
8
 
9
9
  class PrecomputedAdapter:
10
10
  """
11
- Adapter for pre-computed outputs useful when you already have agent
11
+ Adapter for pre-computed outputs - useful when you already have agent
12
12
  responses and just want AgentX to score them.
13
13
 
14
14
  Accepts a list or dict keyed by case_id::
@@ -57,7 +57,7 @@ class EvaluationsClient:
57
57
  raise AgentXAuthError("AGENTX_API_KEY is required")
58
58
  self._api_key = api_key
59
59
  self._sdk_version = sdk_version
60
- # Falls back to the caller's default workspace server-side when unset see
60
+ # Falls back to the caller's default workspace server-side when unset - see
61
61
  # _with_workspace(). Without this, dataset/settings/run creation silently land in
62
62
  # whatever workspace the API key's user defaults to, not the one the caller intended.
63
63
  self._workspace_id = workspace_id
@@ -139,7 +139,7 @@ class EvaluationsClient:
139
139
  # ------------------------------------------------------------------
140
140
 
141
141
  def list_models(self, provider: Optional[str] = None) -> List[ModelInfo]:
142
- """List the LLM models AgentX supports the same set selectable for
142
+ """List the LLM models AgentX supports - the same set selectable for
143
143
  the Sovereignty & Portability Index. Pass ``provider`` (e.g. "Google")
144
144
  to filter."""
145
145
  params = {"provider": provider} if provider else None
@@ -169,7 +169,7 @@ class EvaluationsClient:
169
169
  return Dataset(**data)
170
170
 
171
171
  # ------------------------------------------------------------------
172
- # Evaluation Settings endpoints standalone grading config, reusable
172
+ # Evaluation Settings endpoints - standalone grading config, reusable
173
173
  # across datasets.
174
174
  # ------------------------------------------------------------------
175
175
 
@@ -199,7 +199,7 @@ class EvaluationsClient:
199
199
  return EvaluationSettings(**data)
200
200
 
201
201
  # ------------------------------------------------------------------
202
- # Prompt registry endpoints see agentx.evaluations.prompts.PromptClient for the concept
202
+ # Prompt registry endpoints - see agentx.evaluations.prompts.PromptClient for the concept
203
203
  # (the external-agent analog to native autotune). Deliberately read-mostly: no publish here,
204
204
  # a new version only ever comes from the dashboard's human-approved propose/publish flow.
205
205
  # ------------------------------------------------------------------
@@ -67,7 +67,7 @@ class DatasetBuilder:
67
67
  self._payload["bleuScore"] = {"enabled": True}
68
68
  if rouge_score:
69
69
  self._payload["rougeScore"] = {"enabled": True}
70
- # Sovereignty & Portability the models to compare on this dataset (use
70
+ # Sovereignty & Portability - the models to compare on this dataset (use
71
71
  # client.evaluations.list_models() to discover valid ids).
72
72
  if sovereignty_models:
73
73
  self._payload["sovereigntyIndex"] = {
@@ -61,7 +61,7 @@ class EvaluationSettingsBuilder:
61
61
  self._payload["bleuScore"] = {"enabled": True}
62
62
  if rouge_score:
63
63
  self._payload["rougeScore"] = {"enabled": True}
64
- # Sovereignty & Portability the models to compare when this config runs
64
+ # Sovereignty & Portability - the models to compare when this config runs
65
65
  # (use client.evaluations.list_models() to discover valid ids).
66
66
  if sovereignty_models:
67
67
  self._payload["sovereigntyIndex"] = {