Skip to main content

Coolhand Python

PyPI version

Monitor and log LLM API calls from OpenAI, Anthropic, Google Gemini, GitHub Copilot, Vertex AI, OpenRouter, OpenCode, Cloudflare AI Gateway, ElevenLabs, DeepSeek, Mistral, Perplexity, xAI, Cohere, Amazon Bedrock, Ollama, and more — including pydantic-ai and Dramatiq — to the Coolhand analytics platform.

Python 3.8 and 3.9 support deprecated: As of v0.4.0, coolhand requires Python 3.10 or later. Python 3.8 reached end-of-life in October 2024 and 3.9 in October 2025. If you are on an older Python version, pin to coolhand<0.4.0.

Installation

pip install coolhand

Getting Started

  1. Get API Key: Visit coolhandlabs.com to create a free account
  2. Install: pip install coolhand
  3. Configure: Set COOLHAND_API_KEY and import coolhand in your app
  4. Deploy: Your AI calls are now automatically monitored!

Quick Start

Automatic Global Monitoring

Set it and forget it! Monitor ALL AI API calls across your entire application with minimal configuration.

import coolhand  # Auto-initializes and starts monitoring

# That's it! ALL AI API calls are now automatically monitored:
# ✅ OpenAI SDK calls
# ✅ Anthropic API calls
# ✅ Google Gemini API calls
# ✅ GitHub Copilot SDK calls
# ✅ ANY library making AI API calls via httpx

# Your existing code works unchanged:
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Hello!"}]
)
# The request and response have been automatically logged to Coolhand!

Why Automatic Monitoring:

  • Zero refactoring - No code changes to existing services
  • Complete coverage - Monitors all AI libraries using httpx automatically
  • Security built-in - Automatic credential sanitization
  • Performance optimized - Negligible overhead via async logging
  • Future-proof - Automatically captures new AI calls added by your team

Configuration

Environment Variables

Variable Required Default Description
COOLHAND_API_KEY Yes - Your Coolhand API key for authentication
COOLHAND_BASE_URL No https://coolhandlabs.com Override the API host (self-hosted deployments)
COOLHAND_SILENT No true Set to false for verbose logging output

Manual Configuration

from coolhand import Coolhand

coolhand_client = Coolhand(
    api_key='your-api-key',
    silent=False,  # Enable verbose logging
)

For excluding noisy endpoints (health checks, batch jobs) or pointing the SDK at a self-hosted backend, see Advanced Configuration.

Usage Examples

With OpenAI

import coolhand
from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
# Request automatically logged to Coolhand!

With Anthropic

import coolhand
from anthropic import Anthropic

client = Anthropic()
response = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}]
)
print(response.content[0].text)
# Request automatically logged to Coolhand!

With Google Gemini

import coolhand
import google.generativeai as genai

genai.configure(api_key="your-gemini-api-key")
model = genai.GenerativeModel("gemini-pro")
response = model.generate_content("Hello!")
print(response.text)
# Request automatically logged to Coolhand!

With GitHub Copilot SDK

import coolhand
# GitHub Copilot SDK calls are automatically intercepted
# via JsonRpcClient patching — no additional setup needed.

With Streaming

import coolhand
from openai import OpenAI

client = OpenAI()
stream = client.chat.completions.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Tell me a story"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
# Complete streamed response automatically logged to Coolhand!

What Gets Logged

The monitor captures:

  • Request Data: Method, URL, headers, request body
  • Response Data: Status code, headers, response body
  • Timing: Request timestamp, response timestamp, duration
  • LLM-Specific: Model used, token counts, streaming status

Headers containing API keys, sensitive URL query parameters, and datastore credentials embedded in request bodies (such as Azure OpenAI On Your Data) are automatically redacted. See Supported Libraries for the exact scope.

Supported Libraries

