Lojas e Esquema

Esta página apresenta as abstrações do armazenamento principal e os controles de esquema usados pelo SDK de Memória do Oracle Agent.

API da loja

Semântica de Gravação da Loja

As gravações de armazenamento mantêm uma separação clara entre o texto que um aplicativo armazena e o payload que o armazenamento usa para recuperação. A maioria dos aplicativos pode usar as APIs no nível da memória e do thread e permitir que o armazenamento prepare as linhas de pesquisa necessárias para recuperação de vetores, palavras-chave ou híbrida. As APIs de armazenamento de nível inferior expõem index_texts, index_text, embeddings e embedding para integrações avançadas que já sabem qual texto ou vetores devem ser usados para recuperação.

Pense em cada escrita como duas partes relacionadas:

update() também aceita text como um parâmetro de compatibilidade obsoleto. Use content no novo código; o fornecimento de text emite um aviso de descontinuação.

Se nenhuma substituição de pesquisa ou incorporação explícita for fornecida, o armazenamento usará o texto armazenado resolvido como o texto de recuperação. O texto não vazio é dividido pela loja quando a divisão em blocos é configurada. O texto vazio armazena o texto do registro, mas não fornece texto de recuperação.

A tabela abaixo descreve como o texto de recuperação é escolhido antes que os payloads vetoriais explícitos sejam considerados.

Payloads de recuperação no nível da loja

Entrada add() update()
index_texts ou index_text omitido Cada registro usa seu valor contents resolvido para recuperação. Um valor content de substituição é usado para recuperação. Se content também for omitido, as atualizações somente incorporação reutilizarão as linhas de texto de recuperação existentes do registro.
String index_texts entrada ou string index_text A string substitui o texto de recuperação desse registro. O armazenamento pode separá-lo antes de gravar linhas de recuperação. A string substitui o texto de recuperação desse registro. O armazenamento pode separá-lo antes de gravar linhas de recuperação.
Entrada list[str] index_texts ou list[str] index_text A lista é tratada como chunks de propriedade do chamador. Cada string não vazia é gravada como uma linha de recuperação e o armazenamento não a divide novamente. A lista é tratada como chunks de propriedade do chamador. Cada string não vazia é gravada como uma linha de recuperação e o armazenamento não a divide novamente.
Entrada None index_texts ou index_text=None None na lista externa index_texts significa "usar o conteúdo armazenado para este registro". index_text=None limpa as linhas de recuperação ao deixar o conteúdo armazenado inalterado, a menos que content também seja fornecido.
String vazia ou lista de partes vazia Armazena o conteúdo do registro e não fornece texto de recuperação para esse registro. Atualiza o conteúdo do registro quando o content é fornecido e limpa o texto de recuperação desse registro.

As incorporações explícitas são opcionais. Quando eles são omitidos, o armazenamento deriva vetores locais do texto de recuperação quando o armazenamento vetorial local é configurado; os armazenamentos de palavras-chave ou híbridos também podem usar linhas de recuperação somente texto. Quando valores embeddings ou embedding explícitos são fornecidos, o armazenamento grava esses vetores diretamente e não chama seu incorporador para esses vetores.

No add(), embeddings=None se comporta como omitir embeddings. No update(), embedding=None é explícito: o armazenamento mantém ou reescreve o texto de recuperação de acordo com content e index_text, mas armazena essas linhas sem vetores locais. Se content e index_text forem omitidos, isso limpará os vetores das linhas de recuperação existentes.

A forma do vetor informa à loja a quantidade de propriedade de chunk que o chamador está tomando:

Algumas combinações são rejeitadas, portanto, o texto armazenado, o texto de recuperação e os vetores não se afastam. A transmissão de content=None limpa o conteúdo armazenado e as linhas de recuperação, de modo que não pode ser combinada com valores index_text ou embedding não nulos; os registros de perfil do ator não suportam content=None. O parâmetro text obsoleto tem o mesmo comportamento. Passar index_text=None em update() significa "limpar linhas de recuperação", portanto, incorporações explícitas não vazias não são permitidas na mesma chamada. Vários vetores explícitos exigem texto em bloco explícito, a menos que a atualização seja somente incorporação e as linhas de recuperação existentes já forneçam o texto em bloco.

classe oracleagentmemory.core.OracleMemoryStore

Bases: IMemoryStore

Interface de armazenamento comum usada pelo OracleAgentMemory.

