import { SUPPORTED_AI_PROVIDERS, createAIModel, aiProps } from '@activepieces/common-ai';
import { createAction, Property } from '@activepieces/pieces-framework';
import { LanguageModel, generateText } from 'ai';
export const askAI = createAction({
name: 'askAi',
displayName: 'Ask AI',
description: 'Generate text using AI providers',
props: {
// AI provider selection (OpenAI, Anthropic, etc.)
provider: aiProps({ modelType: 'language' }).provider,
// Model selection within the chosen provider
model: aiProps({ modelType: 'language' }).model,
prompt: Property.LongText({
displayName: 'Prompt',
required: true,
}),
creativity: Property.Number({
displayName: 'Creativity',
required: false,
defaultValue: 100,
description: 'Controls the creativity of the AI response (0-100)',
}),
maxTokens: Property.Number({
displayName: 'Max Tokens',
required: false,
defaultValue: 2000,
}),
},
async run(context) {
const providerName = context.propsValue.provider as string;
const modelInstance = context.propsValue.model as LanguageModel;
// The `createAIModel` function creates a standardized AI model instance compatible with the AI SDK:
const baseURL = `${context.server.apiUrl}v1/ai-providers/proxy/${providerName}`;
const engineToken = context.server.token;
const provider = createAIModel({
providerName, // Provider name (e.g., 'openai', 'anthropic')
modelInstance, // Model instance with configuration
engineToken, // Authentication token
baseURL, // Proxy URL for API requests
});
// Generate text using the AI SDK
const response = await generateText({
model: provider, // AI provider instance
messages: [
{
role: 'user',
content: context.propsValue.prompt,
},
],
maxTokens: context.propsValue.maxTokens, // Limit response length
temperature: (context.propsValue.creativity ?? 100) / 100, // Control randomness (0-1)
headers: {
'Authorization': `Bearer ${engineToken}`, // Required for proxy authentication
},
});
return response.text ?? '';
},
});