@nomyx/assistant
Version:
A powerful assistant library and cli for your AI projects. works with Vertex AI (Claude and Gemini)
64 lines (56 loc) • 2.17 kB
text/typescript
import { ChatMessage, ChatOptions } from '../types/chat';
import { ExtendedActionContext } from './types';
import { PromptAction } from './PromptAction';
import { evaluateCondition } from '../utils/conditionEvaluator';
export async function executePromptAction<I, O>(
promptAction: PromptAction<I, O>,
params: I,
context: ExtendedActionContext
): Promise<O> {
if (promptAction.routing && promptAction.routing.length > 0) {
for (const route of promptAction.routing) {
if (evaluateCondition(route.condition, { ...context.state, ...params })) {
if (typeof route.prompt === 'string') {
return context.executeAction!(route.prompt) as Promise<O>;
} else {
return executePromptAction(route.prompt, params, context);
}
}
}
// If no conditions are met, end execution
return null as unknown as O;
}
// Execute the current prompt if no routing or no conditions met
const messages: ChatMessage[] = [
{ role: 'system', content: promptAction.content },
{ role: 'user', content: JSON.stringify(params) }
];
const options: ChatOptions = {
...promptAction.options,
...promptAction.config
};
try {
const result = await context.aiProvider.chat(messages, options);
return result as O;
} catch (error) {
context.logger.error('Error executing prompt action:', error);
throw error;
}
}
// Export a test function to verify routing
export function testPromptRouting(promptAction: PromptAction<any, any>, params: any, context: ExtendedActionContext): string {
let result = 'Routing Test:\n';
if (promptAction.routing && promptAction.routing.length > 0) {
for (const route of promptAction.routing) {
const conditionMet = evaluateCondition(route.condition, { ...context.state, ...params });
result += `Condition "${route.condition}": ${conditionMet ? 'Met' : 'Not Met'}\n`;
if (conditionMet) {
result += `Routing to: ${typeof route.prompt === 'string' ? route.prompt : route.prompt.name}\n`;
break;
}
}
} else {
result += 'No routing defined. Executing current prompt.\n';
}
return result;
}