agentx-python 0.8.9__py3-none-any.whl → 0.8.11__py3-none-any.whl

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.
@@ -37,6 +37,9 @@ _RETRY_BACKOFF = [1.0, 2.0, 4.0]
37
37
  # wait out the whole job on one connection. Matches EvaluationRunContext.analyze()'s own
38
38
  # default timeout.
39
39
  _SELF_HOST_ANALYZE_TIMEOUT = 1800
40
+ # Batch result submission scores each result synchronously inside the request (one judge call
41
+ # per result on the sync path) - a big batch on a slow judge legitimately takes minutes.
42
+ _SELF_HOST_SCORING_TIMEOUT = 900
40
43
 
41
44
 
42
45
  class AgentXEvaluationsError(Exception):
@@ -344,7 +347,15 @@ class EvaluationsClient:
344
347
  "batchId": batch_id,
345
348
  "results": [_result_to_payload(r) for r in results],
346
349
  }
347
- data = self._request("POST", f"/runs/{run_id}/results", json=payload)
350
+ # Scoring is synchronous inside this request (a judge call per result - the runner's
351
+ # spinner says "~60s+" for a reason), so the default 30s timeout + silent backoff loop
352
+ # re-POSTed the batch WHILE the first submission was still scoring, and the two raced
353
+ # into the engine's (run_id, idempotency_key) unique constraint. Long timeout, no
354
+ # transport retry - the runner's own logged retry-once is the retry layer here.
355
+ data = self._request(
356
+ "POST", f"/runs/{run_id}/results", json=payload,
357
+ timeout=_SELF_HOST_SCORING_TIMEOUT, retry=False,
358
+ )
348
359
  return BatchAppendResponse(**data)
349
360
 
350
361
  def finalize_run(self, run_id: str) -> Dict[str, Any]:
agentx/version.py CHANGED
@@ -1,7 +1,7 @@
1
- VERSION = "0.8.9"
1
+ VERSION = "0.8.11"
2
2
 
3
3
  # The AgentX-trace-eval release this SDK version is tested against - what `agentx-trace-eval`
4
4
  # installs and converges to (see agentx/cli.py). Bump together with VERSION when releasing, so
5
5
  # every published SDK names a known-good engine+dashboard pair. Users can override with
6
6
  # AGENTX_TRACE_EVAL_VERSION=<tag|latest>.
