使用 SearchMemories 接口根据查询文本检索结构化记忆和服务生成的记忆文件。
前提条件
已创建 AgentStorage 实例且状态为
normal,并获取实例访问地址(endpoint)和实例名。已创建 API Key。
Scope 规则:
appId必填且不能为*;其他字段省略时补__default__,只有显式传入*才通配。包含file输出的记忆库暂不支持通配 Scope 搜索,请使用精确 Scope,必要时搭配filter进一步确认范围。
请求参数
字段 | 类型 | 必填 | 说明 |
| string | 是 | 目标记忆库名称。 |
| string | 是 | 查询文本,默认最多 8192 个 Unicode 字符。 |
| object | 是 | 基础查询范围。 |
| object | 否 | Scope Filter,与 |
| object | 否 | 当前会话的完整精确 Scope,用作软排序信号;必须同时位于 |
| int | 否 | 每类结果最多返回数量,默认 10,上限 50。 |
| boolean | 否 | 是否对结构化记忆启用 Rerank,默认 |
| boolean | 否 | 是否附带结构化记忆对应的短期消息证据,默认 |
| float | 否 | 兼容字段,范围 |
| object | 否 | 显式结果门槛。内部两个门槛同时设置时采用 AND。 |
| float | 否 | 范围 |
| float | 否 | 范围 |
| object | 否 | 结构化记忆的 Metadata 完整精确匹配条件。最多 16 个键,键最长 64 个 Unicode 字符,值最长 1024 个 Unicode 字符;键和值均为字符串,多个键值对按 AND 组合。 |
scope 和 filter 解析出的范围最多包含 1000 个唯一 conversation Scope,超过时返回 400 INVALID_PARAMETER。Scope 查询能力暂时不可用时返回 503 SERVICE_UNAVAILABLE。包含 file 输出的记忆库暂不支持通配 Scope 搜索;请使用精确 Scope,必要时搭配 filter 进一步确认范围。
metadata 对完整字符串执行精确匹配,*、?、逗号和等号等字符按普通字符处理,适合检索 UUID、追踪 ID 等长值。超过键数量或键值长度限制时返回 400 INVALID_PARAMETER。通用定义见Metadata。
topK 分别作用于 results 和 fileResults。相关性过滤、去重或可见数据不足时,实际结果数可能少于 topK;应用不应依赖固定数量的返回项。
请求示例
使用 API Key 认证时,通过 x-ots-instancename 和 x-ots-apikey 请求头传入实例名和 API Key。
curl -X POST https://<endpoint>/SearchMemories \
-H "x-ots-instancename: <instance-name>" \
-H "x-ots-apikey: <your-api-key>" \
-H "Content-Type: application/json" \
-d '{
"memoryStoreName": "agent_memory",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "*",
"runId": "*"
},
"filter": {"op": "eq", "field": "text", "value": "*sess*"},
"contextScope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001"
},
"query": "用户喜欢什么饮品",
"topK": 5,
"enableRerank": true,
"includeEvidence": true,
"thresholds": {
"minSimilarity": 0.3,
"minScore": 0.2
},
"metadata": {
"source": "chat"
}
}'响应
字段 | 说明 |
| 结构化记忆结果列表;没有 |
| 长期记忆单元,字段定义见下表。 |
| 规范相关性分数( |
| 查询与记忆的归一化余弦相似度( |
| 使用 |
| 与 |
| 命中来源,例如 |
| 记忆文件结果列表;没有 |
|
|
| 查询使用的 Scope。 |
| 记忆库名称。 |
results 和 fileResults 在所有记忆库中都会返回,因此客户端可以使用同一种响应结构。双输出记忆库最多分别返回 topK 条结构化结果和 topK 条文件结果。
fileResults 的元素字段如下。
字段 | 说明 |
| 固定为 |
| 记忆文件 ID。 |
| 记忆文件路径。 |
| 文件摘要,也是参与检索的文本。 |
| 命中文件版本的 ID。 |
| 命中文件版本的序号。 |
| 规范相关性分数( |
| 文件摘要与查询的归一化余弦相似度( |
双输出记忆库的响应示例:
默认情况下,results 按 score 从高到低排序。仅当响应中包含 rankingScore 时,结果改按 rankingScore 从高到低排序;session 软排序不会改写 score。
results[].unit 内部字段如下。ListMemories、GetMemory 返回的记忆单元字段与此一致。embedding 向量不会在响应中返回。
字段 | 说明 |
| 长期记忆单元 ID。 |
| 关联的会话键。 |
| 记忆所属 Scope,对象包含 |
| 记忆片段 ID。 |
| 记忆单元类型,例如 |
| 记忆名称,最多 64 个字符;旧数据或字段为空时客户端可回退展示 |
| 记忆文本。 |
| 用于检索的文本。 |
| 关键词列表,最多 8 个,每个最多 32 个字符。 |
| 来源消息 ID 列表。 |
| 类型标签。 |
| 日期分桶。 |
| 元数据对象(写入时提供的键值对)。 |
| 元数据,JSON 字符串。 |
| 元数据扁平化字符串,用于过滤。 |
| 是否已删除。 |
| 创建时间。 |
| 事实、事件或计划所描述的生效时间;可能早于或晚于记忆写入时间。 |
| 记忆单元最近一次服务端更新的时间。 |
| 时间来源,例如 |
|
|
| 显著性分数。 |
| 版本号。 |
| 记忆涉及的说话人(字段非空时返回)。 |
| 主题标签(字段非空时返回)。 |
| 相关实体列表(字段非空时返回)。 |
| 时间锚点信息(字段非空时返回)。 |
| 来源消息引用列表,元素含 |
| 记忆被合并/更新时的替代链信息(字段非空时返回)。 |
| 由记忆整理(Dream)产生或改写的记忆携带的溯源字段(字段非空时返回)。 |
提供 contextScope 时,服务可以在语义相关性接近的候选中优先当前会话的记忆。该字段只影响排序,不扩大 scope 和 filter 指定的数据范围,也不能绕过 thresholds 或兼容阈值。
{
"memoryStoreName": "agent_memory",
"results": [
{
"unit": {
"id": "1b88d0d65a5b6c0d9142e9b7c7347048",
"conversation_key": "app-001/user-001/assistant/session-001",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001"
},
"memcell_id": "87e8805d6df9866dce823d135cfd6dff",
"unit_type": "entity_fact",
"text": "[2026-08-25T05:52:19Z] 我写脚本只用 Python。",
"search_text": "用户编程语言偏好\n我写脚本只用 Python。\nkeywords: Python, 脚本, 编程语言, 偏好\nPython 脚本语言 技术偏好\nuser\n记住:我的内部工号是 FALCON-9931,常驻杭州,写脚本只用 Python。\ntime: 2026-08-25T05:52:19Z",
"keywords": [
"Python",
"脚本",
"编程语言",
"偏好"
],
"source_turn_ids": [
"aa5f2e1d34b8ced5b044239f0fc75bee"
],
"source_turn_refs": [
{
"messageId": "aa5f2e1d34b8ced5b044239f0fc75bee",
"timestampMs": 1787637139185
}
],
"type_label": "profile_fact",
"date_bucket": "2026-08",
"metadata": {
"content_hash": "4ec0592b5550159a3f77b9dc62bca64e",
"session_date": "5:52 AM on 25 August, 2026",
"source_quote": "写脚本只用 Python"
},
"metadata_json": "{\"content_hash\":\"4ec0592b5550159a3f77b9dc62bca64e\",\"session_date\":\"5:52 AM on 25 August, 2026\",\"source_quote\":\"写脚本只用 Python\"}",
"metadata_flat": "content_hash=4ec0592b5550159a3f77b9dc62bca64e,session_date=5:52 AM on 25 August, 2026,source_quote=写脚本只用 Python",
"deleted": false,
"created_at": "2026-08-25T05:52:19.185Z",
"salience": 0.8,
"version": 1,
"title": "用户编程语言偏好",
"effective_at": "2026-08-25T05:52:19Z",
"updated_at": "2026-08-25T05:52:30.509Z",
"time_source": "source_message",
"time_precision": "second"
},
"score": 0.3358759430317645,
"similarity": 0.2652787210590392,
"source": "vector"
},
{
"unit": {
"id": "546b00a31ddd5e76e309e2da5cb0030e",
"conversation_key": "app-001/user-001/assistant/session-001",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001"
},
"memcell_id": "87e8805d6df9866dce823d135cfd6dff",
"unit_type": "entity_fact",
"text": "[2026-08-25T05:52:19Z] 我常驻杭州。",
"search_text": "用户常驻地\n我常驻杭州。\nkeywords: 杭州, 常驻, 地理位置\n杭州 常驻地 地理位置\nuser\n记住:我的内部工号是 FALCON-9931,常驻杭州,写脚本只用 Python。\ntime: 2026-08-25T05:52:19Z",
"keywords": [
"杭州",
"常驻",
"地理位置"
],
"source_turn_ids": [
"aa5f2e1d34b8ced5b044239f0fc75bee"
],
"source_turn_refs": [
{
"messageId": "aa5f2e1d34b8ced5b044239f0fc75bee",
"timestampMs": 1787637139185
}
],
"type_label": "profile_fact",
"date_bucket": "2026-08",
"metadata": {
"content_hash": "9f9821b441975f392313a2d7aec6ed6e",
"session_date": "5:52 AM on 25 August, 2026",
"source_quote": "常驻杭州"
},
"metadata_json": "{\"content_hash\":\"9f9821b441975f392313a2d7aec6ed6e\",\"session_date\":\"5:52 AM on 25 August, 2026\",\"source_quote\":\"常驻杭州\"}",
"metadata_flat": "content_hash=9f9821b441975f392313a2d7aec6ed6e,session_date=5:52 AM on 25 August, 2026,source_quote=常驻杭州",
"deleted": false,
"created_at": "2026-08-25T05:52:19.185Z",
"salience": 0.8,
"version": 1,
"title": "用户常驻地",
"effective_at": "2026-08-25T05:52:19Z",
"updated_at": "2026-08-25T05:52:30.509Z",
"time_source": "source_message",
"time_precision": "second"
},
"score": 0.32277120656532554,
"similarity": 0.25208147048454044,
"source": "vector"
},
{
"unit": {
"id": "4f6ddad33fad6f52d475c69708b44dd1",
"conversation_key": "app-001/user-001/assistant/session-001",
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "assistant",
"runId": "session-001"
},
"memcell_id": "87e8805d6df9866dce823d135cfd6dff",
"unit_type": "entity_fact",
"text": "[2026-08-25T05:52:19Z] 我的内部工号是 FALCON-9931。",
"search_text": "用户内部工号\n我的内部工号是 FALCON-9931。\nkeywords: 工号, FALCON-9931, 内部标识\nFALCON-9931 工号 身份标识\nuser\n记住:我的内部工号是 FALCON-9931,常驻杭州,写脚本只用 Python。\ntime: 2026-08-25T05:52:19Z",
"keywords": [
"工号",
"FALCON-9931",
"内部标识"
],
"source_turn_ids": [
"aa5f2e1d34b8ced5b044239f0fc75bee"
],
"source_turn_refs": [
{
"messageId": "aa5f2e1d34b8ced5b044239f0fc75bee",
"timestampMs": 1787637139185
}
],
"type_label": "profile_fact",
"date_bucket": "2026-08",
"metadata": {
"content_hash": "d0b62aedd9294009f14ed6ab951ebfed",
"session_date": "5:52 AM on 25 August, 2026",
"source_quote": "我的内部工号是 FALCON-9931"
},
"metadata_json": "{\"content_hash\":\"d0b62aedd9294009f14ed6ab951ebfed\",\"session_date\":\"5:52 AM on 25 August, 2026\",\"source_quote\":\"我的内部工号是 FALCON-9931\"}",
"metadata_flat": "content_hash=d0b62aedd9294009f14ed6ab951ebfed,session_date=5:52 AM on 25 August, 2026,source_quote=我的内部工号是 FALCON-9931",
"deleted": false,
"created_at": "2026-08-25T05:52:19.185Z",
"salience": 0.8,
"version": 1,
"title": "用户内部工号",
"effective_at": "2026-08-25T05:52:19Z",
"updated_at": "2026-08-25T05:52:30.509Z",
"time_source": "source_message",
"time_precision": "second"
},
"score": 0.2805238412257555,
"similarity": 0.23675615504707195,
"source": "vector"
}
],
"scope": {
"appId": "app-001",
"tenantId": "user-001",
"agentId": "*",
"runId": "*"
}
}