Uma implementação de loja é responsável por persistir registros de texto e executar uma pesquisa de similaridade sobre eles. Os pontos de entrada síncronos e assíncronos são definidos para que as APIs de nível superior possam expor superfícies síncronas/assíncronas correspondentes sem duplicar a lógica específica da loja.

método add

Adicionar registros à loja.

Observações

Use add_batches() quando o chamador já tiver um ou mais objetos PendingRecordBatch.

method add_agent (abstract)

Adicionar um registro de perfil do agente.

método add_agent_async (assíncrono)

Adicionar de forma assíncrona um registro de perfil de agente.

método add_async (assíncrono)

Adicione registros orientados por linha de forma assíncrona à loja.

Aceita os mesmos argumentos e retorna os mesmos identificadores que add().

método add_batches

Adicione lotes lógicos preparados pelo chamador à loja.

Exemplos

store.add_batches(
    [
        PendingRecordBatch(
            contents=["pizza batch"],
            record_type="memory",
            record_ids="mem-batch-docs",
        )
    ]
)
['mem-batch-docs']

método add_batches_async (assíncrono)

Adicione lotes lógicos preparados pelo chamador de forma assíncrona ao armazenamento.

Aceita os mesmos argumentos e retorna os mesmos identificadores que add_batches().

method add_relations (abstract)

Armazene uma ou mais relações direcionadas.

Os valores escalares são transmitidos pelo lote de registro de origem. Os valores de lista devem ter o mesmo tamanho. Somente uma orientação pode ser armazenada para um par de pontos finais. Use opposite_relation_types para descrever a view reversa em vez de adicionar uma segunda relação reversa. As implementações podem restringir quais tipos de registro de ponto final e rótulos de relação eles persistem.

Exemplos

store.add_relations(
    "new", "memory", "old", "memory", "supersedes"
)
['relation-id']

método add_relations_async (assíncrono)

Armazenar assincronamente uma ou mais relações direcionadas.

Os valores escalares são transmitidos pelo lote de registro de origem. Os valores de lista devem ter o mesmo tamanho. Somente uma orientação pode ser armazenada para um par de pontos finais. Use opposite_relation_types para descrever a view reversa em vez de adicionar uma segunda relação reversa.

Exemplos

await store.add_relations_async(
    "new", "memory", "old", "memory", "supersedes"
)
['relation-id']

method add_user (abstract)

Adicionar um registro de perfil de usuário.

método add_user_async (assíncrono)

Adicionar de forma assíncrona um registro de perfil de usuário.

method delete (abstract)

Excluir um registro armazenado por identificador.

método delete_async (assíncrono)

Exclua de forma assíncrona um registro armazenado por identificador.

method delete_relations (abstract)

Exclua relações por identificador.

O estado do ciclo de vida é recalculado a partir das relações que permanecem.

Exemplos

store.delete_relations("relation-id")
1

método delete_relations_async (assíncrono)

Exclua relações de forma assíncrona por identificador.

O estado do ciclo de vida é recalculado a partir das relações que permanecem.

Exemplos

await store.delete_relations_async("relation-id")
1

method delete_thread (abstract)

Exclua um thread e seus dados armazenados associados.

Observações

Esta é a operação no nível do armazenamento para remover um thread e os registros no escopo do thread gerenciados pelo armazenamento. Prefira a exclusão de thread quando os requisitos de retenção exigirem a exclusão de mensagens de origem e de dados de memória com escopo de thread derivado, porque as exclusões no nível da mensagem não implicam que registros derivados persistidos separadamente sejam removidos.

método delete_thread_async (assíncrono)

Exclua de forma assíncrona um thread e seus dados armazenados associados.

Observações

Esta é a operação no nível do armazenamento para remover um thread e os registros no escopo do thread gerenciados pelo armazenamento. Prefira a exclusão de thread quando os requisitos de retenção exigirem a exclusão de mensagens de origem e de dados de memória com escopo de thread derivado, porque as exclusões no nível da mensagem não implicam que registros derivados persistidos separadamente sejam removidos.

method get (abstract)

Recuperar um registro armazenado por tipo e identificador.

método get_async (assíncrono)

Recuperar assincronicamente um registro armazenado por tipo e identificador.

method get_relation (abstract)

Retorna uma relação em sua orientação de origem a destino armazenada.

Forneça apenas relation_id ou uma tupla completa de ponto final de origem para destino.

Exemplos

