Skip to main content

Subshell + MLX LLM-calling backends (Claude/Codex CLI, local MLX) shared across tools.

Project description

spawnllm

spawnllm banner

PyPI Python Docs License: MIT

Subshell + MLX LLM-calling backends (Claude/Codex CLI, local MLX) shared across tools.

spawnllm centralizes the LLM-calling plumbing that small tools keep re-inventing: driving the claude and codex CLIs as subshells — with structured Pydantic output, model tiers, and faithful error capture — and running local Apple-Silicon MLX models with adapter fusion, prompt-cache reuse, and batched generation. Depend on it once and each tool keeps only its domain logic instead of its own copy of the backends.

Install

Run the CLI with uvx:

uvx spawnllm --help

For the local MLX engine (Apple Silicon only), pull the extra: uv add "spawnllm[mlx]".

Quickstart

See which backends are installed and authenticated, and which one auto-selection picks:

uvx spawnllm status
claude: ready
codex: ready
selected: claude

Make a request by passing a prompt as the argument, or piping it over stdin:

uvx spawnllm call --backend claude "What is 2+2? Reply with just the number."
4

--model small|medium|large swaps the tier, which each backend maps to a concrete model — the claude backend resolves small to Haiku, medium to Sonnet, and large to Opus. Add --agent to let the call use tools. Run uvx spawnllm --help for the full flag list.

From Python

call_sync runs one request and returns the response. With no backend, it auto-selects the first installed, authenticated CLI (its async companion call mirrors the same signature):

from spawnllm import call_sync

print(call_sync("Reply with just the word: pong"))
# pong

Pin a backend and tier explicitly, or pass a Pydantic model to get a validated object back instead of text:

from pydantic import BaseModel

from spawnllm import call_sync, ClaudeCliBackend


class Capital(BaseModel):
    country: str
    capital: str


result = call_sync(
    "What is the capital of France?",
    backend=ClaudeCliBackend(),
    model="large",
    response_model=Capital,
)
print(result.capital)  # Paris

When you don't pin a backend, set specialty= to scope auto-selection by task. The debugging and review specialties route to Codex, and general routes to Claude.

Spec-driven runs

For full control, build a RunSpec and execute it with run_sync (or its async companion run). A RunSpec takes a literal provider model id — no tier mapping — and per-provider flag passthrough via provider_configs. The call returns a RunResult with raw stdout, stderr, and exit code, retrying transient 529/overloaded/rate-limit failures with backoff:

from spawnllm import run_sync, RunSpec, ClaudeConfig, ClaudeCliBackend

result = run_sync(
    RunSpec(
        prompt="What is 2+2? Reply with just the number.",
        model="opus",
        provider_configs={"claude": ClaudeConfig(permission_mode="bypassPermissions")},
    ),
    backend=ClaudeCliBackend(),
)
print(result.stdout)  # 4

How it works

Each backend holds plumbing that consumers would otherwise rebuild: the CLI backends own argv construction, stdin/stdout piping, stderr teeing, and turning non-zero exits into useful errors, and they turn a Pydantic model into a JSON-schema constraint plus a parsed, validated result. The MLX engine wraps adapter fusion, prompt-cache reuse, worker-thread lifecycle, and batched single-token generation. Tools that share the layer stay byte-for-byte consistent instead of drifting across diverging copies.

Docs

Read the docs for the full guide and API reference.

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

spawnllm-0.5.1.tar.gz (28.3 kB view details)

Uploaded Source

Built Distribution

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

spawnllm-0.5.1-py3-none-any.whl (39.2 kB view details)

Uploaded Python 3

File details

Details for the file spawnllm-0.5.1.tar.gz.

File metadata

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

File hashes

Hashes for spawnllm-0.5.1.tar.gz
Algorithm Hash digest
SHA256 b8d926d8048c66e54f9d78b2bf85f63af2278527f84b17d05c8eafe8d208bf5c
MD5 1e946cf685e8e081719c829cef87d211
BLAKE2b-256 40f533e40b389b71d00dd956200292267ac8de424cce09b8a7188d4ef3a34366

See more details on using hashes here.

Provenance

The following attestation bundles were made for spawnllm-0.5.1.tar.gz:

Publisher: release-pypi.yml on yasyf/spawnllm

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

File details

Details for the file spawnllm-0.5.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for spawnllm-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6e926fa8db138bffe5c0744e14f1ee7e8905937ca863967d7ab51c379599d1ee
MD5 250502a334454f5b47dedaf1d9dad9e5
BLAKE2b-256 0e842cd7d07efd1ba292c5966d83b9129271722940727e4124d2cbb587092d12

See more details on using hashes here.

Provenance

The following attestation bundles were made for spawnllm-0.5.1-py3-none-any.whl:

Publisher: release-pypi.yml on yasyf/spawnllm

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