agentx-python 0.8.8__py3-none-any.whl → 0.8.10__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.
agentx/cli.py CHANGED
@@ -4,18 +4,21 @@ Evaluate, Monitor), published separately at github.com/AgentX-ai/AgentX-trace-ev
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
6
6
  AgentX SaaS and would never touch it, so it isn't bundled in this package. Instead, this command
7
- downloads the matching release into ~/.agentx/bin the first time it's needed (mirroring
7
+ downloads the release into ~/.agentx/bin the first time it's needed (mirroring
8
8
  AgentX-trace-eval's own install.sh) and then hands off to the real `agentx-server` binary.
9
9
 
10
- The installed release tag is stamped in ~/.agentx/bin/.version. The launcher never silently
11
- re-downloads, but it re-installs when you ask: `--update` fetches the newest release (engine +
12
- dashboard), and setting AGENTX_TRACE_EVAL_VERSION to a tag other than the stamped one switches
13
- to that release. When running "latest", a quick fail-open check against GitHub tells you if a
14
- newer release exists.
10
+ Versioning: each SDK release pins the engine release it was tested against
11
+ (agentx.version.ENGINE_VERSION); the launcher installs that pin and converges to it - if the
12
+ stamped install (~/.agentx/bin/.version) differs from the pin, it re-installs, so upgrading the
13
+ SDK upgrades the engine to the matching pair. `--update` force-reinstalls the resolved version
14
+ (recovering a broken or pre-stamp install). Set AGENTX_TRACE_EVAL_VERSION to a tag or `latest`
15
+ to override the pin; in `latest` mode the launcher trusts whatever is installed, prints a
16
+ fail-open notice when GitHub has something newer, and `--update` fetches it.
15
17
 
16
18
  Usage:
17
19
  agentx-trace-eval --dev
18
20
  agentx-trace-eval --update --dev
21
+ AGENTX_TRACE_EVAL_VERSION=latest agentx-trace-eval --update --dev
19
22
  agentx-trace-eval --port 5000 --db-url postgres://...
20
23
  """
21
24
 
@@ -32,6 +35,8 @@ from typing import Optional, Tuple
32
35
 
33
36
  import requests
34
37
 
38
+ from agentx.version import ENGINE_VERSION
39
+
35
40
  REPO = "AgentX-ai/AgentX-trace-eval"
36
41
  INSTALL_DIR = Path(os.environ.get("AGENTX_INSTALL_DIR", str(Path.home() / ".agentx" / "bin")))
37
42
  _BIN_NAMES = ("agentx", "agentx-server", "agentx-engine")
@@ -114,11 +119,17 @@ def _latest_release_tag() -> Optional[str]:
114
119
  return None
115
120
 
116
121
 
122
+ def resolve_version() -> str:
123
+ """The engine version this launcher should be running: the AGENTX_TRACE_EVAL_VERSION
124
+ override (a tag, or `latest`) when set, else the SDK's tested pin."""
125
+ return os.environ.get("AGENTX_TRACE_EVAL_VERSION") or ENGINE_VERSION
126
+
127
+
117
128
  def _install(version: str = "latest") -> None:
118
129
  os_name, arch = _platform_tag()
119
130
  INSTALL_DIR.mkdir(parents=True, exist_ok=True)
120
131
 
121
- print(f"agentx-trace-eval: downloading agentx ({os_name}/{arch})...", file=sys.stderr)
132
+ print(f"agentx-trace-eval: downloading agentx {version} ({os_name}/{arch})...", file=sys.stderr)
122
133
  with tempfile.TemporaryDirectory() as tmp:
123
134
  tmp_dir = Path(tmp)
124
135
  archive = tmp_dir / "agentx.tar.gz"
@@ -178,23 +189,30 @@ def _install(version: str = "latest") -> None:
178
189
  _extract_tar(web_archive, web_dir)
179
190
 
180
191
 
181
- def ensure_installed(version: str = "latest", force: bool = False) -> Path:
182
- """Downloads agentx-server (+ its engine and dashboard) into ~/.agentx/bin when it's missing
192
+ def ensure_installed(version: Optional[str] = None, force: bool = False) -> Path:
193
+ """Installs agentx-server (+ its engine and dashboard) into ~/.agentx/bin when it's missing
183
194
  there, when `force` is set, or when `version` is a specific tag that differs from the
184
- installed one. Returns the path to the agentx-server executable. Set AGENTX_INSTALL_DIR to
185
- change where this looks/installs; set AGENTX_TRACE_EVAL_VERSION to pin a release tag."""
195
+ stamped install - the convergence that makes an SDK upgrade carry its tested engine along.
196
+ `version` defaults to resolve_version() (the AGENTX_TRACE_EVAL_VERSION override, else the
197
+ SDK's pin); pass "latest" to trust whatever is installed and only fetch when missing.
198
+ Returns the path to the agentx-server executable. Set AGENTX_INSTALL_DIR to change where
199
+ this looks/installs."""
200
+ if version is None:
201
+ version = resolve_version()
186
202
  server_path = INSTALL_DIR / "agentx-server"
187
- installed = _stamped_version()
188
- pin_changed = version != "latest" and installed is not None and installed != version
189
- if force or pin_changed or not server_path.exists():
203
+ stamped = _stamped_version()
204
+ pin_mismatch = version != "latest" and stamped != version
205
+ if force or pin_mismatch or not server_path.exists():
190
206
  _install(version=version)
