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

Uploaded Python 3

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

Hashes for arcana_core-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8e2fa87291f668ca0b41ce4e9992391ebd7a6ffe06947e12fa80dc37eb6d8c71
MD5 8d2c186efc8648c74aea8c64976fd23e
BLAKE2b-256 66f342e52d3e343de24f5cfb21bc61c0ac408526e3fce7b44592af0fa11040ca

See more details on using hashes here.

Provenance

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

Hashes for arcana_core-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 848d8c8361713223f1dbb445674a4c35bdcd922ebc2e7e66c316b29f9bb58e0b
MD5 cedcb4c0b43a9ab03481f5206b7fc560
BLAKE2b-256 499df3d2bf0f1f6510c9e2b5f1cb742821b12ecf22a379b777ee23cebac832e5

See more details on using hashes here.

Provenance

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

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