Skip to main content

skilltest-sdk

The Python SDK for the skilltest CLI. A thin, typed wrapper and nothing else: it runs the CLI as a subprocess and parses the stable --format json contract into Pydantic models. Test-framework integrations build on it — use skilltest-pytest if you want pytest collection; use this package directly from any other Python code.

Define the whole case — skill, input, evals, an optional simulated user, mocks — in code and pass it straight to run_skill. Everything a case YAML carries has a typed builder, so the case and its checks live in one place:

from skilltest_sdk import TestCase, run_skill, boolean, numeric, describe_failures, assistant_text

case = TestCase(
    skill="skills/greeter",              # resolved relative to the working dir
    input="Greet Dr. Smith, who has an appointment today.",
    evals=[
        boolean("the reply greets Dr. Smith by name"),
        numeric("how warm is the tone", min=0, max=10, threshold=7),
    ],
)
report = run_skill(case)
assert report.passed, describe_failures(report)
# Mix in deterministic checks on the transcript:
assert "Dr. Smith" in assistant_text(report.runs[0].transcript)

Add user(persona=..., done_when=...) for a multi-turn case, and mocks=[...] of stub/spy/deny/rewrite (a called / not_called eval takes the mock object itself, or a name= you gave it). Validate a skill definition with validate_skill("skills/greeter").

A stub can answer successive calls differently: pass responses instead of output, and the n-th call it intercepts in a run gets the n-th item, with the last item repeating. So stub("jobctl status", responses=["queued", {"output": "failed", "exit_code": 1}, "passed"]) answers failed on its second call and passed on every call after that.

Or point at existing YAML cases

run_skill also takes a path to a test-case YAML file — or a directory of them — so a suite that keeps cases as data works unchanged, and the pytest plugin auto-discovers *.skilltest.yaml files with no code at all:

report = run_skill("cases/greet.yaml")   # or run_skill("cases/") for the tree

The field reference for both forms is docs/schema.md.

Tool events

Each assistant turn carries the normalized tool events the skill took (shell commands, file edits, tool uses), lifted from oneharness's --events. Assert on what the skill did with tool_calls (the tool_call events across a transcript, in order); each ToolEvent has kind, name, input, output, index:

from skilltest_sdk import TestCase, run_skill, tool_calls, boolean

case = TestCase(
    skill="skills/editor",
    input="Update the config and commit it.",
    evals=[boolean("the change was committed")],
)
report = run_skill(case)
calls = tool_calls(report.runs[0].transcript)
assert any("git commit" in str(c.input) for c in calls)
assert not any("rm -rf" in str(c.input) for c in calls)   # never destructive

Streaming (opt-in)

stream_skill takes the same case (or path) and returns a SkillStream you iterate with async for to receive each event live, and break to short-circuit — closing the stream tears the harness down, so a bad turn is cut off instead of paid for in full. .report holds the final report once the stream runs to completion:

from skilltest_sdk import stream_skill

async def guard(case):
    stream = stream_skill(case)
    async for ev in stream:  # ev: StreamEvent — .case/.platform/.model/.turn/.event
        if ev.event.name == "bash" and "rm -rf" in str(ev.event.input):
            break
    return stream.report

The skilltest binary is resolved from the bin= argument, the SKILLTEST_BIN env var, or PATH; a provider override comes from provider= or SKILLTEST_PROVIDER. A failing eval is reported (report.passed is false), not raised; bad input raises SkilltestUsageError (CLI exit 2) and provider problems raise SkilltestProviderError (exit 3).

The default provider drives oneharness, which installs with this package (the oneharness-cli dependency) — no separate step. The SDK points the CLI at it via SKILLTEST_ONEHARNESS_BIN; set that variable, or a config provider.bin, to use a different oneharness.

The Pydantic models are generated from the golden schemas in schemas/ — themselves generated from the CLI's own types — via just gen-contract, and a drift gate in CI fails if anything is stale, so the models cannot diverge from the binary. That covers both directions: the report models the SDK parses (_report.py) and the case models the builders construct (_case.py).

Metadata

