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
This commit is contained in:
Ajax Davis 2026-01-25 05:15:40 +10:00
parent bfd45341bb
commit 88c4848ab6
2 changed files with 24 additions and 10 deletions

View file

@ -13,7 +13,6 @@ import { Prisma, prisma } from '@tpmjs/db';
import { registryExecuteTool } from '@tpmjs/registry-execute'; import { registryExecuteTool } from '@tpmjs/registry-execute';
import { registrySearchTool } from '@tpmjs/registry-search'; import { registrySearchTool } from '@tpmjs/registry-search';
import { jsonSchema, wrapLanguageModel, type ModelMessage } from 'ai'; import { jsonSchema, wrapLanguageModel, type ModelMessage } from 'ai';
import { devToolsMiddleware } from '@ai-sdk/devtools';
import { type NextRequest, NextResponse } from 'next/server'; import { type NextRequest, NextResponse } from 'next/server';
import { z } from 'zod'; import { z } from 'zod';
import { authenticateRequest } from '~/lib/api-keys/middleware'; 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 { buildSystemPrompt } from '~/lib/omega/system-prompt';
import { checkRateLimit, type RateLimitConfig } from '~/lib/rate-limit'; import { checkRateLimit, type RateLimitConfig } from '~/lib/rate-limit';
// Initialize devtools middleware once at module level (only used in development) // Devtools middleware - lazy loaded only in development
const devtools = process.env.NODE_ENV === 'development' ? devToolsMiddleware() : null; let devtools: ReturnType<typeof import('@ai-sdk/devtools').devToolsMiddleware> | null = null;
if (devtools) { async function getDevtools() {
console.log('[Omega] AI SDK DevTools middleware initialized'); 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'); const baseModel = openai('gpt-4.1-mini');
// Wrap with devtools middleware in development // Wrap with devtools middleware in development
const model = devtools const devtoolsMiddleware = await getDevtools();
? wrapLanguageModel({ model: baseModel, middleware: devtools }) const model = devtoolsMiddleware
? wrapLanguageModel({ model: baseModel, middleware: devtoolsMiddleware })
: baseModel; : baseModel;
if (devtools) { if (devtoolsMiddleware) {
console.log('[Omega] Model wrapped with DevTools middleware'); console.log('[Omega] Model wrapped with DevTools middleware');
} }

View file

@ -215,8 +215,16 @@ export default function OmegaChatPage(): React.ReactElement {
}); });
if (!response.ok) { if (!response.ok) {
const errorData = await response.json(); // Handle non-JSON error responses gracefully
throw new Error(errorData.error || 'Failed to send message'); 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 // Handle SSE stream