store.get_relation(relation_id="relation-id")
RecordRelation(...)
store.get_relation(
    "source-id", "memory", "target-id", "fact", "supports"
)
RecordRelation(...)

método get_relation_async (assíncrono)

Recupera assincronicamente uma relação por tupla de ID ou ponto final.

Forneça apenas relation_id ou uma tupla completa de ponto final de origem para destino.

Exemplos

await store.get_relation_async(relation_id="relation-id")
RecordRelation(...)

method list (abstract)

Listar registros armazenados para um tipo de registro.

método list_async (assíncrono)

Listar registros armazenados de forma assíncrona para um tipo de registro.

method list_relations (abstract)

Liste as relações armazenadas em sua orientação de origem para destino.

Exemplos

store.list_relations(
    source_record_id="current-memory",
    relation_type="supports",
    metadata_filter={"source": "manual"},
)
[RecordRelation(...)]

método list_relations_async (assíncrono)

Liste relações de forma assíncrona na orientação de origem para destino.

Exemplos

await store.list_relations_async(
    source_record_id="current-memory", relation_type="supports"
)
[RecordRelation(...)]

method list_thread_messages (abstract)

Liste o histórico de mensagens armazenado para um tópico.

método list_thread_messages_async (assíncrono)

Liste de forma assíncrona o histórico de mensagens armazenado para um thread.

method search (abstract)

Pesquisar registros por similaridade.

Exemplos

store.add(
    ["Searchable abstract memory"],
    record_type="memory",
    record_ids="mem-search-abstract-docs",
)
['mem-search-abstract-docs']
store.search("Searchable", 1, record_types={"memory"})[0][0].id
'mem-search-abstract-docs'

Filtrar em um valor de metadados escalar:

store.add(
    ["pizza release"],
    record_type="memory",
    record_ids="mem-search-meta-source-docs2",
    metadata={"source": "slack"},
)
['mem-search-meta-source-docs2']
any(
    record.id == "mem-search-meta-source-docs2"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"source": "slack"},
    )
)
True

Filtrar em metadados aninhados:

store.add(
    ["pizza review"],
    record_type="memory",
    record_ids="mem-search-meta-review-docs2",
    metadata={"review": {"status": "open"}},
)
['mem-search-meta-review-docs2']
any(
    record.id == "mem-search-meta-review-docs2"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"review": {"status": "open"}},
    )
)
True

Corresponder exatamente um valor de lista, incluindo a ordem:

store.add(
    ["pizza tags"],
    record_type="memory",
    record_ids="mem-search-meta-tags-docs2",
    metadata={"tags": ["prod", "urgent"]},
)
['mem-search-meta-tags-docs2']
any(
    record.id == "mem-search-meta-tags-docs2"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={"tags": ["prod", "urgent"]},
    )
)
True

Filtre quando um array de metadados contiver um valor:

any(
    record.id == "mem-search-meta-tags-docs2"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={"tags": {"$array_contains": "prod"}},
    )
)
True

Combine várias condições de metadados. Um registro deve atender a todas as chaves:

store.add(
    ["pizza rollout"],
    record_type="memory",
    record_ids="mem-search-meta-combined-docs2",
    metadata={
        "source": "slack",
        "review": {"status": "open"},
        "tags": ["prod", "urgent"],
    },
)
['mem-search-meta-combined-docs2']
any(
    record.id == "mem-search-meta-combined-docs2"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={
            "source": "slack",
            "review": {"status": "open"},
            "tags": ["prod", "urgent"],
        },
    )
)
True

método search_async (assíncrono)

Pesquise registros de forma assíncrona por similaridade semântica.

method update (abstract)

Atualize o conteúdo do registro armazenado, incorporando dados, metadados, timestamp ou expiração.

método update_async (assíncrono)

Atualize de forma assíncrona o conteúdo do registro armazenado, incorporando dados, metadados, timestamp ou expiração.

method update_relations (abstract)

Atualizar valores mutáveis nas relações armazenadas.

Os campos omitidos permanecem inalterados, exceto que a alteração para um tipo de relação de memória incorporado substitui seu rótulo reverso pelo inverso fixo. Um armazenamento de memória suportado pelo BD também recalcula os estados do ciclo de vida do ponto final após uma alteração do tipo de relação.

Exemplos

store.update_relations(
    "relation-id", relation_types="supports"
)
['relation-id']

método update_relations_async (assíncrono)

Atualizar assincronamente valores mutáveis em relações armazenadas.

Os campos omitidos permanecem inalterados, exceto que a alteração para um tipo de relação de memória incorporado substitui seu rótulo reverso pelo inverso fixo. Um armazenamento de memória suportado pelo BD também recalcula os estados do ciclo de vida do ponto final após uma alteração do tipo de relação.

Exemplos

await store.update_relations_async(
    "relation-id", relation_types="supports"
)
['relation-id']

Armazenamento do Oracle DB

classe oracleagentmemory.core.OracleDBMemoryStore

Bases: OracleMemoryStore

Persistência baseada em banco de dados para mensagens, documentos, memórias e perfis de atores.

Crie um armazenamento do Oracle DB.

Aviso: SchemaPolicy.CREATE_IF_NECESSARY pode ser mais caro do que a inicialização normal do armazenamento porque pode reparar objetos de esquema gerenciados antes que a inicialização seja bem-sucedida. Planeje o trabalho de reparo como uma operação de manutenção quando um esquema pode conter muitas linhas. Um armazenamento em uma versão de esquema mais antiga requer um upgrade de esquema de pacote antes da inicialização.

Se a configuração do esquema precisar criar o job de expurgação de registro expirado gerenciado, mas o usuário do banco de dados não tiver o privilégio scheduler-job, a inicialização avisará e continuará. As mensagens e memórias expiradas permanecem ocultas de leituras e pesquisas, mas elas não são expurgadas fisicamente até que o job seja criado por um usuário com o privilégio CREATE JOB ou um scheduler equivalente.

Quando o SchemaPolicy.CREATE_IF_NECESSARY cria pela primeira vez um índice híbrido gerenciado em um esquema existente, o sistema Oracle verifica o texto de pesquisa armazenado e cria o estado de índice híbrido gerenciado com base no modelo configurado no banco de dados. Como a inicialização do armazenamento aguarda a conclusão desse DDL, planeje o primeiro upgrade híbrido como uma operação de migração ou manutenção para grandes esquemas. SearchIndexSyncMode controla a manutenção contínua após a existência do índice; ele não torna a primeira criação de índice assíncrona.

A criação desse índice híbrido gerenciado também cria uma preferência do vetorizador DBMS_VECTOR_CHAIN nomeada pelo esquema gerenciado. A preferência armazena metadados de configuração do vetorizador leves do modelo OracleDBEmbedder configurado. Ele pode ser inspecionado com as exibições de preferência do Oracle Text, como CTX_USER_PREFERENCES e CTX_USER_PREFERENCE_VALUES.

método add

Adicione registros ao armazenamento do Oracle DB.

Exemplos

store.add(
    ["Index this stored text"],
    record_type="memory",
    record_ids="mem-db-add-docs",
)
['mem-db-add-docs']
store.add(
    ["Stored text"],
    record_type="memory",
    index_texts=["Search this text"],
    record_ids="mem-db-index-text-docs",
)
['mem-db-index-text-docs']
store.add(
    ["Short-lived event"],
    record_type="memory",
    record_ids="mem-db-ttl-docs",
    timestamps="2026-01-01T12:00:00+00:00",
    ttl_days=7,
    ttl_anchor=TimeToLiveAnchor.TIMESTAMP,
)
['mem-db-ttl-docs']

método add_agent

Adicionar um registro de perfil do agente.

Observações

Os registros de perfil do agente não têm escopo. O identificador de registro público inserido é o mesmo valor informado como agent_id.

Exemplos

store.add_agent("a-docs-agent", "Support assistant")
'a-docs-agent'

método add_agent_async (assíncrono)

Adicionar de forma assíncrona um registro de perfil de agente.

método add_async (assíncrono)

Adicione registros orientados por linha de forma assíncrona à loja.

Aceita os mesmos argumentos e retorna os mesmos identificadores que add().

método add_batches

Adicione lotes lógicos preparados pelo chamador à loja.

Exemplos

store.add_batches(
    [
        PendingRecordBatch(
            contents=["pizza batch"],
            record_type="memory",
            record_ids="mem-batch-docs",
        )
    ]
)
['mem-batch-docs']

método add_batches_async (assíncrono)

Adicione lotes lógicos preparados pelo chamador de forma assíncrona ao armazenamento.

Aceita os mesmos argumentos e retorna os mesmos identificadores que add_batches().

método add_relations

Armazene uma ou mais relações memória-para-memória atomicamente.

