Skip to main content

arcana-core

License: Apache 2.0 Python 3.11+

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, models, memory, tools, and workspaces.
arcana/cards/definitions/ One file per card, each exporting a TarotCard instance (all 22 present).
arcana/cards/registry.py CardRegistryget(Card), all().
arcana/cards/engine.py CardEngine — blending, resolve()AgentConfig, check_compatibility().
arcana/agents/agent.py Agentrun() / 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.
arcana/memory/ The federated memory layer. MemoryFederation presents private / shared / global tiers as one MemoryAdapter: SQLiteAdapter (FTS5 keyword search), optional VectorAdapter (sqlite-vec semantic + hybrid), and read-only connectorsMarkdownFolderAdapter makes an Obsidian vault or notes folder searchable from just a path. A knowledge-graph layer (memory_edges + EdgeStore) links notes into typed edges, populated from [[wikilinks]] by WikilinkEdgeExtractor. Per-tier resilience (timeouts, circuit breakers) and PRAGMA user_version migrations round it out.
arcana/context/ read_soul() — loads the optional user-owned ~/.arcana/soul.md context injected into sessions; missing or unreadable is a silent None.
arcana/observability/ Local-first telemetry: a JSONL AuditLog (~/.arcana/logs/), OpenTelemetry tracing (optional [observability] extra), and metrics — wired through the Agent and ModelGateway.
arcana/evals/ arcana.evals, the public evaluation harness: EvalHarness runs EvalCase suites (cards, memory, decay, blending) scored by a CompositeJudge (deterministic RuleJudge + optional LLMJudge), with JSON result persistence and regression comparison across runs.

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

  1. Create arcana/cards/definitions/<name>.py following fool.py — export a single TarotCard instance.
  2. Import it in arcana/cards/definitions/__init__.py and add it to all_cards() in canonical order.
  3. Add the Card enum value to arcana/types/card.py if 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 federated memory layer now lives in arcana-core (tiered backends, folder connectors, and a knowledge-graph edge layer — see the module map), usable directly as a library. Wiring it into the agent run path — plus a tool/MCP gateway and The World meta-agent — lands in Phase 1b as additive work, not a rewrite.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arcana_core-0.3.0.tar.gz (230.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arcana_core-0.3.0-py3-none-any.whl (196.7 kB view details)

Uploaded Python 3

File details

Details for the file arcana_core-0.3.0.tar.gz.

File metadata

  • Download URL: arcana_core-0.3.0.tar.gz
  • Upload date:
  • Size: 230.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arcana_core-0.3.0.tar.gz
Algorithm Hash digest
SHA256 fd74613a34d7702a967d561374cc8eaa006a3cb8de3d043f2eb06572a86470c8
MD5 a0f7bcab66e4d17cb65342b0b4f152c8
BLAKE2b-256 8fa17cf809f74840a53eae7a86fd5125c3df77fb76853a975a97945bc4899144

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcana_core-0.3.0.tar.gz:

Publisher: release.yml on priscilapower/arcana-os

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arcana_core-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: arcana_core-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 196.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arcana_core-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b7dfd3f1036a82a8a10a3e5ccc8385fe5170ec87b3e73c7da04d4bee43956129
MD5 fc4672b9a23a4a387a63216c0c60b6e9
BLAKE2b-256 b2c2c5f9ae6f5c6d8c38d91036a4cf5ac90257f7b56a53867e560f730f863879

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcana_core-0.3.0-py3-none-any.whl:

Publisher: release.yml on priscilapower/arcana-os

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page