Threads

Cette page présente le gestionnaire de threads Oracle concret ainsi que le type d'aide aux messages destiné aux développeurs.

Thread Oracle

classe oracleagentmemory.core.OracleThread

Bases : IThread

Thread soutenu par un magasin Oracle.

Cette implémentation intègre et stocke à la fois les messages de thread et les mémoires ajoutées manuellement, puis prend en charge la recherche de similarité sur tous les enregistrements stockés.

Remarques

Créez une instance OracleThread.

Exemples 

from oracleagentmemory.core import OracleAgentMemory
import oracledb
db_pool = oracledb.SessionPool(
    user="YOUR DB USER",
    password="YOUR DB PASSWORD",
    dsn="YOUR DB CONNECT STRING",
)
client = OracleAgentMemory(connection=db_pool, embedder=embedder)
thread = client.create_thread(
    thread_id="c1",
    llm=llm,
    memory_extraction_config=MemoryExtractionConfig(enable_context_summary=True),
)
len(thread.add_messages([{"role": "user", "content": "I love pizza."}]))
1

méthode add_memory

Ajoutez une entrée de mémoire manuelle et indexez-la.

Exemples 

thread.add_memory("Remember this preference", memory_id="mem-thread-docs")
'mem-thread-docs'

method add_memory_async (async)

Ajoutez une mémoire de manière asynchrone.

méthode add_messages

Ajoutez des messages au thread et indexez-les.

En mode d'extraction en arrière-plan, cette méthode est renvoyée après l'insertion des messages bruts et la tentative d'extraction en arrière-plan en arrière-plan.

Remarques

Dans MemoryExtractionMode.BACKGROUND, les messages bruts sont conservés avant que les mémoires extraites ne soient stockées. Si l'extraction en arrière-plan n'est pas en file d'attente, ou si une attente de capacité de file d'attente configurée atteint son délai d'attente, les messages bruts insérés restent stockés et l'appel continue sans mémoires extraites ou soulève TimeoutError, selon background_extraction_queue_full_behavior.

Exemples 

len(thread.add_messages([{"role": "user", "content": "Thread message from docs"}]))
1

method add_messages_async (async)

Ajoutez des messages de manière asynchrone au thread et indexez-les.

En mode d'extraction en arrière-plan, cette méthode est renvoyée après l'insertion des messages bruts et la tentative d'extraction en arrière-plan en arrière-plan.

Dans MemoryExtractionMode.BACKGROUND, les messages bruts sont conservés avant que les mémoires extraites ne soient stockées. Si l'extraction en arrière-plan n'est pas en file d'attente, ou si une attente de capacité de file d'attente configurée atteint son délai d'attente, les messages bruts insérés restent stockés et l'appel continue sans mémoires extraites ou soulève TimeoutError, selon background_extraction_queue_full_behavior.

méthode delete_memory

Supprimer un enregistrement de type mémoire (par exemple, une mémoire, un fait, une préférence ou une consigne) de ce thread exact par identifiant.

Exemples 

thread.delete_memory("456")
0

méthode delete_message

Supprimer un enregistrement de message de ce thread exact par identifiant.

Remarques

La suppression d'un message supprime uniquement l'enregistrement de message brut. Les mémoires dérivées ne sont pas supprimées car nous ne suivons pas encore les mémoires extraites provenant de quel message, de sorte qu'elles peuvent rester consultables ou encore affecter la sortie de la carte de contexte. Utilisez OracleAgentMemory.delete_thread() pour supprimer le thread ainsi que les messages et les mémoires associés.

Exemples 

thread.delete_message("123")
0

méthode get_context_card

Renvoie un objet context-card pour le thread.

Préférez get_context_card_async lorsqu'une implémentation soutenue par un LLM peut effectuer des E/S réseau distantes.

Remarques

Cela utilise la portée de recherche par défaut du thread avec exact_thread_match=False, de sorte que les mémoires pertinentes d'autres threads pour le même utilisateur/agent peuvent être incluses.

Exemples 

thread.add_memory("User likes pizza", memory_id="mem-context-docs")
'mem-context-docs'
len(thread.add_messages([{"role": "user", "content": "Tell me about pizza"}]))
1
"User likes pizza" in thread.get_context_card().content
True
card = thread.get_context_card(
    max_relevant_results=4,
    min_relevant_results_by_type={"memory": 1},
)
len(card.relevant_results or []) <= 4
True

method get_context_card_async (async)

Renvoie de manière asynchrone un objet context-card pour le thread.

Exemples 

card = await thread.get_context_card_async(
    min_relevant_results_by_type={"preference": 1, "guideline": 1},
)
len(card.relevant_results or []) <= 5
True

méthode get_messages

Renvoyer les messages stockés pour ce sujet de discussion.

Exemples 

