Minimal tooling primitives for LLM tool calling
Project description
Baretools AI
The un-framework for AI Engineers — Build AI Agents, Not Framework Wrappers.
Status: Alpha. Documentation · API Reference · Why Baretools? · Changelog
Why
Modern agent frameworks own your prompts, your orchestration, and your state. That trade-off is fine for demos and POCs, but in production it costs you the control needed to build your own Agent Harness. You also end up knowing the framework better than the underlying engineering — which is exactly backwards.
Baretools handles only the mechanical glue between your Python functions and the LLM:
- Function → provider tool schema (OpenAI, Anthropic, Gemini, generic JSON Schema)
- Parsing tool calls out of provider responses
- Validating and executing those calls (sync, async, parallel, streaming)
- Formatting results back into provider-shaped messages
Everything else — prompts, loops, retries, memory, guardrails — stays in your code.
Install
pip install baretools-ai
Pre-requisite:
- Python >=3.10x
- Optional Pydantic support:
pip install "baretools-ai[pydantic]".
Quickstart
from baretools import tool, ToolRegistry, parse_tool_calls, format_tool_results
from openai import OpenAI
@tool
def get_weather(location: str) -> str:
"""Get current weather for a location."""
return f"Sunny, 72°F in {location}"
tools = ToolRegistry()
tools.register(get_weather)
client = OpenAI()
messages = [{"role": "user", "content": "What's the weather in Paris?"}]
max_iterations = 5 # Can be very high in real world agents
iteration = 0
while iteration < max_iterations:
response = client.chat.completions.create(
model="gpt-4.1",
messages=messages,
tools=tools.get_schemas("openai"),
)
iteration += 1
message = response.choices[0].message
messages.append(message)
tool_calls = parse_tool_calls(message, "openai")
if not tool_calls:
print("Final Response:", message.content)
break
results = tools.execute(tool_calls)
messages.extend(format_tool_results(results, "openai"))
You write the loop. Baretools handles the schema, parsing, execution, and formatting on each side.
Runnable Examples
Working agents for each provider are in examples/:
OPENAI_API_KEY=... uv run python examples/openai_agent.py
ANTHROPIC_API_KEY=... uv run python examples/anthropic_agent.py
GOOGLE_API_KEY=... uv run python examples/gemini_agent.py
Features
- Zero runtime dependencies — stdlib only; no transitive supply chain to audit
- Multi-provider schemas —
tools.get_schemas("openai" | "anthropic" | "gemini" | "json_schema") - Sync, async, streaming —
execute,execute_async,execute_stream,execute_stream_async - Parallel tool execution — pass
parallel=Truewithmax_workers(sync) ormax_concurrency(async) to fan out independent calls - Tool call hooks —
before_toolandafter_toolcallbacks let you plug in guardrails, redaction, auditing, or tracing around every call - Retries with structured events — pass
on_event=...to observe attempts/retries/failures - Type-driven validation —
dataclasseswork out of the box;pydanticBaseModels supported when installed - Provider-native parsing/formatting —
parse_tool_calls()andformat_tool_results()for all four providers
See the docs site for the full API reference, advanced patterns, and design notes.
Development
uv sync --group dev
uv run ruff check .
uv run pytest -q
Contributing
Baretools is designed to be strictly minimal. Preferably, we only add features that are universally needed across tool-calling applications and difficult for developers to implement themselves. Please open an issue to discuss your idea before proposing a new feature.
License
MIT — see LICENSE.
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 baretools_ai-0.4.2.tar.gz.
File metadata
- Download URL: baretools_ai-0.4.2.tar.gz
- Upload date:
- Size: 13.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 |
ecd435f2c8b62dcb3e4d15b02f01f7c4b553f47a65107cd270a3c9368667a37a
|
|
| MD5 |
de12f67f4d08640e822ce4c8334c65ab
|
|
| BLAKE2b-256 |
0b829034d9989965ec260f6e73925f9fd8dd85e8beb55ab1a1b3b2ff725828f9
|
Provenance
The following attestation bundles were made for baretools_ai-0.4.2.tar.gz:
Publisher:
release.yml on ndamulelonemakh/baretools-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
baretools_ai-0.4.2.tar.gz -
Subject digest:
ecd435f2c8b62dcb3e4d15b02f01f7c4b553f47a65107cd270a3c9368667a37a - Sigstore transparency entry: 1374779682
- Sigstore integration time:
-
Permalink:
ndamulelonemakh/baretools-ai@e1237a6afc4e10840c7b0670bd4cc6f2c55ca0c0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ndamulelonemakh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e1237a6afc4e10840c7b0670bd4cc6f2c55ca0c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file baretools_ai-0.4.2-py3-none-any.whl.
File metadata
- Download URL: baretools_ai-0.4.2-py3-none-any.whl
- Upload date:
- Size: 12.3 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 |
56957ab9649e15c02860278657748b235039f6cd184a5cd874a0c303cb0ae148
|
|
| MD5 |
1023da3e29da7826b53c433f8ae2009f
|
|
| BLAKE2b-256 |
a3874400a43a83b409e7849677e3d232c61a6f6eb4458ecb848bbe52b029a217
|
Provenance
The following attestation bundles were made for baretools_ai-0.4.2-py3-none-any.whl:
Publisher:
release.yml on ndamulelonemakh/baretools-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
baretools_ai-0.4.2-py3-none-any.whl -
Subject digest:
56957ab9649e15c02860278657748b235039f6cd184a5cd874a0c303cb0ae148 - Sigstore transparency entry: 1374779787
- Sigstore integration time:
-
Permalink:
ndamulelonemakh/baretools-ai@e1237a6afc4e10840c7b0670bd4cc6f2c55ca0c0 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ndamulelonemakh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e1237a6afc4e10840c7b0670bd4cc6f2c55ca0c0 -
Trigger Event:
push
-
Statement type: