ghostdrive1's picture
Upload folder using huggingface_hub
116524e verified
|
Raw
History Blame Contribute Delete
5.23 kB
# Tracing
Send agent traces to Kayba with a few lines of code. The `ace.tracing` module wraps all tracing functionality behind a Kayba-native API — just configure your API key and instrument your functions.
## Installation
```bash
pip install ace-framework[tracing]
```
## Quick Start
```python
from ace.tracing import configure, trace, start_span
configure(api_key="kb-...")
@trace
def my_agent(query: str) -> str:
with start_span("retrieval") as span:
span.set_inputs({"query": query})
results = search(query)
span.set_outputs(results)
return synthesize(results)
my_agent("What is the capital of France?")
```
Every call to `my_agent` now produces a trace visible in your Kayba dashboard.
## Configuration
### configure()
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `api_key` | `str` | `None` | Kayba API key. Falls back to `KAYBA_API_KEY` env var |
| `base_url` | `str` | `None` | API base URL. Falls back to `KAYBA_API_URL`, then `https://use.kayba.ai` |
| `experiment` | `str` | `None` | Optional experiment name for grouping traces |
| `folder` | `str` | `None` | Optional folder name — traces are filed into this folder in the dashboard |
### Environment Variables
| Variable | Description |
|----------|-------------|
| `KAYBA_API_KEY` | API key (alternative to passing `api_key=` directly) |
| `KAYBA_API_URL` | Base URL override (default: `https://use.kayba.ai`) |
### Minimal Configuration
If `KAYBA_API_KEY` is set in your environment, configuration is a single line:
```python
from ace.tracing import configure
configure()
```
Or skip the import entirely and configure from `ace`:
```python
from ace import configure_tracing
configure_tracing(api_key="kb-...")
```
## Instrumenting Your Code
### @trace decorator
Wrap any function to automatically capture its inputs, outputs, and duration:
```python
from ace.tracing import trace
@trace
def classify(text: str) -> str:
return call_llm(f"Classify: {text}")
```
Add metadata with optional parameters:
```python
@trace(name="custom-name", span_type="LLM", attributes={"model": "gpt-4o"})
def classify(text: str) -> str:
return call_llm(f"Classify: {text}")
```
### start_span context manager
For finer-grained control within a function:
```python
from ace.tracing import trace, start_span
@trace
def my_agent(query: str) -> str:
with start_span("retrieve") as span:
span.set_inputs({"query": query})
docs = vector_search(query)
span.set_outputs({"count": len(docs)})
with start_span("generate") as span:
span.set_inputs({"docs": docs})
answer = llm_generate(docs, query)
span.set_outputs({"answer": answer})
return answer
```
Spans nest automatically — child spans created inside a parent span are linked in the trace tree.
### Nested function tracing
Decorated functions called within other decorated functions produce a nested trace:
```python
from ace.tracing import trace
@trace
def retrieve(query: str) -> list[str]:
return vector_search(query)
@trace
def generate(docs: list[str], query: str) -> str:
return llm_call(docs, query)
@trace
def agent(query: str) -> str:
docs = retrieve(query) # child span
return generate(docs, query) # child span
```
Calling `agent("...")` produces a single trace with three spans in a tree.
## Folders
Traces can be organized into folders in the Kayba dashboard. Set the folder at configuration time or change it dynamically:
```python
from ace.tracing import configure, set_folder, trace
# Set folder at configure time
configure(api_key="kb-...", folder="production")
@trace
def my_agent(query: str) -> str:
...
# Change folder mid-session
set_folder("staging")
# Clear folder (traces go to Unfiled)
set_folder(None)
```
All traces created after `set_folder()` are tagged with the new folder. Previously sent traces are not affected.
## Enabling / Disabling
```python
from ace.tracing import enable, disable
disable() # temporarily stop sending traces
# ... untraced code ...
enable() # resume
```
## Retrieving Traces
```python
from ace.tracing import get_trace, search_traces
# Fetch a specific trace by ID
t = get_trace("abc123")
# Search recent traces
traces = search_traces()
# Search within a specific experiment
traces = search_traces(experiment_names=["my-experiment"])
```
## Full API Reference
| Function | Description |
|----------|-------------|
| `configure()` | Set API key, base URL, experiment, and folder |
| `trace` | Decorator — auto-instruments a function |
| `start_span()` | Context manager — create a child span with manual inputs/outputs |
| `set_folder()` | Change the target folder for subsequent traces |
| `get_folder()` | Return the currently configured folder |
| `enable()` | Re-enable tracing after disabling |
| `disable()` | Temporarily stop sending traces |
| `get_trace()` | Retrieve a trace by ID |
| `search_traces()` | Search for traces by experiment |