7
- ENGINE_VERSION = "v0.3.1"
7
+ ENGINE_VERSION = "v0.3.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.8.9
3
+ Version: 0.8.11
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
@@ -68,7 +68,7 @@ Dynamic: summary
68
68
  [![Python versions](https://img.shields.io/pypi/pyversions/agentx-python)](https://pypi.org/project/agentx-python/)
69
69
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
70
70
 
71
- 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.
71
+ The official Python SDK for **[AgentX](https://www.agentx.so/)** - an evaluation, tracing, and monitoring framework for AI agents, plus a client for AgentX's own hosted agents.
72
72
 
73
73
  Also see [SDK Developer Docs](https://developers.agentx.so), [API Reference Docs](https://docs.agentx.so/reference)
74
74
 
@@ -109,19 +109,10 @@ pip install --upgrade agentx-python
109
109
 
110
110
  Requires Python 3.9 or newer.
111
111
 
112
- ---
113
-
114
- ## Authentication
115
-
116
- Get your API key at [app.agentx.so](https://app.agentx.so), then either pass it inline or expose it as an environment variable.
117
-
118
- ```python
119
- # Option A - pass the key inline
120
- from agentx import AgentX
121
- client = AgentX(api_key="your-api-key-here")
112
+ #### Run self host eval framework locally
122
113
 
123
- # Option B - set AGENTX_API_KEY in your environment, then:
124
- client = AgentX.from_env()
114
+ ```
115
+ agentx-trace-eval --dev --update
125
116
  ```
126
117
 
127
118
  ---
@@ -179,7 +170,7 @@ print(report.recommendations) # list of prioritized, actionable fixes
179
170
 
180
171
  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.
181
172
 
182
- 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:
173
+ 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:
183
174
 
184
175
  ```python
185
176
  prompt = client.evaluations.prompts.get("support-agent-system-prompt") # or prompt.id
@@ -193,7 +184,7 @@ client.evaluations.run(
193
184
 
194
185
  See [Prompt registry](EVALUATIONS.md#prompt-registry) in the full guide, or [self-host's docs](https://docs.agentx.so/improve/prompt-management) for the "Suggest improvement" dashboard flow (self-host only - no hosted-SaaS equivalent yet).
195
186
 
196
- On self-host, a finalized run can also **gate a CI job**: `report.gate(fail_under=7, no_regression=True)` checks the run's average rating against an absolute floor and/or the dataset's previous run, prints per-check verdicts into the CI log, and returns an exit code - `sys.exit(gate.exit_code)` blocks the merge on regression. Recorded gates appear in the dashboard's CI Gates tab. See [self-host's CI docs](https://docs.agentx.so/integrations/self-host-ci) for the GitHub Actions recipe.
187
+ On self-host, a finalized run can also **gate a CI job**: `run.gate(fail_under=7, no_regression=True)` (on the run context `.execute()` returns) checks the run's average rating against an absolute floor and/or the dataset's previous run, prints per-check verdicts into the CI log, and returns an exit code - `sys.exit(gate.exit_code)` blocks the merge on regression. Recorded gates appear in the dashboard's CI Gates tab. See [self-host's CI docs](https://docs.agentx.so/integrations/self-host-ci) for the GitHub Actions recipe.
197
188
 
198
189
  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.
199
190
 
@@ -248,18 +239,18 @@ regular totals, no extra config needed. Self-host's cost estimate prices these s
248
239
  regular input token when you've set optional cache rates on that model. Install the matching
249
240
  extra:
250
241
 
251
- | Framework | Install | Integration |
252
- | --------------------- | -------------------------------------------- | ------------------------ |
253
- | LangChain | `pip install "agentx-python[langchain]"` | `AgentXCallbackHandler` |
254
- | CrewAI | `pip install "agentx-python[crewai]"` | `AgentXCrewObserver` |
255
- | OpenAI Agents SDK | `pip install "agentx-python[openai-agents]"` | `AgentXTracingProcessor` |
256
- | OpenAI (raw client) | `pip install "agentx-python[openai]"` | `patch_openai_client` |
257
- | Anthropic | `pip install "agentx-python[anthropic]"` | `patch_anthropic_client` |
258
- | Google ADK | `pip install "agentx-python[google-adk]"` | `AgentXADKPlugin` |
259
- | Google GenAI (Gemini) | `pip install "agentx-python[google-genai]"` | `patch_genai_client` |
260
- | LiteLLM | `pip install "agentx-python[litellm]"` | `AgentXLiteLLMLogger` |
261
- | LlamaIndex | `pip install "agentx-python[llamaindex]"` | `AgentXLlamaIndexHandler`|
262
- | AutoGen | `pip install "agentx-python[autogen]"` | `AgentXAutoGenObserver` |
242
+ | Framework | Install | Integration |
243
+ | --------------------- | -------------------------------------------- | ------------------------- |
244
+ | LangChain | `pip install "agentx-python[langchain]"` | `AgentXCallbackHandler` |
245
+ | CrewAI | `pip install "agentx-python[crewai]"` | `AgentXCrewObserver` |
246
+ | OpenAI Agents SDK | `pip install "agentx-python[openai-agents]"` | `AgentXTracingProcessor` |
247
+ | OpenAI (raw client) | `pip install "agentx-python[openai]"` | `patch_openai_client` |
248
+ | Anthropic | `pip install "agentx-python[anthropic]"` | `patch_anthropic_client` |
249
+ | Google ADK | `pip install "agentx-python[google-adk]"` | `AgentXADKPlugin` |
250
+ | Google GenAI (Gemini) | `pip install "agentx-python[google-genai]"` | `patch_genai_client` |
251
+ | LiteLLM | `pip install "agentx-python[litellm]"` | `AgentXLiteLLMLogger` |
252
+ | LlamaIndex | `pip install "agentx-python[llamaindex]"` | `AgentXLlamaIndexHandler` |
253
+ | AutoGen | `pip install "agentx-python[autogen]"` | `AgentXAutoGenObserver` |
263
254
 
264
255
  Or plain Python - wrap any function with `@tracer.trace(...)` and it just works, no framework required.
265
256
 
@@ -10,10 +10,10 @@ agentx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  agentx/testing.py,sha256=0shZEid_vhJgBegpO_loUq6APYDxQrUgD3jvcRdIDV8,7372
11
11
  agentx/traces.py,sha256=sz9gxutlDKNgf0fdCkyzKsGwK5eMAJuIEl3NIwGrsuo,2287
12
12
  agentx/util.py,sha256=lt2Kpg4Fj8whrSuAhLEahcPEIYRVpK9RCC5y9ShdTJs,703
13
- agentx/version.py,sha256=NVkvAxXnY4aNvFKBaIaMdP2_Lq6r1q1gNdF9rkcPaJ0,364
13
+ agentx/version.py,sha256=Tdbz2wkmgrYtacg6NLYVLsyKCx__z2LPrSfkSIJ8IZc,365
14
14
  agentx/evaluations/__init__.py,sha256=Erv7RGFlRxGTG4rVb2uHhCqLLEX_iAWKqkZKzK6CumE,262
15
15
  agentx/evaluations/_term.py,sha256=WFpiNzdgDBeJJ-Gg-6X7TwwxllobuE4OqFUTuDQvS3Y,2529
16
- agentx/evaluations/client.py,sha256=miUmEq4IthUDl-QVAczqT7iaOu4X6QMbHhlm2rSSJpg,31239
16
+ agentx/evaluations/client.py,sha256=UlYl8OFmIjk8oqmL_LEpjnTn6CmUPBM1kgVgzkUKfT8,31999
17
17
  agentx/evaluations/datasets.py,sha256=2--V40JrSJoXxR1s0jI3i5rYT8ys25ouijqQQlj72D8,16053
18
18
  agentx/evaluations/evaluation_settings.py,sha256=geRydHqKpxwkxBVfMIOqkB6NlStyOZrYwZnMHluDwvA,6276
19
19
  agentx/evaluations/models.py,sha256=fKaDwyXhruXRHpBDw89Vv_FeceLvSILVrA9HNtzKLF8,32266
@@ -63,9 +63,9 @@ agentx/tracing/ci_types.py,sha256=zFVcZGvc1qbVDdOlEPQ1i5R6terqJHxCzFF4ZjouxxI,14
63
63
  agentx/tracing/eval_scope.py,sha256=ElMbPxpqpQBVuaUnHNlw9RIQu71oyOpd0yR55bDH8eI,2144
64
64
  agentx/tracing/ingest_client.py,sha256=5X6RyxtMq1XYgOzsMd3b2f2qpmYpsMnhKm7NB3oup00,17664
65
65
  agentx/tracing/tracer.py,sha256=qQojU-T4O8IJKyf9vue0Em66qPBTZKl3FMyr3KJKPnI,53770
66
- agentx_python-0.8.9.dist-info/licenses/LICENSE,sha256=gZVsM-nLsE8vlaY6NXXsVoo6IlCClxkToAWmhgT3y_s,10762
67
- agentx_python-0.8.9.dist-info/METADATA,sha256=MLSczgjVUoeyS3DniUVutzQ78YJqIsxc6P-WfMb5HzI,20992
68
- agentx_python-0.8.9.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
69
- agentx_python-0.8.9.dist-info/entry_points.txt,sha256=rQqF1JTY3T1yfviBU1r8PU-5mBdfOk6P4bZ1L4BskIM,172
70
- agentx_python-0.8.9.dist-info/top_level.txt,sha256=s-q-HB9Gb_QdrZNacSeQyF_c25gQooMy7DlxzgLOHPk,7
71
- agentx_python-0.8.9.dist-info/RECORD,,
66
+ agentx_python-0.8.11.dist-info/licenses/LICENSE,sha256=gZVsM-nLsE8vlaY6NXXsVoo6IlCClxkToAWmhgT3y_s,10762
67
+ agentx_python-0.8.11.dist-info/METADATA,sha256=Ku6NS673vKq1m-oqJTuow8GbECfUKSevyLCafI7C7Rs,20768
68
+ agentx_python-0.8.11.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
69
+ agentx_python-0.8.11.dist-info/entry_points.txt,sha256=rQqF1JTY3T1yfviBU1r8PU-5mBdfOk6P4bZ1L4BskIM,172
70
+ agentx_python-0.8.11.dist-info/top_level.txt,sha256=s-q-HB9Gb_QdrZNacSeQyF_c25gQooMy7DlxzgLOHPk,7
71
+ agentx_python-0.8.11.dist-info/RECORD,,