aichain
The simplest way to build AI pipelines. 11 cloud providers + your own private server. 1 interface. Zero lock-in.
from yait_aichain import Model, Skill
skill = Skill(
model = Model("claude-sonnet-4-6"), # change this one word to switch providers
input = {"messages": [{"role": "user", "parts": ["Summarise: {text}"]}]},
)
result = skill.run(variables={"text": "..."})
Change "claude-sonnet-4-6" to "gpt-4o", "gemini-2.5-pro", or "grok-3" — nothing else changes.
Why aichain?
Every major AI library makes you choose: LangChain is too complex, LlamaIndex is RAG-only, CrewAI is agents-only, AutoGen requires a PhD to configure.
aichain covers the full stack with the simplest interface:
| Need | aichain primitive |
|---|---|
| Call any LLM | Skill |
| Chain steps together | Chain |
| Run tasks in parallel | Pool |
| Autonomous reasoning | Agent |
| Vector search + RAG | VectorDB + vectorQuery |
| Rerank results | Reranker |
| Call any tool or MCP server | Tool / MCPTools |
All of these work identically across 88 models from 11 cloud providers — plus any open-weight model you host yourself, where the data never leaves your perimeter — with one line to swap any of them.
Install
pip install yait-aichain
Optional extras:
pip install markitdown # file/URL → Markdown
pip install pyyaml # save & load Skills and Chains
pip install fastmcp # MCP server integration
API keys — only for the providers you use:
export ANTHROPIC_API_KEY="sk-ant-…"
export OPENAI_API_KEY="sk-…"
export GOOGLE_AI_API_KEY="AIza…"
export XAI_API_KEY="xai-…"
export PERPLEXITY_API_KEY="pplx-…"
export MOONSHOT_API_KEY="sk-…" # Kimi
export DEEPSEEK_API_KEY="sk-…"
export DASHSCOPE_API_KEY="sk-…" # Qwen
export COHERE_API_KEY="…" # embeddings + reranking
export VOYAGE_API_KEY="…" # embeddings + reranking
12 providers, one syntax
from yait_aichain.models import Model
Model("claude-sonnet-4-6") # Anthropic
Model("gpt-4o") # OpenAI
Model("gemini-2.5-flash") # Google
Model("grok-3") # xAI
Model("sonar-pro") # Perplexity
Model("kimi-k2.5") # Kimi
Model("deepseek-chat") # DeepSeek
Model("qwen-max") # Qwen
Model("private/llama3.3") # your own server — vLLM, Ollama, LM Studio, …
88 cloud models total (full list: model registry →).
The private provider needs no key and accepts whatever your server serves —
the prompts and the answers stay inside your perimeter
(private models →).
Core concepts
Skill — one prompt, any model
skill = Skill(model=Model("gpt-4o-mini"), input={...})
result = skill.run(variables={"topic": "neural networks"})
Chain — sequential steps, automatic variable flow
chain = Chain(steps=[
(fetch_tool, "page"),
(summarise, "summary"),
(translate, "result"),
])
result = chain.run(variables={"url": "https://…", "language": "French"})
print(chain.history) # full audit trail
Pool — parallel execution
pool = Pool(summarise_skill, items=[{"text": t} for t in documents], max_flows=10)
results = pool.run() # all documents processed simultaneously
print(pool.status) # {PENDING: 0, RUNNING: 0, DONE: 50, FAILED: 0}
print(pool.history) # per-item: status, output, error, duration
Agent — autonomous reasoning
from yait_aichain.agent import Agent, step_count
agent = Agent(
model = Model("claude-opus-4-8"),
tools = [searchPerplexity(), convertToMD()],
mode = "agile",
stop_when = [step_count(10)],
)
result = agent.run("Compare the top 3 vector databases.")
print(result.output)
print(f"steps={result.steps_taken} tokens={result.tokens_used:,}")
Full RAG pipeline
from yait_aichain.tools.embedding import Embedding
from yait_aichain.tools.vectordb import VectorDB, vectorChunk, vectorUpsert, vectorQuery
from yait_aichain.tools.reranking import Reranker
store = VectorDB("chroma", "docs", embedder=Embedding("cohere/embed-v4.0"))
reranker = Reranker("cohere/rerank-v3.5")
# Ingest
chunks = vectorChunk(max_chars=800).run(my_document)
vectorUpsert(store).run([{"id": f"c{i}", **c} for i, c in enumerate(chunks)])
# Query → rerank → answer
pipeline = Chain(steps=[
(vectorQuery(store), "candidates", {"input": "{question}", "options": {"n": 20}}),
(reranker, "context", {"input": "{candidates}",
"options": {"query": "{question}", "top_n": 5}}),
answer_skill,
])
answer = pipeline.run(variables={"question": "How does KV caching work?"})
Vector DB providers: Chroma · Qdrant · Pinecone Reranking providers: Cohere · Voyage · Qwen
Cost, routing & resilience
These are all opt-in — the minimal program above is unchanged.
Token usage & cost — every result carries normalised usage:
skill.run()
skill.last_usage.input_tokens # 1240
skill.last_usage.total_tokens # 1310
skill.last_usage.cost # 0.0032 (USD, None if the model has no price)
chain.run()
chain.last_usage.cost # summed across all Skill steps
Explicit provider routing — pick the provider with a provider/model
prefix; it also unlocks custom / fine-tuned names the auto-detector can't
recognise:
Model("openai/gpt-4o") # same as Model("gpt-4o")
Model("openai/ft:gpt-4o:acme:42") # custom name, explicit provider
Fallback chain — pass a list; a transient failure (rate limit / server / network) advances to the next model. A real error (bad key, bad request) still raises immediately:
skill = Skill(
model = [Model("claude-sonnet-4-6"), Model("gpt-4o")], # primary, then backup
input = {"messages": [{"role": "user", "parts": ["..."]}]},
)
Typed errors — catch a specific failure mode, or APIError for all:
from yait_aichain import (RateLimitError, AuthenticationError,
InsufficientCreditsError, APIError)
try:
skill.run()
except RateLimitError as e:
wait(e.retry_after) # honours the Retry-After header
except InsufficientCreditsError:
... # out of credits/quota — top up (not a key problem)
except AuthenticationError:
...
Keep the model list fresh — diff the registry against a provider's live roster:
from yait_aichain.models import registry
registry.refresh("openai") # → {"new": [...], "removed": [...], ...}
Built-in tools
Search
searchPerplexity · searchBrave · searchSerp · searchOpenAI
Convert
convertToMD · convertToHTML · convertToPDF · TTS(provider) · STT(provider)
Embeddings
Embedding("openai/text-embedding-3-small")
Embedding("cohere/embed-v4.0")
Embedding("voyage/voyage-3-large")
Examples
→ examples/ — 18 focused examples, one concept each
| # | File | What it shows |
|---|---|---|
| 01 | 01_skill.py |
The minimum viable aichain program |
| 02 | 02_skill_models.py |
Same prompt, Claude + GPT + Gemini |
| 03 | 03_skill_multimodal.py |
Text → image → vision, three providers |
| 04 | 04_skill_save_load.py |
Save to YAML, reload anywhere |
| 05 | 05_tool_convert.py |
URL → Markdown |
| 06 | 06_tool_mcp.py |
Connect an MCP server, discover + call tools |
| 07 | 07_tool_custom.py |
Build your own Tool, plug into a Chain |
| 08 | 08_chain.py |
GPT writes → Claude reviews |
| 09 | 09_chain_tool_skill.py |
Fetch page → summarise |
| 10 | 10_chain_save_load.py |
Save/reload a full pipeline |
| 11 | 11_pool.py |
5 topics, all in parallel |
| 12 | 12_pool_chain.py |
Chain-per-item, all in parallel |
| 13 | 13_agent.py |
Autonomous agent, one tool |
| 14 | 14_agent_tools.py |
Agent picks its own tools |
| 15 | 15_agent_orchestrator.py |
Orchestrator spawns sub-agents |
| 16 | 16_debug.py |
Inspect Chain history, Pool status, Agent steps |
| 17 | 17_chain_human_input.py |
Pause a chain for human approval, then resume |
| 18 | 18_agent_external_trigger.py |
Suspend an agent; a webhook resumes it (cross-process) |
| 19 | 19_image_edit.py |
Edit one product photo across four image providers |
Persist and reload
skill.save("skills/translator.yaml")
skill = Skill.load("skills/translator.yaml") # API key from env, not file
chain.save("chains/research.yaml")
chain = Chain.load("chains/research.yaml")
Supported providers
| Provider | Text | Vision | Image gen | Env var |
|---|---|---|---|---|
| Anthropic | Claude Fable 5, Opus / Sonnet / Haiku 4 | ✓ | — | ANTHROPIC_API_KEY |
| OpenAI | GPT-5.5, GPT-5.4, GPT-4o | ✓ | ChatGPT-Image, GPT-Image-2 | OPENAI_API_KEY |
| Gemini 2.5 Pro / Flash, 3.x | ✓ | Gemini image models | GOOGLE_AI_API_KEY |
|
| xAI | Grok 4, Grok 3 | ✓ | Grok-Imagine | XAI_API_KEY |
| Perplexity | Sonar Pro, Sonar, Deep Research | — | — | PERPLEXITY_API_KEY |
| Kimi | K2.7 Code, K2.6, K2.5, K2 Thinking | ✓ | — | MOONSHOT_API_KEY |
| DeepSeek | DeepSeek-V3, DeepSeek-R1 | — | — | DEEPSEEK_API_KEY |
| Qwen | Qwen-Max, Qwen3, QwQ | ✓ | Wan 2.2 image | DASHSCOPE_API_KEY |
| Recraft | — | — | Recraft V3 (raster + vector) | RECRAFT_API_TOKEN |
| BFL (FLUX) | — | — | FLUX.2, FLUX Kontext | BFL_API_KEY |
| Reve | — | — | Reve Image (create / edit / remix) | REVE_API_KEY |
Image editing — instruction edit, preserves the subject: OpenAI · Google · xAI · Qwen · FLUX Kontext (place / restyle / recompose while keeping the original object)
Image-to-image — whole-image variation (restyle, not subject-preserving): Recraft (imageToImage, strength-controlled)
Embedding: OpenAI · Cohere · Voyage · Google · Qwen
Reranking: Cohere · Voyage · Qwen
Vector DB: Chroma · Qdrant · Pinecone
License
MIT
Changelog
Every release is in CHANGELOG.md — what changed, and why it
changed. Releases before 2.0 are recorded incompletely; the file says which
ones and why they were not reconstructed.
Metadata
Release files for yait-aichain 2.12.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 | |
|---|---|---|---|
| yait_aichain-2.12.0.tar.gz | 337.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yait_aichain-2.12.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 690.9 kB
Release files / yait_aichain-2.12.0.tar.gz
| Download URL | yait_aichain-2.12.0.tar.gz |
|---|---|
| Size | 337.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16402208dd8786816d81dae89e64df3de7775de80a79e286f782fed2a56db474
|
|
BLAKE2b-256 checksum How to use checksums |
df67445c210fcb1c71efdd623f3e58b65b36ee4ac8419a2234da7a8d392fec02
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency logRelease files / yait_aichain-2.12.0-py3-none-any.whl
| Download URL | yait_aichain-2.12.0-py3-none-any.whl |
|---|---|
| Size | 353.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9500b87c3e78667e20f70130d99d5487f2634aa834c3f034a9b9b95d16c2a0fd
|
|
BLAKE2b-256 checksum How to use checksums |
72b891987e72d658d107f7fedd0c3f1764dab3595e28f010097393672564b325
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.
Transparency log