Uso de la memoria del agente con WayFlow
WayFlow, una biblioteca para crear asistentes de IA, organiza respuestas de agentes y llamadas a herramientas durante una sesión. Sin embargo, muchas aplicaciones también deben conservar el contexto del usuario después de que finalice la sesión o la conversación. Oracle AI Agent Memory almacena este contexto de larga duración para que una conversación posterior de WayFlow pueda recuperarlo y utilizarlo.
En esta guía, aprenderá a conectar la memoria del agente a un agente de WayFlow, lo que permite al agente reutilizar la información entre sesiones.
Nota: Utilice esta integración cuando un agente necesite recordar información más allá de la sesión actual, como preferencias de usuario, detalles de soporte o instrucciones permanentes. Utilice WayFlow solo cuando el contexto solo importe durante la sesión o conversación actual.
Indicación: Para la configuración del paquete, consulte Get Started with Agent Memory. Para aprender a configurar una instancia local de Oracle AI Database para este ejemplo, siga Ejecución local de Oracle AI Database. Para obtener más información sobre WayFlow, consulte https://github.com/oracle/wayflow.
Configuración de la memoria del agente y WayFlow
Cree un thread de memoria de agente de Oracle para el usuario, exponga una herramienta search_memory a WayFlow y cree WayFlow Agent con un valor OpenAIModel. La herramienta search_memory consulta la API de memoria del agente de Oracle por usuario e ID de agente para que pueda recuperar hechos duraderos de sesiones anteriores en lugar de limitarse al thread actual. El cliente de memoria del agente de Oracle también utiliza su propio LLM para extraer periódicamente memorias duraderas de mensajes de thread recientes, mientras que WayFlow Agent sigue utilizando su propio OpenAIModel para respuestas y llamadas a herramientas.
import oracledb
from oracleagentmemory.core import MemoryExtractionConfig, OracleAgentMemory, SchemaPolicy
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
from wayflowcore.agent import Agent
from wayflowcore.models import OpenAIModel
from wayflowcore.tools import tool
embedder = Embedder(
model="YOUR_EMBEDDING_MODEL",
api_base="YOUR_EMBEDDING_API_BASE",
api_key="YOUR_EMBEDDING_API_KEY",
)
llm = Llm(
model="gpt-4.1-mini",
api_key="YOUR_OPENAI_API_KEY",
)
db_pool = oracledb.SessionPool(
user="YOUR DB USER",
password="YOUR DB PASSWORD",
dsn="localhost:1521/...",
)
memory_store_id = "T_WAYFLOW"
wayflow_llm = OpenAIModel(
model_id="gpt-4.1-mini",
api_key="YOUR_OPENAI_API_KEY",
)
#Keep these identifiers stable for the same assistant and end user so memory
#is scoped consistently across threads and sessions.
agent_id = "support_agent"
user_id = "user_123"
memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=llm,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
)
memory_thread = memory.create_thread(
thread_id="wayflow_memory_demo",
user_id=user_id,
agent_id=agent_id,
)
from typing import Annotated
@tool
def search_memory(
query: Annotated[str, "Question to search in Oracle Agent Memory"],
) -> Annotated[str, "Top matching memory content"]:
"""Search Oracle Agent Memory for durable user facts relevant to the current request."""
results = memory.search(
query=query,
user_id=user_id,
agent_id=agent_id,
max_results=1,
record_types=["memory"],
)
if not results:
return "No relevant memory found."
return results[0].content
assistant = Agent(
llm=wayflow_llm,
agent_id=agent_id,
custom_instruction=(
"You are a support agent. When the user asks about durable facts from "
"prior sessions, call the search_memory tool before answering."
),
tools=[search_memory],
)
| Referencia de API: OracleAgentMemory | OracleThread |
Conservar el contexto del usuario después de una sesión
Después de cada sesión de WayFlow, agregue los mensajes intercambiados a la memoria del agente de Oracle y almacene cualquier hecho duradero que se deba volver a utilizar más adelante.
session_1 = assistant.start_conversation()
user_message = (
"I am John, a Python developer and I need help debugging a payment service."
)
session_1.append_user_message(user_message)
session_1.execute()
assistant_reply = session_1.get_last_message().content
print(assistant_reply)
#I can help with that. What error are you seeing?
#add_messages will add messages to the DB and extract memories automatically
memory_thread.add_messages(
[
{"role": "user", "content": user_message},
{"role": "assistant", "content": assistant_reply},
]
)
#add_memory adds memory to the DB
memory_thread.add_memory("The user is John, a Python developer.")
Reutilización de Memoria en una Nueva Sesión de WayFlow
Cuando se inicie una sesión posterior, vuelva a abrir el mismo thread de memoria del agente de Oracle y permita que el agente de WayFlow llame a search_memory para recuperar el contexto de usuario anterior.
memory_thread = memory.get_thread("wayflow_memory_demo")
assistant = Agent(
llm=wayflow_llm,
agent_id=agent_id,
custom_instruction=(
"You are a support agent. When the user asks about durable facts from "
"prior sessions, call the search_memory tool before answering."
),
tools=[search_memory],
)
session_2 = assistant.start_conversation()
session_2.append_user_message("Who am I?")
session_2.execute()
remembered_reply = session_2.get_last_message().content
print(remembered_reply)
#The user is John, a Python developer.
Uso avanzado
Para una integración más estricta, puede registrar un listener de eventos de WayFlow que almacena en buffer las entradas ConversationMessageAddedEvent y las escribe en la memoria del agente de Oracle al final de una ejecución. De esta forma, la ruta de acceso de actualización de la memoria del agente de Oracle se desacopla del código de thread principal mientras se mantienen los mensajes intercambiados finales.
from wayflowcore.events.event import ConversationMessageAddedEvent
from wayflowcore.events.eventlistener import GenericEventListener, register_event_listeners
pending_messages: list[dict[str, str]] = []
def _buffer_thread_message(event: ConversationMessageAddedEvent) -> None:
if event.streamed:
return
pending_messages.append(
{
"role": event.message.role,
"content": event.message.content,
}
)
message_listener = GenericEventListener(
[ConversationMessageAddedEvent],
_buffer_thread_message,
)
with register_event_listeners([message_listener]):
session_3 = assistant.start_conversation()
session_3.append_user_message("Please remember that I prefer concise code reviews.")
session_3.execute()
if pending_messages:
memory_thread.add_messages(pending_messages)
Desactivar extracción automática
Si solo desea mantener mensajes y agregar memorias duraderas manualmente, cree el cliente de memoria del agente de Oracle con memory_extraction_config=MemoryExtractionConfig(extract_memories=False) e inserte las filas de memoria duraderas usted mismo.
manual_memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
memory_extraction_config=MemoryExtractionConfig(extract_memories=False),
)
manual_memory_thread = manual_memory.create_thread(
thread_id="wayflow_manual_memory_demo",
user_id=user_id,
agent_id=agent_id,
)
manual_memory_thread.add_messages(
[
{
"role": "user",
"content": "Please remember that I prefer concise code reviews.",
},
{
"role": "assistant",
"content": "Understood. I will keep responses concise.",
},
]
)
manual_memory_thread.add_memory("The user prefers concise code reviews.")
Conclusión
En esta guía hemos aprendido a conectar la memoria del agente de Oracle a un agente de WayFlow, a mantener los mensajes intercambiados y las memorias duraderas después de cada sesión y a reutilizar el contexto de usuario anterior en ejecuciones posteriores.
→ Después de haber aprendido a utilizar la memoria del agente de Oracle con WayFlow, puede que también le interese Usar memoria del agente de Oracle con LangGraph.
Código Completo
#Copyright © 2026 Oracle and/or its affiliates.
#This software is under the Apache License 2.0
#(LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) or Universal Permissive License
#(UPL) 1.0 (LICENSE-UPL or https://oss.oracle.com/licenses/upl), at your option.
#Oracle Agent Memory Code Example - Integration with WayFlow
#-----------------------------------------------------------
##Configure Oracle Memory and WayFlow
import oracledb
from oracleagentmemory.core import MemoryExtractionConfig, OracleAgentMemory, SchemaPolicy
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
from wayflowcore.agent import Agent
from wayflowcore.models import OpenAIModel
from wayflowcore.tools import tool
embedder = Embedder(
model="YOUR_EMBEDDING_MODEL",
api_base="YOUR_EMBEDDING_API_BASE",
api_key="YOUR_EMBEDDING_API_KEY",
)
llm = Llm(
model="gpt-4.1-mini",
api_key="YOUR_OPENAI_API_KEY",
)
db_pool = oracledb.SessionPool(
user="YOUR DB USER",
password="YOUR DB PASSWORD",
dsn="localhost:1521/...",
)
memory_store_id = "T_WAYFLOW"
wayflow_llm = OpenAIModel(
model_id="gpt-4.1-mini",
api_key="YOUR_OPENAI_API_KEY",
)
#Keep these identifiers stable for the same assistant and end user so memory
#is scoped consistently across threads and sessions.
agent_id = "support_agent"
user_id = "user_123"
memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=llm,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
)
memory_thread = memory.create_thread(
thread_id="wayflow_memory_demo",
user_id=user_id,
agent_id=agent_id,
)
from typing import Annotated
@tool
def search_memory(
query: Annotated[str, "Question to search in Oracle Agent Memory"],
) -> Annotated[str, "Top matching memory content"]:
"""Search Oracle Agent Memory for durable user facts relevant to the current request."""
results = memory.search(
query=query,
user_id=user_id,
agent_id=agent_id,
max_results=1,
record_types=["memory"],
)
if not results:
return "No relevant memory found."
return results[0].content
assistant = Agent(
llm=wayflow_llm,
agent_id=agent_id,
custom_instruction=(
"You are a support agent. When the user asks about durable facts from "
"prior sessions, call the search_memory tool before answering."
),
tools=[search_memory],
)
##Persist user context after a session
session_1 = assistant.start_conversation()
user_message = (
"I am John, a Python developer and I need help debugging a payment service."
)
session_1.append_user_message(user_message)
session_1.execute()
assistant_reply = session_1.get_last_message().content
print(assistant_reply)
#I can help with that. What error are you seeing?
#add_messages will add messages to the DB and extract memories automatically
memory_thread.add_messages(
[
{"role": "user", "content": user_message},
{"role": "assistant", "content": assistant_reply},
]
)
#add_memory adds memory to the DB
memory_thread.add_memory("The user is John, a Python developer.")
##Reuse memory in a new WayFlow session
memory_thread = memory.get_thread("wayflow_memory_demo")
assistant = Agent(
llm=wayflow_llm,
agent_id=agent_id,
custom_instruction=(
"You are a support agent. When the user asks about durable facts from "
"prior sessions, call the search_memory tool before answering."
),
tools=[search_memory],
)
session_2 = assistant.start_conversation()
session_2.append_user_message("Who am I?")
session_2.execute()
remembered_reply = session_2.get_last_message().content
print(remembered_reply)
#The user is John, a Python developer.
##Advanced use event listeners
from wayflowcore.events.event import ConversationMessageAddedEvent
from wayflowcore.events.eventlistener import GenericEventListener, register_event_listeners
pending_messages: list[dict[str, str]] = []
def _buffer_thread_message(event: ConversationMessageAddedEvent) -> None:
if event.streamed:
return
pending_messages.append(
{
"role": event.message.role,
"content": event.message.content,
}
)
message_listener = GenericEventListener(
[ConversationMessageAddedEvent],
_buffer_thread_message,
)
with register_event_listeners([message_listener]):
session_3 = assistant.start_conversation()
session_3.append_user_message("Please remember that I prefer concise code reviews.")
session_3.execute()
if pending_messages:
memory_thread.add_messages(pending_messages)
##Disable automatic memory extraction
manual_memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
memory_extraction_config=MemoryExtractionConfig(extract_memories=False),
)
manual_memory_thread = manual_memory.create_thread(
thread_id="wayflow_manual_memory_demo",
user_id=user_id,
agent_id=agent_id,
)
manual_memory_thread.add_messages(
[
{
"role": "user",
"content": "Please remember that I prefer concise code reviews.",
},
{
"role": "assistant",
"content": "Understood. I will keep responses concise.",
},
]
)
manual_memory_thread.add_memory("The user prefers concise code reviews.")