Skip to main content

The OS that gives your agents a soul — core library

Project description

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, and models.
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.

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 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

arcana_core-0.1.1.tar.gz (110.2 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.1.1-py3-none-any.whl (110.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arcana_core-0.1.1.tar.gz
  • Upload date:
  • Size: 110.2 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.1.1.tar.gz
Algorithm Hash digest
SHA256 c624d03f6c19b8b605f242f75553d030c381e9934e9ee01b33cb2b3663f71966
MD5 67ca83642923fd3a3e7471bc2fd4616f
BLAKE2b-256 0971ad07a98ff979c34563ca088d030a0da100e2679e5cd210d34a1fb9bd2983

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcana_core-0.1.1.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.1.1-py3-none-any.whl.

File metadata

  • Download URL: arcana_core-0.1.1-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

Hashes for arcana_core-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 69c46d013854538ad0748b70b476b8454187b7150006d6eb00200a81228f36d5
MD5 4e5c17cbb993464c726abbef19855137
BLAKE2b-256 b5e1f78fa3ad337bd082fd88f3420e28d3704a0477d4367f450fe2111eadc5bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcana_core-0.1.1-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.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page