Os valores escalares são transmitidos no batch de ID de origem; as listas devem ser alinhadas. Somente uma orientação de relação pode ser armazenada para um par de pontos finais. Os labels de link de memória incorporados recebem seu label reverso fixo, e os labels de ciclo de vida atualizam o estado do ponto final na mesma transação.

Exemplos

store.add_relations(
    "new-memory", "memory", "old-memory", "memory", "supersedes"
)
['relation-id']

método add_relations_async (assíncrono)

Armazenar assincronamente uma ou mais relações direcionadas.

Os valores escalares são transmitidos pelo lote de registro de origem. Os valores de lista devem ter o mesmo tamanho. Somente uma orientação pode ser armazenada para um par de pontos finais. Use opposite_relation_types para descrever a view reversa em vez de adicionar uma segunda relação reversa.

Exemplos

await store.add_relations_async(
    "new", "memory", "old", "memory", "supersedes"
)
['relation-id']

método add_user

Adicionar um registro de perfil de usuário.

Observações

Os registros de perfil do usuário não têm escopo. O identificador de registro público inserido é o user_id explícito ou inferido.

Exemplos

store.add_user("u-docs-profile", "Prefers concise answers.")
'u-docs-profile'

método add_user_async (assíncrono)

Adicionar de forma assíncrona um registro de perfil de usuário.

método delete

Excluir uma linha gerenciada e suas linhas de bloco por identificador.

Observações

A operação é executada dentro de uma transação. Quando cascade está ativado para um destino de nível superior suportado, a exclusão do perfil e todas as exclusões filho com escopo são submetidas a commit ou submetidas a rollback juntas.

Exemplos

store.add(["Delete me"], record_type="memory", record_ids="mem-delete-docs")
['mem-delete-docs']
store.delete("memory", "mem-delete-docs")
1

método delete_async (assíncrono)

Exclua de forma assíncrona um registro armazenado por identificador.

método delete_relations

Exclua relações por identificador e recalcule o estado do ciclo de vida.

Exemplos

store.delete_relations("relation-id")
1

método delete_relations_async (assíncrono)

Exclua relações de forma assíncrona por identificador.

O estado do ciclo de vida é recalculado a partir das relações que permanecem.

Exemplos

await store.delete_relations_async("relation-id")
1

método delete_thread

Excluir um thread e suas linhas armazenadas associadas.

Observações

Use esta operação quando precisar de limpeza em cascata com escopo de thread. No armazenamento suportado pelo BD, a exclusão do thread remove a linha do thread gerenciado juntamente com as linhas de mensagem e memória associadas, além dos dados de pesquisa mantidos para recuperação. Isso é mais amplo do que uma exclusão no nível da mensagem, o que remove apenas a linha da mensagem bruta. A exclusão do thread remove as linhas dependentes de mensagem e memória junto com seus dados de recuperação associados na mesma transação.

Exemplos

store.delete_thread("c1")
0

método delete_thread_async (assíncrono)

Exclua de forma assíncrona um thread e seus dados armazenados associados.

Observações

Esta é a operação no nível do armazenamento para remover um thread e os registros no escopo do thread gerenciados pelo armazenamento. Prefira a exclusão de thread quando os requisitos de retenção exigirem a exclusão de mensagens de origem e de dados de memória com escopo de thread derivado, porque as exclusões no nível da mensagem não implicam que registros derivados persistidos separadamente sejam removidos.

método get

Recuperar um registro armazenado por identificador.

Exemplos

store.add(["Remember this"], record_type="memory", record_ids="mem-get-docs")
['mem-get-docs']
store.get("memory", "mem-get-docs").id
'mem-get-docs'

método get_async (assíncrono)

Recuperar assincronicamente um registro armazenado por tipo e identificador.

método get_relation

Retorna uma relação identificada por ID ou tupla de ponto final completa.

Forneça apenas relation_id ou uma tupla completa de ponto final de origem para destino.

Exemplos

store.get_relation(relation_id="relation-id")
RecordRelation(...)
store.get_relation(
    "source-id", "memory", "target-id", "fact", "supports"
)
RecordRelation(...)

método get_relation_async (assíncrono)

Recupera assincronicamente uma relação por tupla de ID ou ponto final.

Forneça apenas relation_id ou uma tupla completa de ponto final de origem para destino.

Exemplos

await store.get_relation_async(relation_id="relation-id")
RecordRelation(...)

método list

Enumerar registros persistidos para um tipo de registro.

Observações

"user_profile" e "agent_profile" são tipos de registro sem escopo. Para esses tipos de registro, thread_id, user_id e agent_id são ignorados e a identidade do ator permanece em record.id. Os registros "thread" expõem o identificador de thread como record.id e record.thread_id.

Exemplos

store.add(
    ["First listed", "Second listed"],
    record_type="memory",
    record_ids=["mem-list-docs-1", "mem-list-docs-2"],
)
['mem-list-docs-1', 'mem-list-docs-2']
[record.id for record in store.list("memory", limit=2)]
['mem-list-docs-1', 'mem-list-docs-2']
store.add_user("u-list-docs", "Prefers concise answers.")
'u-list-docs'
any(
    record.id == "u-list-docs"
    for record in store.list("user_profile", user_id=None, limit=10)
)
True

método list_async (assíncrono)

Listar registros armazenados de forma assíncrona para um tipo de registro.

método list_relations

Liste as relações em sua orientação de origem para destino.

Exemplos

store.list_relations(
    source_record_id="current-memory",
    relation_type="supports",
    metadata_filter={"source": "manual"},
)
[RecordRelation(...)]

método list_relations_async (assíncrono)

Liste relações de forma assíncrona na orientação de origem para destino.

Exemplos

await store.list_relations_async(
    source_record_id="current-memory", relation_type="supports"
)
[RecordRelation(...)]

método list_thread_messages

Retornar mensagens persistidas para um tópico.

Exemplos

store.list_thread_messages("c1")
[]

método list_thread_messages_async (assíncrono)

Liste de forma assíncrona o histórico de mensagens armazenado para um thread.

Pesquisar registros por similaridade.

O backend de pesquisa ativo depende do SearchStrategy configurado do armazenamento. SearchStrategy.VECTOR classifica o vetor de consulta em relação aos vetores de registro armazenados. SearchStrategy.HYBRID consulta o índice híbrido gerenciado da Oracle pelo texto de pesquisa armazenado e seu estado de índice gerenciado. SearchStrategy.KEYWORD classifica apenas por texto correspondente ao texto de pesquisa armazenado.

Exemplos

store.add(
    ["pizza preference"],
    record_type="memory",
    record_ids="mem-search-docs",
    thread_ids="c-search-docs",
)
['mem-search-docs']
results = store.search(
    "pizza",
    1,
    thread_id="c-search-docs",
    exact_thread_match=True,
    record_types={"memory"},
)
results[0][0].id
'mem-search-docs'

Filtrar em um valor de metadados escalar:

store.add(
    ["pizza release"],
    record_type="memory",
    record_ids="mem-search-meta-source-docs",
    metadata={"source": "slack"},
)
['mem-search-meta-source-docs']
any(
    record.id == "mem-search-meta-source-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"source": "slack"},
    )
)
True

Filtrar em metadados aninhados:

store.add(
    ["pizza review"],
    record_type="memory",
    record_ids="mem-search-meta-review-docs",
    metadata={"review": {"status": "open"}},
)
['mem-search-meta-review-docs']
any(
    record.id == "mem-search-meta-review-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"review": {"status": "open"}},
    )
)
True

Corresponder exatamente um valor de lista, incluindo a ordem:

store.add(
    ["pizza tags"],
    record_type="memory",
    record_ids="mem-search-meta-tags-docs",
    metadata={"tags": ["prod", "urgent"]},
)
['mem-search-meta-tags-docs']
any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": ["prod", "urgent"]},
    )
)
True

Filtre quando um array de metadados contiver um valor:

any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": {"$array_contains": "prod"}},
    )
)
True

Combine várias condições de metadados. Um registro deve atender a todas as chaves:

store.add(
    ["pizza rollout"],
    record_type="memory",
    record_ids="mem-search-meta-combined-docs",
    metadata={
        "source": "slack",
        "review": {"status": "open"},
        "tags": ["prod", "urgent"],
    },
)
['mem-search-meta-combined-docs']
any(
    record.id == "mem-search-meta-combined-docs"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={
            "source": "slack",
            "review": {"status": "open"},
            "tags": ["prod", "urgent"],
        },
    )
)
True

método search_async (assíncrono)

Pesquise registros de forma assíncrona por similaridade semântica.

método update

Atualize o conteúdo do registro armazenado, o estado da pesquisa, os metadados e os valores de timestamp.

Exemplos

store.add(["Original note"], record_type="memory", record_ids="mem-update-docs")
['mem-update-docs']
store.update("memory", "mem-update-docs", content="Updated note")
1
store.get("memory", "mem-update-docs").content
'Updated note'

