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).
- One-time: on PyPI add a trusted publisher for project
harnext, ownerQualityUnit, repoharnext, workflowrelease.yml, environment blank. - Dry run: trigger
release.ymlviaworkflow_dispatch(defaultdry_run=true) — builds and validates npm + PyPI without uploading. - 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file harnext-1.14.0.tar.gz.
File metadata
- Download URL: harnext-1.14.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd52307da8052ee9642961cb9148553512aab91fe7c36ed2e2d572f477b6f3a7
|
|
| MD5 |
e0e631290d64499d5d91228a809a6648
|
|
| BLAKE2b-256 |
3fcdf673d94fe1e4e6042486c8f5d83aca5149fabc6de93bfcee5f072a18ca6b
|
Provenance
The following attestation bundles were made for harnext-1.14.0.tar.gz:
Publisher:
release.yml on QualityUnit/harnext
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harnext-1.14.0.tar.gz -
Subject digest:
fd52307da8052ee9642961cb9148553512aab91fe7c36ed2e2d572f477b6f3a7 - Sigstore transparency entry: 1867961627
- Sigstore integration time:
-
Permalink:
QualityUnit/harnext@a9028acc67745b7a9ed2a3e95e2bcb0c08f5956a -
Branch / Tag:
refs/tags/v1.14.0 - Owner: https://github.com/QualityUnit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a9028acc67745b7a9ed2a3e95e2bcb0c08f5956a -
Trigger Event:
push
-
Statement type:
File details
Details for the file harnext-1.14.0-py3-none-any.whl.
File metadata
- Download URL: harnext-1.14.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ecf01e3213905a00168cbe8ee374bf952076e02984ff91c8a1cc97ce08f19c9
|
|
| MD5 |
9348e0d294020da7cdaffcfc18552431
|
|
| BLAKE2b-256 |
030b4b1b19ae2099c585fd66440ae4c2562c5b32174323c976bcc6f1ee8b996b
|
Provenance
The following attestation bundles were made for harnext-1.14.0-py3-none-any.whl:
Publisher:
release.yml on QualityUnit/harnext
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
harnext-1.14.0-py3-none-any.whl -
Subject digest:
7ecf01e3213905a00168cbe8ee374bf952076e02984ff91c8a1cc97ce08f19c9 - Sigstore transparency entry: 1867961714
- Sigstore integration time:
-
Permalink:
QualityUnit/harnext@a9028acc67745b7a9ed2a3e95e2bcb0c08f5956a -
Branch / Tag:
refs/tags/v1.14.0 - Owner: https://github.com/QualityUnit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a9028acc67745b7a9ed2a3e95e2bcb0c08f5956a -
Trigger Event:
push
-
Statement type: