Skip to main content

neatlogs

LLM observability for AI agents.
Instrument once. Inspect everything.

PyPI version Python 3.10+ MIT License

Website  ·  Docs  ·  Get API key  ·  AI Skill


Agent failures don't throw exceptions — they produce wrong outputs, miss tool calls, or hallucinate.
Neatlogs captures every trace so you can see exactly what the model was given, what it decided, and what each step returned.


neatlogs

Installation

pip install neatlogs

Optional extras install the underlying LLM / framework libraries:

pip install "neatlogs[openai]"
pip install "neatlogs[crewai]"
pip install "neatlogs[langchain,langgraph]"
pip install "neatlogs[google-genai]"

Requires Python >= 3.10, < 3.14.

Before initialization, run the local Doctor. It sends generated non-user workflow and tool spans through an isolated instance of the installed SDK's normalization, masking, capture, and flush pipeline. It performs no backend request and requires no API key:

python -m neatlogs doctor --local --json
# or: neatlogs-doctor --local --json

A passing local result proves that this installed SDK pipeline works. It does not prove that an application's own instrumentors or backend export are working. Doctor capture is enabled only inside the isolated local/probe pipeline, is strictly bounded, and is cleared during shutdown; normal application telemetry is never retained for diagnostics. Use doctor --probe to export a controlled trace through /v1/traces and read that exact trace back through /api/traces/v3/:traceId; HTTP acceptance or exporter flush alone is not a pass.


Quickstart

import neatlogs
from neatlogs import span

neatlogs.init(
    api_key="your-api-key",       # or NEATLOGS_API_KEY env var
    workflow_name="my-agent",
    instrumentations=["openai"],
)

# Import instrumented libraries AFTER init()
from openai import OpenAI


@span(kind="WORKFLOW", name="quickstart")
def main():
    client = OpenAI()
    return client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "What is AI?"}],
    )


main()
neatlogs.flush()
neatlogs.shutdown()

Auto-instrumentation captures LLM calls, tools, and retrievals as child spans. Use @span(kind="WORKFLOW") on your main function or request handler so each run shows up as a top-level trace in the dashboard.

Call neatlogs.init() before importing any instrumented library.

For long-running servers (FastAPI, Celery workers), call init() once at startup and decorate each request handler with @span(kind="WORKFLOW"). Do not call flush() / shutdown() per request.

Full walkthrough: Your First Trace.

Payload delivery status

Normal OTLP batches are byte-limited and gzip-compressed. Deploy and verify gzip-aware trace intake before releasing this SDK version. Captured text values are bounded to 100,000 UTF-8 bytes and telemetry items to a 1 MB capture budget. A truncated value contains its original byte length, SHA-256 digest, and backend_upload_contract_unavailable; spans/logs also carry neatlogs.capture.* diagnostics, exposed through get_delivery_diagnostics().

Typed-media metadata is detected without fetching remote content. Credential-bearing remote locators are reduced to scheme/host/path, and large inline media is replaced in captured bodies by typed unavailable metadata rather than a base64 prefix. Authenticated large-media and oversized trace uploads are available behind the default-off uploads_enabled=True option (or NEATLOGS_UPLOADS_ENABLED=true). The SDK masks first, prepares an API-key-authenticated upload, PUTs only to the returned HTTPS object URL, completes backend validation, and exports only a small canonical ready reference. Signed URLs and headers never enter telemetry. In-progress, rejected, expired, or otherwise incomplete uploads fail explicitly and are exposed through get_delivery_diagnostics(); an oversized item is never also sent through ordinary ingest.

Prompt client boundary

Prompt-management requests are product-data API calls, not trace telemetry. The telemetry mask= callback does not transform prompt content passed to PromptClient; apply any desired prompt transformation before calling the prompt API. The prompt client authenticates with the configured project API key and endpoint independently of the telemetry exporter.

Unpinned and label-based reads use a configurable 60-second cache by default. An expired entry is returned immediately while one background refresh runs for that key; a refresh failure leaves the stale entry available for the next retry. Explicitly versioned reads stay pinned to that immutable version for the lifetime of the client. Each client retains at most 100 prompt selectors and runs at most four background refreshes concurrently. Call PromptClient.close() when an explicitly constructed client is no longer needed. neatlogs.shutdown() closes the module-level prompt clients created from init() so a later SDK generation cannot reuse an earlier project's key or cache. Prompt API failures do not flush, stop, or reconfigure the telemetry provider, and API response bodies are not copied into SDK error messages.