191
207
  return server_path
192
208
 
193
209
 
194
210
  def _maybe_print_update_notice(installed: Optional[str]) -> None:
211
+ """Only relevant in `latest` mode, where nothing converges automatically - a quick fail-open
212
+ check tells the user when the world has moved on. (Pinned mode needs no notice: a pin
213
+ mismatch re-installs instead of nagging.)"""
195
214
  latest = _latest_release_tag()
196
215
  if installed is None:
197
- # Pre-stamp install (or a wiped stamp): age unknown, so always point at --update.
198
216
  print(
199
217
  "agentx-trace-eval: installed engine version unknown"
200
218
  + (f" (newest release is {latest})" if latest else "")
@@ -215,7 +233,7 @@ def main() -> None:
215
233
  # --update belongs to this launcher, not to agentx-server - consume it before the handoff.
216
234
  args = [a for a in args if a != "--update"]
217
235
 
218
- version = os.environ.get("AGENTX_TRACE_EVAL_VERSION", "latest")
236
+ version = resolve_version()
219
237
  server_path = ensure_installed(version=version, force=force_update)
220
238
  if not server_path.exists():
221
239
  raise SystemExit(f"agentx-trace-eval: {server_path} still missing after install, giving up")
@@ -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 +1,7 @@
1
- VERSION = "0.8.8"
1
+ VERSION = "0.8.10"
2
+
3
+ # The AgentX-trace-eval release this SDK version is tested against - what `agentx-trace-eval`
4
+ # installs and converges to (see agentx/cli.py). Bump together with VERSION when releasing, so
5
+ # every published SDK names a known-good engine+dashboard pair. Users can override with
6
+ # AGENTX_TRACE_EVAL_VERSION=<tag|latest>.
7
+ ENGINE_VERSION = "v0.3.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.8.8
3
+ Version: 0.8.10
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
@@ -193,7 +193,7 @@ client.evaluations.run(
193
193
 
194
194
  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
195
 
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.
196
+ 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
197
 
198
198
  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
199
 
@@ -1,6 +1,6 @@
1
1
  agentx/__init__.py,sha256=4iMiGLNU4S-I-WyX0Z7l0BFUY_krVJ3seMQPqyO-ReA,602
2
2
  agentx/agentx.py,sha256=WuzVQtXSPqBhRwKxkUlQ8VG2cwvGpbMcti4n6aTNPwA,8816
3
- agentx/cli.py,sha256=4c6hPaz5wCvG-IOvzwqlO3PRpkWK4ocf9K-6UXbEfbU,9504
3
+ agentx/cli.py,sha256=yawLQLSeZ7KIl7ukgmly-lrYbx9GgKcaI9M4xamiMPw,10468
4
4
  agentx/exceptions.py,sha256=2tDLdZjriFBQbjgzyIcah12RazpbujhqZSRbSXgAml4,1377
5
5
  agentx/export.py,sha256=FNT00e-j9AQRkNDksUwgHJXgr8-XVPscEH4xUqJHmfM,4265
6
6
  agentx/feedback.py,sha256=hMPU3ivUHvhOXOH7gvT4Jy1yztVmoIMOw1MbUNRs5Gk,3643
@@ -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=KtsrDPnnfwQ504ziRmPTLeUxADR8tN7iC1IRjn_cl_M,18
13
+ agentx/version.py,sha256=sSbsfDvIXz3zR_dv_mmgv3XPzX8Fi8FnwzRLQ-G08M8,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.8.dist-info/licenses/LICENSE,sha256=gZVsM-nLsE8vlaY6NXXsVoo6IlCClxkToAWmhgT3y_s,10762
67
- agentx_python-0.8.8.dist-info/METADATA,sha256=554KW0UbN4YVvfAtI4sudXO-2Dscr0biu4Q2W8VxaHg,20992
68
- agentx_python-0.8.8.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
69
- agentx_python-0.8.8.dist-info/entry_points.txt,sha256=rQqF1JTY3T1yfviBU1r8PU-5mBdfOk6P4bZ1L4BskIM,172
70
- agentx_python-0.8.8.dist-info/top_level.txt,sha256=s-q-HB9Gb_QdrZNacSeQyF_c25gQooMy7DlxzgLOHPk,7
71
- agentx_python-0.8.8.dist-info/RECORD,,
66
+ agentx_python-0.8.10.dist-info/licenses/LICENSE,sha256=gZVsM-nLsE8vlaY6NXXsVoo6IlCClxkToAWmhgT3y_s,10762
67
+ agentx_python-0.8.10.dist-info/METADATA,sha256=EzbfWsvWLIimWsfA-vHWsqV0BWRK4Emc1u1ryY_xWHU,21032
68
+ agentx_python-0.8.10.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
69
+ agentx_python-0.8.10.dist-info/entry_points.txt,sha256=rQqF1JTY3T1yfviBU1r8PU-5mBdfOk6P4bZ1L4BskIM,172
70
+ agentx_python-0.8.10.dist-info/top_level.txt,sha256=s-q-HB9Gb_QdrZNacSeQyF_c25gQooMy7DlxzgLOHPk,7
71
+ agentx_python-0.8.10.dist-info/RECORD,,