Python SDK for NodeLoom AI agent monitoring and telemetry
Project description
NodeLoom Python SDK
Python SDK for instrumenting AI agents and sending telemetry to NodeLoom.
Features
- Fire-and-forget telemetry that never blocks or crashes your application
- Automatic batching and retry with exponential backoff
- Context manager support for traces and spans
- Built-in integrations for LangChain and CrewAI
- Thread-safe client (individual traces/spans are single-threaded)
- Bounded in-memory queue prevents unbounded memory growth
- Configurable via constructor arguments
Requirements
- Python 3.9+
Installation
pip install nodeloom-sdk
With LangChain integration:
pip install nodeloom-sdk[langchain]
With CrewAI integration:
pip install nodeloom-sdk[crewai]
Quick Start
from nodeloom import NodeLoom, SpanType
client = NodeLoom(api_key="sdk_your_api_key")
with client.trace("my-agent", input={"query": "What is NodeLoom?"}) as trace:
with trace.span("llm-call", type=SpanType.LLM) as span:
span.set_input({"messages": [{"role": "user", "content": "What is NodeLoom?"}]})
# ... call your LLM ...
span.set_output({"text": "NodeLoom is an AI agent operations platform."})
span.set_token_usage(prompt=15, completion=20, model="gpt-4o")
client.shutdown()
Traces and Spans
A trace represents a single end-to-end agent execution. A span represents a unit of work within a trace (an LLM call, tool invocation, retrieval step, etc.).
Span Types
| Type | Description |
|---|---|
SpanType.LLM |
Language model call |
SpanType.TOOL |
Tool or function invocation |
SpanType.RETRIEVAL |
Vector search or data retrieval |
SpanType.CHAIN |
Pipeline or chain of steps |
SpanType.AGENT |
Sub-agent invocation |
SpanType.CUSTOM |
User-defined operation |
Nested Spans
with client.trace("my-agent") as trace:
with trace.span("agent-step", type=SpanType.AGENT) as parent:
with trace.span("llm-call", type=SpanType.LLM, parent_span_id=parent.span_id) as child:
child.set_output({"response": "..."})
child.set_token_usage(prompt=10, completion=20, model="gpt-4o")
Standalone Events
client.event("guardrail_triggered", level=EventLevel.WARN, data={"rule": "pii_detected"})
Error Handling
Traces and spans used as context managers automatically catch exceptions, mark the span/trace as ERROR, and re-raise:
with client.trace("my-agent") as trace:
with trace.span("risky-call", type=SpanType.TOOL) as span:
raise ValueError("something went wrong")
# span is automatically marked as ERROR
# trace is automatically marked as ERROR
You can also set errors manually:
span.set_error("Connection timeout")
trace.end(status=TraceStatus.ERROR, error="Agent failed")
LangChain Integration
from nodeloom import NodeLoom
from nodeloom.integrations.langchain import NodeLoomCallbackHandler
client = NodeLoom(api_key="sdk_your_api_key")
handler = NodeLoomCallbackHandler(client)
# Pass the handler to any LangChain chain, agent, or LLM
result = chain.invoke(input, config={"callbacks": [handler]})
client.shutdown()
The callback handler automatically instruments LLM calls, chain runs, tool invocations, and retriever queries with proper parent-child span relationships.
CrewAI Integration
Decorator
from nodeloom import NodeLoom
from nodeloom.integrations.crewai import instrument_crew
client = NodeLoom(api_key="sdk_your_api_key")
@instrument_crew(client, agent_name="my-crew", agent_version="1.0.0")
def run_crew():
crew = Crew(agents=[...], tasks=[...])
return crew.kickoff()
run_crew()
client.shutdown()
Manual Instrumentation
from nodeloom.integrations.crewai import CrewAIInstrumentation
inst = CrewAIInstrumentation(client)
with inst.trace_crew("my-crew") as ctx:
with ctx.task("research", agent="researcher") as span:
result = do_research()
span.set_output({"result": result})
Configuration
| Parameter | Default | Description |
|---|---|---|
api_key |
required | SDK API key (starts with sdk_) |
endpoint |
https://api.nodeloom.io |
NodeLoom API base URL |
environment |
production |
Deployment environment label |
batch_size |
100 |
Max events per batch |
flush_interval |
5.0 |
Seconds between automatic flushes |
max_retries |
3 |
Retry attempts for failed requests |
queue_max_size |
10000 |
Max queued events before dropping |
timeout |
10.0 |
HTTP request timeout in seconds |
enabled |
True |
Set to False to disable telemetry |
Running Tests
pip install -e ".[dev]"
pytest
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nodeloom_sdk-0.1.0.tar.gz.
File metadata
- Download URL: nodeloom_sdk-0.1.0.tar.gz
- Upload date:
- Size: 26.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5c12bc2ce1885b0a79bc5a8625d62054f3dfef0bb0f4e39db35797232fdb9b8
|
|
| MD5 |
ce90ad6eba39b834fbafd25df150ae49
|
|
| BLAKE2b-256 |
58416c88670b51a865f1a4e1aabba07c2d00e35fd2fa9163dfa705fd7daab803
|
Provenance
The following attestation bundles were made for nodeloom_sdk-0.1.0.tar.gz:
Publisher:
publish.yml on Nodeloom/nodeloom-sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nodeloom_sdk-0.1.0.tar.gz -
Subject digest:
a5c12bc2ce1885b0a79bc5a8625d62054f3dfef0bb0f4e39db35797232fdb9b8 - Sigstore transparency entry: 1109226793
- Sigstore integration time:
-
Permalink:
Nodeloom/nodeloom-sdk-python@797cac329eced33395dcc204c5c84474a3f6196d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Nodeloom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@797cac329eced33395dcc204c5c84474a3f6196d -
Trigger Event:
push
-
Statement type:
File details
Details for the file nodeloom_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: nodeloom_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18f02000df03a7a791a0ed96fd1baffa7c69acd0510178eca990de5116c4164e
|
|
| MD5 |
4d2cd573242d78ec56504ea9fa0948e5
|
|
| BLAKE2b-256 |
9690ceda6e866271a7e516f68ca6be642e066eaac4b23ce8a95007e0b8d720a9
|
Provenance
The following attestation bundles were made for nodeloom_sdk-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Nodeloom/nodeloom-sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nodeloom_sdk-0.1.0-py3-none-any.whl -
Subject digest:
18f02000df03a7a791a0ed96fd1baffa7c69acd0510178eca990de5116c4164e - Sigstore transparency entry: 1109226797
- Sigstore integration time:
-
Permalink:
Nodeloom/nodeloom-sdk-python@797cac329eced33395dcc204c5c84474a3f6196d -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Nodeloom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@797cac329eced33395dcc204c5c84474a3f6196d -
Trigger Event:
push
-
Statement type: