线程

此页提供了具体的 Oracle 线程句柄以及面向开发者的消息帮助程序类型。

Oracle 线程

class oracleagentmemory.core.OracleThread

基础:IThread

由 Oracle 存储支持的线程。

此实现嵌入并存储线程消息和手动添加的内存,然后支持对所有存储的记录进行相似性搜索。

注释

创建新的 OracleThread 实例。

示例

from oracleagentmemory.core import MemoryExtractionConfig, OracleAgentMemory
client = OracleAgentMemory(connection=db_pool, embedder=embedder)
thread = client.create_thread(
    thread_id="c4",
    llm=llm,
    memory_extraction_config=MemoryExtractionConfig(enable_context_summary=True),
)
len(thread.add_messages([{"role": "user", "content": "I love pizza."}]))
1

method add_image

持久保存与此线程关联的一个图像。

description 存储为图像的可搜索文本。省略或 None 时,附加的 LLM 将生成标题。省略的范围值继承此线程的对应用户、代理和线程标识符。

method add_image_async(异步)

异步保存与此线程关联的一个映像。

description 存储为图像的可搜索文本。省略或 None 时,附加的 LLM 将生成标题。省略的范围值继承此线程的对应用户、代理和线程标识符。

method add_memory

添加手动内存条目并为其编制索引。

示例

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

method add_memory_async(异步)

添加手动内存条目并异步为其编制索引。

示例

import asyncio
asyncio.run(thread.add_memory_async(
    "Remember this preference", memory_id="mem-thread-docs-async"
))
'mem-thread-docs-async'

method add_messages

将消息添加到主题并为其编制索引。

在后台提取模式下,此方法在插入原始消息并在后台尝试到期后台提取后返回。

在任一模式下自动提取之前,都会存储原始消息。如果以后提取或派生内存存储失败,原始消息将保留,而派生内存或摘要更新可能丢失。

注释

在 MemoryExtractionMode.BACKGROUND 中,原始消息在存储提取的内存之前会保留。如果后台提取没有排队,或者如果配置的队列容量等待达到其超时值,则插入的原始消息将保留存储,并且调用将继续而不提取内存,或者根据 background_extraction_queue_full_behavior 引发 TimeoutError。

示例

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

method add_messages_async(异步)

异步向线程添加消息并为其编制索引。

在后台提取模式下,此方法在插入原始消息并在后台尝试到期后台提取后返回。

在任一模式下自动提取之前,都会存储原始消息。如果以后提取或派生内存存储失败,原始消息将保留,而派生内存或摘要更新可能丢失。

在 MemoryExtractionMode.BACKGROUND 中,原始消息在存储提取的内存之前会保留。如果后台提取没有排队,或者如果配置的队列容量等待达到其超时值,则插入的原始消息将保留存储,并且调用将继续而不提取内存,或者根据 background_extraction_queue_full_behavior 引发 TimeoutError。

method delete_image

删除此线程拥有的一个图像。

method delete_image_async(异步)

异步删除此线程拥有的一个映像。

method delete_memory

按标识符从该精确线程中删除类似内存的记录(例如,内存、事实、首选项或准则)。

注释

在删除记录之前,此方法将等待通过附加的代理内存组件接受此线程的早期后台提取。它不等待等待等待开始后接受的工作,也不等待其他组件或进程启动的工作。

示例

thread.delete_memory("456")
0

method delete_memory_async(异步)

以异步方式从该精确线程中删除类似内存的记录(例如,内存、事实、首选项或准则)。

注释

此方法遵循 delete_memory() 所记录的后台提取等待和并发行为。

示例

import asyncio
asyncio.run(thread.delete_memory_async("456"))
0

method delete_message

按标识符从此确切线程中删除一条消息记录。

注释

在删除消息之前,此方法将等待通过连接的代理内存组件接受此线程的早期后台提取。它不等待等待等待开始后接受的工作,也不等待其他组件或进程启动的工作。

