cross-ai-core
Multi-provider AI dispatcher with MD5-keyed response caching and unified error handling.
Supports Anthropic, xAI (Grok), OpenAI, Google Gemini, and Perplexity 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 only (uses requests, no extra SDK)
Install all providers at once (used by cross-st, which runs all 5 simultaneously):
pip install "cross-ai-core[all]"
Dependencies
requests is always installed — it is used for the Perplexity provider 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 |
[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 5 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 |
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.
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 cross_ai_core-0.10.0.tar.gz.
File metadata
- Download URL: cross_ai_core-0.10.0.tar.gz
- Upload date:
- Size: 63.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9273ce5823f48b26d1567c0ee31016cc0dc830d717275e0df761a2758add45b
|
|
| MD5 |
c58196373ef7f5a988fef7dc033a6dc9
|
|
| BLAKE2b-256 |
27d31ace19b461f101cbcda023929e1ba36a18f2d58e316e2619570df6c79833
|
File details
Details for the file cross_ai_core-0.10.0-py3-none-any.whl.
File metadata
- Download URL: cross_ai_core-0.10.0-py3-none-any.whl
- Upload date:
- Size: 47.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
685f6ae345f00e6e88ee194e88ec80f0a4df6ca4cb36e4703945f874a8109edd
|
|
| MD5 |
93fff242d999f3e39f4ff070a42e91d3
|
|
| BLAKE2b-256 |
02d5ac10475acc739c3a2bafd94ce3567088fe360470e882edd306503342a761
|