ClientCoded Python SDK
Trace your AI agent's tool calls for root cause analysis when failures occur.
Install
pip install clientcoded
Quick Start
import clientcoded
# Configure once at startup
clientcoded.configure(
agent_id="your-agent-id",
api_key="your-api-key"
)
# Decorate any function your agent calls
@clientcoded.trace
def get_invoice(invoice_id):
return stripe.Invoice.retrieve(invoice_id)
@clientcoded.trace
def search_knowledge_base(query):
return pinecone.query(query)
@clientcoded.trace
def update_crm(contact_id, data):
return hubspot.update_contact(contact_id, data)
Conversation Tracking
# At the start of each conversation
clientcoded.set_conversation_id("conv-123")
# At each turn
clientcoded.set_turn(1)
response = agent.handle_message("What is my invoice total?")
clientcoded.set_turn(2)
response = agent.handle_message("Can you break that down by line item?")
Async Support
@clientcoded.trace_async
async def get_invoice(invoice_id):
return await stripe.Invoice.aretrieve(invoice_id)
Custom Names
@clientcoded.trace(name="stripe_invoice_lookup")
def get_invoice(invoice_id):
return stripe.Invoice.retrieve(invoice_id)
Manual Logging
For complex operations where decorators don't fit:
import time
start = time.time()
try:
result = complex_multi_step_operation()
clientcoded.log_trace(
"complex_operation",
input_data={"step": "final"},
output_data=result,
latency_ms=int((time.time() - start) * 1000)
)
except Exception as e:
clientcoded.log_trace(
"complex_operation",
input_data={"step": "final"},
error=str(e),
latency_ms=int((time.time() - start) * 1000)
)
raise
LangChain Integration
from langchain.tools import tool
import clientcoded
clientcoded.configure(agent_id="your-agent-id", api_key="your-api-key")
@tool
@clientcoded.trace
def search_database(query: str) -> str:
"""Search the company database."""
return db.execute(query)
LlamaIndex Integration
from llama_index.core.tools import FunctionTool
import clientcoded
clientcoded.configure(agent_id="your-agent-id", api_key="your-api-key")
@clientcoded.trace
def query_index(question: str) -> str:
return index.query(question)
tool = FunctionTool.from_defaults(fn=query_index)
What Gets Traced
For each decorated function call, the SDK logs:
- Function name (or custom name)
- Input arguments (truncated to 2000 chars)
- Output (truncated to 2000 chars)
- Error message if the function threw
- Latency in milliseconds
- Conversation ID and turn number (if set)
What Doesn't Get Traced
- The SDK never captures environment variables
- The SDK never captures file contents
- Large inputs/outputs are truncated, not stored in full
- All trace sends are fire-and-forget with a 2-second timeout
Safety
- The SDK will never break your agent. Every trace send is wrapped in try/catch.
- Trace sends happen in background threads. Zero impact on response latency.
- If the ClientCoded API is down, traces are silently dropped. Your agent continues normally.
- No sensitive data filtering in v0.1. Do not decorate functions that handle passwords, tokens, or PII directly. Wrap them in a function that sanitizes first.
Configuration
| Environment Variable | Default | Description |
|---|---|---|
| CLIENTCODED_TRACE_URL | https://clientcoded.app.n8n.cloud/webhook/ap-35-trace-ingest | Custom trace endpoint |
Metadata
Release files for clientcoded 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| clientcoded-0.4.0.tar.gz | 9.3 kB | Without provenance | Details for clientcoded-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| clientcoded-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for clientcoded-0.4.0-py3-none-any.whl |
Total release size: 17.5 kB
Release files / clientcoded-0.4.0.tar.gz
| Download URL | clientcoded-0.4.0.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
19d78de29571c03ad3fcc9c78da10c1c31fa65b740010706bf4d9554a9a25dfb
|
|
BLAKE2b-256 checksum How to use checksums |
944672611a0b00422fdc7fff7f04417e73c48534e19981d463dafcde773d5dfc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / clientcoded-0.4.0-py3-none-any.whl
| Download URL | clientcoded-0.4.0-py3-none-any.whl |
|---|---|
| Size | 8.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e188d38df6e0d13fe8d82d68c626d9d79ee6048f13b01a04e270148da4204da
|
|
BLAKE2b-256 checksum How to use checksums |
ac02a165b398d89462ceaccf0bf9535d0e2991304ad0fa9742fb650426cc54d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Security for clientcoded 0.4.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.