删除消息只会删除原始消息记录。派生记忆不会被删除,因为我们尚未跟踪从哪个消息中提取的记忆,因此它们可能仍然是可搜索的,或者仍然影响上下文卡的输出。使用 OracleAgentMemory.delete_thread() 可删除线程及其关联的消息和记忆。

示例

thread.delete_message("123")
0

method delete_message_async(异步)

按标识符异步删除此确切线程的消息记录。

注释

此方法遵循 delete_message() 所记录的后台提取等待和并发行为。

删除消息只会删除原始消息记录。派生记忆不会被删除,因为我们尚未跟踪从哪个消息中提取的记忆,因此它们可能仍然是可搜索的,或者仍然影响上下文卡的输出。使用 OracleAgentMemory.delete_thread() 可删除线程及其关联的消息和记忆。

示例

import asyncio
asyncio.run(thread.delete_message_async("123"))
0

按 ID 删除线程拥有的关系或完整的端点元组。

端点元组选择器必须使用存储的源到目标方向。

示例

thread.delete_record_link(relation_id="relation-id")
1

异步删除此线程拥有的关系。

method get_context_card

返回线程的上下文卡对象。

当 LLM 支持的实现可以执行远程网络 I/O 时,首选 get_context_card_async。

注释

这会将线程的缺省搜索范围与 exact_thread_match=False 一起使用,因此可能会包含来自同一用户/代理的其他线程的相关内存。

示例

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(异步)

异步返回线程的上下文卡对象。

示例

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

method get_message

返回此主题一封邮件。

默认情况下,图像部分将返回其标识符和说明。传递 included_image_ids 以装入所选映像部分的字节数。将忽略不相关的标识符。

method get_message_async(异步)

异步返回一条线程拥有的消息。

included_image_ids(可选)选择应装入其字节的附加映像部分;省略或 None 仅返回映像元数据。

method get_messages

返回此主题已存储的消息。

示例

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(异步)

以异步方式从 add_messages 添加的线程获取未处理的消息。

示例

import asyncio
message_ids = asyncio.run(thread.add_messages_async(
    [{"role": "user", "content": "Stored message example"}]
))
len(message_ids)
1
messages = asyncio.run(thread.get_messages_async())
messages[-1].content
'Stored message example'

method get_summary

返回线程的摘要。

全线程请求可重用或刷新持久概要。带有 except_last 的请求在不更改持久的全线程摘要的情况下汇总该前缀。

当 LLM 支持的实现可以执行远程网络 I/O 时,首选 get_summary_async。

示例

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

method get_summary_async(异步)

异步返回线程的摘要。

全线程请求可重用或刷新持久概要。带有 except_last 的请求在不更改持久的全线程摘要的情况下汇总该前缀。

在此线程拥有的两个记录之间创建定向关系。

目前,两个端点必须是类似内存的记录:"memory"、"fact"、"guideline" 或 "preference"。内置关系类型为 "supersedes" ("is_superseded_by")、"contradicts"、"refines" ("is_refined_by")、"supports" ("is_supported_by") 和 "duplicates"。"contradicts" 和 "duplicates" 反向使用相同的标签。

这两个端点必须属于此确切线程。一个端点对只能存储一个方向。opposite_relation_type 在从目标遍历到源时命名关系;例如,new "supersedes" old 在该方向上变为 old "is_superseded_by" new。

示例

thread.link_records(
    "fact-1", "fact", "memory-1", "memory", "supports"
)
'relation-id'

异步创建此线程拥有的记录之间的关系。

目前,两个端点必须是类似内存的记录:"memory"、"fact"、"guideline" 或 "preference"。内置关系类型为 "supersedes" ("is_superseded_by")、"contradicts"、"refines" ("is_refined_by")、"supports" ("is_supported_by") 和 "duplicates"。"contradicts" 和 "duplicates" 反向使用相同的标签。

method list_images

列出此线程拥有的图像记录。

默认情况下,返回的记录包含图像元数据。仅当提供 include_bytes=True 和 image_id 时才装入原始字节。

method list_images_async(异步)

