InquiryCraft
InquiryCraft, shortened to iqcraft in project discussions and documentation, is a
lightweight, extensible harness for building tool-using LLM agents. It provides the
execution loop and lifecycle primitives needed by standalone agents, interactive CLIs,
and larger host applications without imposing a domain workflow. The published package,
Python import, and CLI command all remain inquirycraft; iqcraft is a short name, not a
second compatibility entry point.
Release status
The current stable release is 0.7.0, published on
PyPI. InquiryCraft is currently beta software
and supports Python 3.11 and newer. Release tags use vMAJOR.MINOR.PATCH; the main
branch may contain changes intended for the next release.
For a reproducible installation, pin the published version:
pip install 'inquirycraft==0.7.0'
Why InquiryCraft?
- Small core — the minimal installation depends only on Click.
- Real agent loop — provider request, tool call, tool result, and continuation are
handled by a reusable
AgentRuntime. - Provider-neutral contracts — applications can implement
LLMClientor use the optional OpenAI-compatible adapter. - Composable tools — typed schemas, execution middleware, path policy, concurrent dispatch, output reduction, and raw artifact retention share one contract.
- Durable runs — append-only sessions, lifecycle events, cancellation, resume, and telemetry are built in.
- Deterministic validation — record/replay detects drift in messages, model options, tool schemas, call ordering, results, and stream mode.
- Optional integrations — provider SDKs, token counting, and MCP stay outside the minimal package.
Install
Install the minimal runtime and CLI:
pip install inquirycraft
inquirycraft tools list
Install an OpenAI-compatible provider client:
pip install 'inquirycraft[openai]'
Other optional extras:
pip install 'inquirycraft[tokens]'
pip install 'inquirycraft[mcp]'
Importing inquirycraft resolves public symbols lazily. It does not initialize the CLI
or load provider SDKs.
Quick start
Configure any OpenAI-compatible endpoint:
export INQUIRYCRAFT_API_KEY=...
export INQUIRYCRAFT_BASE_URL=http://127.0.0.1:8001/v1
export INQUIRYCRAFT_MODEL=your-model
Run a single task with the built-in file and shell tools:
mkdir -p workspace
inquirycraft run \
--workspace ./workspace \
"Inspect the workspace and write a concise summary to result.txt"
Start an interactive session:
inquirycraft repl --workspace ./workspace
Python API
import asyncio
import os
from pathlib import Path
from inquirycraft.llm.openai_adapter import OpenAICompatibleClient
from inquirycraft.runtime import AgentRuntime, RuntimeOptions
from inquirycraft.tools import default_tools
async def main() -> None:
client = OpenAICompatibleClient(
api_key=os.environ["INQUIRYCRAFT_API_KEY"],
base_url=os.environ.get("INQUIRYCRAFT_BASE_URL"),
)
runtime = AgentRuntime(
llm=client,
options=RuntimeOptions(
model=os.environ["INQUIRYCRAFT_MODEL"],
workspace=Path("./workspace"),
system_prompt="You are a careful coding agent.",
),
tools=default_tools(),
)
try:
print(await runtime.run("Inspect the workspace and summarize its contents."))
finally:
await client.aclose()
asyncio.run(main())
Implementing the LLMClient protocol is enough to connect another provider. Custom
tools subclass BaseTool and return a ToolResult; hooks and event sinks can be added
without modifying the loop.
Sessions, events, and replay
Persist a conversation and its lifecycle events:
inquirycraft run "continue the task" \
--session-log .inquirycraft/session.jsonl \
--event-log .inquirycraft/events.jsonl
Session logs are append-only. If the file already exists, run and repl restore its
messages before the next turn.
RecordingLLMClient stores the exact provider-visible request and completion result or
stream chunks. ReplayLLMClient consumes that JSONL offline and raises
ReplayMismatchError when model parameters, messages, tool schemas, call ordering, or
stream mode drift. Generated timestamps and event IDs can be normalized without
loosening prompts, tool payloads, results, or ordering.
Tools and path policy
InquiryCraft includes independent read, write, edit, grep, glob, list, and shell tools. Filesystem scope is configured separately from tool behavior:
from inquirycraft.tools import PathPolicy, ReadTool
policy = PathPolicy("./workspace", enabled=True)
read = ReadTool(path_policy=policy)
A strict PathPolicy contains model-generated paths under a configured root and any
explicitly allowed extra roots. Hosts that execute untrusted model output should also
apply process isolation and least-privilege credentials appropriate to their threat
model.
CLI reference
inquirycraft run Run one tool-using agent task
inquirycraft repl Start an interactive multi-turn session
inquirycraft tools list List built-in tools
inquirycraft tools schema Print tool schemas
inquirycraft events show Inspect runtime event JSONL
Use inquirycraft COMMAND --help for command-specific options.
Package layout
| Package | Responsibility |
|---|---|
inquirycraft.runtime |
Agent loop, hooks, cancellation, telemetry, and resume |
inquirycraft.llm |
Provider protocols, streaming models, retry, and adapters |
inquirycraft.tools |
Tool contracts, execution, file tools, and path policy |
inquirycraft.memory |
Messages, conversations, and persistent records |
inquirycraft.events |
Lifecycle JSONL and deterministic record/replay |
inquirycraft.executor |
Generic shell and Python execution helpers |
inquirycraft.mcp |
Optional MCP transport integration |
inquirycraft.cli |
Standalone commands and CLI composition contracts |
See ARCHITECTURE.md for design boundaries and validation layers.
Development
uv sync --all-extras
uv run pytest -q
uv run ruff check .
uv run ruff format --check .
uv build
InquiryCraft supports Python 3.11 and newer and is distributed under the MIT License.
Metadata
Release files for inquirycraft 0.7.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 | |
|---|---|---|---|---|
| inquirycraft-0.7.0.tar.gz | 103.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| inquirycraft-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 241.5 kB
Release files / inquirycraft-0.7.0.tar.gz
| Download URL | inquirycraft-0.7.0.tar.gz |
|---|---|
| Size | 103.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
875ec7344b016d0af371aee37ae801fdeb3e9a0dd97d882e5723ea5ca6582e50
|
|
BLAKE2b-256 checksum How to use checksums |
72508d960e8c334a498680696e7da6d313bbb949eef06a3707db8887107b3522
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logRelease files / inquirycraft-0.7.0-py3-none-any.whl
| Download URL | inquirycraft-0.7.0-py3-none-any.whl |
|---|---|
| Size | 138.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4c97737c402f0ef0ec3afcc196e6d7bffb0defba5c074b820d6804550d301f28
|
|
BLAKE2b-256 checksum How to use checksums |
f3f61445a1bad56993d38b481bfcf3084c03042717b7f1b602794519056455a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logSecurity for inquirycraft 0.7.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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for inquirycraft-0.7.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 23, 2026.
Transparency logA 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.