método update_async (assíncrono)

Atualize de forma assíncrona o conteúdo do registro armazenado, incorporando dados, metadados, timestamp ou expiração.

método update_relations

Atualize os campos de relação mutável e recalcule o estado do ciclo de vida do ponto final.

Os campos omitidos permanecem inalterados. Os rótulos de link de memória incorporados sempre mantêm seu rótulo reverso derivado.

Exemplos

store.update_relations("relation-id", relation_types="supports")
['relation-id']

método update_relations_async (assíncrono)

Atualizar assincronamente valores mutáveis em relações armazenadas.

Os campos omitidos permanecem inalterados, exceto que a alteração para um tipo de relação de memória incorporado substitui seu rótulo reverso pelo inverso fixo. Um armazenamento de memória suportado pelo BD também recalcula os estados do ciclo de vida do ponto final após uma alteração do tipo de relação.

Exemplos

await store.update_relations_async(
    "relation-id", relation_types="supports"
)
['relation-id']

Relacionamentos

O OracleDBMemoryStore pode armazenar relações direcionadas entre registros semelhantes à memória (memory, fact, guideline e preference). Use add_relations(), get_relation(), list_relations(), update_relations() e delete_relations() quando uma integração precisar da API de relação de nível inferior. As APIs de cliente e thread fornecem link_records(), update_record_link() e delete_record_link() para tipos de relação de memória suportados.

Para recuperar uma relação, forneça relation_id sozinha ou a tupla completa do ponto final armazenado: tipo e ID do registro de origem, tipo e ID do registro de destino e tipo de relação. Uma tupla parcial e um ID de relação combinados com qualquer campo de tupla são inválidos porque nenhum identifica a relação solicitada sem ambiguidade.

Use list_relations() para enumerar relações na ordem de criação. Filtre por ID e tipo de registro de origem ou de destino ou por rótulo de relação direcionada. Ele usa o limite de lista de segurança normal da loja, a menos que você passe limit=None. Seu metadata_filter usa a mesma semântica de correspondência exata, objeto aninhado, associação de array e negação que list(); passe metadata_filter=None para retornar somente relações sem metadados.

Os tipos de relação do ciclo de vida — supersedes, refines e duplicates — marcam a memória de destino inválida enquanto o link existe. A remoção ou alteração do último link desse tipo restaura o destino para um status válido. As APIs de pesquisa podem excluir registros inválidos com include_invalid_results=False.

classe oracleagentmemory.apis.relations.RecordRelation

Bases: object

Descrever uma relação armazenada e direcionada entre dois registros.

Estratégia de Pesquisa

classe oracleagentmemory.core.dbsearch.SearchStrategy

Bases: Enum

Comportamento de pesquisa para armazenamentos do Oracle DB.

A inicialização do armazenamento do BD usa a estratégia selecionada para escolher o recurso de pesquisa de esquema gerenciado. A pesquisa VECTOR armazena incorporações locais. A pesquisa KEYWORD armazena texto pesquisável e um índice de texto. A pesquisa HYBRID armazena texto pesquisável mais o estado de índice vetorial híbrido gerenciado pela Oracle. O armazenamento do BD valida esse recurso de esquema na inicialização para que uma estratégia incompatível não retorne resultados incompletos silenciosamente.

VECTOR
Pesquisar apenas por similaridade vetorial. O armazenamento incorpora a consulta ao incorporador configurado ou usa um query_vector fornecido pelo chamador e classifica os registros pela distância dos vetores armazenados. Use isso com um esquema de banco de dados configurado para pesquisa de vetor.
HYBRID
Pesquise com o índice híbrido gerenciado da Oracle. A Oracle combina correspondência de texto em relação ao texto de pesquisa armazenado com classificação vetorial do índice híbrido no banco de dados. Use-o quando os usuários puderem pesquisar por linguagem natural, bem como identificadores exatos, aliases ou nomes de produtos. Essa estratégia requer que o principal incorporador da loja seja um OracleDBEmbedder para que o índice gerenciado e o armazenamento compartilhem um modelo no banco de dados.
KEYWORD
Pesquise somente por palavra-chave/texto correspondente ao texto de pesquisa armazenado. Esse modo não cria incorporações de consulta local e não precisa de um incorporador do Oracle DB. Quando aberto em um esquema híbrido existente, ele pode usar a ramificação de texto desse índice híbrido sem criar um novo índice híbrido. Use isso quando identificadores exatos, aliases, nomes de produtos ou frases curtas devem gerar recuperação sem fusão vetorial.