异步列出此线程拥有的映像记录。

默认情况下,返回的记录包含图像元数据。仅当提供 include_bytes=True 和 image_id 时才装入原始字节。此线程的作用域会自动应用。

同步搜索与查询相关的记录。

注释

省略的范围字段继承此线程的默认搜索范围:精确的用户和代理匹配加上此线程的当前 user_id、agent_id 和 thread_id。默认线程搜索有意离开 exact_thread_match=False,因此它可能会从同一用户/代理的其他线程返回相关记录。传递 exact_thread_match=True 以将结果限制为当前线程。显式 None 范围值仍遵循已解析的确切匹配规则:exact_*_match=False 保持该维不受约束,而 exact_*_match=True 仅匹配存储的 None 值。

显式 max_results 值必须至少为 1;省略该参数时使用默认值 10。这是上限:当筛选器限制性太强、存在较少的匹配记录或由于特定于实施的搜索行为时,调用返回的结果可能会少于 max_results。

method search_async(异步)

异步搜索与查询相关的记录。

注释

省略的范围字段继承此线程的默认搜索范围:精确的用户和代理匹配加上此线程的当前 user_id、agent_id 和 thread_id。默认线程搜索有意离开 exact_thread_match=False,因此它可能会从同一用户/代理的其他线程返回相关记录。传递 exact_thread_match=True 以将结果限制为当前线程。显式 None 范围值仍遵循已解析的确切匹配规则:exact_*_match=False 保持该维不受约束,而 exact_*_match=True 仅匹配存储的 None 值。

显式 max_results 值必须至少为 1;省略该参数时使用默认值 10。这是上限:当筛选器限制性太强、存在较少的匹配记录或由于特定于实施的搜索行为时,调用返回的结果可能会少于 max_results。

method update_image

更新此线程拥有的一个图像。

省略 image 以保留现有字节。如果提供了 image,则必须随其提供 mime_type。省略 description 以保留现有说明。传递 None 以使用配置的 LLM 生成新说明;非空说明会直接替换该说明。附加到消息的图像的到期必须通过 update_message() 进行更改。

method update_image_async(异步)

异步更新此线程拥有的一个映像。

省略 image 以保留现有字节。如果提供了 image,则必须随其提供 mime_type。省略 description 以保留现有说明。传递 None 以使用配置的 LLM 生成新说明;非空说明会直接替换该说明。元数据、时间戳和到期设置在提供时会更新。附加到消息的图像的到期必须通过 update_message_async() 进行更改。

method update_memory

更新此确切线程拥有的类似内存的记录。

method update_memory_async(异步)

异步更新此确切线程拥有的类似内存的记录。

示例

import asyncio
memory_id = asyncio.run(thread.add_memory_async("Original memory"))
(
    asyncio.run(thread.update_memory_async(
        memory_id, content="Updated memory"
    ))
    == memory_id
)
True

method update_message

更新此确切线程拥有的原始消息记录。

注释

省略的字段将从存储的记录中保留。存储的角色和时间戳保持不变。编辑内容将更新原始消息历史记录,并且启用自动提取时,可能会导致 SDK 从已编辑消息和早期历史记录中重新提取内存。在 INLINE 模式下,该提取将在此方法返回之前完成。在 BACKGROUND 模式下,此方法将在原始消息更新成功并尝试后台提取后返回。此后续工作不会影响后续 add_messages() 调用使用的正常提取频率。现有提取的记忆仍然存在,而从编辑的内容中新提取的记忆可以添加。由于原始消息更新和任何以后的提取内存写入不会以原子方式发生,因此如果后台工作不排队,如果配置的队列容量等待达到其超时,或者稍后提取工作失败,则提取的内存仍可以反映较早的消息内容。此外,请注意,当源消息的 TTL 更改时,现有提取的内存会保留其原始到期时间。

示例

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(异步)

异步更新此确切线程拥有的原始消息记录。

注释