Coolhand works with any library that uses httpx, requests, or the GitHub Copilot SDK:

  • OpenAI Python SDK
  • Anthropic Python SDK
  • Google Gemini (google-generativeai / google-genai)
  • Azure OpenAI (including Azure Government and Azure China endpoints)
  • Azure AI Foundry / Azure AI Inference (azure-ai-inference)
  • Azure Machine Learning managed online endpoints
  • GitHub Models
  • GitHub Copilot SDK
  • Vertex AI
  • Cloudflare AI Gateway
  • OpenRouter
  • OpenCode
  • ElevenLabs
  • DeepSeek
  • Mistral
  • Perplexity
  • xAI
  • Cohere (v2 chat, v1/v2 embed)
  • Amazon Bedrock
  • TypeSafe Jev (System One)
  • Ollama (non-localhost hosts on the default port, e.g. http://ollama:11434)
  • pydantic-ai
  • Any other library using httpx or requests

See Supported Libraries for the full interception mechanism breakdown and streaming details.

How It Works

Importing coolhand patches httpx, requests, and the GitHub Copilot JsonRpcClient at the class level. Requests to LLM APIs are intercepted, credentials are redacted, and data is submitted to Coolhand. Non-LLM requests pass through unchanged.

Integrations

Integration Status Guide
Dramatiq + pydantic-ai ✅ Supported docs/dramatiq.md
Celery 🔜 Coming soon —

Feedback Service

Collect user feedback on LLM responses to improve your AI outputs.

Frontend Feedback Widget: For browser-based feedback collection, see coolhand-js.

from coolhand import Coolhand

ch = Coolhand(api_key='your-api-key')

# Submit positive feedback
ch.create_feedback({
    'llm_request_log_id': 'abc123def456',  # hashid from a prior response; a raw integer FK also still works
    'sentiment': 'like',
    'explanation': 'Very helpful response!'
})

# Submit negative feedback with a correction
ch.create_feedback({
    'original_output': 'The capital of France is London.',
    'sentiment': 'dislike',
    'revised_output': 'The capital of France is Paris.'
})

Running inside an event loop (e.g. an async web handler)? Use await ch.acreate_feedback(...) instead — same fields, same result, non-blocking.

For the full field reference, matching strategies, sentiment values, and async usage, see Feedback API.

Reading Templates

search_templates and get_template read back the LLM request templates your logs are matched against. Unlike the monitoring and feedback calls, these require your private API key (the public key is write-only and 401s):

from coolhand import Coolhand

ch = Coolhand(api_key='your-private-api-key')

result = ch.search_templates(search='summar', status='published')

template = ch.get_template(result['templates'][0]['id'])

Search is a parameter on the list endpoint, not a route of its own. The Unmatched / Ignored API Calls system buckets are hidden unless you pass include_system=True, and prompt patterns come from get_template only.

These are read methods, so they raise CoolhandAPIError (carrying the HTTP status on .status) rather than returning None the way create_feedback does — a caller needs to tell a 404 from a retryable 504.

For the full filter reference, pagination, and error handling, see Reading Templates.

Troubleshooting

Enable Debug Output

from coolhand import Coolhand

Coolhand(
    api_key='your-api-key',
    silent=False  # Enable verbose logging
)

Or via environment variable:

export COOLHAND_SILENT=false

API Key

Sign up for free at coolhandlabs.com to get your API key and start monitoring your LLM usage.

What you get:

  • Complete LLM request and response logging
  • Usage analytics and insights
  • No credit card required to start

Security

  • API keys in request headers are automatically redacted
  • Sensitive URL query parameters (key, api_key, token, etc.) are automatically redacted
  • Datastore credentials embedded in request bodies (e.g. Azure OpenAI On Your Data) are automatically redacted
  • No sensitive data is exposed in logs
  • All data is sent via HTTPS to Coolhand servers

Documentation

  • Advanced Configuration — exclude patterns, self-hosted deployments, custom intercept addresses
  • Feedback API — full field reference, matching strategies, sentiment values, async usage
  • Supported Libraries — interception mechanisms, streaming, thread/process safety, delivery model
  • Dramatiq + pydantic-ai — task queue integration guide, known gaps, workarounds
  • Reading Templates — search LLM request templates and fetch a single one, prompt patterns included, using the private API key
  • Frontend (Feedback Collection Widget): coolhand-js - Frontend feedback widget for collecting user feedback on AI outputs
  • Ruby: coolhand gem - Coolhand monitoring for Ruby applications
  • Node.js: coolhand-node package - Coolhand monitoring for Node.js applications

Community

About Coolhand Labs

Coolhand Labs builds observability and feedback tooling for AI-powered applications. Our platform helps teams monitor LLM usage, collect structured human feedback, and improve output quality over time — across every provider and framework.

License

Apache-2.0

Metadata

Release files for coolhand 0.8.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 coolhand 0.8.0
File Size Uploaded
coolhand-0.8.0.tar.gz 133.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for coolhand 0.8.0
File Interpreter ABI Platform
coolhand-0.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 181.8 kB

Release files / coolhand-0.8.0.tar.gz

Download URL coolhand-0.8.0.tar.gz
Size 133.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c757b9949ae0400be05f9840f0623f823fb2c1114b6e88d4356b739240e13d7c
BLAKE2b-256 checksum
How to use checksums
2b010da86c8aefddb8fbfb5eef48e719a4b6a75b1ba68162275ae755f7f7fd03
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 20, 2026.

Transparency log

Release files / coolhand-0.8.0-py3-none-any.whl

Download URL coolhand-0.8.0-py3-none-any.whl
Size 48.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e95aba3329a9b4147beffb9a7f6f3b062c83d87b638cbb11c08448774bd15daf
BLAKE2b-256 checksum
How to use checksums
ed127ad370cf40f228291425073124fa1d860a7860a29f6928edf3ebf422bc76
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 20, 2026.

Transparency log

Release history Release notifications | RSS feed

0.9.0

2 release files

This release

0.8.0 This release

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.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