diff --git a/content/develop/ai/context-engine/_index.md b/content/develop/ai/context-engine/_index.md new file mode 100644 index 0000000000..413ae2e1e8 --- /dev/null +++ b/content/develop/ai/context-engine/_index.md @@ -0,0 +1,79 @@ +--- +alwaysopen: false +categories: +- docs +- develop +- ai +description: Redis Iris is a suite of fully-managed services that give AI agents the context engine they need to reliably act on business data. +hideListLinks: true +linktitle: Context engine +title: Context engine +weight: 30 +--- + +Context engine includes four services: + +- **[LangCache]({{< relref "/develop/ai/context-engine/langcache" >}})**: A semantic caching service that stores and reuses LLM responses for similar queries, reducing API costs and improving response latency. +- **[Agent Memory]({{< relref "/develop/ai/context-engine/agent-memory" >}})**: A persistent memory service that maintains short-term session memory and long-term memory across agent interactions. +- **[Context Retriever]({{< relref "/develop/ai/context-engine/context-retriever" >}})**: Turns your business data into structured tools that AI agents can safely and reliably use, defined once and reused across all agents. +- **[Data integration]({{< relref "/develop/ai/context-engine/data-integration" >}})**: Syncs live data from your existing relational databases into Redis Cloud so agents always have access to fresh, accurate business data. + +All four services are available on [Redis Cloud]({{< relref "/operate/rc/context-engine" >}}) using the REST API, with no database setup or management required. + +## LangCache + +[LangCache]({{< relref "/develop/ai/context-engine/langcache" >}}) uses semantic similarity to match incoming prompts against previously cached LLM responses. When LangCache finds a semantically similar response in the cache, it returns that response immediately without making an LLM call. + +**Key benefits:** + +- **Lower LLM costs**: Reduces redundant API calls for semantically equivalent queries. +- **Faster responses**: Serves cached answers in milliseconds instead of waiting for an LLM. +- **Managed embeddings**: LangCache handles embedding generation automatically. +- **Cache control**: Configure similarity thresholds, TTLs, and eviction policies. + +LangCache works well for AI assistants, chatbots, RAG applications, AI agents, and centralized AI gateway services. + +[Get started with LangCache]({{< relref "/develop/ai/context-engine/langcache" >}}) + +## Agent Memory + +[Redis Agent Memory]({{< relref "/develop/ai/context-engine/agent-memory" >}}) gives AI agents a structured, persistent memory layer using a two-tier model: + +- **Session memory** (short-term or working memory): Holds the current conversation state and session metadata, with configurable TTL-based expiration. +- **Long-term memory**: Stores information extracted from past sessions, including user preferences and learned patterns, as text with vector embeddings for semantic retrieval. + +Promotion from session memory to long-term memory is automatic and non-blocking. As a conversation progresses, the service asynchronously extracts and stores important information in the background, keeping agent interactions responsive. You can also create long-term memories directly using the API for bulk imports or external knowledge sources. + +Agent Memory is available as a REST API and Python SDK. + +[Get started with Redis Agent Memory]({{< relref "/develop/ai/context-engine/agent-memory" >}}) + +## Context Retriever + +Agents don't fail because they lack data. They fail because they don't know how to use it. Context Retriever turns your raw business data into structured tools that agents can reliably act on, without requiring each project to rediscover how your data works. + +You define your data model once, specifying the entities that matter (such as customers or orders) and the fields agents need. Context Retriever automatically generates the tools agents use to query and work with that data. Agents never access your database directly. They call the generated tools, and the system handles the rest. + +**Key benefits:** + +- **Define once, reuse everywhere**: Business context is captured once and shared across all agents. +- **Automatic tool generation**: Tools are generated from your data model, not hand-coded per agent. +- **Controlled access**: Each agent requires a key, and access tags automatically filter what data each agent can see. +- **Governed by design**: Agents can only use tools that have been explicitly defined, with no direct database access. + +[Get started with Context Retriever]({{< relref "/develop/ai/context-engine/context-retriever" >}}) + +## Data integration + +AI agents are only as reliable as the data they work with. [Redis Data Integration (RDI)]({{< relref "/operate/rc/databases/rdi" >}}) keeps your Redis Cloud database in sync with your existing relational databases, including Oracle, MySQL, PostgreSQL, and SQL Server, so agents always have access to current, accurate business data without querying slow primary databases directly. + +RDI uses a data pipeline that performs an initial sync of your source data into Redis, then captures changes in real time. Updates from your primary database appear in Redis within seconds, eliminating stale data and cache misses. Your agents interact only with Redis, which provides fast and predictable query performance. + +**Key benefits:** + +- **Always-fresh data**: Changes in your source database propagate to Redis within seconds. +- **No direct database access**: Agents query Redis, not your production databases. +- **Minimal setup**: No infrastructure to manage. Redis Cloud handles the pipeline. +- **Broad source support**: Works with Oracle, MySQL, PostgreSQL, MariaDB, SQL Server, and AWS Aurora. + +[Get started with Data integration]({{< relref "/develop/ai/context-engine/data-integration" >}}) diff --git a/content/develop/ai/context-engine/agent-memory/_index.md b/content/develop/ai/context-engine/agent-memory/_index.md new file mode 100644 index 0000000000..3f1a0ef61f --- /dev/null +++ b/content/develop/ai/context-engine/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: 20 +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 using 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 using 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/develop/ai/context-engine/agent-memory/api-examples.md b/content/develop/ai/context-engine/agent-memory/api-examples.md new file mode 100644 index 0000000000..7e28d426e6 --- /dev/null +++ b/content/develop/ai/context-engine/agent-memory/api-examples.md @@ -0,0 +1,138 @@ +--- +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 +--- + +Use the [Agent Memory API]({{< relref "/develop/ai/context-engine/agent-memory/api-reference" >}}) from your client app to store and retrieve agent memory information. + +You can use any standard REST client or library to access the API. If your app is written in Python, you can also use the [Agent Memory Software Development Kit](https://pypi.org/project/redis-agent-memory/) (SDK) to access the API. + +## Authentication + +To access the Agent Memory API, you need: + +- Agent Memory API endpoint +- an Agent Memory API user key +- a Store ID + +When you call the API, you need to pass the Agent Memory API key in the `Authorization` header as a Bearer token and the store ID as the `storeId` path parameter. + +For example: + +```sh +curl -s -X GET "https://$HOST/v1/stores/$STORE_ID/session-memory" \ + -H "accept: application/json" \ + -H "Authorization: Bearer $API_KEY" +``` + +This example expects several variables to be set in the shell: + +- **$HOST** - the Agent Memory API endpoint +- **$STORE_ID** - the Store ID of your Agent Memory service +- **$API_KEY** - The Agent Memory API token + +## Examples + +### Add session event + +Use [`POST /v1/stores/{storeId}/session-memory/events`]({{< relref "/develop/ai/context-engine/agent-memory/api-reference#tag/session-memory/operation/AddSessionEvent" >}}) to add an event to a session in short-term memory. If a session doesn't exist yet, it will be created. + +```json +POST /v1/stores/{storeId}/session-memory/events +{ + "sessionId": "abcd-efgh", + "actorId": "user-name", + "role": "USER", + "content": [ + { + "text": "I'm planning a trip to Japan next month." + } + ], + "createdAt": "2026-05-02T18:15:06Z", + "metadata": { + "browser": "Chrome", + "source": "web-chat" + } +} +``` + +Use this endpoint to store conversations between your users and your AI agent. You can use the `metadata` object to store additional metadata for your application. + +The Agent Memory model will automatically promote relevant short-term memories to long-term memory. + +### Add Long-term memories + +You may want to add one or more long-term memories to add specific preference information. + +Use [`POST /v1/stores/{storeId}/long-term-memory/`]({{< relref "/develop/ai/context-engine/agent-memory/api-reference#tag/long-term-memory/operation/BulkCreateLongTermMemories" >}}) to add one or more long-term memories to long-term memory storage. + +```json +POST /v1/stores/{storeId}/long-term-memory +{ + "memories": [ + { + "id": "cofIXpuMmg", + "text": "The user prefers vegetarian food.", + "memoryType": "episodic", + "sessionId": "abcd-efgh", + "ownerId": "user-name", + } + ] +} +``` + +### Search Long-term memories + +Use [`POST /v1/stores/{storeId}/long-term-memory/search`]({{< relref "/develop/ai/context-engine/agent-memory/api-reference#tag/long-term-memory/operation/SearchLongTermMemory" >}}) to search for long-term memories. + +```json +POST /v1/stores/{storeId}/long-term-memory/search +{ + "text": "user preferences", + "similarityThreshold": 0.48725898820184166, + "filter": { + "sessionId": { + "eq": "abcd-efgh" + }, + "ownerId": { + "in": [ + "user1", + "user2" + ] + } + }, + "filterOp": "any" +} +``` + +In the `filter` object of the request body, you can filter the search by any of the following values: + +| Filter | Data type | Definition | Supported operators | +|--------|----------|------------|---------------------| +| `sessionId` | string | The session ID the memory comes from. | `eq`, `ne`, `in`, `all` | +| `ownerId` | string | The owner ID of the memory. | `eq`, `ne`, `in`, `all` | +| `namespace` | string | The namespace of the memory. | `eq`, `ne`, `in`, `all` | +| `topics` | string | The topics of the memory. | `eq`, `ne`, `in`, `all` | +| `memoryType` | string | The type of memory (`semantic`, `episodic`, `message`). | `eq`, `ne`, `in`, `all` | +| `createdAt` | string (ISO 8601) | The timestamp when the memory was created. | `eq`, `gt`, `lt`, `gte`, `lte` | + +For all values, you must set only one of these operators: + +| Operator | Definition | +|----------|---------------------| +| `eq` | Returns memories with the value equal to the provided value. | +| `ne` | Returns memories where the value is not the provided value. | +| `in` | Returns memories where the value is one of a list of provided values. | +| `all` | Returns memories where the value matches all of the provided values. | +| `gt` | Returns memories where the value is greater than the provided value. | +| `lt` | Returns memories where the value is less than the provided value. | +| `gte` | Returns memories where the value is greater than or equal to the provided value. | +| `lte` | Returns memories where the value is less than or equal to the provided value. | \ No newline at end of file diff --git a/content/develop/ai/context-engine/agent-memory/api-reference.md b/content/develop/ai/context-engine/agent-memory/api-reference.md new file mode 100644 index 0000000000..b4ec2a4eaa --- /dev/null +++ b/content/develop/ai/context-engine/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/context-engine/agent-memory/api-reference/openapi-agent-memory.json b/content/develop/ai/context-engine/agent-memory/api-reference/openapi-agent-memory.json new file mode 100644 index 0000000000..1115d940b6 --- /dev/null +++ b/content/develop/ai/context-engine/agent-memory/api-reference/openapi-agent-memory.json @@ -0,0 +1,2913 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "MemoryDataPlaneServer", + "version": "1.0.0", + "description": "API for managing Redis Agent Memory (RAM) data plane operations.\n\nAuthentication:\n- Cloud deployments require `Authorization: Bearer `, where the store API key is obtained from [Redis Cloud Agent Memory](https://cloud.redis.io/#/agent-memory).\n- On-prem deployments run with authentication disabled.\n" + }, + "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" + } + } + } + } + }, + "tags": [ + "Service Health" + ] + } + }, + "/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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "201": { + "description": "BulkCreateLongTermMemories 201 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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The store instance ID." + }, + "required": true + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of sessions to return. Defaults to 100. Allowed range: 1-1000.", + "schema": { + "type": "integer", + "default": 100, + "maximum": 1000, + "minimum": 1, + "description": "Maximum number of sessions to return. Defaults to 100. Allowed range: 1-1000.", + "format": "int32" + } + }, + { + "name": "pageToken", + "in": "query", + "description": "Opaque token from a previous response for the next page.", + "schema": { + "type": "string", + "description": "Opaque token from a previous response for the next page." + } + } + ], + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "The store instance ID." + }, + "required": true + } + ], + "responses": { + "201": { + "description": "AddSessionEvent 201 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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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" + } + } + } + } + }, + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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": "string", + "description": "Client-supplied timestamp for when the event happened (UTC).", + "format": "date-time" + }, + "metadata": { + "description": "Optional metadata as any valid JSON value." + } + }, + "required": [ + "actorId", + "content", + "createdAt", + "role" + ] + }, + "AddSessionEventResponseContent": { + "type": "object", + "description": "Response returned after appending a session event.", + "properties": { + "event": { + "$ref": "#/components/schemas/SessionEvent" + } + }, + "required": [ + "event" + ] + }, + "AuthenticationErrorResponseContent": { + "type": "object", + "description": "Authentication credentials are missing, malformed, or invalid.", + "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", + "description": "Problem type URI for authentication errors.", + "enum": [ + "/errors/authentication-failed" + ] + }, + "BadRequestErrorResponseContent": { + "type": "object", + "description": "Request validation or input decoding failed.", + "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" + }, + "description": "Optional field-level validation errors." + } + }, + "required": [ + "status", + "title", + "type" + ] + }, + "BadRequestErrorType": { + "type": "string", + "description": "Problem type URI for bad request errors.", + "enum": [ + "/errors/invalid-data" + ] + }, + "BulkCreateLongTermMemoriesRequestContent": { + "type": "object", + "description": "Bulk create request for long-term memory records.", + "properties": { + "memories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateMemoryRecord" + }, + "maxItems": 100, + "minItems": 1, + "description": "List of memory records to create." + } + }, + "required": [ + "memories" + ] + }, + "BulkCreateLongTermMemoriesResponseContent": { + "type": "object", + "description": "Bulk create result for long-term memory records.", + "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). Client-provided for idempotent long-term memory creation." + }, + "description": "IDs of successfully created memory records. Always returned; empty when no records were created." + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkOperationError" + }, + "description": "Errors for memory records that failed to be created." + } + }, + "required": [ + "created" + ] + }, + "BulkDeleteLongTermMemoriesRequestContent": { + "type": "object", + "description": "Bulk delete request for long-term memory records.", + "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). Client-provided for idempotent long-term memory creation." + }, + "maxItems": 100, + "minItems": 1, + "description": "List of memory record IDs to delete (1-100 IDs)." + } + }, + "required": [ + "memoryIds" + ] + }, + "BulkDeleteLongTermMemoriesResponseContent": { + "type": "object", + "description": "Bulk delete result for long-term memory records.", + "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). Client-provided for idempotent long-term memory creation." + }, + "description": "IDs of successfully deleted memory records. Always returned; empty when no records were deleted." + }, + "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", + "maxLength": 50000, + "minLength": 1, + "description": "The memory content (1-50000 chars)." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "sessionId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session ID associated with this memory (1-64 chars, alphanumeric and dashes)." + }, + "ownerId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Owner ID associated with this memory (1-64 chars, alphanumeric and dashes)." + }, + "namespace": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping (1-64 chars, alphanumeric and dashes)." + }, + "topics": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "description": "Topic name (1-100 chars)." + }, + "maxItems": 50, + "description": "Topic tags for categorization (max 50 topics, each 1-100 chars)." + } + }, + "required": [ + "id", + "text" + ] + }, + "CreatedAtFilter": { + "type": "object", + "description": "Filter by creation timestamp.", + "properties": { + "gt": { + "type": "string", + "description": "After the given timestamp.", + "format": "date-time" + }, + "gte": { + "type": "string", + "description": "At or after the given timestamp.", + "format": "date-time" + }, + "lt": { + "type": "string", + "description": "Before the given timestamp.", + "format": "date-time" + }, + "lte": { + "type": "string", + "description": "At or before the given timestamp.", + "format": "date-time" + }, + "eq": { + "type": "string", + "description": "Exactly at the given timestamp.", + "format": "date-time" + } + } + }, + "FailedDependencyErrorResponseContent": { + "type": "object", + "description": "A dependent resource required to process the request is unavailable or unhealthy.", + "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", + "description": "Problem type URI for failed-dependency errors.", + "enum": [ + "/errors/resource-unavailable", + "/errors/database-out-of-memory" + ] + }, + "FieldError": { + "type": "object", + "description": "Validation error details for a single request field.", + "properties": { + "field": { + "type": "string", + "description": "Name of the invalid request field." + }, + "rule": { + "type": "string", + "description": "Validation rule that was violated." + }, + "message": { + "type": "string", + "description": "Human-readable validation error message." + } + }, + "required": [ + "field", + "message", + "rule" + ] + }, + "FilterConjunction": { + "type": "string", + "description": "Filter conjunction mode.", + "enum": [ + "all", + "any" + ] + }, + "ForbiddenErrorResponseContent": { + "type": "object", + "description": "The caller is authenticated but not allowed to access the requested resource.", + "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", + "description": "Problem type URI for authorization errors.", + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "description": "Topic name (1-100 chars)." + }, + "maxItems": 50, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the memory was created (UTC).", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the memory was last updated (UTC).", + "format": "date-time" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + }, + "GetSessionEventResponseContent": { + "type": "object", + "description": "Response containing a single requested session event.", + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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": { + "$ref": "#/components/schemas/HealthStatus" + } + }, + "required": [ + "status" + ] + }, + "HealthStatus": { + "type": "string", + "description": "Health status returned by the /health endpoint.", + "enum": [ + "healthy" + ] + }, + "ListSessionsResponseContent": { + "type": "object", + "description": "Paginated list of session IDs for a store.", + "properties": { + "items": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session identifier (1-64 chars, alphanumeric and dashes). When the server generates one, it uses a 32-character UUID without dashes." + }, + "description": "List of session IDs. Always returned; empty when the store has no sessions." + }, + "total": { + "type": "integer", + "description": "Total number of matching sessions.", + "format": "int32" + }, + "nextPageToken": { + "type": "string", + "description": "Opaque token for fetching the next page. Omitted when no more results." + } + }, + "required": [ + "items", + "total" + ] + }, + "LongTermMemoryFilter": { + "type": "object", + "description": "Grouping of filter conditions for long-term memory search.", + "properties": { + "sessionId": { + "$ref": "#/components/schemas/SessionIdFilter" + }, + "ownerId": { + "$ref": "#/components/schemas/OwnerIdFilter" + }, + "namespace": { + "$ref": "#/components/schemas/NamespaceFilter" + }, + "topics": { + "$ref": "#/components/schemas/TopicsFilter" + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryTypeFilter" + }, + "createdAt": { + "$ref": "#/components/schemas/CreatedAtFilter" + } + } + }, + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "description": "Topic name (1-100 chars)." + }, + "maxItems": 50, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the memory was created (UTC).", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the memory was last updated (UTC).", + "format": "date-time" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + }, + "MemoryType": { + "type": "string", + "description": "Type of long-term memory.", + "enum": [ + "semantic", + "episodic", + "message" + ] + }, + "MemoryTypeFilter": { + "type": "object", + "description": "Filter by memory type.", + "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." + } + } + }, + "MessageRole": { + "type": "string", + "description": "Message role for session events.", + "enum": [ + "USER", + "ASSISTANT", + "SYSTEM" + ] + }, + "NamespaceFilter": { + "type": "object", + "description": "Filter by namespace.", + "properties": { + "eq": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Equals the given value." + }, + "ne": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Not equal to the given value." + }, + "in": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping of long-term memory records (1-64 chars, alphanumeric and dashes)." + }, + "description": "Matches any of the given values." + }, + "all": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping of long-term memory records (1-64 chars, alphanumeric and dashes)." + }, + "description": "Matches all of the given values." + } + } + }, + "NotFoundErrorResponseContent": { + "type": "object", + "description": "The requested resource does not exist.", + "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", + "description": "Problem type URI for not-found errors.", + "enum": [ + "/errors/resource-not-found" + ] + }, + "OwnerIdFilter": { + "type": "object", + "description": "Filter by the long-term memory ownerId field.", + "properties": { + "eq": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Equals the given value." + }, + "ne": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Not equal to the given value." + }, + "in": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Actor/owner identifier (1-64 chars, alphanumeric and dashes). Used for users, agents, or other participants." + }, + "description": "Matches any of the given values." + }, + "all": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Actor/owner identifier (1-64 chars, alphanumeric and dashes). Used for users, agents, or other participants." + }, + "description": "Matches all of the given values." + } + } + }, + "PayloadTooLargeErrorResponseContent": { + "type": "object", + "description": "The request payload exceeds the maximum supported size.", + "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", + "description": "Problem type URI for payload-too-large errors.", + "enum": [ + "/errors/payload-too-large" + ] + }, + "SearchLongTermMemoryRequestContent": { + "type": "object", + "description": "Semantic search request for long-term memory records.", + "properties": { + "text": { + "type": "string", + "description": "Text to use for semantic search." + }, + "similarityThreshold": { + "type": "number", + "maximum": 1, + "minimum": 0, + "description": "The minimum similarity threshold for vector search results (normalized cosine similarity). Allowed range: 0-1.", + "format": "float" + }, + "filter": { + "$ref": "#/components/schemas/LongTermMemoryFilter" + }, + "filterOp": { + "$ref": "#/components/schemas/FilterConjunction" + }, + "limit": { + "type": "integer", + "default": 10, + "maximum": 100, + "minimum": 1, + "description": "Maximum number of results to return. Defaults to 10. Allowed range: 1-100.", + "format": "int32" + }, + "pageToken": { + "type": "string", + "description": "Opaque token from a previous response for the next page." + } + } + }, + "SearchLongTermMemoryResponseContent": { + "type": "object", + "description": "Semantic search result for long-term memory records.", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MemoryRecord" + }, + "description": "List of matching memory records. Always returned; empty when no records match." + }, + "nextPageToken": { + "type": "string", + "description": "Opaque token for fetching the next page. Omitted when no more results." + } + }, + "required": [ + "items" + ] + }, + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "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": "string", + "description": "Client-supplied timestamp for when the event happened (UTC).", + "format": "date-time" + }, + "systemTimestamp": { + "type": "string", + "description": "Server-set timestamp for when the dataplane ingested the event (UTC).", + "format": "date-time" + }, + "metadata": { + "description": "Optional metadata as any valid JSON value." + } + }, + "required": [ + "actorId", + "content", + "createdAt", + "eventId", + "role", + "sessionId", + "systemTimestamp" + ] + }, + "SessionIdFilter": { + "type": "object", + "description": "Filter by the long-term memory sessionId field.", + "properties": { + "eq": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Equals the given value." + }, + "ne": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Not equal to the given value." + }, + "in": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session identifier (1-64 chars, alphanumeric and dashes). When the server generates one, it uses a 32-character UUID without dashes." + }, + "description": "Matches any of the given values." + }, + "all": { + "type": "array", + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session identifier (1-64 chars, alphanumeric and dashes). When the server generates one, it uses a 32-character UUID without dashes." + }, + "description": "Matches all of the given values." + } + } + }, + "TimeoutErrorResponseContent": { + "type": "object", + "description": "The request timed out before the service could complete it.", + "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", + "description": "Problem type URI for timeout errors.", + "enum": [ + "/errors/timeout" + ] + }, + "TooManyRequestsErrorResponseContent": { + "type": "object", + "description": "The service rejected the request because rate limits were exceeded.", + "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", + "description": "Problem type URI for rate-limit errors.", + "enum": [ + "/errors/too-many-requests" + ] + }, + "TopicsFilter": { + "type": "object", + "description": "Filter by topics.", + "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." + } + } + }, + "UnexpectedErrorResponseContent": { + "type": "object", + "description": "The service failed with an unexpected internal error.", + "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", + "description": "Problem type URI for unexpected internal errors.", + "enum": [ + "/errors/unexpected-error" + ] + }, + "UpdateLongTermMemoryRequestContent": { + "type": "object", + "description": "Partial update request for a long-term memory record.", + "properties": { + "text": { + "type": "string", + "maxLength": 50000, + "minLength": 1, + "description": "Updated text content (1-50000 chars)." + }, + "memoryType": { + "$ref": "#/components/schemas/MemoryType" + }, + "topics": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "description": "Topic name (1-100 chars)." + }, + "maxItems": 50, + "description": "Updated topics (max 50 topics, each 1-100 chars)." + }, + "namespace": { + "type": "string", + "description": "Updated namespace. When provided, must be 1-64 chars alphanumeric and dashes; omit the field or send an empty string to clear." + }, + "ownerId": { + "type": "string", + "description": "Updated owner ID. When provided, must be 1-64 chars alphanumeric and dashes; omit the field or send an empty string to clear." + }, + "sessionId": { + "type": "string", + "description": "Updated session ID. When provided, must be 1-64 chars alphanumeric and dashes; omit the field or send an empty string to clear." + } + } + }, + "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", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Session ID associated with this memory." + }, + "ownerId": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Owner ID associated with this memory." + }, + "namespace": { + "type": "string", + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-zA-Z0-9-]+$", + "description": "Namespace for logical grouping." + }, + "topics": { + "type": "array", + "items": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "description": "Topic name (1-100 chars)." + }, + "maxItems": 50, + "description": "Topic tags for categorization." + }, + "createdAt": { + "type": "string", + "description": "Timestamp when the memory was created (UTC).", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp when the memory was last updated (UTC).", + "format": "date-time" + } + }, + "required": [ + "createdAt", + "id", + "text", + "updatedAt" + ] + } + } + } +} diff --git a/content/develop/ai/context-engine/context-retriever/_index.md b/content/develop/ai/context-engine/context-retriever/_index.md new file mode 100644 index 0000000000..57cc3a3f40 --- /dev/null +++ b/content/develop/ai/context-engine/context-retriever/_index.md @@ -0,0 +1,41 @@ +--- +Title: Redis Context Retriever +alwaysopen: false +categories: +- docs +- develop +- ai +description: Expose tools to Agents to query your Redis databases. +linkTitle: Context Retriever +hideListLinks: true +weight: 30 +bannerText: Redis Context Retriever is currently available in preview. Features and behavior are subject to change. +bannerChildren: true +--- + +Redis Context Retriever helps teams expose operational context to AI agents through schema-first retrieval. It models the entities, fields, keys, and relationships that matter to an agent workflow, then presents that context through a governed tool surface the agent can call at runtime. Context Retriever helps an AI Agent understand what business objects exist, how they connect, and which paths are safe to use. + +## Overview + +Production agents fail not because the model is wrong, but because the context layer breaks. Enterprise data can be fragmented across multiple different databases, and can be disorganized. Teams try to patch this with text-to-SQL, OpenAPI-to-MCP wrappers, or hand-built tools — which works for demos but creates tool zoo sprawl, SQL risk, and agents that can't reliably choose the right path in production. Redis Context Retriever gives teams a governed, schema-first surface agents can traverse safely. + +When you set up Redis Context Retriever, you model the objects that matter to your agent workflow and connect the relationships between them. You can do this either through the UI, using the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/), or the `ctxctl` CLI (available when you install the python client). Context Retriever will use those relationships to automatically create and deploy retrieval tools from your entity model. + +When an agent needs context during execution, it calls the MCP tools Context Retriever exposes. Instead of guessing which tool to use, or generating SQL, the agent follows the defined entity paths and gets back structured, live, operational context. + +## Get started with Redis Context Retriever + +Get started with Redis Context Retriever on Redis Cloud or join the private preview for Redis Software. + +{{< multitabs id="context-retriever-get-started" + tab1="Redis Cloud" + tab2="Redis Software (private preview)" >}} + +{{< embed-md "rc-context-retriever-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. + +{{< /multitabs >}} + diff --git a/content/develop/ai/context-engine/data-integration/_index.md b/content/develop/ai/context-engine/data-integration/_index.md new file mode 100644 index 0000000000..f2d6677396 --- /dev/null +++ b/content/develop/ai/context-engine/data-integration/_index.md @@ -0,0 +1,75 @@ +--- +Title: Redis Data Integration +alwaysopen: false +categories: +- docs +- develop +- ai +description: Keep Redis in sync with your primary databases so AI agents always have access to fresh, accurate business data. +linkTitle: Data Integration +hideListLinks: true +weight: 40 +--- + +Redis Data Integration (RDI) is a fully-managed data pipeline service that keeps your Redis Cloud database in sync with your existing relational databases in near real time. By streaming live data from your primary databases into Redis, RDI ensures that AI agents always have access to accurate, up-to-date business data without querying slow source databases directly. + +[Get started](#get-started) with RDI on [Redis Cloud]({{< relref "/operate/rc/databases/rdi" >}}) or explore the full [Redis Data Integration documentation]({{< relref "/integrate/redis-data-integration" >}}). + +## Redis Data Integration overview + +AI agents are only as reliable as the data they work with. RDI solves the freshness problem by using [Change Data Capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) to detect changes in your source database and propagate them to Redis within seconds. Agents interact only with Redis, which is fast, predictable, and always current. + +RDI pipelines run in two phases: + +- **Initial sync**: Reads a full snapshot of your source data and loads it into the target Redis database. +- **Streaming**: Captures changes as they happen and applies them to Redis within seconds of the source change. + +Data is transformed from relational rows into Redis hashes or JSON documents as part of the pipeline, with no coding required. You define what data to sync and how to map it using configuration, and RDI handles the rest. + +### Why agents need fresh data + +Without a reliable data pipeline, agents face two common failure modes: stale cached data that no longer reflects reality, or slow queries to source databases that block agent responsiveness. RDI eliminates both by maintaining a continuously updated Redis cache that agents can query at full Redis speed. + +## Key benefits + +- **Near real-time updates**: Changes in your source database reach Redis within seconds using CDC. +- **No direct database access**: Agents query Redis, not your production databases, preserving performance and security. +- **No coding required**: Define pipelines through configuration. Transformations are handled automatically. +- **Fully managed on Redis Cloud**: No infrastructure to provision or maintain. +- **High throughput**: Processes approximately 10,000 records per second per core for initial snapshots and streaming. +- **At-least-once delivery**: RDI guarantees every change in the defined dataset is delivered to Redis. + +## Supported source databases + +RDI supports the following source databases when used with Redis Cloud: + +| Database | Versions | +|----------|----------| +| Oracle | 19c, 21c | +| MySQL | 5.7, 8.0.x, 8.2 | +| PostgreSQL | 10–16 | +| MariaDB | 10.5, 11.4.3 | +| AWS Aurora PostgreSQL | 15 | +| SQL Server | 2017, 2019, 2022 | + +## Get started {#get-started} + +{{< multitabs id="rdi-get-started" + tab1="Redis Cloud" + tab2="Redis Enterprise" >}} + +RDI on Redis Cloud is available in preview for Redis Cloud Pro databases hosted on AWS. + +To get started: + +1. [Prepare your source database]({{< relref "/operate/rc/databases/rdi/setup" >}}) and configure credentials and connectivity. +2. [Define your data pipeline]({{< relref "/operate/rc/databases/rdi/define" >}}) by selecting which tables to sync and how to map them. +3. [View and manage your pipeline]({{< relref "/operate/rc/databases/rdi/view-edit" >}}) once it's running. + +See the [RDI Cloud quick start]({{< relref "/operate/rc/databases/rdi/quick-start" >}}) to get up and running quickly with a PostgreSQL source database. + +-tab-sep- + +RDI is also available for self-managed Redis Enterprise deployments. See the [Redis Data Integration documentation]({{< relref "/integrate/redis-data-integration" >}}) for full installation and configuration instructions. + +{{< /multitabs >}} diff --git a/content/develop/ai/langcache/_index.md b/content/develop/ai/context-engine/langcache/_index.md similarity index 93% rename from content/develop/ai/langcache/_index.md rename to content/develop/ai/context-engine/langcache/_index.md index b94af528cf..f78bb9f0b6 100644 --- a/content/develop/ai/langcache/_index.md +++ b/content/develop/ai/context-engine/langcache/_index.md @@ -8,14 +8,16 @@ categories: description: Store LLM responses for AI apps in a semantic cache. linkTitle: LangCache hideListLinks: true -weight: 30 +weight: 10 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-agent-memory-get-started.md b/content/embeds/rc-agent-memory-get-started.md new file mode 100644 index 0000000000..9985b31bf4 --- /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/context-engine/agent-memory/create-service" >}}) for your database on Redis Cloud. +3. [Use the Agent Memory API]({{< relref "/operate/rc/context-engine/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/context-engine/agent-memory/view-service" >}}). diff --git a/content/embeds/rc-context-retriever-get-started.md b/content/embeds/rc-context-retriever-get-started.md new file mode 100644 index 0000000000..0edf71243f --- /dev/null +++ b/content/embeds/rc-context-retriever-get-started.md @@ -0,0 +1,5 @@ +To set up a Redis Context Retriever on Redis Cloud, you need a database on Redis Cloud that already has relevant data. If you use a relational database, use [Redis Data Integration (RDI)]({{< relref "/operate/rc/databases/rdi" >}}) to ingest data into a Redis Cloud database. + +When you have a database, [Create a context retriever service]({{< relref "/operate/rc/context-engine/context-retriever/create-service" >}}) for your database on Redis Cloud. + +After you set up Context Retriever, you can [view your service]({{< relref "/operate/rc/context-engine/context-retriever/view-service" >}}). See the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/) for more information on how to call your tools. \ No newline at end of file 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/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/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/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/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/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/context-engine/agent-memory/_index.md b/content/operate/rc/context-engine/agent-memory/_index.md new file mode 100644 index 0000000000..25a47cc2c3 --- /dev/null +++ b/content/operate/rc/context-engine/agent-memory/_index.md @@ -0,0 +1,31 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Store agent memory for AI applications in Redis Cloud. +hideListLinks: true +linktitle: Agent Memory +title: Redis Agent Memory on Redis Cloud +weight: 36 +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 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/context-engine/agent-memory" >}}). + +## Get started with Agent Memory on Redis Cloud + +{{< embed-md "rc-agent-memory-get-started.md" >}} diff --git a/content/operate/rc/context-engine/agent-memory/create-service.md b/content/operate/rc/context-engine/agent-memory/create-service.md new file mode 100644 index 0000000000..fac407bb57 --- /dev/null +++ b/content/operate/rc/context-engine/agent-memory/create-service.md @@ -0,0 +1,108 @@ +--- +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 +--- + +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. + +## Prerequisites and 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 an 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 an 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/context-engine/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/context-engine/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** | Defines the time-to-live (TTL) of your agent's **long-term memory**. 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 an 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/context-engine/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/context-engine/agent-memory/use-agent-memory" >}}) from your client app. + +You can also [view and edit the service]({{< relref "/operate/rc/context-engine/agent-memory/view-service" >}}). \ No newline at end of file diff --git a/content/operate/rc/context-engine/agent-memory/use-agent-memory.md b/content/operate/rc/context-engine/agent-memory/use-agent-memory.md new file mode 100644 index 0000000000..e24eb4bab6 --- /dev/null +++ b/content/operate/rc/context-engine/agent-memory/use-agent-memory.md @@ -0,0 +1,28 @@ +--- +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 on Redis Cloud +weight: 10 +--- + +You can use the [Agent Memory API and SDK]({{< relref "/develop/ai/context-engine/agent-memory/api-examples" >}}) from your client app to store and retrieve working and long-term memory for AI agents. + +To access the Agent Memory API, you need: + +- Agent Memory API endpoint +- Agent Memory service API key +- Store ID + +For Agent Memory on Redis Cloud, the endpoint and Store ID are available in the Agent Memory service's **Configuration** page in the [**General settings** section]({{< relref "/operate/rc/context-engine/agent-memory/view-service#general-settings" >}}). + +The Agent Memory API key is only available immediately after you create the service API key. If you lost this value, you will need to [generate a new service API key]({{< relref "/operate/rc/context-engine/agent-memory/view-service#replace-service-api-key" >}}) to be able to use the Agent Memory API. + +When you call the API, you need to pass the Agent Memory API key in the `Authorization` header as a Bearer token and the Store ID as the `storeId` path parameter. + +See the [Agent Memory API and SDK examples]({{< relref "/develop/ai/context-engine/agent-memory/api-examples" >}}) for more information on how to use the Agent Memory API. diff --git a/content/operate/rc/context-engine/agent-memory/view-service.md b/content/operate/rc/context-engine/agent-memory/view-service.md new file mode 100644 index 0000000000..f02c772478 --- /dev/null +++ b/content/operate/rc/context-engine/agent-memory/view-service.md @@ -0,0 +1,137 @@ +--- +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 +--- + +After you have [created your first Agent Memory service]({{< relref "/operate/rc/context-engine/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/context-engine/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. + +| Metric | Description | +|--------|-------------| +| Short-term Memory Latency | The average time to process a Short-term memory (or Session memory) lookup request. | +| Long-term Memory Latency | The average time to process a Long-term memory lookup request. | + +## 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/content/operate/rc/context-engine/context-retriever/_index.md b/content/operate/rc/context-engine/context-retriever/_index.md new file mode 100644 index 0000000000..e77eb6115e --- /dev/null +++ b/content/operate/rc/context-engine/context-retriever/_index.md @@ -0,0 +1,26 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Expose schema-first retrieval tools from your Redis Cloud data to AI agents. +hideListLinks: true +linktitle: Context Retriever +title: Redis Context Retriever on Redis Cloud +weight: 37 +bannerText: Redis Context Retriever on Redis Cloud is currently available in preview. Features and behavior are subject to change. +bannerChildren: true +--- + +Redis Context Retriever helps teams expose operational context to AI agents through schema-first retrieval. It models the entities, fields, keys, and relationships that matter to an agent workflow, then presents that context through a governed tool surface the agent can call at runtime. Context Retriever helps an AI agent understand what business objects exist, how they connect, and which paths are safe to use. + +When you set up Redis Context Retriever, you model the objects that matter to your agent workflow and connect the relationships between them. You can do this through the UI, the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/), or the `ctxctl` CLI (available when you install the Python client). Context Retriever uses those relationships to automatically create and deploy retrieval tools from your entity model. + +When an agent needs context during execution, it calls the MCP tools Context Retriever exposes. Instead of guessing which tool to use or generating SQL, the agent follows the defined entity paths and gets back structured, live, operational context. + +For more details, see the [Redis Context Retriever overview]({{< relref "/develop/ai/context-engine/context-retriever" >}}). + +## Get started with Context Retriever on Redis Cloud + +{{< embed-md "rc-context-retriever-get-started.md" >}} diff --git a/content/operate/rc/context-engine/context-retriever/create-service.md b/content/operate/rc/context-engine/context-retriever/create-service.md new file mode 100644 index 0000000000..b41dfe2c0c --- /dev/null +++ b/content/operate/rc/context-engine/context-retriever/create-service.md @@ -0,0 +1,114 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: Create a Context Retriever service in Redis Cloud to expose schema-first retrieval tools to AI agents. +hideListLinks: true +linktitle: Create service +title: Create a Context Retriever service +weight: 5 +--- + +Redis Context Retriever helps teams expose operational context to AI agents through schema-first retrieval. This guide walks you through creating and configuring a Context Retriever service in Redis Cloud. + +## Prerequisites and limitations + +To create a Redis Context Retriever service, you will need a Redis Cloud database that already has relevant data. If you don't have one, see [Create a database]({{< relref "/operate/rc/databases/create-database" >}}). If your source data lives in a relational database, use [Redis Data Integration (RDI)]({{< relref "/operate/rc/databases/rdi" >}}) to ingest it into a Redis Cloud database first. + +{{< note >}} +Agent Memory does not support the following databases during public preview: +- [Redis Flex]({{< relref "operate/rc/databases/create-database/create-flex-database">}}) databases +- [Active-Active]({{< relref "/operate/rc/databases/active-active" >}}) databases +{{< /note >}} + +## Create a Context Retriever service + +From the [Redis Cloud console](https://cloud.redis.io/), select **Context Retriever** from the left-hand menu. + +If you have not already created a Context Retriever service, you'll see a page with an introduction to Context Retriever. Otherwise, select **New service** to go to the Context Retriever introduction page. + +{{The New service button.}} + +From here, you can either: + +- Select **Get started** to follow a step-by-step guide using the `ctxctl` CLI, which is installed with the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/). +- Select **Create custom service** to manually configure your own context retriever settings. + +For this guide, select **Create custom service**. + +### 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 Context Retriever 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. | +| **Description** | Enter a description for your context retriever. | + +Select **Entities** to continue. + +### Define entities + +In the **Define Entities** step, you'll define the objects that Context Retriever will use to generate retrieval tools. + +{{The Entities section.}} + +Select **Add Entity** to add an entity. + +{{The Entity table with the Entity Name, Key template, and description.}} + +- In the **Entity name** field, enter the name of one of the business objects that is in your database. + + For example, your database might have a bunch of product information with keys like `product:1` or `product:2`. In this case, the entity name would be "Product". + +- In the **Key Template** field, enter the key template for your entity. Use `{id}` to denote where in the key pattern the ID is located. + + For the example above, the key template would be `product:{id}`. + +- You can also enter a description to describe the entity. + +- Select the checkmark to confirm the entity. + +After you are done adding all of the entities, select **Fields** to continue. + +### Configure fields + +In the **Configure fields** step, you'll define the fields of each entity and the relationships between them. + +From here, you can either: + +- Select **Auto-detect fields** to scan your database automatically using a model that will detect the fields for you. + + You'll need to agree to let the model scan your key names and schemas to automatically populate the fields. + + {{< note >}} +If you use Auto-detect fields, make sure that the fields and relationships that the model generates are accurate. + {{< /note >}} + +- Select **Manually enter fields** to manually enter the fields yourself. + +{{The Configure fields step.}} + +Expand each entry to view the currently defined fields for that entry. Select **Add field** to add a field. + +{{The Add field table.}} + +- Enter the field name in the **Field** cell. +- Select the **PK** checkbox if the field is a primary key. You must have at least one primary key. +- If the field is related to any other defined entities, select it from the **Related Entity** dropdown. This is usually set if the field contains primary keys of another entity. For example, you might have an +- Select the field's **Type** from the dropdown. +- In the **Index** cell, select one or more index types to enable searching and filtering on that field. +- You can also add a description in the **Description** cell. + +After you set all fields for all of your entities, select **Create** to create your Context Retriever service. + +## Next steps + +After your service is created, you can call the MCP tools Context Retriever exposes from your agent. See the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/) for more information on how to call your tools. + +You can also [view your service]({{< relref "/operate/rc/context-engine/context-retriever/view-service" >}}). diff --git a/content/operate/rc/context-engine/context-retriever/view-admin-keys.md b/content/operate/rc/context-engine/context-retriever/view-admin-keys.md new file mode 100644 index 0000000000..5e9ada1cc6 --- /dev/null +++ b/content/operate/rc/context-engine/context-retriever/view-admin-keys.md @@ -0,0 +1,62 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: View and manage Context Retriever admin keys in Redis Cloud. +hideListLinks: true +linktitle: View admin keys +title: View and manage Context Retriever admin keys +weight: 25 +--- + +After you have [created your first Context Retriever service]({{< relref "/operate/rc/context-engine/context-retriever/create-service" >}}), you can view and manage your admin keys from the **Admin keys** tab in the **Context Retriever** section of the Redis Cloud console. + +A Context Retriever **admin key** authorizes administrative operations against Context Retriever in your Redis Cloud account, such as creating, updating, or deleting services and their entity models. You can use it with the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/) and `cxtctl` CLI to create an Agent key and call your tools. + +## Admin keys tab + +From the [Redis Cloud console](https://cloud.redis.io/), select **Context Retriever** from the left-hand menu, then select the **Admin keys** tab. + +{{The Admin keys tab showing the list of admin keys.}} + +This tab shows a list of all admin keys associated with Context Retriever in your account. Here, you can generate a new admin key or remove any keys that are no longer in use. You can generate or remove admin keys at any time. + +| Column | Description | +|:-------|:------------| +| **Name** | The name you assigned to the admin key when you created it. | +| **Value** | An abbreviated value of the admin key. | +| **Created** | The date and time the admin key was generated. | + +## Generate a new admin key + +To generate a new admin key: + +1. Select **New admin key**. + + {{The New admin key button.}} + +1. Enter a name for your admin key. + + {{The Add admin key window.}} + +1. Select **Generate key** to generate your new admin key. + +1. The new key will appear in a dialog box. Select **Copy** to copy the key to the clipboard. + + {{The Context Retriever admin key window. Use the Copy button to save the admin key to the clipboard.}} + + {{}} +This is the only time the value of the admin key is available. Save it to a secure location before closing the dialog box.

+ +If you lose the admin key value, you will need to generate a new admin key. + {{
}} + +## Delete an admin key + +To delete an admin key, select the **Delete admin key** button next to the key you want to remove. + +{{Delete button.}} + +Deleting an admin key immediately revokes any administrative operations that rely on it. This action cannot be undone. diff --git a/content/operate/rc/context-engine/context-retriever/view-service.md b/content/operate/rc/context-engine/context-retriever/view-service.md new file mode 100644 index 0000000000..d2c296b6a6 --- /dev/null +++ b/content/operate/rc/context-engine/context-retriever/view-service.md @@ -0,0 +1,78 @@ +--- +alwaysopen: false +categories: +- docs +- operate +- rc +description: View and manage your Context Retriever service in Redis Cloud. +hideListLinks: true +linktitle: View service +title: View and manage Context Retriever service +weight: 15 +--- + +After you have [created your first Context Retriever service]({{< relref "/operate/rc/context-engine/context-retriever/create-service" >}}), selecting **Context Retriever** from the Redis Cloud Console menu will take you to the **Context Retriever Services** page. + +This page displays a list of all Context Retriever services associated with your account. + +{{The Context Retriever service in the Context Retriever service list.}} + +Select your Context Retriever service from the list to view the service's details. + +## Overview tab + +The **Overview** tab lets you view the details of your Context Retriever service. It contains the following sections: + +- The **Details** section provides the connection details and general settings for your Context Retriever service. +- The **Entities** section shows the entities, fields, and relationships that Context Retriever exposes as tools. +- The **Tools** section shows which tools are available to Agents. +- The **Actions** section lets you delete your Context Retriever service. + +### Details + +The **Details** section provides general settings for your Context Retriever service. + +{{The General settings for the Context Retriever service.}} + +| Setting name | Description | +|:-------------|:------------| +| **Description** | The description of your Context Retriever service. | +| **Created** | The creation date for your service. | +| **Updated** | The date your service was last updated. | + +### Entities + +The **Entities** section shows the entities, fields, and relationships that Context Retriever uses to generate retrieval tools. + +{{The Entities section for the Context Retriever service.}} + +Expand each entity to view its fields, primary keys, related entities, types, and indexes. + +### Tools + +The **Tools** section shows the tools that are available to your Agents. + +{{The Entities section for the Context Retriever service.}} + +You can use your Agents to call your tools. For more information, see the [Context Surfaces Python Client](https://pypi.org/project/context-surfaces/) + +### Actions + +The **Actions** section lets you delete your Context Retriever service. + +{{The actions for the Context Retriever service.}} + +#### Delete service + +Deleting your Context Retriever service permanently removes the service configuration, its entity model, and the generated tools. It also immediately terminates all API keys associated with the service. Data stored in the underlying Redis Cloud database remains unaffected. + +To delete your Context Retriever 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 Context Retriever service is permanent and cannot be undone. + 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/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. 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