Spaces:
Running
Running
import { type ActionFunctionArgs } from '@remix-run/cloudflare'; | |
//import { StreamingTextResponse, parseStreamPart } from 'ai'; | |
import { streamText } from '~/lib/.server/llm/stream-text'; | |
import { stripIndents } from '~/utils/stripIndent'; | |
import type { IProviderSetting, ProviderInfo } from '~/types/model'; | |
export async function action(args: ActionFunctionArgs) { | |
return enhancerAction(args); | |
} | |
function parseCookies(cookieHeader: string) { | |
const cookies: any = {}; | |
// Split the cookie string by semicolons and spaces | |
const items = cookieHeader.split(';').map((cookie) => cookie.trim()); | |
items.forEach((item) => { | |
const [name, ...rest] = item.split('='); | |
if (name && rest) { | |
// Decode the name and value, and join value parts in case it contains '=' | |
const decodedName = decodeURIComponent(name.trim()); | |
const decodedValue = decodeURIComponent(rest.join('=').trim()); | |
cookies[decodedName] = decodedValue; | |
} | |
}); | |
return cookies; | |
} | |
async function enhancerAction({ context, request }: ActionFunctionArgs) { | |
const { message, model, provider } = await request.json<{ | |
message: string; | |
model: string; | |
provider: ProviderInfo; | |
apiKeys?: Record<string, string>; | |
}>(); | |
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'); | |
// Parse the cookie's value (returns an object or null if no cookie exists) | |
const apiKeys = JSON.parse(parseCookies(cookieHeader || '').apiKeys || '{}'); | |
const providerSettings: Record<string, IProviderSetting> = JSON.parse( | |
parseCookies(cookieHeader || '').providers || '{}', | |
); | |
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 \`<original_prompt>\` 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. | |
<original_prompt> | |
${message} | |
</original_prompt> | |
`, | |
}, | |
], | |
env: context.cloudflare.env, | |
apiKeys, | |
providerSettings, | |
}); | |
return new Response(result.textStream, { | |
status: 200, | |
headers: { | |
'Content-Type': 'text/plain; charset=utf-8', | |
}, | |
}); | |
} 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', | |
}); | |
} | |
} | |