Metadata-Version: 2.4
Name: getprimer
Version: 0.1.0
Summary: Persistent memory and governance layer for AI agents
License-Expression: MIT
Project-URL: Homepage, https://getprimer.cloud
Project-URL: Docs, https://getprimer.cloud/docs
Project-URL: Repository, https://github.com/getprimer/primer-python
Project-URL: Bug Tracker, https://github.com/getprimer/primer-python/issues
Keywords: ai,agents,memory,llm,langchain,mcp
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Provides-Extra: langchain
Requires-Dist: langchain>=0.1.0; extra == "langchain"
Requires-Dist: pydantic>=2.0; extra == "langchain"
Provides-Extra: all
Requires-Dist: getprimer[langchain]; extra == "all"

# getprimer

Persistent memory and governance layer for AI agents.

```bash
pip install getprimer
```

## Quick start

```python
from getprimer import Primer

p = Primer(api_key="pk_live_...")  # or set PRIMER_API_KEY env var

# ── Always do this pattern ─────────────────────────────────────────
ctx = p.brief(agent="my-bot")           # load context at session start
print(ctx["context_summary"])           # inject into system prompt

# ... agent does work ...

p.learn("Customer prefers async comms", pinned=True, source_trust="human")
p.check("delete_records")              # True = allowed, False = blocked
p.handoff("Done. Next: add tests.")    # save handoff at session end
# ──────────────────────────────────────────────────────────────────
```

## LangChain

```python
from getprimer.langchain import PrimerTools

tools = PrimerTools(api_key="pk_live_...").as_tools()
agent = initialize_agent(tools=tools, llm=ChatOpenAI(), ...)
```

**Autonomous mode** (zero explicit calls — Primer hooks in automatically):

```python
from getprimer.langchain import PrimerCallbackHandler

callback = PrimerCallbackHandler(api_key="pk_live_...")
llm = ChatOpenAI(callbacks=[callback])
# Every LLM chain now gets Primer context injected automatically
```

## Session limit

On the free plan (20 sessions/month), when the limit is reached `brief()` raises `SessionLimitError`. The exception message is safe to surface directly to the user:

```python
from getprimer import Primer, SessionLimitError

try:
    ctx = p.brief()
except SessionLimitError as e:
    print(e)  # "⚠️ Primer: You've used all 20 free sessions..."
              # Upgrade at: https://getprimer.cloud/pricing
```

## Get an API key

Sign up at [getprimer.cloud](https://getprimer.cloud) — free plan included.
