Skip to main content

Python SDK for the harnext coding agent — subprocesses the harnext CLI with a Claude Agent SDK-compatible API.

Project description

harnext Python SDK

Run the harnext coding agent from Python. The SDK subprocesses the harnext CLI (harnext -p --output-format stream-json) and yields parsed messages, with an API that mirrors the Claude Agent SDK for the supported surface.

Install

pip install harnext                  # from PyPI
# or, from a checkout of this repo:
pip install -e sdk/python

# the harnext CLI must be installed too:
npm install -g harnext               # or set HARNEXT_CLI_PATH to the CLI entry

The SDK locates the CLI via, in order: the cli_path option, the HARNEXT_CLI_PATH env var, or harnext on PATH. A .js path is run with node.

Quickstart

import asyncio
from harnext_sdk import query, HarnextAgentOptions, ResultMessage

async def main():
    async for message in query(
        prompt="What files are in this directory?",
        options=HarnextAgentOptions(allowed_tools=["Read", "Bash"]),
    ):
        if isinstance(message, ResultMessage):
            print(message.result)

asyncio.run(main())

Options (HarnextAgentOptions)

Field names match claude_agent_sdk.ClaudeAgentOptions; ClaudeAgentOptions is exported as an alias so ported code runs unchanged.

Option CLI flag Notes
model --model
system_prompt --system-prompt
append_system_prompt --append-system-prompt
cwd --cwd
allowed_tools --allowed-tools auto-approve list
disallowed_tools --disallowed-tools blocked + hidden
permission_mode --permission-mode default/acceptEdits/plan/dontAsk/bypassPermissions
max_turns --max-turns
setting_sources --setting-sources user/project/local → loads CLAUDE.md
add_dirs --add-dir accepted; not yet enforced
fallback_model --fallback-model accepted; reserved
sandbox --sandbox accepted; currently a no-op in harnext
provider --provider harnext extra
thinking --thinking harnext extra
env (process env) merged over os.environ
cli_path path to the CLI entry point
extra_args passthrough {"flag": "value"}--flag value
auto_update_cli default True; auto-upgrade the global CLI when it's behind the SDK

CLI version sync

The SDK and CLI are released in lockstep (same version). On the first query() call, if the globally-installed harnext CLI is older than the SDK, the SDK runs npm install -g harnext@<sdk_version> once per process so the new flags it emits are understood. It's best-effort: failures (no npm, offline, permissions) emit a warning and the existing CLI is used.

It's skipped when cli_path or HARNEXT_CLI_PATH is set (custom/dev builds), when auto_update_cli=False, or when HARNEXT_NO_CLI_AUTOUPDATE is set.

Tool names

Use the Claude names (Read, Write, Edit, Bash); they are matched case-insensitively against harnext's native tools and echoed back in PascalCase.

Messages

query() yields SystemMessage (init), AssistantMessage, UserMessage (tool results), then a terminal ResultMessage with subtype (success / error_max_turns / error_during_execution), result, num_turns, duration_ms, total_cost_usd, and usage.

Tests

cd sdk/python
pip install -e ".[dev]"
pytest                  # unit + stub-subprocess e2e
HARNEXT_LIVE_E2E=1 pytest -k live   # live run against the real CLI (needs a provider key)

Publishing to PyPI

The package name on PyPI is harnext (import name harnext_sdk).

CI (recommended): unified release

Releases are unified in .github/workflows/release.yml: pushing a v<version> tag publishes the CLI to npm and the Python SDK to PyPI in one run. The SDK version is derived from the tag, so the CLI and SDK stay in lockstep (v1.3.3 → npm 1.3.3 + harnext==1.3.3). PyPI uses trusted publishing (OIDC — no token stored in the repo).

  1. One-time: on PyPI add a trusted publisher for project harnext, owner QualityUnit, repo harnext, workflow release.yml, environment blank.
  2. Dry run: trigger release.yml via workflow_dispatch (default dry_run=true) — builds and validates npm + PyPI without uploading.
  3. Release: push a v<version> tag (e.g. git tag v1.3.3 && git push origin v1.3.3).

version in pyproject.toml / __version__ in harnext_sdk/__init__.py are the local defaults; CI overwrites them with the tag version at build time.

Manual

cd sdk/python
python -m build                      # -> dist/*.whl, dist/*.tar.gz
python -m twine check dist/*
python -m twine upload dist/*        # needs a PyPI API token (TWINE_USERNAME=__token__)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

harnext-1.4.0.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

harnext-1.4.0-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

Details for the file harnext-1.4.0.tar.gz.

File metadata

  • Download URL: harnext-1.4.0.tar.gz
  • Upload date:
  • Size: 16.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for harnext-1.4.0.tar.gz
Algorithm Hash digest
SHA256 43c609b398235fe72ff6208cc5435661382536dffcc272ef9055248067963d71
MD5 47a57940aef5626ae1e81c5d47db1d0d
BLAKE2b-256 fa09c67a3b6375458a1faf220da8c8b2d612e01bfeddb80a6330c177396eaa9f

See more details on using hashes here.

Provenance

The following attestation bundles were made for harnext-1.4.0.tar.gz:

Publisher: release.yml on QualityUnit/harnext

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file harnext-1.4.0-py3-none-any.whl.

File metadata

  • Download URL: harnext-1.4.0-py3-none-any.whl
  • Upload date:
  • Size: 14.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for harnext-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b05010fbd62ff1358996dee446625ab612745e580b3e05dbd53c21c8bd6888b9
MD5 5a22861450dcb307ad5eb01651ddcf87
BLAKE2b-256 77de39a3f53e2349ad23cfd0b39970fc4290e0f57f9a37fbea8b5090c594c0e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for harnext-1.4.0-py3-none-any.whl:

Publisher: release.yml on QualityUnit/harnext

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page