The OS that gives your agents a soul — core library
Project description
arcana-core
The Python library at the heart of Arcana OS. Assign a tarot card to an agent: get a soul.
pip install arcana-core
# or inside the monorepo:
uv sync --all-packages --all-extras
Quick start
Agents run through a ModelGateway. The gateway owns connections, routing, retries, and cost metering; the agent just names the model it wants.
from arcana import Agent, Card
from arcana.models import ConnectionStore, ModelGateway
async with ModelGateway(ConnectionStore()) as gw:
agent = Agent(
name="researcher",
card=Card.HERMIT,
gateway=gw,
model="ollama/hermes-3",
)
result = await agent.run("Summarise recent advances in RAG.")
print(result)
# Streaming
async for chunk in agent.stream("What is a vector index?"):
print(chunk, end="", flush=True)
How it works
Every agent is configured by a tarot card. The card encodes an archetype: personality and default temperature. The CardEngine blends one primary card with optional modifier cards into an AgentConfig, which the Agent wires together with the gateway.
Card enum
→ CardRegistry.get() → TarotCard (archetype, traits, prompt ingredients)
→ CardEngine.resolve() → AgentConfig (system_prompt, temperature)
→ Agent.__init__() ← wires gateway + model + AgentConfig together
→ Agent.run() / Agent.stream()
Blending: primary card = 70%, modifier cards = 30% split equally. Temperature is linearly blended. CardEngine.check_compatibility() reports how well a primary and its modifiers fit together.
agent = Agent(
name="creative-researcher",
card=Card.HERMIT, # 70 % — deep, methodical
modifier_cards=[Card.FOOL], # 30 % — curious, action-first
gateway=gw,
model="ollama/hermes-3",
)
Each run records a Session (messages + token totals). Sessions are stateless in this release — multi-turn continuity within a session is supported; cross-session memory is not yet wired (see the roadmap).
The 22 Major Arcana
| # | Card | Archetype | Default temp |
|---|---|---|---|
| 0 | The Fool | Explorer / Autonomous Agent | 0.95 |
| I | The Magician | Executor / Tool Master | 0.50 |
| II | The High Priestess | Archivist / Pattern Reader | 0.40 |
| III | The Empress | Creator / Generative Agent | 0.85 |
| IV | The Emperor | Orchestrator / System Agent | 0.30 |
| V | The Hierophant | Advisor / Domain Expert | 0.30 |
| VI | The Lovers | Collaborator / Communication | 0.70 |
| VII | The Chariot | Driver / Goal Agent | 0.40 |
| VIII | Strength | Coach / Long-Game Agent | 0.60 |
| IX | The Hermit | Researcher / Deep Analyst | 0.35 |
| X | Wheel of Fortune | Scheduler / Probabilistic | 0.65 |
| XI | Justice | Auditor / Evaluation Agent | 0.20 |
| XII | The Hanged Man | Reframer / Perspective | 0.80 |
| XIII | Death | Transformer / Refactor Agent | 0.40 |
| XIV | Temperance | Integrator / Synthesis | 0.55 |
| XV | The Devil | Shadow / Constraint Breaker | 0.75 |
| XVI | The Tower | Disruptor / Breakthrough | 0.85 |
| XVII | The Star | Companion / Wellbeing Agent | 0.70 |
| XVIII | The Moon | Interpreter / Ambiguity | 0.80 |
| XIX | The Sun | Amplifier / Output Agent | 0.75 |
| XX | Judgement | Reviewer / Reflection | 0.45 |
| XXI | The World | Meta-Agent (reserved) | 0.50 |
The World (XXI) is defined but reserved — it cannot be assigned to an agent yet.
Module map
| Module | What's implemented |
|---|---|
arcana/types/ |
All Pydantic models — always import from arcana.types. Covers cards, agents, sessions, and models. |
arcana/cards/definitions/ |
One file per card, each exporting a TarotCard instance (all 22 present). |
arcana/cards/registry.py |
CardRegistry — get(Card), all(). |
arcana/cards/engine.py |
CardEngine — blending, resolve() → AgentConfig, check_compatibility(). |
arcana/agents/agent.py |
Agent — run() / stream(), session recording. |
arcana/agents/registry.py |
AgentRegistry — CRUD for agent records persisted to ~/.arcana/agents/{id}/agent.json; build_runtime(). |
arcana/agents/session_manager.py |
SessionManager — session lifecycle, persisted to disk. |
arcana/models/ |
ModelGateway (routing, adapter pooling, retry/backoff, error normalization, cost metering), adapters for Ollama / Anthropic / OpenAI-compatible, ConnectionStore (keyring-backed secrets), pricing, and a normalized ModelError hierarchy. |
Types convention
All Pydantic models are re-exported from arcana.types. Always import from there:
from arcana.types import Card, AgentConfig # correct
from arcana.types.card import Card # avoid
Adding a new card
- Create
arcana/cards/definitions/<name>.pyfollowingfool.py— export a singleTarotCardinstance. - Import it in
arcana/cards/definitions/__init__.pyand add it toall_cards()in canonical order. - Add the
Cardenum value toarcana/types/card.pyif not already present.
Development
# Lint
uv run ruff check .
# Type check
uv run pyright packages/arcana-core/arcana
# Tests (no LLM calls)
uv run pytest packages/arcana-core/tests/ -v -m "not llm_eval"
Roadmap
This release ships the Phase 1a MVP: card-configured, stateless agents on the model gateway. The memory type system (MemoryEntry, MemoryProfile, MemoryWeights) is already modelled and the Agent has memory slots ready — federated memory backends, a tool/MCP gateway, and The World meta-agent land in Phase 1b as additive wiring, not a rewrite.
Project details
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 arcana_core-0.1.0.tar.gz.
File metadata
- Download URL: arcana_core-0.1.0.tar.gz
- Upload date:
- Size: 110.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e2fa87291f668ca0b41ce4e9992391ebd7a6ffe06947e12fa80dc37eb6d8c71
|
|
| MD5 |
8d2c186efc8648c74aea8c64976fd23e
|
|
| BLAKE2b-256 |
66f342e52d3e343de24f5cfb21bc61c0ac408526e3fce7b44592af0fa11040ca
|
Provenance
The following attestation bundles were made for arcana_core-0.1.0.tar.gz:
Publisher:
release.yml on priscilapower/arcana-os
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arcana_core-0.1.0.tar.gz -
Subject digest:
8e2fa87291f668ca0b41ce4e9992391ebd7a6ffe06947e12fa80dc37eb6d8c71 - Sigstore transparency entry: 1839188677
- Sigstore integration time:
-
Permalink:
priscilapower/arcana-os@786e5e67d6f1d0683f3b1791b65d84fc9d5bb460 -
Branch / Tag:
refs/tags/arcana-core-v0.1.0 - Owner: https://github.com/priscilapower
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@786e5e67d6f1d0683f3b1791b65d84fc9d5bb460 -
Trigger Event:
release
-
Statement type:
File details
Details for the file arcana_core-0.1.0-py3-none-any.whl.
File metadata
- Download URL: arcana_core-0.1.0-py3-none-any.whl
- Upload date:
- Size: 110.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
848d8c8361713223f1dbb445674a4c35bdcd922ebc2e7e66c316b29f9bb58e0b
|
|
| MD5 |
cedcb4c0b43a9ab03481f5206b7fc560
|
|
| BLAKE2b-256 |
499df3d2bf0f1f6510c9e2b5f1cb742821b12ecf22a379b777ee23cebac832e5
|
Provenance
The following attestation bundles were made for arcana_core-0.1.0-py3-none-any.whl:
Publisher:
release.yml on priscilapower/arcana-os
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
arcana_core-0.1.0-py3-none-any.whl -
Subject digest:
848d8c8361713223f1dbb445674a4c35bdcd922ebc2e7e66c316b29f9bb58e0b - Sigstore transparency entry: 1839188765
- Sigstore integration time:
-
Permalink:
priscilapower/arcana-os@786e5e67d6f1d0683f3b1791b65d84fc9d5bb460 -
Branch / Tag:
refs/tags/arcana-core-v0.1.0 - Owner: https://github.com/priscilapower
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@786e5e67d6f1d0683f3b1791b65d84fc9d5bb460 -
Trigger Event:
release
-
Statement type: