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.9.3.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.9.3-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: harnext-1.9.3.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.9.3.tar.gz
Algorithm Hash digest
SHA256 2847d1e5f07e0a2e5d008139fcc5a04b92e80c6efe164ba03c44606dc06aff3b
MD5 f38e81fda45633e006582a5bd0cdae19
BLAKE2b-256 3d7ded406dad4606681d481300808b90fad6ad852bc31c521b4c509aa5bd2e4c

See more details on using hashes here.

Provenance

The following attestation bundles were made for harnext-1.9.3.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.9.3-py3-none-any.whl.

File metadata

  • Download URL: harnext-1.9.3-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.9.3-py3-none-any.whl
Algorithm Hash digest
SHA256 bd7afd3b05695a619fabb872cdd6437001f46d7a2b4c1647317da04d7a670ac9
MD5 f5bf8786c63244e46d332ed2163865a5
BLAKE2b-256 c0f4cd771a4dcb8a8bb39322aeb0e2c6656725325e60ee1dc4e843c90f91562c

See more details on using hashes here.

Provenance

The following attestation bundles were made for harnext-1.9.3-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