From 88c4848ab6ccfb99dd91ff59904880f08dbd2e12 Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Sun, 25 Jan 2026 05:15:40 +1000 Subject: [PATCH] fix(omega): resolve module import crash and improve error handling - Move @ai-sdk/devtools import to lazy dynamic import to prevent module load failures in production environment - Add try-catch around response.json() in client to handle non-JSON error responses gracefully - Display proper error message when server returns non-JSON response --- .../conversations/[id]/messages/route.ts | 22 ++++++++++++------- .../src/app/omega/[conversationId]/page.tsx | 12 ++++++++-- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/apps/web/src/app/api/omega/conversations/[id]/messages/route.ts b/apps/web/src/app/api/omega/conversations/[id]/messages/route.ts index 28866c0..ce70aa8 100644 --- a/apps/web/src/app/api/omega/conversations/[id]/messages/route.ts +++ b/apps/web/src/app/api/omega/conversations/[id]/messages/route.ts @@ -13,7 +13,6 @@ import { Prisma, prisma } from '@tpmjs/db'; import { registryExecuteTool } from '@tpmjs/registry-execute'; import { registrySearchTool } from '@tpmjs/registry-search'; import { jsonSchema, wrapLanguageModel, type ModelMessage } from 'ai'; -import { devToolsMiddleware } from '@ai-sdk/devtools'; import { type NextRequest, NextResponse } from 'next/server'; import { z } from 'zod'; import { authenticateRequest } from '~/lib/api-keys/middleware'; @@ -21,10 +20,16 @@ import { decryptApiKey } from '~/lib/crypto/api-keys'; import { buildSystemPrompt } from '~/lib/omega/system-prompt'; import { checkRateLimit, type RateLimitConfig } from '~/lib/rate-limit'; -// Initialize devtools middleware once at module level (only used in development) -const devtools = process.env.NODE_ENV === 'development' ? devToolsMiddleware() : null; -if (devtools) { - console.log('[Omega] AI SDK DevTools middleware initialized'); +// Devtools middleware - lazy loaded only in development +let devtools: ReturnType | null = null; +async function getDevtools() { + if (process.env.NODE_ENV !== 'development') return null; + if (!devtools) { + const { devToolsMiddleware } = await import('@ai-sdk/devtools'); + devtools = devToolsMiddleware(); + console.log('[Omega] AI SDK DevTools middleware initialized'); + } + return devtools; } /** @@ -566,11 +571,12 @@ Remember: Your value is in EXECUTING tools to get real results, not just describ const baseModel = openai('gpt-4.1-mini'); // Wrap with devtools middleware in development - const model = devtools - ? wrapLanguageModel({ model: baseModel, middleware: devtools }) + const devtoolsMiddleware = await getDevtools(); + const model = devtoolsMiddleware + ? wrapLanguageModel({ model: baseModel, middleware: devtoolsMiddleware }) : baseModel; - if (devtools) { + if (devtoolsMiddleware) { console.log('[Omega] Model wrapped with DevTools middleware'); } diff --git a/apps/web/src/app/omega/[conversationId]/page.tsx b/apps/web/src/app/omega/[conversationId]/page.tsx index af7feca..fa906f5 100644 --- a/apps/web/src/app/omega/[conversationId]/page.tsx +++ b/apps/web/src/app/omega/[conversationId]/page.tsx @@ -215,8 +215,16 @@ export default function OmegaChatPage(): React.ReactElement { }); if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.error || 'Failed to send message'); + // Handle non-JSON error responses gracefully + let errorMessage = 'Failed to send message'; + try { + const errorData = await response.json(); + errorMessage = errorData.error || errorMessage; + } catch { + // Response body isn't valid JSON - use status text + errorMessage = `Server error: ${response.status} ${response.statusText}`; + } + throw new Error(errorMessage); } // Handle SSE stream