Release files for skilltest-sdk 0.12.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for skilltest-sdk 0.12.1
File Size Uploaded
skilltest_sdk-0.12.1.tar.gz 47.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for skilltest-sdk 0.12.1
File
skilltest_sdk-0.12.1-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
skilltest_sdk-0.12.1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
skilltest_sdk-0.12.1-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
skilltest_sdk-0.12.1-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
skilltest_sdk-0.12.1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
skilltest_sdk-0.12.1-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details
skilltest_sdk-0.12.1-py3-none-any.whl Python 3 none any Details

Total release size: 10.2 MB

Release files / skilltest_sdk-0.12.1.tar.gz

Download URL skilltest_sdk-0.12.1.tar.gz
Size 47.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b244d5af4868561436c5fcf2fc70acd179f229d7b4b3a23f9914fb18760ebe51
BLAKE2b-256 checksum
How to use checksums
e737268c4837e89d117f60a1361f775cb8c7dcfdf37f62115ad3ae89d8d3d5fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-win_arm64.whl

Download URL skilltest_sdk-0.12.1-py3-none-win_arm64.whl
Size 1.5 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
de3866222a21ab2939d0eba05b59329ff57fe3ef283f74418ab39c1e2636389d
BLAKE2b-256 checksum
How to use checksums
777e1f7d0e15c3767b2a3c2d6d7ccaf6371dcb757719ff541c4c29f09572e15f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-win_amd64.whl

Download URL skilltest_sdk-0.12.1-py3-none-win_amd64.whl
Size 1.6 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
013d1dbbaa7a265345e026fd2a7a997455c93932675813fd17b37c193c8ee6d8
BLAKE2b-256 checksum
How to use checksums
d944e45995c1a47691439691885d2e59ab2bc9630aa5c4fb6304bd01e38b6c8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-manylinux_2_17_x86_64.whl

Download URL skilltest_sdk-0.12.1-py3-none-manylinux_2_17_x86_64.whl
Size 1.9 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
c68542e8d0736f2e7f1b3732c98ed466ee25ef407282ce9ff40d01f0f2c0a507
BLAKE2b-256 checksum
How to use checksums
f9f80c6913d1c85124c96eff0570ee3e48ed48db859aa4c9bae55ee792bb5c07
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-manylinux_2_17_aarch64.whl

Download URL skilltest_sdk-0.12.1-py3-none-manylinux_2_17_aarch64.whl
Size 1.8 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
c2d03e94ee6b43e53080fcbfc9d50eb6ef496ebb2085518ded971e3ee547b367
BLAKE2b-256 checksum
How to use checksums
bf8ad972e612b8d01c1d5012207d30a9ee7dac97955724a3bb8843714f262bb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-macosx_11_0_arm64.whl

Download URL skilltest_sdk-0.12.1-py3-none-macosx_11_0_arm64.whl
Size 1.6 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d9d56dfeddf47d4c31b5d11bfbed49026e3b5f007e8e836ad64ec72982c6ddbf
BLAKE2b-256 checksum
How to use checksums
10837c447070294de42d02e03674688dd5e4e506fc5bdb5d3a3143af508b122b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-macosx_10_12_x86_64.whl

Download URL skilltest_sdk-0.12.1-py3-none-macosx_10_12_x86_64.whl
Size 1.7 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
537140af52eac5ad8d982eb92b539987996f23838e2356433a80d7093dab5fe8
BLAKE2b-256 checksum
How to use checksums
138f1f3c14618665d7e810adb80725ba2297c5ae8b98687e3f0fd8c09df7b59d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / skilltest_sdk-0.12.1-py3-none-any.whl

Download URL skilltest_sdk-0.12.1-py3-none-any.whl
Size 35.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4dd3d92e2fff80be6b4367dc2a05ea06784b09db0f6a53a65403a78b2ccdccc4
BLAKE2b-256 checksum
How to use checksums
d96ef60a7b3a9d62e1e990180078137dadf1296edcf3497f5a011122887fa5e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.13.0

8 release files

This release

0.12.1 This release

8 release files

0.11.2

6 release files

0.11.1

6 release files

0.11.0

6 release files

0.10.3

6 release files

0.10.2

6 release files

0.10.1

6 release files

0.9.0

6 release files

0.8.0

6 release files

0.7.0

6 release files

0.6.0

6 release files

0.5.0

6 release files

0.4.0

6 release files

0.3.0

6 release files

0.2.2

6 release files

0.2.1

6 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page