len(thread.add_messages([{"role": "user", "content": "Stored message example"}]))
1
messages = thread.get_messages()
messages[-1].content
'Stored message example'

method get_messages_async (async)

Renvoyer les messages de thread bruts de manière asynchrone.

méthode get_summary

Renvoyer un résumé au mieux du thread.

Préférez get_summary_async lorsqu'une implémentation soutenue par un LLM peut effectuer des E/S réseau distantes.

Exemples 

len(thread.add_messages([{"role": "assistant", "content": "Summary source message"}]))
1
summary = thread.get_summary()
bool(summary.content)
True

method get_summary_async (async)

Renvoie de manière asynchrone un récapitulatif au mieux du thread.

Rechercher de manière synchrone les enregistrements pertinents pour une requête.

Remarques

Les champs de portée omis héritent de la portée de recherche par défaut de ce thread : correspondance exacte entre l'utilisateur et l'agent, plus les valeurs user_id, agent_id et thread_id en cours de ce thread. La recherche de thread par défaut laisse intentionnellement exact_thread_match=False, de sorte qu'elle peut renvoyer les enregistrements pertinents d'autres threads pour le même utilisateur/agent. Transmettez exact_thread_match=True pour limiter les résultats au thread en cours. Les valeurs de portée None explicites suivent toujours les règles de correspondance exacte résolues : exact_*_match=False laisse cette dimension sans contrainte, tandis que exact_*_match=True correspond uniquement aux valeurs None stockées.

Les valeurs max_results explicites doivent être au moins 1. Si vous omettez l'argument, la valeur par défaut de 10 est utilisée. Limite supérieure : l'appel peut renvoyer moins de résultats max_results lorsque les filtres sont trop restrictifs, lorsqu'il existe moins d'enregistrements correspondants ou en raison d'un comportement de recherche propre à l'implémentation.

method search_async (async)

Rechercher de manière asynchrone les enregistrements pertinents pour une requête.

Remarques

Les champs de portée omis héritent de la portée de recherche par défaut de ce thread : correspondance exacte entre l'utilisateur et l'agent, plus les valeurs user_id, agent_id et thread_id en cours de ce thread. La recherche de thread par défaut laisse intentionnellement exact_thread_match=False, de sorte qu'elle peut renvoyer les enregistrements pertinents d'autres threads pour le même utilisateur/agent. Transmettez exact_thread_match=True pour limiter les résultats au thread en cours. Les valeurs de portée None explicites suivent toujours les règles de correspondance exacte résolues : exact_*_match=False laisse cette dimension sans contrainte, tandis que exact_*_match=True correspond uniquement aux valeurs None stockées.

Les valeurs max_results explicites doivent être au moins 1. Si vous omettez l'argument, la valeur par défaut de 10 est utilisée. Limite supérieure : l'appel peut renvoyer moins de résultats max_results lorsque les filtres sont trop restrictifs, lorsqu'il existe moins d'enregistrements correspondants ou en raison d'un comportement de recherche propre à l'implémentation.

méthode update_memory

Mettre à jour un enregistrement de type mémoire appartenant à ce thread exact.

method update_memory_async (async)

Mettre à jour un enregistrement de type mémoire de manière asynchrone.

Exemples 

from functools import partial
from oracleagentmemory._async_helpers import run_async_in_sync
memory_id = thread.add_memory("Original memory")
run_async_in_sync(
    partial(thread.update_memory_async, memory_id, content="Updated memory")
) == memory_id
True

méthode update_message

Mettre à jour un enregistrement de message brut appartenant à ce thread exact.

Remarques

Les champs omis sont préservés de l'enregistrement stocké. Le rôle stocké et l'horodatage restent inchangés. La modification du contenu met à jour l'historique des messages bruts et, lorsque l'extraction automatique est activée, le kit SDK peut extraire de nouveau les mémoires du message modifié et de l'historique précédent. En mode INLINE, cette extraction se termine avant que cette méthode ne soit renvoyée. En mode BACKGROUND, cette méthode renvoie une fois la mise à jour du message brut réussie et l'extraction en arrière-plan tentée. Ce travail de suivi n'affecte pas la fréquence d'extraction normale utilisée par les appels add_messages() ultérieurs. Les mémoires extraites existantes restent en place tandis que les mémoires nouvellement extraites du contenu modifié peuvent être ajoutées. Etant donné que la mise à jour du message brut et toute écriture de mémoire extraite ultérieure ne se produisent pas de manière atomique, les mémoires extraites peuvent toujours refléter le contenu du message précédent si le travail en arrière-plan ne fait pas l'objet d'une file d'attente, si une attente de capacité de file d'attente configurée atteint son délai d'attente ou si le travail d'extraction ultérieur échoue. Notez également que les mémoires extraites existantes conservent leur expiration initiale lorsque la durée de vie d'un message source change.

Exemples 