HÍBRIDO = 'híbrido'

KEYWORD = 'palavra-chave'

VECTOR = 'vetor'

Modo de sincronização de índice de pesquisa

classe oracleagentmemory.core.dbsearch.SearchIndexSyncMode

Bases: Enum

Comportamento de atualização para índices de pesquisa do BD gerenciado.

Essa definição controla quando o sistema Oracle torna o texto de pesquisa novo ou alterado visível para pesquisa com reconhecimento de texto suportada pelo BD. O SearchStrategy.HYBRID usa o índice vetorial híbrido gerenciado da Oracle. SearchStrategy.KEYWORD usa um índice do Oracle Text. SearchStrategy.VECTOR não usa essa definição.

ON_COMMIT
Atualize o índice quando a transação de gravação for confirmada. Esta é a opção padrão e mais simples para a maioria dos aplicativos porque os registros são pesquisáveis imediatamente após uma gravação bem-sucedida. Ele pode adicionar trabalho para gravar transações porque o índice é mantido atualizado imediatamente.
MANUAL
Não atualize o índice automaticamente. Registros novos ou atualizados podem não aparecer na pesquisa por palavra-chave ou híbrida até que você mesmo execute a operação de sincronização de índice do banco de dados. Isso é útil para cargas em massa ou janelas de manutenção nas quais você deseja controlar ao atualizar execuções de trabalho.
AUTO
Permitir que a Oracle atualize o índice híbrido gerenciado de forma assíncrona. As gravações podem evitar o custo de atualização imediato, mas os resultados da pesquisa podem ficar atrás das gravações recentes até que a Oracle conclua a atualização em segundo plano. Este modo é suportado somente com SearchStrategy.HYBRID.

Aviso: Esta configuração controla a manutenção contínua após a existência do índice de pesquisa gerenciado. Ele não torna a primeira compilação de índice assíncrona. A criação de um índice híbrido gerenciado sobre o texto de pesquisa armazenado existente pode ser de longa execução porque a Oracle cria o estado de índice híbrido gerenciado com base nesse texto.

AUTO = 'AUTO'

MANUAL = 'MANUAL'

ON_COMMIT = 'ON_COMMIT'

Tempo de Vida Útil

classe oracleagentmemory.core.retention.MemoryRetentionConfig

Bases: object

Definições de retenção no nível do esquema para registros com suporte do Oracle DB.

classe oracleagentmemory.apis.ttl.TimeToLiveAnchor

Bases: Enum

Âncora usada para calcular um timestamp de expiração de uma duração de tempo de vida.

CREATED_AT
Expiração de computação do timestamp de criação do banco de dados do registro. Este é o padrão quando os chamadores omitem ttl_anchor.
TIMESTAMP
Calcular expiração do timestamp de evento armazenado do registro. Use esta opção quando uma mensagem ou memória representar um evento mais antigo e deve expirar em relação a esse horário de evento em vez de inserir o tempo.

CREATED_AT = 'criated_at'

TIMESTAMP = 'TIMESTAMP'

Política de Esquema

classe oracleagentmemory.core.SchemaPolicy

Bases: str, Enum

Política de criação de esquema para armazenamentos do Oracle DB.

REQUER_EXISTENTE

Valide se o esquema gerenciado completo já existe e está atualizado. Não crie ou modifique objetos do BD.

CRIAR_SE_VAZIO

Se não houver objetos gerenciados, o esquema de bootstrap. Se já existirem objetos, exija um esquema gerenciado completo e atualizado.

CRIAR_IF_NECESSÁRIO

Crie objetos gerenciados ausentes e aplique upgrades de esquema gerenciado suportados.

RECRIAR

Elimine e recrie todos os objetos de esquema gerenciados. Isso é destrutivo.

SEM_VERIFICAÇÃO

Ignore a validação e a criação do esquema gerenciado. Use esta política para um armazenamento protegido do Deep Data Security existente enquanto um contexto de segurança do usuário final estiver ativo. Um armazenamento aberto em um contexto de usuário final requer um contexto ativo para cada operação subsequente do banco de dados. Outras políticas de esquema rejeitam contextos de usuário final porque o trabalho do ciclo de vida do esquema deve ser executado por meio de uma identidade de banco de dados administrativo.