省略的字段将从存储的记录中保留。存储的角色和时间戳保持不变。编辑内容将更新原始消息历史记录,并且启用自动提取时,可能会导致 SDK 从已编辑消息和早期历史记录中重新提取内存。在 INLINE 模式下,该提取将在此方法返回之前完成。在 BACKGROUND 模式下,此方法将在原始消息更新成功并尝试后台提取后返回。此后续工作不会影响后续 add_messages() 调用使用的正常提取频率。现有提取的记忆仍然存在,而从编辑的内容中新提取的记忆可以添加。由于原始消息更新和任何以后的提取内存写入不会以原子方式发生,因此如果后台工作不排队,如果配置的队列容量等待达到其超时,或者稍后提取工作失败,则提取的内存仍可以反映较早的消息内容。此外,请注意,当源消息的 TTL 更改时,现有提取的内存会保留其原始到期时间。

示例

import asyncio
message_ids = asyncio.run(thread.add_messages_async(
    [{"role": "user", "content": "Draft message"}]
))
(
    asyncio.run(thread.update_message_async(
        message_ids[0], content="Edited message"
    ))
    == message_ids[0]
)
True

更新其端点归此线程所有的关系。

省略的值会保留。当 relation_type 更改为内置内存关系类型时,其固定反向标签将替换 opposite_relation_type。

示例

thread.update_record_link("relation-id", relation_type="supports")
1

异步更新其端点属于此线程的关系。

method wait_for_memory_extraction

等待此线程的早期后台内存提取。

此方法等待由早期的 add_messages()、add_messages_async()、update_message() 或 update_message_async() 调用在此线程上通过同一代理内存组件启动的后台提取。如果其中一个调用已在完成,则此方法包括在等待之前启动的提取。

此等待开始后启动的提取、其他代理内存组件启动的提取,或者在另一个进程中运行的提取,方法不会等待提取。此等待的提取失败计数为已完成。

示例

thread.wait_for_memory_extraction(timeout=10)

method wait_for_memory_extraction_async(异步)

异步等待更早的后台内存提取。

此方法遵循与 wait_for_memory_extraction() 相同的行为。

示例

import asyncio
asyncio.run(thread.wait_for_memory_extraction_async(timeout=10))

注:delete_message() 仅删除原始消息行。派生的记忆可能仍然可以搜索或显示在上下文卡中。使用 OracleAgentMemory.delete_thread() 可删除线程及其关联的消息和记忆。通过线程句柄删除消息和内存将等待已由该线程的附加客户机接受的早期后台提取。对于等待开始后接受的其他客户端实例、进程或工作,这不是全局并发屏障。

消息和消息内容

class oracleagentmemory.apis.message.Message

基准:object

线程和 LLM 适配器共享的内存中消息。

class oracleagentmemory.apis.message.MessageContent

基础:ABC

结构化消息内容的基类。

class oracleagentmemory.apis.message.TextContent

基础:MessageContent

多模式消息中的文本部分。

class oracleagentmemory.apis.message.ImageContent

基础:MessageContent

多模式消息中的图像部分。

class oracleagentmemory.apis.message.ImageMimeType

基础:str、Enum

图像内容支持的 MIME 类型。

不支持动画 PNG 和 WebP。

JPEG = ‘ image/JPEG ’

PNG = ‘ image/PNG ’

WEBP = ‘ image/WEBP ’

上下文卡

class oracleagentmemory.apis.contextcard.ContextCard

基础:ABC

抽象线程 API 返回的上下文卡对象。

property content(抽象)

class oracleagentmemory.core.contextcard.OracleContextCard

基础:ContextCard

Oracle 线程返回的上下文卡。

property(属性)content

示例

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

property(属性)formatted_content

示例

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

概要

class oracleagentmemory.apis.summary.Summary

基础:ABC

抽象线程 API 返回的线程概要对象。

property content(抽象)

class oracleagentmemory.core.summary.OracleSummary

基础:Summary

Oracle 线程返回的概要。

示例

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

property(属性)content

示例

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

property(属性)formatted_content

示例

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