import { type ActionFunctionArgs } from '@remix-run/cloudflare'; import { streamText } from '~/lib/.server/llm/stream-text'; import { stripIndents } from '~/utils/stripIndent'; import type { ProviderInfo } from '~/types/model'; import { getApiKeysFromCookie, getProviderSettingsFromCookie } from '~/lib/api/cookies'; export async function action(args: ActionFunctionArgs) { return enhancerAction(args); } async function enhancerAction({ context, request }: ActionFunctionArgs) { const { message, model, provider } = await request.json<{ message: string; model: string; provider: ProviderInfo; apiKeys?: Record; }>(); const { name: providerName } = provider; // validate 'model' and 'provider' fields if (!model || typeof model !== 'string') { throw new Response('Invalid or missing model', { status: 400, statusText: 'Bad Request', }); } if (!providerName || typeof providerName !== 'string') { throw new Response('Invalid or missing provider', { status: 400, statusText: 'Bad Request', }); } const cookieHeader = request.headers.get('Cookie'); const apiKeys = getApiKeysFromCookie(cookieHeader); const providerSettings = getProviderSettingsFromCookie(cookieHeader); try { const result = await streamText({ messages: [ { role: 'user', content: `[Model: ${model}]\n\n[Provider: ${providerName}]\n\n` + stripIndents` You are a professional prompt engineer specializing in crafting precise, effective prompts. Your task is to enhance prompts by making them more specific, actionable, and effective. I want you to improve the user prompt that is wrapped in \`\` tags. For valid prompts: - Make instructions explicit and unambiguous - Add relevant context and constraints - Remove redundant information - Maintain the core intent - Ensure the prompt is self-contained - Use professional language For invalid or unclear prompts: - Respond with clear, professional guidance - Keep responses concise and actionable - Maintain a helpful, constructive tone - Focus on what the user should provide - Use a standard template for consistency IMPORTANT: Your response must ONLY contain the enhanced prompt text. Do not include any explanations, metadata, or wrapper tags. ${message} `, }, ], env: context.cloudflare?.env as any, apiKeys, providerSettings, }); return new Response(result.textStream, { status: 200, headers: { 'Content-Type': 'text/event-stream', Connection: 'keep-alive', 'Cache-Control': 'no-cache', 'Text-Encoding': 'chunked', }, }); } catch (error: unknown) { console.log(error); if (error instanceof Error && error.message?.includes('API key')) { throw new Response('Invalid or missing API key', { status: 401, statusText: 'Unauthorized', }); } throw new Response(null, { status: 500, statusText: 'Internal Server Error', }); } }