A minimal CLI tool that turns natural language into instant APIs.
Project description
ask2api
ask2api is a minimal Python CLI tool that turns natural language prompts into structured API-style JSON responses using LLM.
It allows you to define a JSON Schema and force the model to answer strictly in that format.
Why ask2api?
Because LLMs are no longer just chatbots, they are also programmable API engines.
ask2api lets you use them that way. 🚀
Key features:
- Minimal dependencies
- CLI first
- Prompt → API behavior
- No markdown, no explanations, only valid JSON
- Vision modality support
- Designed for automation pipelines and AI-driven backend workflows
Installation
pip install ask2api
Set your API key:
export ASK2API_API_KEY="your_api_key"
# Or you can pass OpenAI key
# export OPENAI_API_KEY="your_api_key"
Provider Support
ask2api supports both OpenAI (and OpenAI-compatible) and Anthropic (Claude) models.
Using OpenAI (default)
By default, ask2api uses OpenAI. No additional configuration is needed:
export OPENAI_API_KEY="sk-..."
ask2api -p "What is 2+2?" -e '{"result": 1}'
Using Anthropic Claude
To use Anthropic's Claude models, set the provider explicitly:
export ASK2API_PROVIDER="anthropic"
export ANTHROPIC_API_KEY="sk-ant-..."
ask2api -p "What is the capital of France?" -e '{"country": "string", "city": "string"}'
You can also customize the model:
export ASK2API_PROVIDER="anthropic"
export ASK2API_API_KEY="sk-ant-..."
export ASK2API_MODEL="claude-opus-4-5"
ask2api -p "Analyze carbon" -e '{"symbol": "string", "atomic_number": 1}'
Anthropic's Claude models support vision as well:
export ASK2API_PROVIDER="anthropic"
export ANTHROPIC_API_KEY="sk-ant-..."
ask2api -p "What's in this image?" -e '{"description": "string"}' -i photo.jpg
Usage
Text-only prompts
Instead of asking:
"Where is the capital of France?"
and receiving free-form text, you can do this:
ask2api -p "Where is the capital of France?" -sf schema.json
Or pass an example directly without a schema file:
ask2api -p "Where is the capital of France?" -e '{"country": "string", "city": "string"}'
And get a structured API response:
{
"country": "France",
"city": "Paris"
}
For more complex structures with different data types:
ask2api -p "Analyze carbon element" -e '{
"symbol": "element symbol",
"atomic_number": 1234,
"atomic_weight": 12.34,
"is_metal": true,
"isotopes": ["name of the isotope"],
"properties": {
"melting_point": 1234.5,
"boiling_point": 2345.6,
"magnetic": true
}
}'
Output:
{
"symbol": "C",
"atomic_number": 6,
"atomic_weight": 12.011,
"is_metal": false,
"isotopes": [
"C-12",
"C-13",
"C-14"
],
"properties": {
"melting_point": 3550,
"boiling_point": 4827,
"magnetic": false
}
}
Vision modality
You can also analyze images and get structured JSON responses:
ask2api -p "Where is this place?" -sf schema.json -i https://upload.wikimedia.org/wikipedia/commons/6/64/Lesdeuxmagots.jpg
Note: Some API providers may not accept image URLs...
...and require images to be provided as base64-encoded data (i.e., a local file). If you encounter problems using an image URL, download the image locally and pass the file path, then ask2api will base64-encode local files automatically.
Example (download with curl and run):
curl -sSL -o place.jpg "https://upload.wikimedia.org/wikipedia/commons/6/64/Lesdeuxmagots.jpg"
ask2api -p "Where is this place?" -sf schema.json -i ./place.jpg
Or download with wget:
wget -O place.jpg "https://upload.wikimedia.org/wikipedia/commons/6/64/Lesdeuxmagots.jpg"
How it works
- You define the desired output structure using a JSON Schema.
- The schema is passed to the model:
- For OpenAI: using the
json_schemastructured output format - For Anthropic: using tool calling with forced tool use
- For OpenAI: using the
- The system prompt enforces strict JSON-only responses.
- For vision tasks, images are automatically encoded (base64 for local files) or passed as URLs.
- The CLI prints the API-ready JSON output.
The model is treated as a deterministic API function, regardless of provider.
Example schema
Create a file named schema.json:
{
"type": "object",
"properties": {
"country": { "type": "string" },
"city": { "type": "string" }
},
"required": ["country", "city"]
}
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT
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 ask2api-1.2.0.tar.gz.
File metadata
- Download URL: ask2api-1.2.0.tar.gz
- Upload date:
- Size: 35.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
759aa0c66971a54adef7412bb4985fdac55e038cf156ea81065d0280ef223e1c
|
|
| MD5 |
6a1f794129f47cc95792e1815240ffef
|
|
| BLAKE2b-256 |
8e63a02a59fdb5cd7f524e1ffdb4e43024142141e2bb003188373e12d25ffbb3
|
File details
Details for the file ask2api-1.2.0-py3-none-any.whl.
File metadata
- Download URL: ask2api-1.2.0-py3-none-any.whl
- Upload date:
- Size: 9.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f20b010aad10118402b3b50908e536c8fcbd4557e15f0955edf3ba7a9525a560
|
|
| MD5 |
9aa71d021070f369de8379092de4e34e
|
|
| BLAKE2b-256 |
c9e2e5cab7d03ef081d21679eade9ba6c9f646d10a90316ffce0dc22bfac4dfb
|