Agent-Speicher mit WayFlow verwenden
WayFlow, eine Bibliothek zum Erstellen von KI-Assistenten, orchestriert Agent-Antworten und Toolaufrufe während einer Session. Viele Anwendungen müssen jedoch auch den Benutzerkontext beibehalten, nachdem die Session oder Unterhaltung beendet wurde. Der Oracle AI Agent-Speicher speichert diesen Kontext mit langer Lebensdauer, sodass eine spätere WayFlow-Unterhaltung ihn abrufen und verwenden kann.
In diesem Artikel erfahren Sie, wie Sie den Agent-Speicher mit einem WayFlow-Agent verbinden, sodass der Agent Informationen über Sessions hinweg wiederverwenden kann.
Hinweis: Verwenden Sie diese Integration, wenn ein Agent Informationen über die aktuelle Session hinaus speichern muss, wie z.B. Benutzervoreinstellungen, Supportdetails oder Daueranweisungen. Verwenden Sie WayFlow allein, wenn der Kontext nur während der aktuellen Session oder Unterhaltung wichtig ist.
Tipp: Informationen zum Packagesetup finden Sie unter Erste Schritte mit Agent-Speicher. Wenn Sie für dieses Beispiel eine lokale Oracle AI Database benötigen, lesen Sie Oracle AI Database lokal ausführen. Weitere Informationen zu WayFlow finden Sie unter (https://github.com/oracle/wayflow).
Agent-Speicher und WayFlow konfigurieren
Erstellen Sie einen Agent-Speicher-Thread für den Benutzer, stellen Sie ein search_memory-Tool für WayFlow bereit, und erstellen Sie den WayFlow Agent mit einem OpenAIModel. Das Tool search_memory fragt die Agent-Speicher-API nach Benutzer und Agent-ID ab, damit dauerhafte Fakten aus vorherigen Sessions wiederhergestellt werden können, anstatt auf den aktuellen Thread beschränkt zu sein. Der Agent-Speicherclient verwendet auch sein eigenes LLM, um dauerhafte Speicher regelmäßig aus aktuellen Threadnachrichten zu extrahieren, während der WayFlow Agent weiterhin seinen eigenen OpenAIModel für Antworten und Toolaufrufe verwendet.
import oracledb
from oracleagentmemory.core import MemoryExtractionConfig
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
from oracleagentmemory.core.oracleagentmemory import OracleAgentMemory
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="YOUR DB CONNECT STRING",
)
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,
)
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],
)
| API-Referenz: OracleAgentMemory | OracleThread |
Benutzerkontext nach einer Session beibehalten
Hängen Sie die ausgetauschten Nachrichten nach jeder WayFlow-Session an den Agent-Speicher an, und speichern Sie alle dauerhaften Fakten, die später wiederverwendet werden sollen.
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.")
Speicher in einer neuen WayFlow-Session wiederverwenden
Wenn eine spätere Session gestartet wird, öffnen Sie denselben Agent-Speicher-Thread erneut, und lassen Sie den WayFlow-Agent search_memory aufrufen, um den vorherigen Benutzerkontext wiederherzustellen.
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)
Ausgabe:
The user is John, a Python developer.
Erweiterte Verwendung
Zur engeren Integration können Sie einen WayFlow-Ereignis-Listener registrieren, der ConversationMessageAddedEvent-Einträge puffert und sie am Ende einer Ausführung in den Agent-Speicher schreibt. Dadurch wird der Aktualisierungspfad des Agent-Speichers vom Haupt-Thread-Code entkoppelt, während die letzten ausgetauschten Nachrichten beibehalten werden.
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)
Automatische Extraktion deaktivieren
Wenn Sie nur Nachrichten persistieren und dauerhafte Speicher manuell hinzufügen möchten, erstellen Sie den Agent-Speicherclient mit memory_extraction_config=MemoryExtractionConfig(extract_memories=False), und fügen Sie die dauerhaften Speicherzeilen selbst ein.
manual_memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
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.")
Schlussfolgerung
In diesem Artikel haben wir gelernt, wie Sie Agent-Speicher mit einem WayFlow-Agent verbinden, ausgetauschte Nachrichten und dauerhafte Speicher nach jeder Session persistieren und vorherigen Benutzerkontext bei späteren Ausführungen wiederverwenden.
Tipp: Nachdem Sie gelernt haben, wie Sie Agent-Speicher in WayFlow integrieren, interessieren Sie sich möglicherweise auch für Agent-Speicher in LangGraph integrieren.
Vollständiger Code
#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.
#Agent Memory Code Example - Integration with WayFlow
#-----------------------------------------------------
##Configure Oracle Memory and WayFlow
import oracledb
from oracleagentmemory.core import MemoryExtractionConfig
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
from oracleagentmemory.core.oracleagentmemory import OracleAgentMemory
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="YOUR DB CONNECT STRING",
)
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,
)
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?
memory_thread.add_messages(
[
{"role": "user", "content": user_message},
{"role": "assistant", "content": assistant_reply},
]
)
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,
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.")