Python SDK for Introspection — continuously improve your AI systems with production feedback and frontier practices
Project description
Build frontier AI systems that self-improve.
Introspection continuously improves your AI systems with production feedback and frontier practices. This is the Python SDK.
Install
uv add introspection-sdk
# or
pip install introspection-sdk
The default install is everything you need for the Introspection API
(runtimes, tasks, files, conversations) — no OpenTelemetry pulled in. To also
emit analytics events and export traces, add the [otel] extra; see
OpenTelemetry below.
Introspection API (runtimes, tasks, files)
The main Introspection API. Open a Runner against a runtime, spawn tasks, and
stream their output; manage files and read conversations on the same Runner.
AsyncIntrospectionClient is the recommended entry point — everything that
touches the network is awaitable, and run output streams with async for:
import asyncio
from introspection_sdk import AsyncIntrospectionClient
async def main() -> None:
async with AsyncIntrospectionClient() as client: # token from INTROSPECTION_TOKEN
runner = await client.runtimes("customer-agent").run()
async with runner:
run = await runner.tasks.start(prompt="Say hello in one sentence.")
async for event in run.stream():
print(f"[{event.event}] {event.data}")
asyncio.run(main())
A Runner exposes three DP-bound namespaces side by side: runner.tasks,
runner.files, and the read-only runner.conversations. The conversations
namespace lists conversation summaries (runner.conversations.list()), loads
the latest LLM turn of a conversation as a Responses-API-style view
(await runner.conversations.retrieve(conversation_id)), and walks a
conversation's per-turn items (runner.conversations.items.list(...)).
Every list() returns an AsyncPager: async for it to stream every item
across pages (fetched lazily), or await it for the first page with its
envelope metadata (counts, cursors):
# Stream every summary across all pages.
async for summary in runner.conversations.list(limit=20):
response = await runner.conversations.retrieve(
summary.conversation_id or summary.trace_id
)
if response is not None:
print(response.model, len(response.input_messages))
# Or just the first page, with totals.
first = await runner.files.list(include_total=True)
print(first.total_count, len(first.records))
See examples/api/async_runtimes.py
for an end-to-end walkthrough.
Sync client
Not on asyncio? IntrospectionClient is the synchronous twin with an
identical surface — drop the awaits, use for instead of async for, and
with instead of async with (examples/api/runtimes.py):
from introspection_sdk import IntrospectionClient
client = IntrospectionClient() # token from INTROSPECTION_TOKEN
runner = client.runtimes("customer-agent").run()
run = runner.tasks.start(prompt="Say hello in one sentence.")
for event in run.stream():
print(f"[{event.event}] {event.data}")
runner.close()
client.shutdown()
OpenTelemetry (analytics & tracing)
Two optional OTel-based surfaces live behind the [otel] extra, independent of
the Introspection API above:
pip install 'introspection-sdk[otel]'
- Analytics events —
track/feedback/identifyviaIntrospectionLogs. - Traces — auto-instrument Anthropic, Gemini, OpenAI Agents, Claude Agent,
LangChain, and Logfire with a single
introspection_sdk.init().
Both are documented in docs/otel.md; advanced/manual
wiring lives in docs/advanced.md. For complete
integration patterns (including dual-export with Arize, Langfuse, Braintrust,
and LangSmith) see examples/.
Environment variables
# Introspection API (IntrospectionClient / AsyncIntrospectionClient)
export INTROSPECTION_TOKEN="intro_xxx"
export INTROSPECTION_BASE_API_URL="https://api.introspection.dev" # optional
export INTROSPECTION_PROJECT_ID="proj_…" # optional
# OTel (IntrospectionLogs + span processors + instrumentors) — see docs/otel.md
export INTROSPECTION_BASE_OTEL_URL="https://otel.introspection.dev" # optional
export INTROSPECTION_SERVICE_NAME="my-service" # optional
Documentation
Full documentation is available at docs.introspection.dev.
License
Apache-2.0
Project details
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 introspection_sdk-0.5.2.tar.gz.
File metadata
- Download URL: introspection_sdk-0.5.2.tar.gz
- Upload date:
- Size: 93.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ea7c86e711db61fec7ebf7ea36ebc511c78fee2970ab17d8b876ea2c10ec669
|
|
| MD5 |
a0182b616ccc4bb0f9005112548f3296
|
|
| BLAKE2b-256 |
7ed9846dadfdaad099c7e6ba7adf254be2e78ee8947c4ea0b917f7f72bc30507
|
Provenance
The following attestation bundles were made for introspection_sdk-0.5.2.tar.gz:
Publisher:
publish.yml on introspection-org/introspection-python-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
introspection_sdk-0.5.2.tar.gz -
Subject digest:
0ea7c86e711db61fec7ebf7ea36ebc511c78fee2970ab17d8b876ea2c10ec669 - Sigstore transparency entry: 1840591501
- Sigstore integration time:
-
Permalink:
introspection-org/introspection-python-sdk@e231f7de483b2d3ac3cdca70321b4b950e6e98cb -
Branch / Tag:
refs/tags/v0.5.2 - Owner: https://github.com/introspection-org
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e231f7de483b2d3ac3cdca70321b4b950e6e98cb -
Trigger Event:
push
-
Statement type:
File details
Details for the file introspection_sdk-0.5.2-py3-none-any.whl.
File metadata
- Download URL: introspection_sdk-0.5.2-py3-none-any.whl
- Upload date:
- Size: 125.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f43e2b88727bc3ebebac8ae2a6536429f04541739d7a6409475c992549b06dd1
|
|
| MD5 |
52e6a2948aa033bc5a0809050ecf0d8e
|
|
| BLAKE2b-256 |
10eda7ef64f2af57f1af0f173bc67d40d8df5bf62718424e562d50d752f8bc9d
|
Provenance
The following attestation bundles were made for introspection_sdk-0.5.2-py3-none-any.whl:
Publisher:
publish.yml on introspection-org/introspection-python-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
introspection_sdk-0.5.2-py3-none-any.whl -
Subject digest:
f43e2b88727bc3ebebac8ae2a6536429f04541739d7a6409475c992549b06dd1 - Sigstore transparency entry: 1840591598
- Sigstore integration time:
-
Permalink:
introspection-org/introspection-python-sdk@e231f7de483b2d3ac3cdca70321b4b950e6e98cb -
Branch / Tag:
refs/tags/v0.5.2 - Owner: https://github.com/introspection-org
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e231f7de483b2d3ac3cdca70321b4b950e6e98cb -
Trigger Event:
push
-
Statement type: