cross-ai-core
Multi-provider AI dispatcher with MD5-keyed response caching and unified error handling.
Supports Anthropic, xAI (Grok), OpenAI, Google Gemini, Perplexity, and Ollama (local/LAN, keyless) through a single consistent interface.
Requirements
- Python 3.10 or newer (3.11 recommended for development)
- No upper version limit — tested on 3.10–3.13
Install
Install only the provider(s) you need:
pip install "cross-ai-core[anthropic]" # Claude
pip install "cross-ai-core[gemini]" # Google Gemini
pip install "cross-ai-core[openai]" # OpenAI (ChatGPT)
pip install "cross-ai-core[xai]" # xAI Grok (uses the OpenAI SDK)
pip install cross-ai-core # Perplexity or Ollama (uses requests, no extra SDK)
Install all providers at once (used by cross-st, which runs multiple providers simultaneously):
pip install "cross-ai-core[all]"
Dependencies
requests is always installed — it is used for the Perplexity and Ollama providers and general HTTP.
The three provider SDKs are optional extras; pip installs only what you request.
| Extra | Package | Version | Providers covered |
|---|---|---|---|
| (base) | requests |
≥2.32.4 | Perplexity, Ollama (local/LAN, keyless) |
[anthropic] |
anthropic |
≥0.84.0 | Anthropic / Claude |
[gemini] |
google-genai |
≥1.65.0 | Google Gemini |
[openai] |
openai |
≥1.70.0 | OpenAI |
[xai] |
openai |
≥1.70.0 | xAI / Grok (OpenAI-compatible API) |
[all] |
all three above | — | All 6 providers |
Quick start
Calls are dispatched through agents — named (provider, model) pairs. See the cross-st Agents wiki page for the full concept; the minimal version is one JSON file at ~/.cross_ai_models.json:
{
"version": 2,
"agents": {
"xai": {"make": "xai", "model": null},
"anthropic": {"make": "anthropic", "model": null}
}
}
If you also use cross-st, running st-admin --setup once will detect every API key in ~/.crossenv and seed one starter agent per provider for you. Standalone users can write the file by hand or set CROSS_AI_AGENTS_FILE=/path/to/file.json to point at an alternative.
import os
from dotenv import load_dotenv
load_dotenv(os.path.expanduser("~/.crossenv")) # your app loads keys; the library reads os.environ
from cross_ai_core import process_prompt, get_content_auto, get_default_ai
agent = get_default_ai() # DEFAULT_AGENT env var, then DEFAULT_AI (legacy),
# then first agent in ~/.cross_ai_models.json
result = process_prompt(
agent,
"Explain transformer attention in 3 sentences.",
system="You are a concise technical writer.", # omit to use each provider's default
verbose=False,
use_cache=True,
)
print(get_content_auto(result.response)) # auto-dispatches via the _make stamp
Breaking change in 0.8.0: built-in provider names are no longer auto-registered as self-agents.
process_prompt("xai", …)raisesValueError: Unsupported AI model: 'xai'. No agents defined.if the registry is empty. Define at least one agent (above) before the first call.
For older callers, get_content(agent, result.response) still works (it alias-resolves the agent → provider make internally).
Configuration (environment variables)
| Variable | Default | Purpose |
|---|---|---|
DEFAULT_AGENT |
(first agent in registry) | Default agent when none is specified (set by st-admin > AI > d in cross-st 0.10+) |
DEFAULT_AI |
— | Legacy pre-Agents-v2 spelling of DEFAULT_AGENT; still read for back-compat |
CROSS_AI_AGENTS_FILE |
~/.cross_ai_models.json |
Path to the agent registry JSON |
<AGENT_UPPER>_MODEL |
— | Per-agent model override (e.g. ANTHROPIC_OPUS_MODEL=claude-opus-future) |
<MAKE_UPPER>_MODEL |
— | Per-provider model override (e.g. ANTHROPIC_MODEL=claude-3-5-haiku-latest) |
XAI_API_KEY |
— | xAI / Grok API key |
ANTHROPIC_API_KEY |
— | Anthropic / Claude API key |
OPENAI_API_KEY |
— | OpenAI API key |
GEMINI_API_KEY |
— | Google Gemini API key |
PERPLEXITY_API_KEY |
— | Perplexity API key |
OLLAMA_BASE_URL |
http://localhost:11434 |
Ollama daemon location (local or LAN) — keyless |
OLLAMA_MODEL |
llama3.1 |
Default Ollama model |
CROSS_API_CACHE_DIR |
~/.cross_api_cache/ |
Response cache directory |
CROSS_NO_CACHE |
— | Set to 1 to disable caching globally |
CROSS_NO_CLIENT_CACHE |
— | Set to 1 to disable per-provider client singleton caching |
The library only reads from os.environ — it never calls load_dotenv() itself.
Load your .env or ~/.crossenv before importing.
You only need to set API keys for the providers you actually use.
Caching
Responses are cached by MD5 hash of the request payload in ~/.cross_api_cache/.
The cache is safe to delete at any time.
# Bypass cache for one call
result = process_prompt(provider, prompt, verbose=False, use_cache=False)
# Check if a response was served from cache
if result.was_cached:
print("from cache")
Development
cd ~/github/cross-ai-core
python3.11 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]" # installs the package + pytest + pytest-mock
Run the test suite:
python -m pytest tests/ -v
Tests use mocks — no real API keys required.
Note: Keep each repo's
.venvseparate; do not share it with dependent projects.
Adding a provider
- Create
cross_ai_core/ai_<name>.pyimplementingBaseAIHandler(get_payload,get_client,get_cached_response,get_model,get_make,get_content,put_content,get_data_content,get_title,get_usage). - Register in
cross_ai_core/ai_handler.py: add toAI_HANDLER_REGISTRYandAI_LIST.
Documentation
- API reference — all public functions,
AIResponse, parallel calls, error handling - Providers — per-provider guide: models, API keys, strengths, free tiers
- Changelog
Used by
| Project | PyPI | Description |
|---|---|---|
| cross-st | cross-st |
Multi-AI research reports with cross-product fact-checking. Installs this package automatically via cross-ai-core[all]. Full CLI toolkit — pipx install cross-st. |
Building something with
cross-ai-core? Open a PR or issue to get listed here.
Community & support
Questions, ideas, bug reports, or just want to share what you're building?
- 💬 crossai.dev community forum — Discourse-powered discussion for
cross-ai-core,cross-st, and the wider Cross family. Ask questions, share prompts, or compare provider results. Invite-only sign-up keeps it friction-free for real users; see thecross-stwiki for the one-command onboarding (st-admin --discourse-setup). - 🐛 GitHub issues — bug reports and feature requests.
- 🎬 YouTube @crossaicore — walkthroughs and release notes.
Tagline: AI reports. Cross-examined.
License
MIT — free for personal, academic, and open-source use.
See COMMERCIAL_LICENSE.md for organizational and commercial use.
Metadata
Release files for cross-ai-core 2026.10.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 | |
|---|---|---|---|
| cross_ai_core-2026.10.0.tar.gz | 64.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cross_ai_core-2026.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 111.4 kB
Release files / cross_ai_core-2026.10.0.tar.gz
| Download URL | cross_ai_core-2026.10.0.tar.gz |
|---|---|
| Size | 64.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e95b091aefde9ace1a63911a3a25911866b1623599994bff454d09ca7170fcec
|
|
BLAKE2b-256 checksum How to use checksums |
c1ec71a426c3f70026e229cd288e95e0bb99fab5341f90a3ca2d6738c5347157
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / cross_ai_core-2026.10.0-py3-none-any.whl
| Download URL | cross_ai_core-2026.10.0-py3-none-any.whl |
|---|---|
| Size | 47.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
24ce692429b16344b76cd0248c1a49afaa41e8e167023f068c50a0f634f41abf
|
|
BLAKE2b-256 checksum How to use checksums |
205b3ecce202beff1ad5a0e47be99363d1496635a14535a06343259ce8e1eb67
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|