cat-claws
Agent-SDK backends for the CatLLM ecosystem: classify text through a Claude subscription (Claude Agent SDK) or a ChatGPT subscription (openai-codex SDK) instead of per-token API billing.
(Distribution name cat-claws; imports as catclaws. Source repo:
cat-agent.)
Status: alpha, under active development. See MASTERPLAN.md for the
design and step tracker, and OPENAI_MASTERPLAN.md for the Codex backend's
execution record.
Install
Each backend's SDK is an extra — install the one(s) you use:
pip install "cat-claws[claude]" # Claude backend (claude-agent-sdk)
pip install "cat-claws[codex]" # Codex backend (openai-codex, bundles the codex binary)
pip install "cat-claws[claude,codex]" # both
A bare pip install cat-claws installs neither SDK; calls then return a
clear per-row install hint instead of classifying.
Design in one paragraph
One row = one sealed, fresh-context agent call (no tools, single turn, no settings/AGENTS.md/CLAUDE.md loading), using cat-stack's validated classification prompt byte-for-byte. The model answers in JSON; parsing and the wide 0/1 output matrix reuse cat-stack's existing machinery. Throughput comes from concurrent one-shot calls, never from shared conversations or corpus-in-one-prompt (which would contaminate rows and break research validity).
Quick start
import catclaws
# Claude subscription (requires Claude Code installed and logged in):
df = catclaws.classify(
input_data=["I moved for a new job", "Rent got too expensive"],
categories=["Employment", "Cost of living", "Other"],
description="Why did you move?",
agent="claude", # default; user_model=None -> claude-sonnet-5
)
# ChatGPT subscription (requires `codex login`; the SDK bundles the binary):
df = catclaws.classify(
input_data=["I moved for a new job", "Rent got too expensive"],
categories=["Employment", "Cost of living", "Other"],
description="Why did you move?",
agent="codex", # user_model=None -> gpt-5.5
)
No API key needed for either backend. Engine users reach the same adapters
via catstack.classify(..., model_source="claude-agent") /
model_source="codex-agent".
Notes for agent="codex": reasoning is explicitly set per call
(thinking_budget=0 → effort "none"), so your ~/.codex/config.toml
defaults are never silently inherited. Images (and rendered PDF pages) are
supported on both backends; the codex SDK takes file paths, so each image is
written to a private temp file for the call and deleted afterwards.
Methodology note
The two backends answer the same frozen prompt. On the 24-row synthetic
parity run (2026-07-11, benchmarks/parity_run.py) claude-sonnet-5 and
gpt-5.5 agreed on 96/96 cells (Cohen's kappa 1.000, 0 errors). Synthetic
one-liners are easy; expect some divergence on real survey text — measure
and disclose per study (benchmarks/RESULTS.md holds the running record),
and never tune the prompt to force agreement.
Metadata
Release files for cat-claws 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cat_claws-0.3.2.tar.gz | 65.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cat_claws-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 83.4 kB
Release files / cat_claws-0.3.2.tar.gz
| Download URL | cat_claws-0.3.2.tar.gz |
|---|---|
| Size | 65.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0c42594ef9e03b175aa385e817fc4b7cfcb117c1ab3bcbd56f29aecfe214c84
|
|
BLAKE2b-256 checksum How to use checksums |
1cfd8309fe1c26187017144dd60da3ff2e43115a10c2166c55b703977d012485
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.14
|
Release files / cat_claws-0.3.2-py3-none-any.whl
| Download URL | cat_claws-0.3.2-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
09d34e920ab5faf23d6b2c661f155159ada41f62e8c115c9db035c2e2fc1b8ed
|
|
BLAKE2b-256 checksum How to use checksums |
d33146a9debea9feb29ec5ed811ae7ae9c76ef31d1f4edbc9989c89a06942ef5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.14
|