Alloy (Python): Python for logic. English for intelligence.
Project description
Alloy (Python)
Python for logic. English for intelligence.
from alloy import command
@command(output=float)
def extract_price(text: str) -> str:
return f"Extract the price from: {text}"
print(extract_price("This costs $49.99")) # 49.99
Write typed AI functions that feel like normal Python. No framework, no abstractions — just functions that happen to use AI.
Install • Tutorial • Examples • Docs
Install
pip install alloy-ai # OpenAI only
pip install 'alloy-ai[anthropic]' # With Anthropic
pip install 'alloy-ai[providers]' # All providers
Quick start (OpenAI):
export OPENAI_API_KEY=sk-...
python -c "from alloy import ask; print(ask('Say hello'))"
Why Alloy?
🎯 Types you can trust: Provider‑enforced structured outputs. Get a real float, not a string to parse.
🐍 Just Python: Commands are functions. Tools are functions. Everything composes.
⚡ Production‑ready: Retries, contracts, streaming, cross‑provider support — batteries included.
🔍 Zero magic: See what’s happening. Control what’s happening. No hidden state.
Examples
Exploration with ask — Quick one‑offs and streaming
from alloy import ask
# One‑liner exploration
print(ask("List 3 reasons Alloy is useful."))
# Stream text output (text‑only streaming)
for chunk in ask.stream("Write a two‑sentence pitch for Alloy."):
print(chunk, end="")
Typed outputs — Get back real Python objects
from dataclasses import dataclass
from alloy import command
@dataclass
class Analysis:
sentiment: str
score: float
keywords: list[str]
@command(output=Analysis)
def analyze(text: str) -> str:
return f"Analyze this text: {text}"
result = analyze("Alloy is amazing!")
print(result.score) # 0.95
TypedDict outputs are supported too:
from typing import TypedDict
from alloy import command
class Product(TypedDict):
name: str
price: float
@command(output=Product)
def make() -> str:
return "Return a Product with name='Test' and price=9.99 (numeric literal)."
print(make()["price"]) # 9.99
Tools + Contracts — Safe multi‑step workflows
from alloy import command, tool, ensure, require
@tool
@ensure(lambda x: x > 0, "Result must be positive")
def calculate(expression: str) -> float:
return eval(expression) # simplified example
@command(tools=[calculate])
def solve(problem: str) -> str:
return f"Solve step by step: {problem}"
See more in examples/ and the Examples guide.
📦 More installation options
# Specific providers
pip install 'alloy-ai[anthropic]'
pip install 'alloy-ai[gemini]'
pip install 'alloy-ai[ollama]'
# Development
pip install -e '.[dev]'
🔧 Configuration
export ALLOY_MODEL=gpt-5-mini
export ALLOY_TEMPERATURE=0.2
export ALLOY_MAX_TOOL_TURNS=10
Or in Python:
from alloy import configure
configure(model="gpt-5-mini", temperature=0.2)
🧪 Run examples offline
export ALLOY_BACKEND=fake
make examples-quick
Providers
Works with major providers — same code, zero changes:
| Provider | Models (examples) | Setup |
|---|---|---|
| OpenAI | gpt‑5 | export OPENAI_API_KEY=... |
| Anthropic | claude‑4 | export ANTHROPIC_API_KEY=... |
| gemini | export GOOGLE_API_KEY=... |
|
| Local | ollama | ollama run <model> + ALLOY_MODEL=ollama:<model> |
See the full provider guide.
Next Steps
New to Alloy? → 10‑minute tutorial
Ready to build? → Browse examples
Need details? → Read the docs
Contributing
We welcome contributions! See .github/CONTRIBUTING.md.
License
MIT — see LICENSE.
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 alloy_ai-0.3.1.tar.gz.
File metadata
- Download URL: alloy_ai-0.3.1.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3d769d04bb44702e84ce083c7675faff514581236fefc84e71bf258164bd113
|
|
| MD5 |
5b18fcb640afcfbe6cab1a03dc04f0d3
|
|
| BLAKE2b-256 |
f92355b026669d95526d0eac7014fe64eb7cf952ec246bb4da5c2367f096ebb8
|
Provenance
The following attestation bundles were made for alloy_ai-0.3.1.tar.gz:
Publisher:
release.yml on lydakis/alloy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alloy_ai-0.3.1.tar.gz -
Subject digest:
b3d769d04bb44702e84ce083c7675faff514581236fefc84e71bf258164bd113 - Sigstore transparency entry: 480550854
- Sigstore integration time:
-
Permalink:
lydakis/alloy@f1e306538a4bbf86189c2efcf37367035c187adb -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/lydakis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f1e306538a4bbf86189c2efcf37367035c187adb -
Trigger Event:
push
-
Statement type:
File details
Details for the file alloy_ai-0.3.1-py3-none-any.whl.
File metadata
- Download URL: alloy_ai-0.3.1-py3-none-any.whl
- Upload date:
- Size: 35.4 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 |
21123a3961a418647ab206161082bfaa127105b9b2780249118a8651e4b2d86a
|
|
| MD5 |
86b64a3bc5495b2b91279f734a667576
|
|
| BLAKE2b-256 |
e8006f3f9a5b62f50786f1ca86b037f3605353f3549bc256d9f605d2d2510686
|
Provenance
The following attestation bundles were made for alloy_ai-0.3.1-py3-none-any.whl:
Publisher:
release.yml on lydakis/alloy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alloy_ai-0.3.1-py3-none-any.whl -
Subject digest:
21123a3961a418647ab206161082bfaa127105b9b2780249118a8651e4b2d86a - Sigstore transparency entry: 480550856
- Sigstore integration time:
-
Permalink:
lydakis/alloy@f1e306538a4bbf86189c2efcf37367035c187adb -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/lydakis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f1e306538a4bbf86189c2efcf37367035c187adb -
Trigger Event:
push
-
Statement type: