diff --git a/package-lock.json b/package-lock.json index f82aea4..ab3edcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,11 @@ "version": "1.1.2", "license": "ISC", "dependencies": { - "@ai-sdk/google": "^3.0.8", - "@ai-sdk/google-vertex": "^4.0.15", - "@ai-sdk/openai": "^3.0.10", - "@ai-sdk/openai-compatible": "^2.0.10", - "@ai-sdk/react": "^3.0.37", + "@ai-sdk/google": "^3.0.9", + "@ai-sdk/google-vertex": "^4.0.16", + "@ai-sdk/openai": "^3.0.11", + "@ai-sdk/openai-compatible": "^2.0.11", + "@ai-sdk/react": "^3.0.39", "@dotenvx/dotenvx": "^1.51.4", "@e2b/code-interpreter": "^2.3.3", "@emotion/react": "^11.14.0", @@ -79,6 +79,7 @@ "ai-sdk-ollama": "^3.1.1", "ai-sdk-provider-claude-code": "^3.2.1", "ai-sdk-provider-gemini-cli": "^2.0.1", + "ai-sdk-provider-opencode-sdk": "^1.0.0", "arraystat": "^1.7.81", "axios-retry": "^4.5.0", "bottleneck": "^2.19.5", @@ -204,7 +205,7 @@ "eslint-plugin-react-refresh": "^0.4.26", "ink-testing-library": "^4.0.0", "mastra": "^1.0.0-beta.14", - "prettier": "^3.7.4", + "prettier": "^3.8.0", "tailwindcss": "^4.1.18", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", @@ -255,13 +256,13 @@ } }, "node_modules/@ai-sdk/anthropic": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.13.tgz", - "integrity": "sha512-62UqSpZWuR8pU2ZLc1IgPYiNdH01blAcaNEjrQtx4wCN7L2fUTXm/iG6Tq9qRCiRED+8eQ43olggbf0fbguqkA==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-3.0.14.tgz", + "integrity": "sha512-71BaVg60FM6tN0JaRY7kRb/6qZtHi5R9PFF3NES+kqonY3nVD4PCPP8DoMb/tqxC7f/XezlCqsHrveT2mGfi3A==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", - "@ai-sdk/provider-utils": "4.0.6" + "@ai-sdk/provider-utils": "4.0.7" }, "engines": { "node": ">=18" @@ -283,9 +284,9 @@ } }, "node_modules/@ai-sdk/anthropic/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -317,13 +318,13 @@ } }, "node_modules/@ai-sdk/google": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.8.tgz", - "integrity": "sha512-HiDetkn01f8ibcu6atygkPXsy6YgNA2uNz2bwgn6xHQQB1FsCCjDo8ylPA2EvaUbNypmD7oPj0zObDgwfE25Ug==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.9.tgz", + "integrity": "sha512-whRdK0gCZL92UbEHdmQ6edm3cp5ZZSqwE79AIvTEaJR+BeaMUJchTxz/I5w9l3EHGOiDxrKYssklqO3z45KGXg==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", - "@ai-sdk/provider-utils": "4.0.6" + "@ai-sdk/provider-utils": "4.0.7" }, "engines": { "node": ">=18" @@ -333,15 +334,15 @@ } }, "node_modules/@ai-sdk/google-vertex": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.15.tgz", - "integrity": "sha512-5QV5bAFABSJBY60PSzJGemGifAYiqOeYvlVoRisi406EbLu6srUKUk89OAVQowQ/62G90JTbvuTY+EzoySv4Tw==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@ai-sdk/google-vertex/-/google-vertex-4.0.16.tgz", + "integrity": "sha512-paY4NGCaqMbd0kssK27ssTMggDybNPIFudJ99QsdzRDJ/Kgo0EjeXZn7G/CoBY/Snmf0fA0PEZW34yV9kloFCQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "3.0.13", - "@ai-sdk/google": "3.0.8", + "@ai-sdk/anthropic": "3.0.14", + "@ai-sdk/google": "3.0.9", "@ai-sdk/provider": "3.0.3", - "@ai-sdk/provider-utils": "4.0.6", + "@ai-sdk/provider-utils": "4.0.7", "google-auth-library": "^10.5.0" }, "engines": { @@ -364,9 +365,9 @@ } }, "node_modules/@ai-sdk/google-vertex/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -393,9 +394,9 @@ } }, "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -410,13 +411,13 @@ } }, "node_modules/@ai-sdk/openai": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.10.tgz", - "integrity": "sha512-G6HJORN0rKuCFrqIUiYchjl2b4UjzKvv3VcNuW7xwQIdI8EcdB9Pr8ZaR9nEImK9E639nM8gCfvFEUM1xwGaCA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.11.tgz", + "integrity": "sha512-nX7Egt9EJtvImiq1D88sZCOlfAIJgKJGa987ptp40hJRp7CQ4snBLnEHt344m2tqB0LIpzdc53l02o+LlYsM2A==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", - "@ai-sdk/provider-utils": "4.0.6" + "@ai-sdk/provider-utils": "4.0.7" }, "engines": { "node": ">=18" @@ -426,13 +427,13 @@ } }, "node_modules/@ai-sdk/openai-compatible": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.10.tgz", - "integrity": "sha512-dM+CXjW3+QAZVl2NKhch9T5gCa8p7CMJR16KtaRS9HzY8H/ASD8hiAssnDGz00XyOKYpDkd9Mj2mwK25u5LxnQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.11.tgz", + "integrity": "sha512-6rbJyCs9m/jDSe9UuDXJ2gWaETzGXdJmnoi49sbW63r1DcHISkY/rkImG7ISnoE+GUw3DjqVzQ/2ELELTu5w8w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", - "@ai-sdk/provider-utils": "4.0.6" + "@ai-sdk/provider-utils": "4.0.7" }, "engines": { "node": ">=18" @@ -454,9 +455,9 @@ } }, "node_modules/@ai-sdk/openai-compatible/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -483,9 +484,9 @@ } }, "node_modules/@ai-sdk/openai/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -615,13 +616,13 @@ } }, "node_modules/@ai-sdk/react": { - "version": "3.0.37", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.37.tgz", - "integrity": "sha512-xTOC3UXZ4xwv59DX1IniZQxyA31tjyqqRG2Yv87/O7xSurhY+kNXQnrwlpHPVe0b8YGkjXQTz3jF+KcJO5+zTg==", + "version": "3.0.39", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.39.tgz", + "integrity": "sha512-Q/39hAazwxItCbqEDWC4pa3+HXLVvTzeu/zu7ghANqRNCxzmqBb/GYEIU/wiYNRS05hP6R1l9bA9S4U6sx0iTA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "4.0.6", - "ai": "6.0.35", + "@ai-sdk/provider-utils": "4.0.7", + "ai": "6.0.37", "swr": "^2.2.5", "throttleit": "2.1.0" }, @@ -645,9 +646,9 @@ } }, "node_modules/@ai-sdk/react/node_modules/@ai-sdk/provider-utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.6.tgz", - "integrity": "sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "3.0.3", @@ -8063,6 +8064,12 @@ "node": ">= 20" } }, + "node_modules/@opencode-ai/sdk": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.1.21.tgz", + "integrity": "sha512-4M6lBjRPlPz99Rb5rS5ZqKrb0UDDxOT9VTG06JpNxvA7ynTd8C50ckc2NGzWtvjarmxfaAk1VeuBYN/cq2pIKQ==", + "license": "MIT" + }, "node_modules/@openrouter/ai-sdk-provider": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.5.4.tgz", @@ -17013,6 +17020,52 @@ "zod": "^3.25 || ^4" } }, + "node_modules/ai-sdk-provider-opencode-sdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-opencode-sdk/-/ai-sdk-provider-opencode-sdk-1.0.0.tgz", + "integrity": "sha512-6FZwW+J57U6Xx+KTBNqaBnoCwVzP6fMZMzwYEt5tblKHz/K9wckvPflzD0B2KGDu1ta+7UlR41ftC7muFyQodQ==", + "license": "MIT", + "dependencies": { + "@ai-sdk/provider": "^3.0.0", + "@ai-sdk/provider-utils": "^4.0.1", + "@opencode-ai/sdk": "^1.0.207" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ai-sdk-provider-opencode-sdk/node_modules/@ai-sdk/provider": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.3.tgz", + "integrity": "sha512-qGPYdoAuECaUXPrrz0BPX1SacZQuJ6zky0aakxpW89QW1hrY0eF4gcFm/3L9Pk8C5Fwe+RvBf2z7ZjDhaPjnlg==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ai-sdk-provider-opencode-sdk/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.7.tgz", + "integrity": "sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.3", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -30414,9 +30467,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" diff --git a/package.json b/package.json index 7ccd64d..8be2070 100644 --- a/package.json +++ b/package.json @@ -45,11 +45,11 @@ "node": ">=20.9.0" }, "dependencies": { - "@ai-sdk/google": "^3.0.8", - "@ai-sdk/google-vertex": "^4.0.15", - "@ai-sdk/openai": "^3.0.10", - "@ai-sdk/openai-compatible": "^2.0.10", - "@ai-sdk/react": "^3.0.37", + "@ai-sdk/google": "^3.0.9", + "@ai-sdk/google-vertex": "^4.0.16", + "@ai-sdk/openai": "^3.0.11", + "@ai-sdk/openai-compatible": "^2.0.11", + "@ai-sdk/react": "^3.0.39", "@dotenvx/dotenvx": "^1.51.4", "@e2b/code-interpreter": "^2.3.3", "@emotion/react": "^11.14.0", @@ -115,6 +115,7 @@ "ai-sdk-ollama": "^3.1.1", "ai-sdk-provider-claude-code": "^3.2.1", "ai-sdk-provider-gemini-cli": "^2.0.1", + "ai-sdk-provider-opencode-sdk": "^1.0.0", "arraystat": "^1.7.81", "axios-retry": "^4.5.0", "bottleneck": "^2.19.5", @@ -240,7 +241,7 @@ "eslint-plugin-react-refresh": "^0.4.26", "ink-testing-library": "^4.0.0", "mastra": "^1.0.0-beta.14", - "prettier": "^3.7.4", + "prettier": "^3.8.0", "tailwindcss": "^4.1.18", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", @@ -262,4 +263,4 @@ "@typescript-eslint/parser": "^8.53.0", "zod": "^4.2.1" } -} \ No newline at end of file +} diff --git a/src/mastra/agents/researchAgent.ts b/src/mastra/agents/researchAgent.ts index 0d08095..0c76fd7 100644 --- a/src/mastra/agents/researchAgent.ts +++ b/src/mastra/agents/researchAgent.ts @@ -28,12 +28,13 @@ import { htmlToMarkdownTool, webScraperTool } from '../tools/web-scraper-tool' import { InternalSpans } from '@mastra/core/observability' type UserTier = 'free' | 'pro' | 'enterprise' +type ResearchPhase = 'initial' | 'followup' | 'validation' export interface ResearchRuntimeContext { 'user-tier': UserTier language: 'en' | 'es' | 'ja' | 'fr' // Optional runtime fields the server middleware may populate userId?: string - researchPhase?: 'initial' | 'followup' | 'validation' | string + researchPhase?: ResearchPhase } log.info('Initializing Research Agent...') diff --git a/src/mastra/config/convex.ts b/src/mastra/config/convex.ts index ca195d4..7219a97 100644 --- a/src/mastra/config/convex.ts +++ b/src/mastra/config/convex.ts @@ -1,13 +1,62 @@ import { ConvexStore, ConvexVector } from '@mastra/convex' +import { ModelRouterEmbeddingModel } from '@mastra/core/llm' +import { Memory } from '@mastra/memory' -const storage = new ConvexStore({ +const storageCon = new ConvexStore({ id: 'convex-storage', deploymentUrl: process.env.CONVEX_URL!, adminAuthToken: process.env.CONVEX_ADMIN_KEY!, }) -const vectorStore = new ConvexVector({ +const vectorCon = new ConvexVector({ id: 'convex-vectors', - deploymentUrl: 'https://your-project.convex.cloud', - adminAuthToken: 'your-admin-token', + deploymentUrl: process.env.CONVEX_URL!, + adminAuthToken: process.env.CONVEX_ADMIN_KEY!, +}) + +export const convexMemory = new Memory({ + storage: storageCon, + vector: vectorCon, // Using PgVector with flat for 3072 dimension embeddings (gemini-embedding-001) + embedder: new ModelRouterEmbeddingModel('google/gemini-embedding-001'), + options: { + // Message management + lastMessages: parseInt(process.env.MEMORY_LAST_MESSAGES ?? '500'), + generateTitle: true, + // Advanced semantic recall with HNSW index configuration + semanticRecall: { + topK: parseInt(process.env.SEMANTIC_TOP_K ?? '5'), + messageRange: { + before: parseInt(process.env.SEMANTIC_RANGE_BEFORE ?? '3'), + after: parseInt(process.env.SEMANTIC_RANGE_AFTER ?? '2'), + }, + scope: 'resource', // 'resource' | 'thread' + // HNSW index configuration to support high-dimensional embeddings (>2000 dimensions) + indexConfig: { + // type: 'ivfflat', // flat index type (supports dimensions > 4000, unlike HNSW limit of 2000) + // metric: 'cosine', // Distance metric for normalized embeddings + // ivf: { lists: 3200 }, // IVFFlat configuration + }, + threshold: 0.75, // Similarity threshold for semantic recall + // indexName: 'memory_messages_3072', // Index name for semantic recall + }, + // Enhanced working memory with supported template + workingMemory: { + enabled: true, + scope: 'resource', // 'resource' | 'thread' + // version: 'vnext', + template: `# User Context +## Profile +- Name/Role: +- Org/Loc: +- Style/Level: +## Active +- Goals/Projects: +- Recent/Deadlines: +## Insights +- Patterns/Habits: +- Session Focus: +- Action Items: +`, + }, + }, }) diff --git a/src/mastra/config/gemini-cli.ts b/src/mastra/config/gemini-cli.ts index 5d1a38a..e42540e 100644 --- a/src/mastra/config/gemini-cli.ts +++ b/src/mastra/config/gemini-cli.ts @@ -1,6 +1,6 @@ import { createGeminiProvider } from 'ai-sdk-provider-gemini-cli' -import { logError } from './logger' -import os from 'os' +import { log } from './logger' + const useApiKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY !== undefined || @@ -20,23 +20,28 @@ export const geminiCliModels = { contextWindow: 1048576, // 1MB maxTokens: 65536, supportsStreaming: true, - thinkingBudget: -1, - showThoughts: true, - codeexecution: true, - structuredOutput: true, - functionCalling: true, - urlContext: true, + verbose: true, // Enable debug logging + logger: log, // Custom logger (or false to disable) + thinkingConfig: { + thinkingBudget: -1, + showThoughts: true, + }, }), gemini3Pro: gemini('gemini-3-pro-preview', { contextWindow: 1048576, // 1MB maxTokens: 65536, supportsStreaming: true, - thinkingBudget: -1, - showThoughts: true, + thinkingConfig: { + thinkingLevel: 'medium', // 'low' | 'medium' | 'high' | 'minimal' + thinkingBudget: -1, + showThoughts: true, + }, codeexecution: true, structuredOutput: true, functionCalling: true, urlContext: true, + verbose: true, // Enable debug logging + logger: log, // Custom logger (or false to disable) }), // Flash models for speed @@ -44,9 +49,13 @@ export const geminiCliModels = { contextWindow: 1048576, // 1MB maxTokens: 65536, supportsStreaming: true, - thinkingBudget: -1, + thinkingConfig: { + thinkingBudget: -1, + showThoughts: true, + }, + verbose: true, // Enable debug logging + logger: log, // Custom logger (or false to disable) codeexecution: true, - showThoughts: true, structuredOutput: true, grounding: true, functionCalling: true, @@ -56,13 +65,12 @@ export const geminiCliModels = { contextWindow: 1048576, // 1MB maxTokens: 64000, supportsStreaming: true, - thinkingBudget: -1, - showThoughts: true, - //codeexecution: true, - structuredOutput: true, - grounding: true, - functionCalling: true, - urlContext: true, + thinkingConfig: { + thinkingBudget: -1, + showThoughts: false, + }, + verbose: true, // Enable debug logging + logger: log, // Custom logger (or false to disable) }), // Image generation models diff --git a/src/mastra/config/google.ts b/src/mastra/config/google.ts index 3ffd72a..5ae0ac9 100644 --- a/src/mastra/config/google.ts +++ b/src/mastra/config/google.ts @@ -20,25 +20,26 @@ export const voice = new GoogleVoice({ // Chat/Text Models export const googleChatModels = { // Gemini 3 Pro model for higher-performance applications - gemini3Pro: google.languageModel('gemini-3-pro-preview'), + gemini3Pro: google.chat('gemini-3-pro-preview'), // Gemini 3 Flash model - gemini3Flash: google.languageModel('gemini-3-flash-preview'), + gemini3Flash: google.chat('gemini-3-flash-preview'), // Gemini 2.5 Pro model for higher-performance applications - gemini25Pro: google.languageModel('gemini-2.5-pro'), + gemini25Pro: google.chat('gemini-2.5-pro'), // Gemini 2.5 Flash model for general-purpose applications - gemini25Flash: google.languageModel('gemini-2.5-flash-preview-09-2025'), + gemini25Flash: google.chat('gemini-2.5-flash-preview-09-2025'), // Gemini 2.5 Flash Lite model for free-tier applications - gemini25FlashLite: google.languageModel('gemini-2.5-flash-lite-preview-09-2025'), + gemini25FlashLite: google.chat('gemini-2.5-flash-lite-preview-09-2025'), // Gemini Computer Use model for tasks requiring higher accuracy and reliability - gemini25ComputerUse: google.languageModel('gemini-2.5-computer-use-preview-10-2025'), + gemini25ComputerUse: google.chat('gemini-2.5-computer-use-preview-10-2025'), // Additional variants - gemini25FlashAlt: google.languageModel('gemini-2.5-flash-preview-09-2025'), + gemini25FlashAlt: google.chat('gemini-2.5-flash-preview-09-2025'), + //gemini: ('google/gemini-2.5-flash-preview-09-2025'), } // Image Generation Models export const googleImageModels = { // Gemini Flash Image model - gemini25FlashImage: google.languageModel('gemini-2.5-flash-image'), + gemini25FlashImage: google.chat('gemini-2.5-flash-image'), // gemini3ProImage: google('gemini-3-pro-image-preview'), // Imagen 4.0 models imagen4Generate: google.image('imagen-4.0-generate-001'), diff --git a/src/mastra/config/lance.ts b/src/mastra/config/lance.ts index bfb3bcf..2b7c486 100644 --- a/src/mastra/config/lance.ts +++ b/src/mastra/config/lance.ts @@ -13,11 +13,11 @@ import { ModelRouterEmbeddingModel } from '@mastra/core/llm' // Configuration constants const LANCE_CONFIG = { dbPath: process.env.LANCE_DB_PATH ?? '/tmp/lance_db', - tableName: process.env.LANCE_TABLE_NAME ?? 'governed_rag', + tableName: process.env.LANCE_TABLE_NAME ?? 'mastra_vectors', // Google Gemini gemini-embedding-001 supports flexible dimensions: 128-3072 // Recommended: 768, 1536, 3072 embeddingDimension: parseInt( - process.env.LANCE_EMBEDDING_DIMENSION ?? '1536' + process.env.LANCE_EMBEDDING_DIMENSION ?? '3072' ), embeddingModel: new ModelRouterEmbeddingModel('google/gemini-embedding-001'), } as const @@ -73,36 +73,15 @@ export const lanceMemory = new Memory({ enabled: true, scope: 'resource', // 'resource' | 'thread' version: 'vnext', // Enable the improved/experimental tool - template: `# User Profile & Context - ## Personal Information - - **Name**: [To be learned] - - **Role/Title**: [To be learned] - - **Organization**: [To be learned] - - **Location**: [To be learned] - - **Time Zone**: [To be learned] - - ## Communication Preferences - - **Preferred Communication Style**: [To be learned] - - **Response Length Preference**: [To be learned] - - **Technical Level**: [To be learned] - - ## Current Context - - **Active Projects**: [To be learned] - - **Current Goals**: [To be learned] - - **Recent Activities**: [To be learned] - - **Pain Points**: [To be learned] - - ## Long-term Memory - - **Key Achievements**: [To be learned] - - **Important Relationships**: [To be learned] - - **Recurring Patterns**: [To be learned] - - **Preferences & Habits**: [To be learned] - - ## Session Notes - - **Today's Focus**: [To be learned] - - **Outstanding Questions**: [To be learned] - - **Action Items**: [To be learned] - - **Follow-ups Needed**: [To be learned] + template: `# Assistant Working Memory +## Session Notes + - **Today's Focus**: + - **Outstanding Questions**: + - **Action Items**: + - **Follow-ups Needed**: +## NotePad +[Dynamic notes taken during the conversation will be summarized here. This is your personal scratchpad to jot down important points, ideas, or reminders.] + - `, }, }, diff --git a/src/mastra/config/mongodb.ts b/src/mastra/config/mongodb.ts index a665bc4..fd43105 100644 --- a/src/mastra/config/mongodb.ts +++ b/src/mastra/config/mongodb.ts @@ -17,7 +17,7 @@ import { ModelRouterEmbeddingModel } from '@mastra/core/llm' const MONGODB_CONFIG = { uri: process.env.MONGODB_URI ?? 'mongodb://localhost:27017', dbName: process.env.MONGODB_DATABASE ?? 'AgentStack', - collectionName: process.env.MONGODB_COLLECTION ?? 'governed_rag', + collectionName: process.env.MONGODB_COLLECTION ?? 'mastra_vectors', // Google Gemini gemini-embedding-001 supports flexible dimensions: 128-3072 // Recommended: 768, 1536, 3072 embeddingDimension: parseInt( diff --git a/src/mastra/config/opencode.ts b/src/mastra/config/opencode.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/mastra/index.ts b/src/mastra/index.ts index a274c94..843be98 100644 --- a/src/mastra/index.ts +++ b/src/mastra/index.ts @@ -18,7 +18,7 @@ import { pgVector } from './config/pg-storage' // MCP import { a2aCoordinatorMcpServer, codingA2AMcpServer } from './mcp' import { notesMCP } from './mcp/server' - +import type { GoogleGenerativeAIProviderOptions } from '@ai-sdk/google' // A2A Coordinator import { a2aCoordinatorAgent } from './a2a/a2aCoordinatorAgent' @@ -152,6 +152,7 @@ import { researchCompletenessScorer, sourceDiversityScorer, } from './evals/scorers/custom-scorers' +import type { OpenAIResponsesProviderOptions } from '@ai-sdk/openai' export const mastra = new Mastra({ workflows: { weatherWorkflow, @@ -432,8 +433,12 @@ export const mastra = new Mastra({ }, maxSteps: 50, includeRawChunks: true, + providerOptions: { + google: {} as GoogleGenerativeAIProviderOptions, + openai: {} as OpenAIResponsesProviderOptions, // Use an instance of RequestContext (not the class) so the route has a proper context per request // requestContext: new RequestContext() + } }, sendStart: true, sendFinish: true,