message_id = thread.add_messages([{"role": "user", "content": "Draft message"}])[0]
thread.update_message(message_id, content="Edited message") == message_id
True

method update_message_async (async)

Mettre à jour un enregistrement de message brut appartenant à ce thread exact de manière asynchrone.

Remarques

Les champs omis sont préservés de l'enregistrement stocké. Le rôle stocké et l'horodatage restent inchangés. La modification du contenu met à jour l'historique des messages bruts et, lorsque l'extraction automatique est activée, le kit SDK peut extraire de nouveau les mémoires du message modifié et de l'historique précédent. En mode INLINE, cette extraction se termine avant que cette méthode ne soit renvoyée. En mode BACKGROUND, cette méthode renvoie une fois la mise à jour du message brut réussie et l'extraction en arrière-plan tentée. Ce travail de suivi n'affecte pas la fréquence d'extraction normale utilisée par les appels add_messages() ultérieurs. Les mémoires extraites existantes restent en place tandis que les mémoires nouvellement extraites du contenu modifié peuvent être ajoutées. Etant donné que la mise à jour du message brut et toute écriture de mémoire extraite ultérieure ne se produisent pas de manière atomique, les mémoires extraites peuvent toujours refléter le contenu du message précédent si le travail en arrière-plan ne fait pas l'objet d'une file d'attente, si une attente de capacité de file d'attente configurée atteint son délai d'attente ou si le travail d'extraction ultérieur échoue. Notez également que les mémoires extraites existantes conservent leur expiration initiale lorsque la durée de vie d'un message source change.

Exemples 

message_id = thread.add_messages([{"role": "user", "content": "Draft message"}])[0]
run_async_in_sync(
    partial(thread.update_message_async, message_id, content="Edited message")
) == message_id
True

méthode wait_for_memory_extraction

Attendez l'extraction de mémoire en arrière-plan précédente pour ce thread.

Cette méthode attend l'extraction en arrière-plan démarrée par les appels add_messages(), add_messages_async(), update_message() ou update_message_async() précédents sur ce thread via le même composant de mémoire d'agent. Si l'un de ces appels est déjà terminé, cette méthode inclut l'extraction qu'il commence avant d'attendre.

La méthode n'attend pas que l'extraction démarre après ce début d'attente, que l'extraction démarre par un autre composant de mémoire d'agent ou que l'extraction s'exécute dans un autre processus. Les échecs d'extraction sont comptabilisés comme terminés pour cette attente.

Exemples 

thread.wait_for_memory_extraction(timeout=10)

method wait_for_memory_extraction_async (async)

Attendez asynchrone l'extraction de mémoire en arrière-plan précédente.

Cette méthode suit le même comportement que wait_for_memory_extraction().

Exemples 

await thread.wait_for_memory_extraction_async(timeout=10)

Remarque : delete_message() supprime uniquement la ligne de message brut. Les mémoires dérivées peuvent toujours être consultables ou apparaître dans des cartes de contexte. Utilisez OracleAgentMemory.delete_thread() pour supprimer le thread ainsi que les messages et les mémoires associés. La suppression de thread au niveau du client attend une extraction en arrière-plan précédemment acceptée déjà connue pour ce thread, mais il ne s'agit pas d'une barrière de simultanéité globale pour les autres opérations sur le même thread alors que la suppression est en cours.

Messages

classe oracleagentmemory.apis.thread.Message

Bases : object

Fiches contextuelles

classe oracleagentmemory.apis.contextcard.ContextCard

Bases : ABC

Objet de carte de contexte abstrait renvoyé par les API de thread.

property content (résumé)

classe oracleagentmemory.core.contextcard.OracleContextCard

Bases : ContextCard

Carte de contexte renvoyée par un thread Oracle.

propriété content

Exemples 

card = OracleContextCard(summary="ctx")
"<summary>" in card.content and "ctx" in card.content
True

propriété formatted_content

Exemples 

OracleContextCard(summary="").formatted_content
''
card = OracleContextCard(summary="ctx", topics=["travel"])
"<topics>" in card.formatted_content
True

Récapitulatifs

classe oracleagentmemory.apis.summary.Summary

Bases : ABC

Objet récapitulatif de thread abstrait renvoyé par les API de thread.

property content (résumé)

classe oracleagentmemory.core.summary.OracleSummary

Bases : Summary

Récapitulatif renvoyé par un thread Oracle.

Exemples 

summary = OracleSummary(content="Plan the Rome itinerary.")
summary.content
'Plan the Rome itinerary.'
str(summary)
'Plan the Rome itinerary.'

propriété content

Exemples 

OracleSummary(content="Keep the tea preference in mind.").content
'Keep the tea preference in mind.'

propriété formatted_content

Exemples 

OracleSummary(content="Thread recap").formatted_content
'Thread recap'