The fastest way to add NeatLogs to an existing project is the official Agent Skill — it encodes import order, @span kinds, CrewAI prompt binding, and troubleshooting so your coding agent gets it right.

Repo: github.com/neatlogs/skills

npx skills add neatlogs/skills --skill "neatlogs-py"

For Cursor:

npx skills add neatlogs/skills --skill "neatlogs-py" --agent "cursor"

No Node.js? Ask in chat: "Install the NeatLogs AI skill from github.com/neatlogs/skills"

Example prompts once installed:

  • "Add neatlogs tracing to my OpenAI calls"
  • "Instrument my CrewAI agents with neatlogs"
  • "Wrap my FastAPI handler so each request is a top-level trace"

Full install options: skills README. The Wizard detects the project, downloads the needed Skill from the latest Skills release, applies the documented instrumentation, and runs the applicable checks.

API reference: docs.neatlogs.com


Platform features

  • Traces: Full span trees — LLM calls, tools, retrievals, reranking, guardrails — with inputs, outputs, tokens, cost, and latency.

  • Timeline view: See which steps ran in parallel, where latency concentrated, and where the process was idle.

  • AI assistant: Ask questions grounded in the actual span data for a trace.

  • AI Search: Query traces in plain English without writing SQL.

  • Detections: Rules that flag matching spans — regex, numeric conditions, PII, or model classifiers.

  • Prompt management: Version prompts, promote labels, test in the Playground.

  • Evals: Human review campaigns — select traces or spans (or auto-collect future ones via filters), send custom rating forms to assigned reviewers, and track batch progress and scores.

  • Comments & voting: Pin notes to spans, @mention teammates, and thumbs-up/down vote outputs while debugging a trace.


Supported libraries

Pass keys to instrumentations in neatlogs.init(). Install extras when noted.

LLM providers

Provider Key Install
OpenAI openai pip install "neatlogs[openai]"
Anthropic anthropic pip install "neatlogs[anthropic]"
Google Gemini google_genai pip install "neatlogs[google-genai]"
Azure AI Inference azure_ai_inference pip install "neatlogs[azure-ai-inference]"
Azure OpenAI (AzureOpenAI client) openai pip install "neatlogs[azure-openai]"
AWS Bedrock bedrock pip install "neatlogs[bedrock]"
LiteLLM litellm pip install "neatlogs[litellm]"
Groq groq pip install "neatlogs[groq]"
Vertex AI vertexai pip install "neatlogs[vertexai]"
Vertex AI (google-genai SDK) vertex_ai pip install "neatlogs[vertex-ai]"
Mistral mistralai pip install "neatlogs[mistralai]"
Portkey portkey pip install "neatlogs[portkey]"

Agent frameworks

Framework Key Install
LangChain langchain pip install "neatlogs[langchain]"
LangGraph langgraph pip install "neatlogs[langgraph]"
CrewAI crewai pip install "neatlogs[crewai]"
LlamaIndex llamaindex pip install "neatlogs[llama-index]"
Haystack haystack pip install "neatlogs[haystack]"
AutoGen autogen pip install "neatlogs[autogen-agentchat]"
DSPy dspy pip install "neatlogs[dspy]"
MCP mcp pip install "neatlogs[mcp]"
Agno agno pip install "neatlogs[agno]"
Google ADK google_adk pip install "neatlogs[google-adk]"
OpenAI Agents openai_agents pip install "neatlogs[openai-agents]"
Pydantic AI pydantic_ai pip install "neatlogs[pydantic-ai]"
smolagents smolagents pip install "neatlogs[smolagents]"
Hermes hermes pip install "neatlogs[hermes]" (Python 3.11+)

Structured output & guardrails

Library Key Install
Instructor instructor pip install "neatlogs[instructor]"
Guardrails AI guardrails pip install "neatlogs[guardrails]"

Vector stores & HTTP

Library Key Notes
ChromaDB chromadb Auto-instrumented when installed
Pinecone pinecone Auto-instrumented when installed
Qdrant qdrant Auto-instrumented when installed
Weaviate weaviate Auto-instrumented when installed
Milvus milvus pip install "neatlogs[milvus]"
Redis redis Auto-instrumented when installed
OpenSearch opensearch Auto-instrumented when installed
Elasticsearch elasticsearch Auto-instrumented when installed
Marqo marqo Auto-instrumented when installed

Configuration

NEATLOGS_API_KEY=your-api-key
NEATLOGS_ENDPOINT=https://ingest.neatlogs.com   # optional — this is the default

Get your API key from the NeatLogs dashboard. Full init() options: reference.

Doctor diagnostics

Validate the SDK's final normalized and masked telemetry envelope without sending data:

neatlogs doctor --local
# or
neatlogs-doctor --local --json

To verify the complete ingestion path, export a controlled trace through the existing POST /v1/traces route and read that exact trace back through GET /api/traces/v3/:traceId:

NEATLOGS_API_KEY=your-api-key neatlogs doctor --probe --json

Local mode is network-free and uses generated diagnostic data. Probe mode reports the first failing backend stage with a stable reason code and never prints the API key.


Examples

Runnable reference apps live in examples/sdk_examples/. Each folder has a requirements.txt (PyPI install) and .env.example.

Example Framework Run
anthropic_multiagent/ Anthropic + Bedrock python main.py
openai_multiagent/ OpenAI via Azure python main.py
google_genai_multiagent/ Google GenAI python main.py
langchain_react/ LangChain ReAct python react_agent.py
langgraph_multiagent/ LangGraph python main.py
langgraph_research_assistant/ LangGraph python main.py
marketing_strategy_demo/ CrewAI + Gemini search python main.py
neatlogs_support_bot/ CrewAI RAG bot python main.py
reasoning_model_workflow/ Multi-provider reasoning python main.py
support_copilot_demo/ Support agent demo traces RUN=A python support_copilot.py
support_copilot_demo_triaged/ Post-Triage support demo SENDGRID_FAKE_SUCCESS=1 RUN=B python support_copilot.py

Adding NeatLogs to your own code? Use the AI skill above — not copy-paste from this README.


Best practices

  1. init() before LLM imports — auto-instrumentation patches libraries at import time.
  2. Wrap script/server entry points in @span(kind="WORKFLOW") — each run gets a clear top-level trace in the dashboard.
  3. Use auto-instrumentation first — only add more @span decorators for custom orchestration.
  4. trace() for prompts and sessions — not as a wrapper around @span(kind="WORKFLOW").
  5. workflow_name = feature name — put env/version/tech stack in tags=.
  6. Scripts: flush() then shutdown() at exit. Servers: init() once, no per-request shutdown.

License

MIT — see LICENSE.

Metadata

Release files for neatlogs 1.4.24

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

Source distribution (sdist)

Source distribution for neatlogs 1.4.24
File Size Uploaded
neatlogs-1.4.24.tar.gz 302.8 kB Details

Built distribution (wheel)

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

Total release size: 632.7 kB

Release files / neatlogs-1.4.24.tar.gz

Download URL neatlogs-1.4.24.tar.gz
Size 302.8 kB
Tags Source
SHA-256 checksum
How to use checksums
c242af5e5e7e81d4912c543bc2650b32731e18df1a3e9bf01843a6be57200eab
BLAKE2b-256 checksum
How to use checksums
234ad0286e9d6d5a28794d693bbf7eea163f697b4202b760073673e566ba175e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / neatlogs-1.4.24-py3-none-any.whl

Download URL neatlogs-1.4.24-py3-none-any.whl
Size 329.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b39d67b681909af8ed92bbfb4e583ae6c080c602b81ee77540ea51d82210622c
BLAKE2b-256 checksum
How to use checksums
2fa77c1a58154ecddf3b308b40da3649a17a8abfd0e70f1ec8aec74a6f006815
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

1.4.27

2 release files

This release

1.4.24 This release

2 release files

1.4.23

2 release files

1.4.20

2 release files

1.4.19

2 release files

1.4.16

2 release files

1.4.15

2 release files

1.4.14

2 release files

1.4.13

2 release files

1.4.12

2 release files

1.4.11

2 release files

1.4.10

2 release files

1.4.9

2 release files

1.4.8

2 release files

1.4.7

2 release files

1.4.6

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.9

2 release files

1.3.8

2 release files

1.3.7

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

1 release file

1.1.9

2 release files

1.1.8

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.0.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

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