Skip to main content

Oroi

Oroi (euskera: raíz de oroitu, «recordar») — una red semántica para agentes conversacionales. Memoria para una conversación infinita.

Oroi es una memoria asociativa para chatbots y agentes LLM que almacena la conversación como una red semántica con dinámica de activación inspirada en la memoria humana: lo mencionado se activa, la activación se propaga a lo asociado, todo decae con los turnos, las asociaciones que se repiten se refuerzan y un proceso en segundo plano consolida lo importante — como la memoria humana consolida durante el sueño.

La hipótesis: la recuperación sensible a la activación supera a la recuperación por similitud vectorial pura (RAG) en conversaciones largas con referencias recurrentes y deriva temática. En una evaluación de 224 escenarios, Oroi supera al RAG híbrido 0,75 frente a 0,55 en recall de recuperación (gana en 43 escenarios y no pierde en ninguno; p<10⁻⁴), con la ventaja concentrada en los casos que confunden a la búsqueda por similitud: distractores, datos que cambian y cadenas de tres asociaciones.

Oroi is an associative memory for LLM agents: a semantic network with activation dynamics inspired by human memory. Spanish-first project; English preprint available below.

El preprint

Instalación

Requiere Python ≥ 3.12 con soporte de extensiones SQLite (los intérpretes de uv, Homebrew, conda y las distribuciones Linux lo traen; el instalador de python.org para macOS, no).

# como librería, dentro de tu proyecto (venv, uv, poetry...):
pip install oroi

# como herramienta de línea de comandos, global:
uvx oroi            # o: pipx install oroi

# desde el repositorio, para desarrollo:
git clone https://github.com/igorlaburu/oroi && cd oroi && uv sync

Credenciales: copia .env.example a .env (en tu carpeta de trabajo o en ~/.oroi/.env para tenerlas globales) y rellena tus claves — Azure OpenAI, o cualquier endpoint OpenAI-compatible como Ollama para correr 100 % en local. Tu memoria vive por defecto en ~/.oroi/mind.db (cámbiala con --db en cualquier comando).

Uso en diez líneas

from oroi import Mind
from oroi.extraction.extractor import TurnExtractor
from oroi.providers.azure import AzureEmbedder, AzureLLM
from oroi.providers.settings import ProviderSettings

settings = ProviderSettings()                      # lee .env
llm = AzureLLM(settings)
mind = Mind("memoria.db", AzureEmbedder(settings), TurnExtractor(llm), judge=llm)

mind.perceive("mi oficina está en Madrid")         # codificar un turno
print(mind.recall("¿dónde trabajo?"))              # recuperar: reconocimiento + evocación

La memoria persiste en memoria.db: reabrir es continuar, no empezar de cero. Mind.sleep() consolida (fusión de duplicados, promoción de asociaciones repetidas, poda); en el REPL y el servidor ocurre solo al quedar inactiva la conversación.

La línea de comandos

uv run oroi-chat                        # REPL conversacional con memoria (proveedor por .env)
uv run oroi viz --db memoria.db         # la película de la memoria, en HTML autocontenido
uv run oroi serve --db memoria.db       # visor en vivo + chat contra la mente real
uv run oroi replay --db memoria.db      # reconstruye la película desde los episodios
uv run oroi consolidate --db memoria.db # consolidación bajo demanda

¿Sin conversación propia todavía? uv run python examples/demo_conversation.py graba una conversación cotidiana de demostración en examples/demo.db.

Proveedores

Pieza Soporte hoy
Extracción (LLM rápido) Azure OpenAI, u OpenAI-compatible (OpenAI directo, Ollama, vLLM...)
Embeddings Azure OpenAI, u OpenAI-compatible con un modelo de embeddings en el endpoint
Conversador Claude (API o sesión local de Claude Code), Azure, u OpenAI-compatible

Para correr 100 % en local con Ollama: MEMORY_PROVIDER=openai, OPENAI_BASE_URL=http://localhost:11434/v1, OPENAI_FAST_MODEL=qwen3.6:latest (o tu modelo), y un modelo de embeddings servido (p. ej. nomic-embed-text, con OPENAI_EMBEDDING_DIM=768).

El núcleo no depende de ningún proveedor: oroi/providers/base.py define los Protocols (Embedder, Extractor, Chat) y todo se inyecta por constructor — cualquier otro proveedor es implementar dos o tres métodos.

Evaluación

El protocolo del preprint es reproducible: evaluation/ contiene el corpus sintético (224 escenarios, 7 fenómenos), las condiciones de contraste (RAG híbrido, RAG sobre hechos, re-ranker) y las dos métricas (Recall@contexto y Answer@judge).

uv run python -m evaluation.run        # tabla por fenómeno + test de McNemar + costes

Estado y licencia

Código bajo Apache-2.0; el nombre «Oroi» queda fuera de la concesión de licencia. Proyecto de investigación en desarrollo activo: la API puede cambiar. Próximas piezas declaradas en el preprint: reelaboración de recuerdos y validación sobre benchmark externo.

Contacto

Igor Laburu · Gako AI · oroi@gako.ai

Metadata

Release files for oroi 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oroi 0.1.1
File Size Uploaded
oroi-0.1.1.tar.gz 490.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oroi 0.1.1
File Interpreter ABI Platform
oroi-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 550.7 kB

Release files / oroi-0.1.1.tar.gz

Download URL oroi-0.1.1.tar.gz
Size 490.9 kB
Tags Source
SHA-256 checksum
How to use checksums
6e4b6e972b89c5e61d327f89cbba6c77581eb763f5c470979ef2785ed772df35
BLAKE2b-256 checksum
How to use checksums
69b1431c1b19e1e1d9be3d2c9dc63c65616080920a0df7a76d4cdc8d5558f8c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / oroi-0.1.1-py3-none-any.whl

Download URL oroi-0.1.1-py3-none-any.whl
Size 59.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
48948ba00f8b16c3f93950af46775ef8c95801ce218c1cfaa33762359ef3bf40
BLAKE2b-256 checksum
How to use checksums
f465fb32234dc68b67c82b6b2bbfc2d947c8766d6caad57cbacff2abb3573a6b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

0.0.1

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