メインコンテンツへ移動

Convex ストレージ

Convex ストレージ実装は、リアルタイム同期と自動キャッシュを備えたフルスタック TypeScript 開発プラットフォームである Convex を使用し、サーバーレスストレージを提供します。

Observability は未サポート

Convex ストレージは observability ドメインをサポートしていませんMastraStorageExporter のトレースを Convex に永続化できず、Convex を唯一のストレージ Provider とした場合、Studio の observability 機能は動作しません。observability を有効にするには、複合ストレージを使用し、observability データを ClickHouse などの対応 Provider にルーティングしてください。

レコードサイズの上限

Convex では、レコードの最大サイズが 1 MiB に制限されます。画像など、base64 エンコードされた添付ファイルを含むメッセージを保存すると、この上限を超える場合があります。S3、Cloudflare R2、Convex file storage などの外部ストレージへ添付ファイルをアップロードする回避策については、大きな添付ファイルの処理を参照してください。

インストール
インストールへの直接リンク

npm install @mastra/convex@latest

Convex のセットアップ
Convex のセットアップへの直接リンク

ConvexStore を使用する前に、Convex プロジェクトで Convex スキーマとストレージハンドラーを設定します。 次のスキーマ例には、ConvexStoreConvexServerCache の完全なセットアップが含まれます。ConvexStore だけを使用する場合は、mastraCacheTablemastraCacheListItemsTable を省略してください。ConvexServerCache を使用する場合は、これらのテーブルを含めてキャッシュハンドラーを作成します。

1. Convex スキーマを設定する
1. Convex スキーマを設定するへの直接リンク

convex/schema.ts で次のように設定します。

import { defineSchema } from 'convex/server'
import {
mastraThreadsTable,
mastraMessagesTable,
mastraResourcesTable,
mastraWorkflowSnapshotsTable,
mastraScoresTable,
mastraObservationalMemoryTable,
mastraVectorIndexesTable,
mastraVectorsTable,
mastraCacheTable,
mastraCacheListItemsTable,
mastraDocumentsTable,
} from '@mastra/convex/schema'

export default defineSchema({
mastra_threads: mastraThreadsTable,
mastra_messages: mastraMessagesTable,
mastra_resources: mastraResourcesTable,
mastra_workflow_snapshots: mastraWorkflowSnapshotsTable,
mastra_scorers: mastraScoresTable,
mastra_observational_memory: mastraObservationalMemoryTable,
mastra_vector_indexes: mastraVectorIndexesTable,
mastra_vectors: mastraVectorsTable,
mastra_cache: mastraCacheTable,
mastra_cache_list_items: mastraCacheListItemsTable,
mastra_documents: mastraDocumentsTable,
})

2. ストレージハンドラーを作成する
2. ストレージハンドラーを作成するへの直接リンク

convex/mastra/storage.ts で次のように設定します。

import { mastraStorage } from '@mastra/convex/server'

export const handle = mastraStorage

ConvexServerCache を使用する場合は、convex/mastra/cache.ts を作成します。

import { mastraCache } from '@mastra/convex/server'

export const handle = mastraCache

3. Convex にデプロイする
3. Convex にデプロイするへの直接リンク

npx convex dev
# or for production
npx convex deploy

使用方法
使用方法への直接リンク

import { ConvexServerCache, ConvexStore } from '@mastra/convex'

const storage = new ConvexStore({
id: 'convex-storage',
deploymentUrl: process.env.CONVEX_URL!,
adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
})

const cache = new ConvexServerCache({
deploymentUrl: process.env.CONVEX_URL!,
adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
})

ConvexStore のパラメーター
ConvexStore のパラメーターへの直接リンク

deploymentUrl:

