Skip to main content

caveman-sdk

caveman-sdk is the Apache-2.0-licensed Python client in the main Caveman repository. Import it as caveman_cloud. It requires Python 3.11 or newer, uses only the standard library at runtime, and includes py.typed type information.

Install

mkdir caveman-python-example
cd caveman-python-example
python3 -m venv .venv
source .venv/bin/activate
python -m pip install caveman-sdk==1.2.0

On Windows, activate with .venv\Scripts\Activate.ps1 in PowerShell. Use python -m pip so installation targets the interpreter running your app. The PyPI package named caveman is unrelated.

Configure your service

Set these variables through your shell or secret manager:

export CAVE_BASE_URL="https://your-caveman-service.example"
export CAVE_API_KEY="your-service-key"
export CAVE_MODEL="your-enabled-model-id"
# Only when your service requires a provider key:
export OPENAI_API_KEY="your-provider-key"

Replace the placeholder address with your configured service. The SDK does not supply a default address, obtain credentials, or start a local runtime. See configure.

Make your first request

Save this as quickstart.py:

import json
import os
from urllib.error import HTTPError, URLError
from caveman_cloud import Cave

cave = Cave(
    api_key=os.environ["CAVE_API_KEY"],
    base_url=os.environ["CAVE_BASE_URL"],
    agent="support-agent",
    default_workflow="answer-question",
)

try:
    response = cave.openai(
        upstream_key=os.environ.get("OPENAI_API_KEY"),
    ).responses.create({
        "model": os.environ["CAVE_MODEL"],
        "input": "Explain what a retry loop is in one sentence.",
    })
    print(json.dumps(response, indent=2))
except HTTPError as error:
    raise SystemExit(f"Provider request failed: HTTP {error.code}") from error
except (URLError, TimeoutError) as error:
    raise SystemExit(f"Service connection failed: {error}") from error
python quickstart.py

A successful call returns the provider JSON as a Python dictionary. It is not an HTTP response object: it has no .headers, .json(), or .output_text attribute.

Compress a string

After creating cave, call a service that supports the compression API:

original = json.dumps({"records": [
    {"id": 1, "status": "ok"},
    {"id": 2, "status": "ok"},
]})
compressed = cave.compress(original, content_type="json")
print(compressed.output)
print(compressed.tokens_before, compressed.tokens_after)
print(compressed.basis, compressed.recovery_handle)

The return value is a CompressResult dataclass. Access its fields with dots. The SDK preserves the original string on transport or parse failure; small inputs may also remain unchanged. Read compression before treating an unchanged result as a working service check.

Call from an async application

Core client methods perform blocking I/O. They are not coroutines. Move a call off the event loop when integrating with an async application:

import asyncio

async def compress_tool_output(text: str):
    return await asyncio.to_thread(cave.compress, text, content_type="text")

Cancelling the awaiting task does not forcibly stop the underlying thread's HTTP request. Provider calls, compression, and shared-context calls use a 300-second urllib timeout; most other connected SDK operations use 30 seconds. The core Cave constructor has no timeout or cancellation option. These socket timeouts are not a whole-workflow deadline.

For native async framework compression, the separate middleware entrypoint exposes AsyncMiddlewareRuntime. That does not turn the core provider clients into async clients.

Python naming and limits

Python uses base_url, default_workflow, tool_search, and retry_loop_breaker; TypeScript uses camelCase. Python chat completions use cave.openai().chat["completions"].create(body). Trace providers use trace.model["openai"].

The SDK does not execute tool calls, process provider SSE streams, or install a compression runtime. Follow provider calls, deferred tools, tracing, and the API reference for complete workflows.

Full documentation

SDK overview · API reference · Troubleshooting

Native framework middleware

caveman_cloud.middleware is stable and follows semver with the rest of caveman-sdk, because caveman-middleware 1.x depends on it.

For automatic projection of eligible tool results in an existing framework, use the separate middleware package. Start with the complete LangChain quickstart. The local runtime is accountless; inference stays in your provider client. The thin connected APIs above remain explicit calls.

Metadata

Release files for caveman-sdk 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for caveman-sdk 1.2.0
File Size Uploaded
caveman_sdk-1.2.0.tar.gz 121.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for caveman-sdk 1.2.0
File Interpreter ABI Platform
caveman_sdk-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 194.7 kB

Release files / caveman_sdk-1.2.0.tar.gz

Download URL caveman_sdk-1.2.0.tar.gz
Size 121.4 kB
Tags Source
SHA-256 checksum
How to use checksums
6bb4b61015c860c4161bce68efb5d4fde51d8402e67328883859e1eb72642a17
BLAKE2b-256 checksum
How to use checksums
a1e9436dc7cb47bee8b97c31226596a5d85e0c149e601b194d8cb289ca964803
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release files / caveman_sdk-1.2.0-py3-none-any.whl

Download URL caveman_sdk-1.2.0-py3-none-any.whl
Size 73.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
86a930a7f525756d307b741115962e0ef3211369ed3c590ca5d87b88db1d6e74
BLAKE2b-256 checksum
How to use checksums
1ac1b72a03f062526e69575371821f64ad2fe7b31dadfbb58e3c6292d2e31f11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page