novyx-agent
Build AI agents with persistent memory, rollback, and audit trails.
from novyx_agent import Agent, tool
agent = Agent(
name="Aria",
api_key="nram_...",
provider="anthropic", # or "openai" or "litellm"
model="claude-sonnet-4-6",
)
@agent.tool
def search_web(query: str) -> str:
"""Search the web for information."""
return requests.get(f"https://api.search.com?q={query}").text
result = agent.run("What did we discuss yesterday?")
print(result)
That's it. The agent automatically recalls relevant memories before every LLM call, executes tools, and remembers the exchange for next time.
v2.0 note:
providerandmodelare now required. Novyx is provider-agnostic — pickopenai,anthropic, orlitellm(for any other model). No hidden defaults.
Why novyx-agent?
Every agent framework gives you tool calling. None of them give you this:
# Roll back the agent's memory to before it went off the rails
agent.rollback("2 hours ago")
# Cryptographic audit trail — every memory operation, hash-chained
trail = agent.audit(limit=50)
# Memory health check — recall accuracy, drift, conflicts, staleness
health = agent.eval()
assert health["score"] >= 0.8, "Memory quality too low"
# Pass/fail gate for CI/CD
agent.eval_gate(min_score=0.7)
# Knowledge graph
agent.add_triple("Python", "is_a", "programming language")
triples = agent.query_triples(subject="Python")
No other agent SDK has rollback, audit trails, eval, or replay. Not OpenAI Agents SDK, not CrewAI, not LangGraph, not Pydantic AI.
Install
pip install novyx-agent
# Pick your LLM provider:
pip install novyx-agent[openai] # OpenAI / OpenAI-compatible
pip install novyx-agent[anthropic] # Claude
pip install novyx-agent[litellm] # Any model via LiteLLM
pip install novyx-agent[all] # All providers
Quick Start
1. Basic agent
from novyx_agent import Agent
agent = Agent(
name="Assistant",
api_key="nram_your_key",
provider="openai",
model="gpt-4o",
)
result = agent.run("Summarize what we've been working on")
print(result)
2. Agent with tools
from novyx_agent import Agent, tool
agent = Agent(
name="ResearchBot",
api_key="nram_...",
provider="anthropic",
model="claude-sonnet-4-6",
)
@agent.tool
def search_docs(query: str, limit: int = 5) -> str:
"""Search internal documentation."""
return f"Found {limit} results for: {query}"
@agent.tool
def create_ticket(title: str, body: str) -> str:
"""Create a support ticket."""
return f"Created ticket: {title}"
result = agent.run("Find docs about auth and create a ticket for the bug")
print(result)
print(f"Tools used: {[tc.tool for tc in result.tool_calls]}")
3. Agent with Claude
agent = Agent(
name="Claude Agent",
api_key="nram_...",
provider="anthropic",
model="claude-sonnet-4-6",
)
4. Agent with any model (LiteLLM)
agent = Agent(
name="Universal",
api_key="nram_...",
provider="litellm",
model="ollama/llama3", # or "gemini/gemini-1.5-pro", "groq/llama3-70b", etc.
)
5. Memory control
from novyx_agent import Agent, MemoryConfig
agent = Agent(
name="Selective",
api_key="nram_...",
provider="anthropic",
model="claude-sonnet-4-6",
memory=MemoryConfig(
auto_recall=True, # Recall before each run
auto_remember=True, # Remember after each run
recall_limit=10, # Max memories to recall
recall_threshold=0.5, # Minimum relevance score
recall_tags=["project-x"], # Only recall tagged memories
remember_tags=["project-x"],# Tag stored memories
remember_importance=8, # 1-10 importance
),
)
6. Rollback & audit
# Oops, the agent stored bad data
agent.rollback("30 minutes ago")
# Preview before committing
preview = agent.rollback_preview("1 hour ago")
print(f"Would restore {preview['restore_count']} memories")
# Full audit trail
for entry in agent.audit(limit=20):
print(f"{entry['action']} at {entry['timestamp']}")
7. Eval gates for CI/CD
health = agent.eval()
print(f"Memory score: {health['score']}")
# score = 0.7*recall + 0.2*freshness + 0.1*consistency
# Hard gate — raises if below threshold
agent.eval_gate(min_score=0.7)
8. Direct Novyx access
# Full SDK access for advanced operations
nx = agent.novyx
nx.dashboard()
nx.cortex_run()
nx.replay_timeline(hours=24)
Architecture
novyx-agent
├── agent.py — Agent class (run loop, memory integration)
├── tools.py — @tool decorator (auto-schema from type hints)
├── types.py — Pydantic models (ToolDef, RunResult, configs)
├── providers.py — LLM adapters (OpenAI, Anthropic, LiteLLM)
└── __init__.py — Public API
The run loop:
- Recall — semantic search over Novyx memories relevant to the prompt
- Build context — system prompt + recalled memories + conversation history + user message
- LLM loop — call the model → if tool calls, execute them → repeat until text response
- Remember — store a summary of the exchange as a new memory
- Return —
RunResultwith output, tool calls, memory stats, token usage
API Reference
Agent
| Method | Description |
|---|---|
run(prompt) |
Run the agent on a prompt |
remember(observation) |
Store a memory |
recall(query) |
Search memories |
forget(memory_id) |
Delete a memory |
rollback(target) |
Roll back memory state |
rollback_preview(target) |
Preview rollback |
audit(**kwargs) |
Get audit trail |
eval() |
Run memory health eval |
eval_gate(min_score) |
Pass/fail gate |
add_triple(s, p, o) |
Add knowledge graph triple |
query_triples(**kwargs) |
Query knowledge graph |
clear_history() |
Clear conversation history |
novyx |
Direct Novyx SDK access |
@tool
@tool
def my_function(param: str, count: int = 5) -> str:
"""Description becomes the tool description."""
return "result"
Automatically extracts: name, description (from docstring), parameters (from type hints), required/optional (from defaults).
RunResult
| Field | Type | Description |
|---|---|---|
output |
str |
The agent's text response |
tool_calls |
List[ToolCall] |
Tools invoked during the run |
memories_recalled |
int |
Memories retrieved |
memories_stored |
int |
Memories created |
model |
str |
Model used |
usage |
Dict[str, int] |
Token usage |
License
MIT
Metadata
Release files for novyx-agent 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| novyx_agent-2.0.0.tar.gz | 26.3 kB | Without provenance | Details for novyx_agent-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| novyx_agent-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for novyx_agent-2.0.0-py3-none-any.whl |
Total release size: 47.3 kB
Release files / novyx_agent-2.0.0.tar.gz
| Download URL | novyx_agent-2.0.0.tar.gz |
|---|---|
| Size | 26.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c594fcc561ffb9e3855ca684f7b134659333ea544eff46f8c255bcfd245b1a7a
|
|
BLAKE2b-256 checksum How to use checksums |
4a1cda8502f881c7a06934a5ef5167b125f654ab2d22ba6fa62b0993cd56c347
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.14
|
Release files / novyx_agent-2.0.0-py3-none-any.whl
| Download URL | novyx_agent-2.0.0-py3-none-any.whl |
|---|---|
| Size | 21.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b4279b1a8ebbc71b5a5c1dd4f4f72fabfb6049999791e59ffd5133a99c9db5c9
|
|
BLAKE2b-256 checksum How to use checksums |
698fb081fcb5b263c0fd83f685664d3ae6f3e34f23632ccb99b3f7201c4bf369
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.14
|
Security for novyx-agent 2.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.