string
Convex のデプロイ URL(例: https://your-project.convex.cloud)

adminAuthToken:

string
バックエンドアクセス用の Convex 管理者認証トークン

storageFunction?:

string
= mastra/storage:handle
ストレージ mutation 関数へのパス(デフォルト: 'mastra/storage:handle')

ConvexServerCache のパラメーター
ConvexServerCache のパラメーターへの直接リンク

deploymentUrl:

string
Convex のデプロイ URL(例: https://your-project.convex.cloud)

adminAuthToken:

string
バックエンドアクセス用の Convex 管理者認証トークン

cacheFunction?:

string
= mastra/cache:handle
ConvexServerCache のキャッシュ mutation 関数へのパス(デフォルト: 'mastra/cache:handle')

requestTimeoutMs?:

number
= 30000
Convex キャッシュ mutation リクエストのタイムアウト(ミリ秒)。0 にするとクライアント側のタイムアウトを無効にします。

keyPrefix?:

string
= mastra:cache:
ConvexServerCache のキーに適用するプレフィックス。clear() は、保存されたプレフィックスがこの値と完全に一致する行を削除します。

ttlMs?:

number
= 300000
ConvexServerCache のデフォルト TTL(ミリ秒)。0 にすると有効期限を無効にします。

コンストラクターの例
コンストラクターの例への直接リンク

import { ConvexServerCache, ConvexStore } from '@mastra/convex'

// Basic configuration
const store = new ConvexStore({
id: 'convex-storage',
deploymentUrl: 'https://your-project.convex.cloud',
adminAuthToken: 'your-admin-token',
})

// With custom storage function path
const storeCustom = new ConvexStore({
id: 'convex-storage',
deploymentUrl: 'https://your-project.convex.cloud',
adminAuthToken: 'your-admin-token',
storageFunction: 'custom/path:handler',
})

// Server cache for durable stream replay and response caching
const cache = new ConvexServerCache({
deploymentUrl: 'https://your-project.convex.cloud',
adminAuthToken: 'your-admin-token',
cacheFunction: 'mastra/cache:handle',
})

サーバーキャッシュ
サーバーキャッシュへの直接リンク

ConvexServerCache は、Convex を使用して Mastra のサーバーキャッシュ規約を実装します。再開可能な durable Agent ストリーム、Workflow ストリームのリプレイ、レスポンスキャッシュなどの機能で、永続的なキャッシュ状態が必要な場合に使用します。

ConvexServerCache は、リストエントリを個別の Convex ドキュメントとして保存します。これにより、1つのドキュメント内でストリームリプレイリストが肥大化することを防ぎ、Convex のレコードサイズ上限内に収めやすくなります。

各スカラーキャッシュ値と各リスト項目は1つの Convex 行として保存されるため、Convex の行サイズ上限内に収める必要があります。非常に大きなリストでは、範囲をリプレイする際に Convex のクエリ上限も適用されます。

キャッシュのクリーンアップと clear() は、サイズを制限したバッチで実行されます。1回のクライアント呼び出しで最大1,000件の Convex mutation をループでき、各 mutation は最大25件のリスト項目を処理します。clear() がキーをクリーンアップしている間、そのキーの読み取りでは完了まで空の結果が返る場合があります。

非常に大きなキャッシュ名前空間では、長時間実行されるクリーンアップを避けるため、段階的にクリアするか、より限定的なプレフィックスを使用してください。

バッチクリーンアップ中、キャッシュメタデータが一時的に内部の deleted 状態になる場合があります。次のクリーンアップ処理でこれらの行が削除されます。clear() が完了するまで、同じプレフィックスで新しい値を書き込まないでください。

clear() は、保存された keyPrefix が設定済みの keyPrefix と完全に一致する行だけを削除します。文字列の前方一致でネストしたプレフィックスをクリアすることはありません。各 listPush() は、キャッシュに設定された ttlMs を使用してリストの TTL を更新します。

clear() ですべてのキャッシュキーを意図的に削除する場合を除き、空でない keyPrefix を使用してください。期限切れのリスト行は読み書き中に段階的に回収されます。clear() は、対象プレフィックスのすべての行を削除します。

ConvexServerCache は、中程度の頻度で発生するイベントの永続的なリプレイに適しています。高頻度のトークンストリームでは、イベントをバッチ化するか、より低レイテンシーのキャッシュバックエンドを使用してください。

ConvexServerCache は、分散 pub/sub トランスポートの代わりにはなりません。アプリでプロセスをまたぐリアルタイムのイベント配信が必要な場合は、本番用の pub/sub バックエンドを別途設定してください。

補足事項
補足事項への直接リンク

スキーマ管理
スキーマ管理への直接リンク

このストレージ実装は、Mastra の各ドメインに型付き Convex テーブルを使用します。

ドメインConvex テーブル用途
Threadsmastra_threads会話スレッド
Messagesmastra_messagesチャットメッセージ
Resourcesmastra_resourcesユーザーの working memory
Observational Memorymastra_observational_memoryobservational memory の生成結果
Workflowsmastra_workflow_snapshotsWorkflow の状態
Scorersmastra_scorers評価データ
Cachemastra_cacheキャッシュ値、カウンター、リストのメタデータ
Cache Itemsmastra_cache_list_itemsキャッシュリストのエントリ
Fallbackmastra_documents不明なテーブル

Observational memory
Observational memoryへの直接リンク

ConvexStoreobservational memory をサポートします。有効にするには、Convex スキーマに mastraObservationalMemoryTable を追加し、npx convex deploy で再デプロイします。このテーブルが追加される前に作成された既存デプロイでも、同じスキーマ更新が必要です。

アーキテクチャ
アーキテクチャへの直接リンク

すべての型付きテーブルに次の項目が含まれます。

  • Mastra のレコード ID 用の id フィールド(Convex が自動生成する _id とは異なります)
  • Mastra ID で効率的に検索するための by_record_id インデックス

この設計により、Convex の自動インデックスとリアルタイム機能を活用しながら、Mastra のストレージ規約との互換性を確保します。

環境変数
環境変数への直接リンク

デプロイ用に次の環境変数を設定します。

  • CONVEX_URL: Convex のデプロイ URL
  • CONVEX_ADMIN_KEY: 管理者認証トークン(Convex ダッシュボードから取得)