From 688b3f839b63664bd77772391e860e9ec0f2fb69 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 24 Apr 2026 11:28:22 -0400 Subject: [PATCH 01/16] Starting structure for Redis Cloud operator --- content/operate/rc/accounts/_index.md | 2 +- content/operate/rc/agent-memory/_index.md | 15 +++++++++++++++ content/operate/rc/agent-memory/create-service.md | 12 ++++++++++++ .../operate/rc/agent-memory/use-agent-memory.md | 12 ++++++++++++ content/operate/rc/agent-memory/view-service.md | 12 ++++++++++++ content/operate/rc/billing-and-payments/_index.md | 2 +- content/operate/rc/cloud-integrations/_index.md | 2 +- content/operate/rc/logs-reports/_index.md | 2 +- 8 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 content/operate/rc/agent-memory/_index.md create mode 100644 content/operate/rc/agent-memory/create-service.md create mode 100644 content/operate/rc/agent-memory/use-agent-memory.md create mode 100644 content/operate/rc/agent-memory/view-service.md diff --git a/content/operate/rc/accounts/_index.md b/content/operate/rc/accounts/_index.md index 647df8e8cc..26949ad9b4 100644 --- a/content/operate/rc/accounts/_index.md +++ b/content/operate/rc/accounts/_index.md @@ -8,7 +8,7 @@ categories: description: Describes how to work with Redis Cloud accounts and manage their settings. hideListLinks: true linkTitle: Accounts & settings -weight: 39 +weight: 44 --- Here, you learn how to manage Redis Cloud accounts and their settings: diff --git a/content/operate/rc/agent-memory/_index.md b/content/operate/rc/agent-memory/_index.md new file mode 100644 index 0000000000..1f651a9a0d --- /dev/null +++ b/content/operate/rc/agent-memory/_index.md @@ -0,0 +1,15 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Store agent memory for AI applications in Redis Cloud. +hideListLinks: true +linktitle: Agent Memory +title: Agent Memory on Redis Cloud +weight: 36 +bannerText: Agent Memory on Redis Cloud is currently available as a public preview. Features and behavior are subject to change. +bannerChildren: true +--- + diff --git a/content/operate/rc/agent-memory/create-service.md b/content/operate/rc/agent-memory/create-service.md new file mode 100644 index 0000000000..6e2a358c28 --- /dev/null +++ b/content/operate/rc/agent-memory/create-service.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Create an Agent Memory service in Redis Cloud to store working and long-term memory for AI agents. +hideListLinks: true +linktitle: Create service +title: Create an Agent Memory service +weight: 5 +--- diff --git a/content/operate/rc/agent-memory/use-agent-memory.md b/content/operate/rc/agent-memory/use-agent-memory.md new file mode 100644 index 0000000000..f236e9b0ee --- /dev/null +++ b/content/operate/rc/agent-memory/use-agent-memory.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Use the Agent Memory API to store and retrieve working and long-term memory for AI agents. +hideListLinks: true +linktitle: Use Agent Memory +title: Use the Agent Memory API +weight: 10 +--- diff --git a/content/operate/rc/agent-memory/view-service.md b/content/operate/rc/agent-memory/view-service.md new file mode 100644 index 0000000000..2d26389a5a --- /dev/null +++ b/content/operate/rc/agent-memory/view-service.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: View and manage your Agent Memory service in Redis Cloud. +hideListLinks: true +linktitle: View service +title: View and manage Agent Memory service +weight: 15 +--- diff --git a/content/operate/rc/billing-and-payments/_index.md b/content/operate/rc/billing-and-payments/_index.md index 805d4b3abe..66af4fcb0d 100644 --- a/content/operate/rc/billing-and-payments/_index.md +++ b/content/operate/rc/billing-and-payments/_index.md @@ -8,7 +8,7 @@ categories: description: Describes how to view billing transactions and manage payment methods for Redis Cloud subscriptions. linkTitle: Billing & payments -weight: 39 +weight: 46 --- The **Billing & Payments** screen: diff --git a/content/operate/rc/cloud-integrations/_index.md b/content/operate/rc/cloud-integrations/_index.md index a8b4a054da..62612a8e06 100644 --- a/content/operate/rc/cloud-integrations/_index.md +++ b/content/operate/rc/cloud-integrations/_index.md @@ -9,7 +9,7 @@ categories: description: Describes how to integrate Redis Cloud subscriptions into existing cloud provider services, whether existing subscriptions or through vendor marketplaces. hideListLinks: true -weight: 40 +weight: 48 --- By default, Redis Cloud subscriptions are hosted in cloud vendor accounts owned and managed by Redis. diff --git a/content/operate/rc/logs-reports/_index.md b/content/operate/rc/logs-reports/_index.md index f04bb536da..bf6ea70b9e 100644 --- a/content/operate/rc/logs-reports/_index.md +++ b/content/operate/rc/logs-reports/_index.md @@ -8,7 +8,7 @@ categories: - rc description: null hideListLinks: false -weight: 37 +weight: 42 --- Here, you learn how to use Redis Cloud logs and reports to track activity and usage statistics. From 108582ce07904e2d56ea6731d9b51c374715cc12 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 4 May 2026 10:16:41 -0400 Subject: [PATCH 02/16] Agent memory overview 1 --- content/develop/ai/agent-memory/_index.md | 68 +++++++++++++++++++ content/embeds/rc-agent-memory-get-started.md | 7 ++ content/operate/rc/agent-memory/_index.md | 9 ++- 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 content/develop/ai/agent-memory/_index.md create mode 100644 content/embeds/rc-agent-memory-get-started.md diff --git a/content/develop/ai/agent-memory/_index.md b/content/develop/ai/agent-memory/_index.md new file mode 100644 index 0000000000..1b74a3dfaa --- /dev/null +++ b/content/develop/ai/agent-memory/_index.md @@ -0,0 +1,68 @@ +--- +Title: Redis Agent Memory +alwaysopen: false +categories: +- docs +- develop +- ai +description: Store agent memory for AI applications in Redis. +linkTitle: Agent Memory +hideListLinks: true +weight: 30 +bannerText: Redis Agent Memory is currently available in preview. Features and behavior are subject to change. +bannerChildren: true +--- + +Redis Agent Memory is a memory service for AI Agents available as a REST API and client libraries. It provides the persistent, structured memory layer that intelligent agents need to store, retrieve, and manage contextual data across interactions. Rather than requiring developers to build custom memory infrastructure from scratch, Redis Agent Memory offers a turnkey solution with dedicated endpoints, secure API key management, configurable memory schemas, and automatic TTL-based lifecycle management. + +[Get started](#get-started) with Redis Agent Memory on Redis Cloud, join the private preview, or set up your own Redis Agent Memory instance. + +## Redis Agent Memory overview + +Redis Agent Memory uses a two-tier memory model: + +- **Session memory** (also known as **Short-term memory** or **Working memory**) maintains the current conversation state, session history, and session-specific metadata. You can set a custom time-to-live (TTL) for session memory to control how long session data is retained. +- **Long-term memory** stores information extracted from past sessions, including user preferences, learned patterns, and other relevant data. + +The promotion from short term memory to long-term memory is automatic. When you store a conversation event in session memory, the Agent Memory Server asynchronously extracts important information using the configured extraction strategy (discrete, summary, preferences, or custom). These extracted memories are then stored as long-term memory entries with vector embeddings and metadata. + +This process is non-blocking: the extraction and promotion happen in the background via a task worker, so the main agent interaction remains responsive. Users do not need to explicitly trigger promotion; it happens as a natural byproduct of storing conversation events in working memory. +Users can also create long-term memories directly via the API.This is useful for bulk memory creation or for importing knowledge from external sources. + +The short-term memory that is not promoted will eventually expire based on its TTL configuration. As a conversation progresses, Redis Agent Memory extracts and asynchronously stores important information into long-term memory. This process ensures responsive interactions while knowledge gradually accumulates. + +### Example: Memory storage during a conversation + +Take this conversation between a User and an AI Travel Agent as an example: + +```text +User: I'm planning a trip to Japan next month and need help finding some restaurants for the trip. +Agent: Nice! What cities are you visiting? +User: I'm going to Tokyo and Kyoto. Also, I'm a vegetarian. +Agent: Good to know! I'll help you find some vegetarian-friendly restaurants in Tokyo and Kyoto. +``` + +For this conversation, you could store the following information with Redis Agent Memory: +- Session Memory: The current conversation state, including the user's query, the agent's response, and the user's follow-up question. The session memory also stores session-specific metadata. +- Long-term memory: Preference and location information from the conversation, stored as text and as vector embeddings for semantic retrieval. In this case, long-term memory might store "The user is a vegetarian" and "The user is planning a trip to Japan". + +## Get started with Redis Agent Memory {#get-started} + +Get started with Redis Agent Memory on Redis Cloud, join the private preview for Redis Software, or set up your own open-source Redis Agent Memory instance. + +{{< multitabs id="agent-memory-get-started" + tab1="Redis Cloud" + tab2="Redis Software (private preview)" + tab3="Open source" >}} + +{{< embed-md "rc-agent-memory-get-started.md" >}} + +-tab-sep- + +Contact your Redis representative or [contact sales](https://redis.com/contact-sales/) to join the private preview on Redis Software. + +-tab-sep- + +The open-source version of Redis Agent Memory is [available on GitHub](https://github.com/redis/agent-memory-server). See [Redis Agent Memory server](https://redis.github.io/agent-memory-server/) for comprehensive docs, quick start guides, and API references. + +{{< /multitabs >}} diff --git a/content/embeds/rc-agent-memory-get-started.md b/content/embeds/rc-agent-memory-get-started.md new file mode 100644 index 0000000000..ed5b5b6715 --- /dev/null +++ b/content/embeds/rc-agent-memory-get-started.md @@ -0,0 +1,7 @@ +To set up Agent Memory on Redis Cloud: + +1. [Create a database]({{< relref "/operate/rc/databases/create-database" >}}) on Redis Cloud. +2. [Create an Agent Memory service]({{< relref "/operate/rc/agent-memory/create-service" >}}) for your database on Redis Cloud. +3. [Use the Agent Memory API]({{< relref "/operate/rc/agent-memory/use-agent-memory" >}}) from your client app. + +After you set up Agent Memory, you can [view and manage your service]({{< relref "/operate/rc/agent-memory/view-service" >}}). diff --git a/content/operate/rc/agent-memory/_index.md b/content/operate/rc/agent-memory/_index.md index 1f651a9a0d..38672a5fa6 100644 --- a/content/operate/rc/agent-memory/_index.md +++ b/content/operate/rc/agent-memory/_index.md @@ -7,9 +7,14 @@ categories: description: Store agent memory for AI applications in Redis Cloud. hideListLinks: true linktitle: Agent Memory -title: Agent Memory on Redis Cloud +title: Redis Agent Memory on Redis Cloud weight: 36 -bannerText: Agent Memory on Redis Cloud is currently available as a public preview. Features and behavior are subject to change. +bannerText: Redis Agent Memory on Redis Cloud is currently available as a public preview. Features and behavior are subject to change. bannerChildren: true --- +Redis Agent Memory is a memory service for AI Agents available as a REST API and Python and Javascript SDKs. It provides the persistent, structured memory layer that intelligent agents need to store, retrieve, and manage contextual data across interactions. Rather than requiring developers to build custom memory infrastructure from scratch, Redis Agent Memory offers a turnkey solution with dedicated endpoints, secure API key management, configurable memory schemas, and automatic TTL-based lifecycle management. + +## Get started with Agent Memory on Redis Cloud + +{{< embed-md "rc-agent-memory-get-started.md" >}} From 335576c178381e196df3c40cf959d52b0b8bc34e Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 11 May 2026 15:46:57 -0400 Subject: [PATCH 03/16] RC/AI: Redis Agent Memory --- .../develop/ai/agent-memory/api-examples.md | 12 + .../develop/ai/agent-memory/api-reference.md | 9 + .../api-reference/openapi-agent-memory.json | 2862 +++++++++++++++++ content/operate/rc/agent-memory/_index.md | 13 +- .../operate/rc/agent-memory/create-service.md | 96 + .../rc/agent-memory/monitor-service.md | 12 + .../operate/rc/agent-memory/view-service.md | 120 + static/images/rc/agent-memory-add-api-key.png | Bin 0 -> 16559 bytes .../images/rc/agent-memory-custom-service.png | Bin 0 -> 4851 bytes .../rc/agent-memory-general-settings.png | Bin 0 -> 20992 bytes .../rc/agent-memory-memory-configuration.png | Bin 0 -> 12140 bytes static/images/rc/agent-memory-new-api-key.png | Bin 0 -> 4377 bytes static/images/rc/agent-memory-service-key.png | Bin 0 -> 16418 bytes .../images/rc/agent-memory-service-list.png | Bin 0 -> 19777 bytes .../images/rc/agent-memory-view-actions.png | Bin 0 -> 28465 bytes .../images/rc/agent-memory-view-api-keys.png | Bin 0 -> 25758 bytes .../images/rc/agent-memory-view-general.png | Bin 0 -> 18661 bytes ...agent-memory-view-memory-configuration.png | Bin 0 -> 11007 bytes 18 files changed, 3123 insertions(+), 1 deletion(-) create mode 100644 content/develop/ai/agent-memory/api-examples.md create mode 100644 content/develop/ai/agent-memory/api-reference.md create mode 100644 content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json create mode 100644 content/operate/rc/agent-memory/monitor-service.md create mode 100644 static/images/rc/agent-memory-add-api-key.png create mode 100644 static/images/rc/agent-memory-custom-service.png create mode 100644 static/images/rc/agent-memory-general-settings.png create mode 100644 static/images/rc/agent-memory-memory-configuration.png create mode 100644 static/images/rc/agent-memory-new-api-key.png create mode 100644 static/images/rc/agent-memory-service-key.png create mode 100644 static/images/rc/agent-memory-service-list.png create mode 100644 static/images/rc/agent-memory-view-actions.png create mode 100644 static/images/rc/agent-memory-view-api-keys.png create mode 100644 static/images/rc/agent-memory-view-general.png create mode 100644 static/images/rc/agent-memory-view-memory-configuration.png diff --git a/content/develop/ai/agent-memory/api-examples.md b/content/develop/ai/agent-memory/api-examples.md new file mode 100644 index 0000000000..94cdd86a4f --- /dev/null +++ b/content/develop/ai/agent-memory/api-examples.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- develop +- ai +description: Learn to use the Redis Agent Memory API for agent memory and semantic memory search. +hideListLinks: true +linktitle: API and SDK examples +title: Use the Redis Agent Memory API and SDK +weight: 10 +--- \ No newline at end of file diff --git a/content/develop/ai/agent-memory/api-reference.md b/content/develop/ai/agent-memory/api-reference.md new file mode 100644 index 0000000000..b4ec2a4eaa --- /dev/null +++ b/content/develop/ai/agent-memory/api-reference.md @@ -0,0 +1,9 @@ +--- +Title: LangCache REST API +linkTitle: API reference +layout: apireference +type: page +params: + sourcefile: ./openapi-agent-memory.json + sortOperationsAlphabetically: false +--- \ No newline at end of file diff --git a/content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json b/content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json new file mode 100644 index 0000000000..876a74d9d0 --- /dev/null +++ b/content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json @@ -0,0 +1,2862 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "MemoryDataPlaneServer", + "version": "", + "description": "API for managing Agentic Memory Service (AMS) data plane operations." + }, + "paths": { + "/health": { + "get": { + "description": "Return information about the operational status of the service.", + "operationId": "Health", + "responses": { + "200": { + "description": "Health 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "management" + ] + } + }, + "/v1/stores/{storeId}/long-term-memory": { + "delete": { + "description": "Deletes long-term memories in bulk by their IDs.", + "operationId": "BulkDeleteLongTermMemories", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkDeleteLongTermMemoriesRequestContent" + } + } + }, + "required": true + }, + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "BulkDeleteLongTermMemories 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkDeleteLongTermMemoriesResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "long-term-memory" + ] + }, + "post": { + "description": "Creates long-term memories in bulk.", + "operationId": "BulkCreateLongTermMemories", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkCreateLongTermMemoriesRequestContent" + } + } + }, + "required": true + }, + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "BulkCreateLongTermMemories 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkCreateLongTermMemoriesResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "long-term-memory" + ] + } + }, + "/v1/stores/{storeId}/long-term-memory/search": { + "post": { + "description": "Runs a semantic search on long-term memory with filtering options.", + "operationId": "SearchLongTermMemory", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchLongTermMemoryRequestContent" + } + } + } + }, + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "SearchLongTermMemory 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SearchLongTermMemoryResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "long-term-memory" + ] + } + }, + "/v1/stores/{storeId}/long-term-memory/{memoryId}": { + "get": { + "description": "Returns a long-term memory by its ID.", + "operationId": "GetLongTermMemory", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "memoryId", + "in": "path", + "description": "The memory record ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The memory record ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "GetLongTermMemory 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetLongTermMemoryResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "long-term-memory" + ] + }, + "patch": { + "description": "Partially updates a long-term memory by its ID.", + "operationId": "UpdateLongTermMemory", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLongTermMemoryRequestContent" + } + } + } + }, + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "memoryId", + "in": "path", + "description": "The memory record ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The memory record ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "UpdateLongTermMemory 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLongTermMemoryResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "long-term-memory" + ] + } + }, + "/v1/stores/{storeId}/session-memory": { + "get": { + "description": "Returns a paginated list of session IDs for a store.", + "operationId": "ListSessions", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of sessions to return.", + "schema": { + "type": "integer", + "description": "Maximum number of sessions to return.", + "format": "int32" + } + }, + { + "name": "offset", + "in": "query", + "description": "Pagination offset.", + "schema": { + "type": "integer", + "description": "Pagination offset.", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "ListSessions 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListSessionsResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + } + }, + "/v1/stores/{storeId}/session-memory/events": { + "post": { + "description": "Appends a single event to a session. Creates the session if it does not exist. If sessionId is omitted, the server generates one.", + "operationId": "AddSessionEvent", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSessionEventRequestContent" + } + } + }, + "required": true + }, + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "AddSessionEvent 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSessionEventResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + } + }, + "/v1/stores/{storeId}/session-memory/{sessionId}": { + "delete": { + "description": "Deletes the session memory for a session.", + "operationId": "DeleteSessionMemory", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "sessionId", + "in": "path", + "description": "The session ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The session ID." + }, + "required": true + } + ], + "responses": { + "204": { + "description": "DeleteSessionMemory 204 response" + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + }, + "get": { + "description": "Returns the session memory for a session.", + "operationId": "GetSessionMemory", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "sessionId", + "in": "path", + "description": "The session ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The session ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "GetSessionMemory 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetSessionMemoryResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + } + }, + "/v1/stores/{storeId}/session-memory/{sessionId}/events/{eventId}": { + "delete": { + "description": "Deletes a single event from a session by event ID.", + "operationId": "DeleteSessionEvent", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "sessionId", + "in": "path", + "description": "The session ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The session ID." + }, + "required": true + }, + { + "name": "eventId", + "in": "path", + "description": "The event ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "pattern": "^[a-zA-Z0-9]+$", + "description": "The event ID." + }, + "required": true + } + ], + "responses": { + "204": { + "description": "DeleteSessionEvent 204 response" + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + }, + "get": { + "description": "Returns a single event from a session by event ID.", + "operationId": "GetSessionEvent", + "parameters": [ + { + "name": "storeId", + "in": "path", + "description": "The store instance ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "sessionId", + "in": "path", + "description": "The session ID.", + "schema": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The session ID." + }, + "required": true + }, + { + "name": "eventId", + "in": "path", + "description": "The event ID.", + "schema": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "pattern": "^[a-zA-Z0-9]+$", + "description": "The event ID." + }, + "required": true + } + ], + "responses": { + "200": { + "description": "GetSessionEvent 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetSessionEventResponseContent" + } + } + } + }, + "400": { + "description": "BadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "AuthenticationError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthenticationErrorResponseContent" + } + } + } + }, + "403": { + "description": "ForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForbiddenErrorResponseContent" + } + } + } + }, + "404": { + "description": "NotFoundError 404 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundErrorResponseContent" + } + } + } + }, + "408": { + "description": "TimeoutError 408 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TimeoutErrorResponseContent" + } + } + } + }, + "413": { + "description": "PayloadTooLargeError 413 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent" + } + } + } + }, + "424": { + "description": "FailedDependencyError 424 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FailedDependencyErrorResponseContent" + } + } + } + }, + "429": { + "description": "TooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "UnexpectedError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnexpectedErrorResponseContent" + } + } + } + }, + "501": { + "description": "NotImplementedError 501 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotImplementedErrorResponseContent" + } + } + } + } + }, + "tags": [ + "session-memory" + ] + } + } + }, + "components": { + "schemas": { + "AddSessionEventRequestContent": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Optional session ID. If omitted, the server generates a unique ID." + }, + "actorId": { + "type": "string", + "description": "Unique actor identifier (1-255 chars). Can represent a user, agent, or any participant." + }, + "role": { + "$ref": "#/components/schemas/MessageRole" + }, + "content": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Content" + }, + "description": "The message content as an array of typed content parts." + }, + "createdAt": { + "type": "integer", + "description": "Timestamp when the event was created in milliseconds.", + "format": "int64" + }, + "metadata": { + "description": "Optional key-value pairs (max 15)." + } + }, + "required": [ + "actorId", + "content", + "createdAt", + "role" + ] + }, + "AddSessionEventResponseContent": { + "type": "object", + "properties": { + "event": { + "$ref": "#/components/schemas/SessionEvent" + } + }, + "required": [ + "event" + ] + }, + "AuthenticationErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 401, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/AuthenticationErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "AuthenticationErrorType": { + "type": "string", + "enum": [ + "/errors/authentication-failed" + ] + }, + "BadRequestErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 400, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/BadRequestErrorType" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FieldError" + } + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "BadRequestErrorType": { + "type": "string", + "enum": [ + "/errors/invalid-data" + ] + }, + "BulkCreateLongTermMemoriesRequestContent": { + "type": "object", + "properties": { + "memories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateMemoryRecord" + }, + "description": "List of memory records to create." + } + }, + "required": [ + "memories" + ] + }, + "BulkCreateLongTermMemoriesResponseContent": { + "type": "object", + "properties": { + "created": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Memory record identifier (1-64 chars, alphanumeric and dashes)." + }, + "description": "IDs of successfully created memory records." + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkOperationError" + }, + "description": "Errors for memory records that failed to be created." + } + }, + "required": [ + "created" + ] + }, + "BulkDeleteLongTermMemoriesRequestContent": { + "type": "object", + "properties": { + "memoryIds": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Memory record identifier (1-64 chars, alphanumeric and dashes)." + }, + "description": "List of memory record IDs to delete." + } + }, + "required": [ + "memoryIds" + ] + }, + "BulkDeleteLongTermMemoriesResponseContent": { + "type": "object", + "properties": { + "deleted": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Memory record identifier (1-64 chars, alphanumeric and dashes)." + }, + "description": "IDs of successfully deleted memory records." + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkOperationError" + }, + "description": "Errors for memory records that failed to be deleted." + } + }, + "required": [ + "deleted" + ] + }, + "BulkOperationError": { + "type": "object", + "description": "Error detail for a single item in a bulk operation.", + "properties": { + "id": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Memory record ID of the item that failed." + }, + "error": { + "type": "string", + "description": "Error message describing the failure." + } + }, + "required": [ + "error", + "id" + ] + }, + "Content": { + "description": "A single content item in a message. Exactly one member is set.", + "oneOf": [ + { + "type": "object", + "title": "text", + "properties": { + "text": { + "type": "string", + "description": "Text content." + } + }, + "required": [ + "text" + ] + } + ] + }, + "CreateMemoryRecord": { + "type": "object", + "description": "A memory record to create.", + "properties": { + "id": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Client-provided memory record ID for idempotent creation." + }, + "text": { + "type": "string", + "description": "The memory content." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "sessionId": { + "type": "string", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Topic tags for categorization." + } + }, + "required": [ + "id", + "text" + ] + }, + "FailedDependencyErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 424, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/FailedDependencyErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "FailedDependencyErrorType": { + "type": "string", + "enum": [ + "/errors/resource-unavailable", + "/errors/database-out-of-memory" + ] + }, + "FieldError": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "rule": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "field", + "message", + "rule" + ] + }, + "FilterConjunction": { + "type": "string", + "description": "Filter conjunction mode.", + "enum": [ + "all", + "any" + ] + }, + "ForbiddenErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 403, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/ForbiddenErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "ForbiddenErrorType": { + "type": "string", + "enum": [ + "/errors/insufficient-permissions" + ] + }, + "GetLongTermMemoryResponseContent": { + "type": "object", + "description": "A long-term memory record.", + "properties": { + "id": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Unique memory record ID." + }, + "text": { + "type": "string", + "description": "The memory content." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "sessionId": { + "type": "string", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "integer", + "description": "Timestamp when the memory was created (Unix milliseconds).", + "format": "int64" + }, + "updatedAt": { + "type": "integer", + "description": "Timestamp when the memory was last updated (Unix milliseconds).", + "format": "int64" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + }, + "GetSessionEventResponseContent": { + "type": "object", + "properties": { + "event": { + "$ref": "#/components/schemas/SessionEvent" + } + }, + "required": [ + "event" + ] + }, + "GetSessionMemoryResponseContent": { + "type": "object", + "description": "Session memory state for a session.", + "properties": { + "sessionId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The session ID." + }, + "ownerId": { + "type": "string", + "description": "The owner of the session, set from the actorId of the first event." + }, + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SessionEvent" + }, + "description": "Events stored in this session." + } + }, + "required": [ + "events", + "ownerId", + "sessionId" + ] + }, + "HealthResponseContent": { + "type": "object", + "description": "Health check response.", + "properties": { + "status": { + "type": "string", + "description": "Status of the service." + } + }, + "required": [ + "status" + ] + }, + "ListSessionsResponseContent": { + "type": "object", + "properties": { + "sessions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of session IDs." + }, + "total": { + "type": "integer", + "description": "Total number of matching sessions.", + "format": "int32" + } + }, + "required": [ + "sessions", + "total" + ] + }, + "LongTermMemoryFilter": { + "type": "object", + "description": "Grouping of filter conditions for long-term memory search.", + "properties": { + "sessionId": { + "$ref": "#/components/schemas/TagFilter" + }, + "ownerId": { + "$ref": "#/components/schemas/TagFilter" + }, + "namespace": { + "$ref": "#/components/schemas/TagFilter" + }, + "topics": { + "$ref": "#/components/schemas/TagFilter" + }, + "memoryType": { + "$ref": "#/components/schemas/TagFilter" + }, + "createdAt": { + "$ref": "#/components/schemas/NumericFilter" + } + } + }, + "MemoryRecord": { + "type": "object", + "description": "A long-term memory record.", + "properties": { + "id": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Unique memory record ID." + }, + "text": { + "type": "string", + "description": "The memory content." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "sessionId": { + "type": "string", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "integer", + "description": "Timestamp when the memory was created (Unix milliseconds).", + "format": "int64" + }, + "updatedAt": { + "type": "integer", + "description": "Timestamp when the memory was last updated (Unix milliseconds).", + "format": "int64" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + }, + "MemoryType": { + "type": "string", + "description": "Type of long-term memory.", + "enum": [ + "semantic", + "episodic", + "message" + ] + }, + "MessageRole": { + "type": "string", + "description": "Message role for session events.", + "enum": [ + "USER", + "ASSISTANT", + "SYSTEM" + ] + }, + "NotFoundErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 404, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/NotFoundErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "NotFoundErrorType": { + "type": "string", + "enum": [ + "/errors/resource-not-found" + ] + }, + "NotImplementedErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 501, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/NotImplementedErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "NotImplementedErrorType": { + "type": "string", + "enum": [ + "/errors/not-implemented" + ] + }, + "NumericFilter": { + "type": "object", + "description": "Filter for numeric fields. The server validates that exactly one operator is set.", + "properties": { + "gt": { + "type": "integer", + "description": "Greater than the given value.", + "format": "int64" + }, + "lt": { + "type": "integer", + "description": "Less than the given value.", + "format": "int64" + }, + "gte": { + "type": "integer", + "description": "Greater than or equal to the given value.", + "format": "int64" + }, + "lte": { + "type": "integer", + "description": "Less than or equal to the given value.", + "format": "int64" + }, + "eq": { + "type": "integer", + "description": "Equals the given value.", + "format": "int64" + } + } + }, + "PayloadTooLargeErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 413, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/PayloadTooLargeErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "PayloadTooLargeErrorType": { + "type": "string", + "enum": [ + "/errors/payload-too-large" + ] + }, + "SearchLongTermMemoryRequestContent": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "Text to use for semantic search." + }, + "similarityThreshold": { + "type": "number", + "description": "The minimum similarity threshold for vector search results (normalized cosine similarity).", + "format": "float" + }, + "filter": { + "$ref": "#/components/schemas/LongTermMemoryFilter" + }, + "filterOp": { + "$ref": "#/components/schemas/FilterConjunction" + }, + "limit": { + "type": "integer", + "description": "Maximum number of results to return.", + "format": "int32" + }, + "pageToken": { + "type": "string", + "description": "Opaque token from a previous response for the next page." + } + } + }, + "SearchLongTermMemoryResponseContent": { + "type": "object", + "properties": { + "memories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MemoryRecord" + }, + "description": "List of matching memory records." + }, + "nextPageToken": { + "type": "string", + "description": "Opaque token for fetching the next page. Omitted when no more results." + } + }, + "required": [ + "memories" + ] + }, + "SessionEvent": { + "type": "object", + "description": "A single event in the session history.", + "properties": { + "eventId": { + "type": "string", + "maxLength": 32, + "minLength": 32, + "pattern": "^[a-zA-Z0-9]+$", + "description": "Auto-generated event ID." + }, + "actorId": { + "type": "string", + "description": "Unique actor identifier (1-255 chars). Can represent a user, agent, or any participant." + }, + "sessionId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session identifier (client-provided or server-generated)." + }, + "role": { + "$ref": "#/components/schemas/MessageRole" + }, + "content": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Content" + }, + "description": "The message content as an array of typed content parts." + }, + "createdAt": { + "type": "integer", + "description": "Timestamp when the event was created in milliseconds.", + "format": "int64" + }, + "metadata": { + "description": "Optional key-value pairs (max 15)." + } + }, + "required": [ + "actorId", + "content", + "createdAt", + "eventId", + "role", + "sessionId" + ] + }, + "TagFilter": { + "type": "object", + "description": "Filter for tag/string fields. The server validates that exactly one operator is set.", + "properties": { + "eq": { + "type": "string", + "description": "Equals the given value." + }, + "ne": { + "type": "string", + "description": "Not equal to the given value." + }, + "in": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Matches any of the given values." + }, + "all": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Matches all of the given values." + } + } + }, + "TimeoutErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 408, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/TimeoutErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "TimeoutErrorType": { + "type": "string", + "enum": [ + "/errors/timeout" + ] + }, + "TooManyRequestsErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 429, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/TooManyRequestsErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "TooManyRequestsErrorType": { + "type": "string", + "enum": [ + "/errors/too-many-requests" + ] + }, + "UnexpectedErrorResponseContent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "A short, human-readable summary of the problem\n type. It SHOULD NOT change from occurrence to occurrence of the\n problem, except for purposes of localization (e.g., using\n proactive content negotiation; see [RFC7231], Section 3.4)." + }, + "status": { + "type": "integer", + "default": 500, + "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.", + "format": "int32" + }, + "detail": { + "type": "string", + "description": "A human-readable explanation specific to this occurrence of the problem." + }, + "instance": { + "type": "string", + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced." + }, + "type": { + "$ref": "#/components/schemas/UnexpectedErrorType" + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "UnexpectedErrorType": { + "type": "string", + "enum": [ + "/errors/unexpected-error" + ] + }, + "UpdateLongTermMemoryRequestContent": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "Updated text content." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Updated topics." + }, + "namespace": { + "type": "string", + "description": "Updated namespace." + }, + "ownerId": { + "type": "string", + "description": "Updated owner ID." + }, + "sessionId": { + "type": "string", + "description": "Updated session ID." + } + } + }, + "UpdateLongTermMemoryResponseContent": { + "type": "object", + "description": "A long-term memory record.", + "properties": { + "id": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Unique memory record ID." + }, + "text": { + "type": "string", + "description": "The memory content." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "sessionId": { + "type": "string", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "integer", + "description": "Timestamp when the memory was created (Unix milliseconds).", + "format": "int64" + }, + "updatedAt": { + "type": "integer", + "description": "Timestamp when the memory was last updated (Unix milliseconds).", + "format": "int64" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + } + } + } +} diff --git a/content/operate/rc/agent-memory/_index.md b/content/operate/rc/agent-memory/_index.md index 38672a5fa6..9d810a8891 100644 --- a/content/operate/rc/agent-memory/_index.md +++ b/content/operate/rc/agent-memory/_index.md @@ -13,7 +13,18 @@ bannerText: Redis Agent Memory on Redis Cloud is currently available as a public bannerChildren: true --- -Redis Agent Memory is a memory service for AI Agents available as a REST API and Python and Javascript SDKs. It provides the persistent, structured memory layer that intelligent agents need to store, retrieve, and manage contextual data across interactions. Rather than requiring developers to build custom memory infrastructure from scratch, Redis Agent Memory offers a turnkey solution with dedicated endpoints, secure API key management, configurable memory schemas, and automatic TTL-based lifecycle management. +Redis Agent Memory is a memory service for AI Agents available as a REST API and Python SDK. It provides the persistent, structured memory layer that intelligent agents need to store, retrieve, and manage contextual data across interactions. Rather than requiring developers to build custom memory infrastructure from scratch, Redis Agent Memory offers a turnkey solution with dedicated endpoints, secure API key management, configurable memory schemas, and automatic TTL-based lifecycle management. + +## Redis Agent Memory overview + +Redis Agent Memory uses a two-tier memory model: + +- **Session memory** (also known as **short-term** or **working memory**) maintains the current conversation state, session history, and session-specific metadata. You can set a custom time-to-live (TTL) to control how long session data is retained. +- **Long-term memory** stores information extracted from past sessions, such as user preferences and learned patterns, as text with vector embeddings for semantic retrieval. + +Promotion from short-term to long-term memory happens automatically. When you store a conversation event in session memory, the Agent Memory Server asynchronously extracts important information using the configured extraction strategy (discrete, summary, preferences, or custom) and stores it as long-term memory. The process is non-blocking, so agent interactions remain responsive. Short-term memory that is not promoted expires based on its TTL. You can also create long-term memories directly through the API for bulk creation or to import knowledge from external sources. + +For more details, see the [Redis Agent Memory overview]({{< relref "/develop/ai/agent-memory" >}}). ## Get started with Agent Memory on Redis Cloud diff --git a/content/operate/rc/agent-memory/create-service.md b/content/operate/rc/agent-memory/create-service.md index 6e2a358c28..27c7a478eb 100644 --- a/content/operate/rc/agent-memory/create-service.md +++ b/content/operate/rc/agent-memory/create-service.md @@ -10,3 +10,99 @@ linktitle: Create service title: Create an Agent Memory service weight: 5 --- + +Redis Agent Memory provides a persistent, structured memory layer that AI agents can use to store, retrieve, and manage contextual data across interactions. This guide walks you through creating and configuring an Agent Memory service in Redis Cloud. This guide walks you through creating and configuring an Agent Memory service in Redis Cloud. + +## Prerequisites & Limitations + +To create a Redis Agent Memory service, you will need a Redis Cloud database. If you don't have one, see [Create a database]({{< relref "/operate/rc/databases/create-database" >}}). + +{{< note >}} +Agent Memory does not support the following databases during public preview: +- [Redis Flex]({{< relref "operate/rc/databases/create-database/create-flex-database">}}) databases +- Databases using [AWS PrivateLink]({{< relref "operate/rc/security/aws-privatelink">}}) connectivity +- [Active-Active]({{< relref "/operate/rc/databases/active-active" >}}) databases +- Databases with the [default user]({{< relref "/operate/rc/security/access-control/data-access-control/default-user" >}}) turned off +{{< /note >}} + +## Create an Agent Memory service + +From the [Redis Cloud console](https://cloud.redis.io/), select **Agent Memory** from the left-hand menu. + +If you have not already created a Agent Memory service, you'll see a page with an introduction to Agent Memory. Otherwise, select **New service** to go to the Agent Memory introduction page. + +{{The New service button.}} + +From here: + +- Select **Quick create** to create a Agent Memory service with default settings using your Free 30MB database. If you haven't created a Free database yet, Redis Cloud will create one and set up the Agent Memory service for you. + + {{The Quick create button.}} + + After Redis Cloud creates your Agent Memory service, a window containing your Agent Memory service key will appear. Select **Copy** to copy the key to your clipboard. + + {{The Agent Memory service key window. Use the Copy button to save the service key to the clipboard.}} + + {{}} +This is the only time the value of the user key is available. Save it to a secure location before closing the dialog box.

+ +If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/agent-memory/view-service#replace-service-api-key" >}}) to be able to use the Agent Memory API. + {{
}} + + After your service is created, you can [use the Agent Memory API]({{< relref "/operate/rc/agent-memory/use-agent-memory" >}}) from your client app. + +- If you want to customize your Agent Memory service, select **Create custom**. + + {{The Create custom button to create an Agent Memory service.}} + + This takes you to the **Create Agent Memory Service** page. This page is divided into the following sections: + + 1. The [General settings](#general-settings) section defines basic properties of your service. + 1. The [Memory configuration](#memory-configuration) section allows you to define the time-to-live (TTL) of your agent's memories. + +### General settings + +The **General settings** section defines basic properties of your service. + +{{The General settings section.}} + +| Setting name |Description| +|:----------------------|:----------| +| **Service name** | Enter a name for your Agent Memory service. We recommend you use a name that describes your service's purpose. | +| **Select database** | Select the Redis Cloud database to use for this service from the list. | +| **User for this service** | The [database access user]({{< relref "/operate/rc/security/access-control/data-access-control/role-based-access-control" >}}) to use for this service. Agent Memory only supports the [`default` user]({{< relref "/operate/rc/security/access-control/data-access-control/default-user" >}}) during public preview. | + +### Memory configuration + +The **Memory configuration** section allows you to define the time-to-live (TTL) of your agent's memories. + +{{The General settings section.}} + +| Setting name |Description| +|:----------------------|:----------| +| **Short-term TTL** | Defines the time-to-live (TTL) of your agent's **short-term memory** (also known as **session memory**). You can define this TTL in seconds, minutes, hours, or days. Default: 1 hour | +| **Long-term TTL** | Select the Redis Cloud database to use for this service from the list. You can define this TTL in seconds, minutes, hours, or days. Default: 365 days | + +### Create service + +When you are done setting the details of your Agent Memory service, select **Create** to create it. + +{{Use the Create button to create a Agent Memory service.}} + +A window containing your Agent Memory service key will appear. Select **Copy** to copy the key to your clipboard. + +{{The Agent Memory service key window. Use the Copy button to save the service key to the clipboard.}} + +{{}} +This is the only time the value of the user key is available. Save it to a secure location before closing the dialog box.

+ +If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/agent-memory/view-service#replace-service-api-key" >}}) to be able to use the Agent Memory API. +{{
}} + +If an error occurs, verify that your database is active. For help, [contact support](https://redis.io/support/). + +## Next steps + +After your service is created, you can [use the Agent Memory API]({{< relref "/operate/rc/agent-memory/use-agent-memory" >}}) from your client app. + +You can also [view and edit the service]({{< relref "/operate/rc/agent-memory/view-service" >}}). \ No newline at end of file diff --git a/content/operate/rc/agent-memory/monitor-service.md b/content/operate/rc/agent-memory/monitor-service.md new file mode 100644 index 0000000000..1cfd69e842 --- /dev/null +++ b/content/operate/rc/agent-memory/monitor-service.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: null +hideListLinks: true +linktitle: Monitor service +title: Monitor a Redis Agent Memory service +weight: 20 +--- \ No newline at end of file diff --git a/content/operate/rc/agent-memory/view-service.md b/content/operate/rc/agent-memory/view-service.md index 2d26389a5a..72efb1a107 100644 --- a/content/operate/rc/agent-memory/view-service.md +++ b/content/operate/rc/agent-memory/view-service.md @@ -10,3 +10,123 @@ linktitle: View service title: View and manage Agent Memory service weight: 15 --- + +After you have [created your first Agent Memory service]({{< relref "/operate/rc/agent-memory/create-service" >}}), selecting **Agent Memory** from the Redis Cloud Console menu will take you to the **Agent Memory Services** page. + +This page displays a list of all Agent Memory services associated with your account. + +{{The Agent Memory service in the Agent Memory service list.}} + +Select your Agent Memory service from the list to view the service's details. + +## Configuration tab + +The **Configuration** tab lets you view the details of your Agent Memory service. It contains the following sections: + +- The **General settings** section provides the connection details and general settings for your Agent Memory service. +- The **Memory configuration** section provides the service settings for your Agent Memory service. +- The **Actions** section lets you flush or delete your Agent Memory service. + +Some of these settings can be changed after service creation. To do so, select the **Edit** button. + +### General settings + +The **General settings** section provides section provides the connection details and general settings for your Agent Memory service. + +{{The General settings for the Agent Memory service.}} + +| Setting name |Description| +|:----------------------|:----------| +| **Service name** | The name of your agent memory service. _(Editable)_ | +| **Database** | The name of the database your service uses. | +| **Store ID** | The unique ID of your Agent Memory store. | +| **Endpoint** | The base URL for any Agent Memory requests. | + +Select the **Copy** button next to the Store ID and API Base URL to copy them to the clipboard. + +See [use the Agent Memory API]({{< relref "/operate/rc/agent-memory/use-agent-memory" >}}) for more information on how to use the connection information and API keys. + +### Memory configuration + +The **Memory configuration** section shows the time-to-live (TTL) for memory storage. + +{{The general settings for the Agent Memory service.}} + +| Setting name |Description| +|:----------------------|:----------| +| **Short-term TTL** | The time-to-live (TTL) of your agent's **short-term memory** (also known as **session memory**). _(Editable)_ | +| **Long-term TTL** | The time-to-live (TTL) of your agent's **long-term memory**. _(Editable)_ | + +### Actions + +The **Actions** section lets you flush or delete your Agent Memory service. + +{{The actions for the Agent Memory service.}} + +#### Flush memory entries + +Flushing the service completely erases all stored memory data while preserving the service configuration and the search index used by the service. + +To flush the service: + +1. Select **Flush**. + +1. A confirmation dialog will appear. Select **Flush** again to confirm. + +Flushing the service is permanent and cannot be undone, and will result in empty memory retrieval results until new memory is stored. + +#### Delete service + +Deleting your Agent Memory service permanently deletes all associated memory data, the service configuration, and the Agent Memory search index. It also immediately terminates all API keys associated with the service. Data stored in other indexes within the same database will remain unaffected. + +To delete your Agent Memory service: + +1. Select **Delete**. + +1. A confirmation dialog will appear. Select the checkbox to confirm that you want to delete the service. + +1. Select **Delete** again to confirm. + +Deleting the Agent Memory service is permanent and cannot be undone. + +## Metrics tab + +The **Metrics** tab provides a series of graphs showing performance data for your Agent Memory service. See [Monitor an Agent Memory service]({{< relref "/operate/rc/agent-memory/monitor-service" >}}) for more information. + +## API keys tab + +The **API keys** tab shows a list of all API keys for your service. + +{{The actions for the Agent Memory service.}} + +Here, you can generate a new API key or remove any keys that are no longer in use. You can generate or remove service API keys at any time. + +### Generate a new service API key {#replace-service-api-key} + +To generate a new service key: + +1. Select **New API key**. + + {{The New API key button.}} + +1. Enter a new name for your API key. + + {{The Add API key window.}} + +1. Select **Generate key** to generate your new API key. + +1. The new key will appear in a dialog box. Select **Copy** to copy the key to the clipboard. + + {{The Agent Memory service key window. Use the Copy button to save the service key to the clipboard.}} + + {{}} +This is the only time the value of the user key is available. Save it to a secure location before closing the dialog box.

+ +If you lose the service key value, you will need to generate a new key again. + {{
}} + +### Delete API key + +To delete an API key, select the **Delete API key** button next to the old key. + +{{Delete button.}} \ No newline at end of file diff --git a/static/images/rc/agent-memory-add-api-key.png b/static/images/rc/agent-memory-add-api-key.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b60aa563a428ba60b4e034920179f50c01dcad GIT binary patch literal 16559 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-custom-service.png b/static/images/rc/agent-memory-custom-service.png new file mode 100644 index 0000000000000000000000000000000000000000..df4de76d3140bde7c55deeea8989c35096e86741 GIT binary patch literal 4851 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 XCq9<)`g-nf_yDxjK&rLM4w3%>-R){p literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-general-settings.png b/static/images/rc/agent-memory-general-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3e52eab712bb476cc366be51456304f63d69d8c5 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-memory-configuration.png b/static/images/rc/agent-memory-memory-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..7e329bfdc0f43726c22f3cb58837cf3cc516c041 GIT binary patch literal 12140 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-new-api-key.png b/static/images/rc/agent-memory-new-api-key.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc6bce0c97ae2d38580135a91b9b91989ceb53f GIT binary patch literal 4377 zcmV+!5$5iRP)%V$ROAq%b*S_$~aiCEAN2>^mXR>@T~Rhwaz`i^*{UUz0W?$y6XaHpWsWS z`M3^1fkZA#2oGkBOG{_b9s>?~zyt!=d_kd<6Bic^$dvQf_UbBNfb5b>e=PX#Ojjr> z6aZjxh%<$Sf&#=p0g#mfsZ0()?bofR$)){_2I$LBfruCPbGDKz`#Dp|`v-iI61a$) z0n{}3d|5VtRvXe;MS^TO;vU3q5}{ZEpv^)YP*5;Mh&ThW1M-m~?vKyT{31^F|BIP9 z6qC=-9^!$sC`~OyTqw=w&w&56733=hbJ(Gwkt2&pK(jsoc0F%OR6lDV?v`Z6#3I&1 z{6;JUP%_TQQA8vw{c%%4AvYbdA!0WnKO_pVDdI3meoVAV&&(2s@eu1Eo-UU2k`Nmq zUMwmMO;q`8l}$-d<-+T-WL%C)Kg*W^sB+y=R&h>JDq;p=n<8;a z3}P+Bu7!DtQ7WG?#W~!VK_8hSAsMj^;slW-JXjf@D9VzBC8+#M3knC%OKi;%^I}wd zK%SEnq3jRQEZ`5+Z-lr_B;h0v#t{{ciyl0SP!tlXJUj77BuP$G#d#x@2PY`^k_>5n zoXVfH66J^Y>sE+83X2j|d&v~JEJ<}oWR_GOm!zzdEY9Ue#wqI|S3opyAp}^UKqC{T zKrV<|yX(7wrCJFCKFA;&MBt)ShIXV5tVqx^5sKk2L?S30+85lvij*Rxe;ia*PZ!7< zSS=dZkp~YD7eEx`g9sD@yCg%|Qs7Udi2sqDkA?u%n~w%s|94%beyMPf60K4cgBe-c zgPzn-Y6vxg8b);_O~?S!kBmmoAT-=bHt92Xj?ey-2b6ZoJ<1hI2j#|O@dDXbRgQ%Y zP^fw+g3K>_LE531o@6lTkD{Z2JYRdu5pzv|&vC-{6DgMM^3 zI!+%(528DKy;I9c%X5(Xd;Mj9RJCRf_Is#;f9B_Y(S0GBqrUbe783`FGsH>a9C3uG z2NrRhXdqgMqlkxoT?4n9J(MkBpq@MwM+~fgzwv=i7P{5Ab-8^|uE|By<$#PkMLI(! z&d!muIOvTaV(}yb*AXmtH+L_9{`U(E*o%0;(1aPbeAX8J0pNeUudnat&syYhfFHd9 z7>7S=4r~Bjb%3*n1qxY_QX>Hw1sI?W`d|#^U=0r70`A}ieh>tq5DBr61Zgk{1dsy- zAcJWz3+6)!l)(yE3mahzY=_Xvirin2z zW6T1x#hfvBjEx0gp;$DQfTdv>ST-iX6xb|mAy$U1!Zu>tuxji_>@ao`JBPJnH?X@{ z7xo-`hZDF4u8*7HcKAq~jdSoQJPDtOXX8`xVtf(43}25|;d}8q{3L!Jzk+w*Pw-v> z2zA1cuq0dvHo+xgiF6{1kP&l;QlgxwB5H|7bkCQF4x*cQOHxTD$s%1yKQe+$CI#eF zat^ta+(_;w>&RyE5_y;GAwN+xDW()>iZ6vn8Ar*cOrw-g$|*Z3hbX7ff2ou5ib|y# zQtheU=)ago&85zyE~Rdw?xUWdwo~s@ducS9G0mCgPm87TX>wW#Z3AsD?Ktfst&{df zO z_6&bU5+j!}pRt}%%Q(%r#dx8vu5P97qaLp=R-dQ7UVXp%S@pZ>Z#DEZoHV!^6EqYW z%QSXroY1(T@j_Em(@rx;GhI`zxlFTK^OWWt%{N+1Emtj`mQZW1R)tob)%uyJ?GQ zubH`7xS7;!gV`ywZgWHPAoE=FHRi|6yDXR%0TyD5H5SJ$93!AYvvutW?ez&FDvTbv0*V&%2 zeQjrNmumN|UA^5Sdn0?EeX)Iw{VfMghd_s^4pk199jT6N$2`YPj%`l3lc!UTQ-#w7 zXWZG#S?s*YxqSp>gwF`ch^i6STr^xbE=4XiE_YoGU87wWxYoNq9ceQ%edNlKXGVT< z^K{F1+u?R|l-{VwQ42;jj(YCyJ&Ido&_oiMAg?68`!o^a3bnc*iQC=pQ+D~ZJQOwz<@4e7M>l=PkHz2ig2uN~hx!E-{%gsT(nCr+PuZj#BQ{7FYAYft7+ zKA1ttNX^)j@qr)9uj2P+@-izkdjwp;I>8fRkZ_H#OXM$FC3=|UpS3FMQMP~f>g=wZ zz?|}&ZZTK9QT!}7B6myf>%7>!U3q=^srmZ~)Cw{R4ombTd6MQS=2NCmX_q=nOQaoB zeW$LS+9QjS?JUF!Cl)ry_2p7|i^4(ijpA-mKv6}}n`tT24o=sdE}7mk!)eBn84ruY zioc&p&J@gSnq@g_{;a#RIkUIT!RBPnX_{+2chTI=dExVR&u7ffoB!Jaw*{*fyj+;N zuyK*uqIrw%e-r*qO^H^CtmN9ae&23cOfD8LZe22Z$%ZALN`-BBn z+v=+9s>-)hw-;@Hup?#1neW-(SMN00S+?`zF3GNr-3hy!tG%nM_n7WkUW3;tYP$AL z*xU9)$PW#*F16eC8SX3F5BnASAOD!~E@|% zr!F_gH@BXSI(_z+uwPD{;hZ^s*8l90bH3*e|H}Tg{=C=ux)#rtL%(_ccBs{>weEuV zg@!htw#N1`?Z++#UOagzp3Y~oXMN9?zA%2V>!rubrrx;T zJFf~}y?-v~7DtSo@% zy8txP0GMq6jPV2Ce@epu8zT5mJn)UEG%tW!eSr9G0PZz_{W}2cP<-tP0CAcCNj`v& z9z8Tv*8g3pB&rU;R^G?Vf=u`qLv=~Ntot7`^hfo8ujl^*x0`%x=j`}F00009a7bBm z000&x000&x0ZCFM@Bjb+icm~cMgRZ*fT!|BeeE)E>o0EWj8 zi|=fi@ll5EJ9q3%gYM|>{i?(F)ZzQP&-swD^f7Pi-st?>=KS&X{+_$`&))l1iSND9 z`NY=x?eqPz$@qe(^Wf_INPq1=dF@_~@Swf+rNH*D$M^O4{?Ok0Uy$&2pz?jC^T*iw zimmiqo8MIc00aR^L_t(|+U=X`QnNZ3MwjHRh_+Z-YQaLq)8^A|@BjAp*Tg`j)OM?M zMw<1yB9(?H$du#{N zD+YWtg3WKj+Eh4I27vk?J1WqmO0TulxB{W9xq&CyAcJQqAlQ=ifE}^{y5X(7e;^V=3d^6C zl^HBIW#a-2xsppLs~wiuYGEVTlLY?!57`%cFgEk0dGS#1;+l>!tA&b z6PW`ueQSofZ14)X$OE8SmT}%HJ2YmRMqXie)e3U?aaqYAtz`pXXwpE*zwj(Z24WGJ zG*(w+X1sv6hOEEqfSQzm-uK&i11M}e&mG7<0FPCtQWIkPADHj~0D+m}OQ}(qeotX$ zJDH9Dk`@47i>zTRnr5Cde`J1kAS=(Cr{)~|P?NzzVnAtyH^}tJlu~16!b%(2nt3QY zWw{VdBhSj;K_Okp#wDz5r`RMCi7>w_1?GANQ`w+^B3V+ZeR^Aol zrkOz}vT_Dx+$K8{(G%)JCO2>|5d^y)SLa5S@!em1C7L$bl|0zvcq`8wi3(8N$VvfE zwd}Ma5K&Od5?*Bri2$+GJhMso;egsHI}tsBB+`<%&YH*@MADJ$3otS@b9j+W3J7zE zWenWh7E_0mO}~ z!)0Xx+-~PdqysyUy|Lv%RWn|oS-xlA0+VVOJgLbb{W#BoL~y%D_DKwJ4tXQbj@t5Q zPZ!mNzE2*B?YtbqlX#Ts1*;75(|B(Dw)b78zR4!?2|bb>?R{|GBiS`h*2y~Ap5bIq z@O8eEdQtPFUcv3#I#%wr`96O9A#(0Mbvf0Km`>~SG>60Ca5x+ehr{7;{8s)0Zb9I0 T4Q?Q_00000NkvXXu0mjfpq+iQ literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-service-key.png b/static/images/rc/agent-memory-service-key.png new file mode 100644 index 0000000000000000000000000000000000000000..57b083de74370145b2f52eb2d2ff95c2de1a51af GIT binary patch literal 16418 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-service-list.png b/static/images/rc/agent-memory-service-list.png new file mode 100644 index 0000000000000000000000000000000000000000..79e7292df5dc4f08928597955bde3321eb47d9af GIT binary patch literal 19777 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-view-actions.png b/static/images/rc/agent-memory-view-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..3c079ee63d3b6471b132bbb24ac230c54f80e20b GIT binary patch literal 28465 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-view-general.png b/static/images/rc/agent-memory-view-general.png new file mode 100644 index 0000000000000000000000000000000000000000..ca648b77b3ba74261e9b0e7d4bd1ccc40365c674 GIT binary patch literal 18661 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/agent-memory-view-memory-configuration.png b/static/images/rc/agent-memory-view-memory-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..abbaa2234cd53b362091245f49fc4de2ce41ccfe GIT binary patch literal 11007 zcmeHsbx<5p@a7;15&{GWPLQC%VR3g|JXo+00=vNC?iO5v!=k}mf;$NWmn;PLV8JaA zAi&<{cUM>U$5ma`N!|T%uWG8^bocb@{^r%|uVU%?7%*o(&6I!*vG#{ zwSptb{dFY@z6zXQ=HL-hP{S!yjU z9)(C@jCzdoM26#p$%#7#jVokKrU*&$OCWf@-8QJfhb!F&ysK5k;I49?<1-rClTuQqh}nyut(P-PossRkXIh9(=YkiC2{xO-CzpS<&8N za@9M_+l}<9xDL~I*3fxn`Pedx!C4j0lC!_&gLjnnt32LsBFh;vw3!U_6!lMkVkR<* z8&c%4jwF3xD!WsAf{Qh&W1$P zS|mgj;$mmYj4B#>-@IR@VzIFPNy38$WRK)E5^YEPIna-kz>Oh#?K@1;#-ZY_WR<4( zBE6_8nPXyGX@Kp3-as1UM2~5hFa46ZM4Bt|O~*k;aIrBChU5?(mHc{vUbsgQewFff z{%6q}-0}>p)Qe=xJ<%x)MS;|MuQkbrC=EF&=M%9A2+5>LwnDKljNl<)Dj`;Jk`A=2BDlxz z6+iiqf|cSiA~Et@6>EFI>I{9s;C1{5e62Dc){rr7Uzx>E8M#(GdkF=FLq+sZbgm+- zkv@71ZEMXUm)Guvls)?!1}xWpRG|TGLZTY9iUb8>eqFkwDxQie|rA(g(Elz|Pv*lif+t9PQKHUEG>S*$`A=^x z@OCVo;;*A0uRjVP#Qa2vQ~wbY%7cUX5#teED3s^PjvP+P7hJ<9RBxZyN35J;PzU)4 zqqA&~2@}Aa9y!QjxqT)66>M<&qK}8NB#M{!-57eqw`^X|*tka)pA121LB($=3cl%+l{!H=cQd!G`ad=pAFgi=GhAb*Y@OsR8JzWS>tLvg%#qKK>5q2RbMH@{i; zMAsJzg7c1N?r6popFv%WabOrQ?jzwNhU(-iMX>3(?6@hXI;SbPpjo=w1eUPK+Z1C< zFta-C{;S!|+=s(dIZwu1V@<}f$UNV3YK`BG;tDTNk?3VQZ(e<__Nef9>o>1YH8l>! z$AvFyx%Bf&yUqN2ZjCNG_8kR&gR()bl*Aws%2AL9H2Zt&r!!ey-DwSeWqwoLnl|+Y z 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 TtpK6<&y9+LhJ1~zMaX{wzL>4_ literal 0 HcmV?d00001 From 155277839439e5540c930630214f24945c5fbfaf Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 11 May 2026 17:06:06 -0400 Subject: [PATCH 04/16] Add context engine section and page under develop/ai and operate/rc --- content/develop/ai/_index.md | 2 +- content/develop/ai/context-engine/_index.md | 12 ++++++++++++ .../ai/{ => context-engine}/agent-memory/_index.md | 2 +- .../agent-memory/api-examples.md | 0 .../agent-memory/api-reference.md | 0 .../api-reference/openapi-agent-memory.json | 0 .../ai/{ => context-engine}/langcache/_index.md | 8 +++++--- .../{ => context-engine}/langcache/api-examples.md | 14 ++++++++------ .../langcache/api-reference.md | 2 ++ .../langcache/api-reference/api.yaml | 2 +- content/develop/whats-new/_index.md | 6 +++--- content/embeds/rc-langcache-get-started.md | 6 +++--- content/operate/rc/changelog/july-2025.md | 4 ++-- content/operate/rc/context-engine/_index.md | 12 ++++++++++++ .../rc/{ => context-engine}/agent-memory/_index.md | 2 +- .../agent-memory/create-service.md | 0 .../agent-memory/monitor-service.md | 0 .../agent-memory/use-agent-memory.md | 0 .../agent-memory/view-service.md | 0 .../rc/{ => context-engine}/langcache/_index.md | 4 +++- .../langcache/create-service.md | 14 ++++++++------ .../langcache/monitor-cache.md | 2 ++ .../langcache/use-langcache.md | 10 ++++++---- .../langcache/view-edit-cache.md | 8 +++++--- layouts/home.html | 2 +- 25 files changed, 76 insertions(+), 36 deletions(-) create mode 100644 content/develop/ai/context-engine/_index.md rename content/develop/ai/{ => context-engine}/agent-memory/_index.md (99%) rename content/develop/ai/{ => context-engine}/agent-memory/api-examples.md (100%) rename content/develop/ai/{ => context-engine}/agent-memory/api-reference.md (100%) rename content/develop/ai/{ => context-engine}/agent-memory/api-reference/openapi-agent-memory.json (100%) rename content/develop/ai/{ => context-engine}/langcache/_index.md (94%) rename content/develop/ai/{ => context-engine}/langcache/api-examples.md (87%) rename content/develop/ai/{ => context-engine}/langcache/api-reference.md (77%) rename content/develop/ai/{ => context-engine}/langcache/api-reference/api.yaml (99%) create mode 100644 content/operate/rc/context-engine/_index.md rename content/operate/rc/{ => context-engine}/agent-memory/_index.md (97%) rename content/operate/rc/{ => context-engine}/agent-memory/create-service.md (100%) rename content/operate/rc/{ => context-engine}/agent-memory/monitor-service.md (100%) rename content/operate/rc/{ => context-engine}/agent-memory/use-agent-memory.md (100%) rename content/operate/rc/{ => context-engine}/agent-memory/view-service.md (100%) rename content/operate/rc/{ => context-engine}/langcache/_index.md (90%) rename content/operate/rc/{ => context-engine}/langcache/create-service.md (90%) rename content/operate/rc/{ => context-engine}/langcache/monitor-cache.md (97%) rename content/operate/rc/{ => context-engine}/langcache/use-langcache.md (60%) rename content/operate/rc/{ => context-engine}/langcache/view-edit-cache.md (92%) diff --git a/content/develop/ai/_index.md b/content/develop/ai/_index.md index cd66c169e6..4a21e902f0 100644 --- a/content/develop/ai/_index.md +++ b/content/develop/ai/_index.md @@ -16,7 +16,7 @@ Redis stores and indexes vector embeddings that semantically represent unstructu

## Redis Feature Form diff --git a/content/develop/ai/context-engine/_index.md b/content/develop/ai/context-engine/_index.md new file mode 100644 index 0000000000..a4cba25acc --- /dev/null +++ b/content/develop/ai/context-engine/_index.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- develop +- ai +description: +hideListLinks: true +linktitle: Redis Context Engine +title: Redis Context Engine +weight: 30 +--- \ No newline at end of file diff --git a/content/develop/ai/agent-memory/_index.md b/content/develop/ai/context-engine/agent-memory/_index.md similarity index 99% rename from content/develop/ai/agent-memory/_index.md rename to content/develop/ai/context-engine/agent-memory/_index.md index 1b74a3dfaa..36b08c9c20 100644 --- a/content/develop/ai/agent-memory/_index.md +++ b/content/develop/ai/context-engine/agent-memory/_index.md @@ -8,7 +8,7 @@ categories: description: Store agent memory for AI applications in Redis. linkTitle: Agent Memory hideListLinks: true -weight: 30 +weight: 10 bannerText: Redis Agent Memory is currently available in preview. Features and behavior are subject to change. bannerChildren: true --- diff --git a/content/develop/ai/agent-memory/api-examples.md b/content/develop/ai/context-engine/agent-memory/api-examples.md similarity index 100% rename from content/develop/ai/agent-memory/api-examples.md rename to content/develop/ai/context-engine/agent-memory/api-examples.md diff --git a/content/develop/ai/agent-memory/api-reference.md b/content/develop/ai/context-engine/agent-memory/api-reference.md similarity index 100% rename from content/develop/ai/agent-memory/api-reference.md rename to content/develop/ai/context-engine/agent-memory/api-reference.md diff --git a/content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json b/content/develop/ai/context-engine/agent-memory/api-reference/openapi-agent-memory.json similarity index 100% rename from content/develop/ai/agent-memory/api-reference/openapi-agent-memory.json rename to content/develop/ai/context-engine/agent-memory/api-reference/openapi-agent-memory.json diff --git a/content/develop/ai/langcache/_index.md b/content/develop/ai/context-engine/langcache/_index.md similarity index 94% rename from content/develop/ai/langcache/_index.md rename to content/develop/ai/context-engine/langcache/_index.md index b94af528cf..a122c52361 100644 --- a/content/develop/ai/langcache/_index.md +++ b/content/develop/ai/context-engine/langcache/_index.md @@ -11,11 +11,13 @@ hideListLinks: true weight: 30 bannerText: LangCache is currently available in preview. Features and behavior are subject to change. bannerChildren: true +aliases: +- /develop/ai/langcache --- Redis LangCache is a fully-managed semantic caching service that reduces large language model (LLM) costs and improves response times for AI applications. -[Get started](#get-started) with LangCache on [Redis Cloud]({{< relref "/operate/rc/langcache" >}}) or join the [private preview](https://redis.io/langcache/). +[Get started](#get-started) with LangCache on [Redis Cloud]({{< relref "/operate/rc/context-engine/langcache" >}}) or join the [private preview](https://redis.io/langcache/). ## LangCache overview @@ -62,13 +64,13 @@ The following diagram displays how you can integrate LangCache into your GenAI a 1. Your app sends the prompt and the new response to LangCache through the `POST /v1/caches/{cacheId}/entries` endpoint. 1. LangCache stores the embedding with the new response in the cache for future use. -See the [LangCache API and SDK examples]({{< relref "/develop/ai/langcache/api-examples" >}}) for more information on how to use the LangCache API. +See the [LangCache API and SDK examples]({{< relref "/develop/ai/context-engine/langcache/api-examples" >}}) for more information on how to use the LangCache API. ## Get started LangCache is currently in preview: -- Public preview on [Redis Cloud]({{< relref "/operate/rc/langcache" >}}) +- Public preview on [Redis Cloud]({{< relref "/operate/rc/context-engine/langcache" >}}) - Fully-managed [private preview](https://redis.io/langcache/) {{< multitabs id="langcache-get-started" diff --git a/content/develop/ai/langcache/api-examples.md b/content/develop/ai/context-engine/langcache/api-examples.md similarity index 87% rename from content/develop/ai/langcache/api-examples.md rename to content/develop/ai/context-engine/langcache/api-examples.md index 9ea523d295..0cb78e4b26 100644 --- a/content/develop/ai/langcache/api-examples.md +++ b/content/develop/ai/context-engine/langcache/api-examples.md @@ -9,9 +9,11 @@ hideListLinks: true linktitle: API and SDK examples title: Use the LangCache API and SDK weight: 10 +aliases: +- /develop/ai/langcache/api-examples --- -Use the [LangCache API]({{< relref "/develop/ai/langcache/api-reference" >}}) from your client app to store and retrieve LLM, RAG, or agent responses. +Use the [LangCache API]({{< relref "/develop/ai/context-engine/langcache/api-reference" >}}) from your client app to store and retrieve LLM, RAG, or agent responses. You can use any standard REST client or library to access the API. If your app is written in Python or Javascript, you can also use the LangCache Software Development Kits (SDKs) to access the API: @@ -47,7 +49,7 @@ This example expects several variables to be set in the shell: ### Search LangCache for similar responses -Use [`POST /v1/caches/{cacheId}/entries/search`]({{< relref "/develop/ai/langcache/api-reference#tag/Cache-Entries/operation/search" >}}) to search the cache for matching responses to a user prompt. +Use [`POST /v1/caches/{cacheId}/entries/search`]({{< relref "/develop/ai/context-engine/langcache/api-reference#tag/Cache-Entries/operation/search" >}}) to search the cache for matching responses to a user prompt. {{< clients-example set="langcache_sdk" step="search_basic" dft_tab_name="REST API" show_footer="false" description="Foundational: Search the cache for semantically similar responses to a user prompt" difficulty="beginner" >}} POST https://[host]/v1/caches/{cacheId}/entries/search @@ -91,7 +93,7 @@ POST https://[host]/v1/caches/{cacheId}/entries/search ### Store a new response in LangCache -Use [`POST /v1/caches/{cacheId}/entries`]({{< relref "/develop/ai/langcache/api-reference#tag/Cache-Entries/operation/set" >}}) to store a new response in the cache. +Use [`POST /v1/caches/{cacheId}/entries`]({{< relref "/develop/ai/context-engine/langcache/api-reference#tag/Cache-Entries/operation/set" >}}) to store a new response in the cache. {{< clients-example set="langcache_sdk" step="store_basic" dft_tab_name="REST API" show_footer="false" description="Foundational: Store a new LLM response in the cache with its corresponding prompt for future retrieval" difficulty="beginner" >}} POST https://[host]/v1/caches/{cacheId}/entries @@ -118,13 +120,13 @@ POST https://[host]/v1/caches/{cacheId}/entries ### Delete cached responses -Use [`DELETE /v1/caches/{cacheId}/entries/{entryId}`]({{< relref "/develop/ai/langcache/api-reference#tag/Cache-Entries/operation/delete" >}}) to delete a cached response from the cache. +Use [`DELETE /v1/caches/{cacheId}/entries/{entryId}`]({{< relref "/develop/ai/context-engine/langcache/api-reference#tag/Cache-Entries/operation/delete" >}}) to delete a cached response from the cache. {{< clients-example set="langcache_sdk" step="delete_entry" dft_tab_name="REST API" show_footer="false" description="Foundational: Delete a specific cached response by its entry ID when you need to remove outdated or incorrect cache entries" difficulty="beginner" >}} DELETE https://[host]/v1/caches/{cacheId}/entries/{entryId} {{< /clients-example >}} -You can also use [`DELETE /v1/caches/{cacheId}/entries`]({{< relref "/develop/ai/langcache/api-reference#tag/Cache-Entries/operation/deleteQuery" >}}) to delete multiple cached responses based on the `attributes` you specify. If you specify multiple `attributes`, LangCache will delete entries that contain all given attributes. +You can also use [`DELETE /v1/caches/{cacheId}/entries`]({{< relref "/develop/ai/context-engine/langcache/api-reference#tag/Cache-Entries/operation/deleteQuery" >}}) to delete multiple cached responses based on the `attributes` you specify. If you specify multiple `attributes`, LangCache will delete entries that contain all given attributes. {{< warning >}} If you do not specify any `attributes`, all responses in the cache will be deleted. This cannot be undone. @@ -144,7 +146,7 @@ DELETE https://[host]/v1/caches/{cacheId}/entries ### Flush the cache Use -[POST /v1/caches/{cacheId}/flush](https://redis.io/docs/latest/develop/ai/langcache/api-reference/#tag/Cache-Entries/operation/flush) +[POST /v1/caches/{cacheId}/flush](https://redis.io/docs/latest/develop/ai/context-engine/langcache/api-reference/#tag/Cache-Entries/operation/flush) to flush all entries from the cache. {{< clients-example set="langcache_sdk" step="flush" dft_tab_name="REST API" show_footer="false" description="Flush cache: Clear all cached responses from the cache in a single operation (use with caution as this cannot be undone)" difficulty="advanced" >}} diff --git a/content/develop/ai/langcache/api-reference.md b/content/develop/ai/context-engine/langcache/api-reference.md similarity index 77% rename from content/develop/ai/langcache/api-reference.md rename to content/develop/ai/context-engine/langcache/api-reference.md index f5f708924e..c7451224c7 100644 --- a/content/develop/ai/langcache/api-reference.md +++ b/content/develop/ai/context-engine/langcache/api-reference.md @@ -1,6 +1,8 @@ --- Title: LangCache REST API linkTitle: API reference +aliases: +- /develop/ai/langcache/api-reference layout: apireference type: page params: diff --git a/content/develop/ai/langcache/api-reference/api.yaml b/content/develop/ai/context-engine/langcache/api-reference/api.yaml similarity index 99% rename from content/develop/ai/langcache/api-reference/api.yaml rename to content/develop/ai/context-engine/langcache/api-reference/api.yaml index e3a1629492..92ed72630e 100644 --- a/content/develop/ai/langcache/api-reference/api.yaml +++ b/content/develop/ai/context-engine/langcache/api-reference/api.yaml @@ -1,7 +1,7 @@ openapi: 3.0.2 info: title: Redis LangCache Service - description: API for managing a [Redis LangCache](https://redis.io/docs/latest/develop/ai/langcache/) service. + description: API for managing a [Redis LangCache](https://redis.io/docs/latest/develop/ai/context-engine/langcache/) service. contact: name: Redis email: support@redis.com diff --git a/content/develop/whats-new/_index.md b/content/develop/whats-new/_index.md index ada9abdfda..59cbf3089a 100644 --- a/content/develop/whats-new/_index.md +++ b/content/develop/whats-new/_index.md @@ -128,7 +128,7 @@ weight: 10 - Vectorizers - Added [AI video tutorials]({{< relref "/develop/ai/ai-videos" >}}) with YouTube content - Added [AI notebook collection]({{< relref "/develop/ai/notebook-collection" >}}) with notebook links -- Added [LangCache documentation]({{< relref "/develop/ai/langcache" >}}) with API examples +- Added [LangCache documentation]({{< relref "/develop/ai/context-engine/langcache" >}}) with API examples --- @@ -168,7 +168,7 @@ weight: 10 - Updated [vector types documentation]({{< relref "/develop/ai/search-and-query/vectors/_index" >}}) for INT8 and UINT8 - Added [GEO search precision information]({{< relref "/develop/ai/search-and-query/indexing/geoindex" >}}) -- Enhanced [LangCache SDK]({{< relref "/develop/ai/langcache/_index" >}}) with savings calculator and improved API documentation +- Enhanced [LangCache SDK]({{< relref "/develop/ai/context-engine/langcache/_index" >}}) with savings calculator and improved API documentation --- @@ -227,7 +227,7 @@ weight: 10 - [Lettuce vector queries]({{< relref "/develop/clients/lettuce/vecsearch" >}}) - [Lettuce vector sets]({{< relref "/develop/clients/lettuce/vecsets" >}}) - Updated [redisvl documentation]({{< relref "/develop/ai/redisvl/_index" >}}) for versions 0.6.0-0.8.2 -- Added [LangCache SDK]({{< relref "/develop/ai/langcache/_index" >}}) documentation with [API reference]({{< relref "/develop/ai/langcache/api-examples" >}}) +- Added [LangCache SDK]({{< relref "/develop/ai/context-engine/langcache/_index" >}}) documentation with [API reference]({{< relref "/develop/ai/context-engine/langcache/api-examples" >}}) --- diff --git a/content/embeds/rc-langcache-get-started.md b/content/embeds/rc-langcache-get-started.md index dd1fe7be1c..7227acf44f 100644 --- a/content/embeds/rc-langcache-get-started.md +++ b/content/embeds/rc-langcache-get-started.md @@ -1,10 +1,10 @@ To set up LangCache on Redis Cloud: 1. [Create a database]({{< relref "/operate/rc/databases/create-database" >}}) on Redis Cloud. -2. [Create a LangCache service]({{< relref "/operate/rc/langcache/create-service" >}}) for your database on Redis Cloud. -3. [Use the LangCache API]({{< relref "/operate/rc/langcache/use-langcache" >}}) from your client app. +2. [Create a LangCache service]({{< relref "/operate/rc/context-engine/langcache/create-service" >}}) for your database on Redis Cloud. +3. [Use the LangCache API]({{< relref "/operate/rc/context-engine/langcache/use-langcache" >}}) from your client app. -After you set up LangCache, you can [view and edit the cache]({{< relref "/operate/rc/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/langcache/monitor-cache" >}}). +After you set up LangCache, you can [view and edit the cache]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/context-engine/langcache/monitor-cache" >}}). See also our [Redis LangCache setup](https://www.youtube.com/watch?v=UOGhMZlZLko) tutorial video for advice on how to get started. diff --git a/content/operate/rc/changelog/july-2025.md b/content/operate/rc/changelog/july-2025.md index f5eb2d96a9..ae68d183c1 100644 --- a/content/operate/rc/changelog/july-2025.md +++ b/content/operate/rc/changelog/july-2025.md @@ -18,11 +18,11 @@ tags: ### LangCache public preview -[LangCache]({{< relref "/operate/rc/langcache" >}}) is now available in public preview on Redis Cloud. +[LangCache]({{< relref "/operate/rc/context-engine/langcache" >}}) is now available in public preview on Redis Cloud. LangCache is a semantic caching service available as a REST API that stores LLM responses for fast and cheaper retrieval, built on the Redis vector database. By using semantic caching, you can significantly reduce API costs and lower the average latency of your generative AI applications. -For more information about how LangCache works, see the [LangCache overview]({{< relref "/develop/ai/langcache" >}}). +For more information about how LangCache works, see the [LangCache overview]({{< relref "/develop/ai/context-engine/langcache" >}}). {{< embed-md "rc-langcache-get-started.md" >}} diff --git a/content/operate/rc/context-engine/_index.md b/content/operate/rc/context-engine/_index.md new file mode 100644 index 0000000000..f35d10981b --- /dev/null +++ b/content/operate/rc/context-engine/_index.md @@ -0,0 +1,12 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Deploy AI agents with Redis Cloud. +hideListLinks: false +linktitle: Context Engine +title: Context Engine on Redis Cloud +weight: 36 +--- \ No newline at end of file diff --git a/content/operate/rc/agent-memory/_index.md b/content/operate/rc/context-engine/agent-memory/_index.md similarity index 97% rename from content/operate/rc/agent-memory/_index.md rename to content/operate/rc/context-engine/agent-memory/_index.md index 9d810a8891..25a47cc2c3 100644 --- a/content/operate/rc/agent-memory/_index.md +++ b/content/operate/rc/context-engine/agent-memory/_index.md @@ -24,7 +24,7 @@ Redis Agent Memory uses a two-tier memory model: Promotion from short-term to long-term memory happens automatically. When you store a conversation event in session memory, the Agent Memory Server asynchronously extracts important information using the configured extraction strategy (discrete, summary, preferences, or custom) and stores it as long-term memory. The process is non-blocking, so agent interactions remain responsive. Short-term memory that is not promoted expires based on its TTL. You can also create long-term memories directly through the API for bulk creation or to import knowledge from external sources. -For more details, see the [Redis Agent Memory overview]({{< relref "/develop/ai/agent-memory" >}}). +For more details, see the [Redis Agent Memory overview]({{< relref "/develop/ai/context-engine/agent-memory" >}}). ## Get started with Agent Memory on Redis Cloud diff --git a/content/operate/rc/agent-memory/create-service.md b/content/operate/rc/context-engine/agent-memory/create-service.md similarity index 100% rename from content/operate/rc/agent-memory/create-service.md rename to content/operate/rc/context-engine/agent-memory/create-service.md diff --git a/content/operate/rc/agent-memory/monitor-service.md b/content/operate/rc/context-engine/agent-memory/monitor-service.md similarity index 100% rename from content/operate/rc/agent-memory/monitor-service.md rename to content/operate/rc/context-engine/agent-memory/monitor-service.md diff --git a/content/operate/rc/agent-memory/use-agent-memory.md b/content/operate/rc/context-engine/agent-memory/use-agent-memory.md similarity index 100% rename from content/operate/rc/agent-memory/use-agent-memory.md rename to content/operate/rc/context-engine/agent-memory/use-agent-memory.md diff --git a/content/operate/rc/agent-memory/view-service.md b/content/operate/rc/context-engine/agent-memory/view-service.md similarity index 100% rename from content/operate/rc/agent-memory/view-service.md rename to content/operate/rc/context-engine/agent-memory/view-service.md diff --git a/content/operate/rc/langcache/_index.md b/content/operate/rc/context-engine/langcache/_index.md similarity index 90% rename from content/operate/rc/langcache/_index.md rename to content/operate/rc/context-engine/langcache/_index.md index e63170e3c2..7888c298d6 100644 --- a/content/operate/rc/langcache/_index.md +++ b/content/operate/rc/context-engine/langcache/_index.md @@ -11,11 +11,13 @@ title: Semantic caching with LangCache on Redis Cloud weight: 36 bannerText: LangCache on Redis Cloud is currently available as a public preview. Features and behavior are subject to change. bannerChildren: true +aliases: +- /operate/rc/langcache --- LangCache is a semantic caching service available as a REST API that stores LLM responses for fast and cheaper retrieval, built on the Redis vector database. By using semantic caching, you can significantly reduce API costs and lower the average latency of your generative AI applications. -For more information about how LangCache works, see the [LangCache overview]({{< relref "/develop/ai/langcache" >}}). +For more information about how LangCache works, see the [LangCache overview]({{< relref "/develop/ai/context-engine/langcache" >}}). ## LLM cost reduction with LangCache diff --git a/content/operate/rc/langcache/create-service.md b/content/operate/rc/context-engine/langcache/create-service.md similarity index 90% rename from content/operate/rc/langcache/create-service.md rename to content/operate/rc/context-engine/langcache/create-service.md index 16dfdb7cb8..cafa66d7bd 100644 --- a/content/operate/rc/langcache/create-service.md +++ b/content/operate/rc/context-engine/langcache/create-service.md @@ -9,6 +9,8 @@ hideListLinks: true linktitle: Create service title: Create a LangCache service weight: 5 +aliases: +- /operate/rc/langcache/create-service --- Redis LangCache provides vector search capabilities and efficient caching for AI-powered applications. This guide walks you through creating and configuring a LangCache service in Redis Cloud. @@ -49,12 +51,12 @@ From here: {{}} This is the only time the value of the user key is available. Save it to a secure location before closing the dialog box.

-If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. +If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. {{
}} - After your cache is created, you can [use the LangCache API]({{< relref "/operate/rc/langcache/use-langcache" >}}) from your client app. + After your cache is created, you can [use the LangCache API]({{< relref "/operate/rc/context-engine/langcache/use-langcache" >}}) from your client app. - You can also [view and edit the cache]({{< relref "/operate/rc/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/langcache/monitor-cache" >}}). + You can also [view and edit the cache]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/context-engine/langcache/monitor-cache" >}}). - If you want to customize your LangCache service, select **Create custom service**. @@ -134,7 +136,7 @@ A window containing your LangCache service key will appear. Select **Copy** to c {{}} This is the only time the value of the user key is available. Save it to a secure location before closing the dialog box.

-If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. +If you lose the service key value, you will need to [generate a new service key]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. {{
}} You'll be taken to your LangCache service's **Configuration** page. You'll also be able to see your LangCache service in the LangCache service list. @@ -150,6 +152,6 @@ For help, [contact support](https://redis.io/support/). ## Next steps -After your cache is created, you can [use the LangCache API]({{< relref "/operate/rc/langcache/use-langcache" >}}) from your client app. +After your cache is created, you can [use the LangCache API]({{< relref "/operate/rc/context-engine/langcache/use-langcache" >}}) from your client app. -You can also [view and edit the cache]({{< relref "/operate/rc/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/langcache/monitor-cache" >}}). +You can also [view and edit the cache]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache" >}}) and [monitor the cache's performance]({{< relref "/operate/rc/context-engine/langcache/monitor-cache" >}}). diff --git a/content/operate/rc/langcache/monitor-cache.md b/content/operate/rc/context-engine/langcache/monitor-cache.md similarity index 97% rename from content/operate/rc/langcache/monitor-cache.md rename to content/operate/rc/context-engine/langcache/monitor-cache.md index 0970200652..3f2ad3abad 100644 --- a/content/operate/rc/langcache/monitor-cache.md +++ b/content/operate/rc/context-engine/langcache/monitor-cache.md @@ -9,6 +9,8 @@ hideListLinks: true linktitle: Monitor cache title: Monitor a LangCache service weight: 20 +aliases: +- /operate/rc/langcache/monitor-cache --- You can monitor a LangCache service's performance from the **Metrics** tab of the service's page. diff --git a/content/operate/rc/langcache/use-langcache.md b/content/operate/rc/context-engine/langcache/use-langcache.md similarity index 60% rename from content/operate/rc/langcache/use-langcache.md rename to content/operate/rc/context-engine/langcache/use-langcache.md index 62a2d0b856..bbae49b6fd 100644 --- a/content/operate/rc/langcache/use-langcache.md +++ b/content/operate/rc/context-engine/langcache/use-langcache.md @@ -9,9 +9,11 @@ hideListLinks: true linktitle: Use LangCache title: Use the LangCache API on Redis Cloud weight: 10 +aliases: +- /operate/rc/langcache/use-langcache --- -You can use the [LangCache API and SDK]({{< relref "/develop/ai/langcache/api-examples" >}}) from your client app to store and retrieve LLM, RAG, or agent responses. +You can use the [LangCache API and SDK]({{< relref "/develop/ai/context-engine/langcache/api-examples" >}}) from your client app to store and retrieve LLM, RAG, or agent responses. To access the LangCache API, you need: @@ -19,10 +21,10 @@ To access the LangCache API, you need: - LangCache service API key - Cache ID -For LangCache on Redis Cloud, the base URL and cache ID are available in the LangCache service's **Configuration** page in the [**Connectivity** section]({{< relref "/operate/rc/langcache/view-edit-cache#connectivity" >}}). +For LangCache on Redis Cloud, the base URL and cache ID are available in the LangCache service's **Configuration** page in the [**Connectivity** section]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache#connectivity" >}}). -The LangCache API key is only available immediately after you create the LangCache service. If you lost this value, you will need to [replace the service API key]({{< relref "/operate/rc/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. +The LangCache API key is only available immediately after you create the LangCache service. If you lost this value, you will need to [replace the service API key]({{< relref "/operate/rc/context-engine/langcache/view-edit-cache#replace-service-api-key" >}}) to be able to use the LangCache API. When you call the API, you need to pass the LangCache API key in the `Authorization` header as a Bearer token and the Cache ID as the `cacheId` path parameter. -See the [LangCache API and SDK examples]({{< relref "/develop/ai/langcache/api-examples" >}}) for more information on how to use the LangCache API. +See the [LangCache API and SDK examples]({{< relref "/develop/ai/context-engine/langcache/api-examples" >}}) for more information on how to use the LangCache API. diff --git a/content/operate/rc/langcache/view-edit-cache.md b/content/operate/rc/context-engine/langcache/view-edit-cache.md similarity index 92% rename from content/operate/rc/langcache/view-edit-cache.md rename to content/operate/rc/context-engine/langcache/view-edit-cache.md index 836bd45335..626b0e8d53 100644 --- a/content/operate/rc/langcache/view-edit-cache.md +++ b/content/operate/rc/context-engine/langcache/view-edit-cache.md @@ -9,9 +9,11 @@ hideListLinks: true linktitle: View and edit cache title: View and edit LangCache service weight: 15 +aliases: +- /operate/rc/langcache/view-edit-cache --- -After you have [created your first LangCache service]({{< relref "/operate/rc/langcache/create-service" >}}), selecting **LangCache** from the Redis Cloud Console menu will take you to the **LangCache Services** page. +After you have [created your first LangCache service]({{< relref "/operate/rc/context-engine/langcache/create-service" >}}), selecting **LangCache** from the Redis Cloud Console menu will take you to the **LangCache Services** page. This page displays a list of all LangCache services associated with your account. @@ -41,7 +43,7 @@ The **Connectivity** section provides the connection details for your LangCache Select the **Copy** button next to the Cache ID and API Base URL to copy them to the clipboard. If you lost the API key value or need to rotate the key, you can [generate a new service API key](#replace-service-api-key) at any time. -See [use the LangCache API]({{< relref "/operate/rc/langcache/use-langcache" >}}) for more information on how to use these values. +See [use the LangCache API]({{< relref "/operate/rc/context-engine/langcache/use-langcache" >}}) for more information on how to use these values. #### Generate a new service API key {#replace-service-api-key} @@ -127,4 +129,4 @@ Deleting the LangCache service is permanent and cannot be undone. ## Metrics tab -The **Metrics** tab provides a series of graphs showing performance data for your LangCache service. See [Monitor a LangCache service]({{< relref "/operate/rc/langcache/monitor-cache" >}}) for more information. \ No newline at end of file +The **Metrics** tab provides a series of graphs showing performance data for your LangCache service. See [Monitor a LangCache service]({{< relref "/operate/rc/context-engine/langcache/monitor-cache" >}}) for more information. \ No newline at end of file diff --git a/layouts/home.html b/layouts/home.html index 8349daa05d..e7120f288d 100644 --- a/layouts/home.html +++ b/layouts/home.html @@ -439,7 +439,7 @@

Run Redis in production