Files
ALwrity/frontend/src/api/personaApi.ts

172 lines
4.5 KiB
TypeScript

/**
* Persona API Client
* Handles communication with the persona generation backend services.
*/
import { apiClient } from './client';
export interface PersonaGenerationRequest {
onboarding_data: {
websiteAnalysis?: any;
competitorResearch?: any;
sitemapAnalysis?: any;
businessData?: any;
researchPreferences?: any;
deepCompetitorAnalysis?: any;
};
selected_platforms: string[];
user_preferences?: any;
}
export interface PersonaGenerationResponse {
success: boolean;
core_persona?: any;
platform_personas?: Record<string, any>;
quality_metrics?: any;
error?: string;
}
export interface PersonaQualityRequest {
core_persona: any;
platform_personas: Record<string, any>;
user_feedback?: any;
}
export interface PersonaQualityResponse {
success: boolean;
quality_metrics?: any;
recommendations?: string[];
error?: string;
}
export interface PersonaOptions {
success: boolean;
available_platforms: Array<{
id: string;
name: string;
description: string;
}>;
persona_types: string[];
quality_metrics: string[];
}
/**
* Generate AI writing personas using the sophisticated persona system.
*/
export const generateWritingPersonas = async (
request: PersonaGenerationRequest
): Promise<PersonaGenerationResponse> => {
try {
const response = await apiClient.post('/api/onboarding/step4/generate-personas', request);
return response.data;
} catch (error: any) {
console.error('Error generating personas:', error);
return {
success: false,
error: error.response?.data?.detail || error.message || 'Failed to generate personas'
};
}
};
/**
* Assess the quality of generated personas.
*/
export const assessPersonaQuality = async (
request: PersonaQualityRequest
): Promise<PersonaQualityResponse> => {
try {
const response = await apiClient.post('/api/onboarding/step4/assess-quality', request);
return response.data;
} catch (error: any) {
console.error('Error assessing persona quality:', error);
return {
success: false,
error: error.response?.data?.detail || error.message || 'Failed to assess persona quality'
};
}
};
/**
* Regenerate persona with different parameters.
*/
export const regeneratePersona = async (
request: PersonaGenerationRequest
): Promise<PersonaGenerationResponse> => {
try {
const response = await apiClient.post('/api/onboarding/step4/regenerate-persona', request);
return response.data;
} catch (error: any) {
console.error('Error regenerating persona:', error);
return {
success: false,
error: error.response?.data?.detail || error.message || 'Failed to regenerate persona'
};
}
};
/**
* Get available options for persona generation.
*/
export const getPersonaGenerationOptions = async (): Promise<PersonaOptions> => {
try {
const response = await apiClient.get('/api/onboarding/step4/persona-options');
return response.data;
} catch (error: any) {
console.error('Error getting persona options:', error);
return {
success: false,
available_platforms: [],
persona_types: [],
quality_metrics: []
};
}
};
/**
* Utility function to prepare onboarding data for persona generation.
*/
export const prepareOnboardingData = (stepData: any) => {
const websiteAnalysis =
stepData?.websiteAnalysis ??
stepData?.analysis ??
null;
const competitorResearch =
stepData?.competitorResearch ??
{
competitors: stepData?.competitors || [],
researchSummary: stepData?.researchSummary || null,
socialMediaAccounts: stepData?.socialMediaAccounts || {},
};
return {
websiteAnalysis,
competitorResearch,
sitemapAnalysis: stepData?.sitemapAnalysis ?? null,
businessData: stepData?.businessData ?? null,
researchPreferences: stepData?.researchPreferences ?? null,
deepCompetitorAnalysis: stepData?.deepCompetitorAnalysis ?? null,
};
};
/**
* Utility function to validate persona generation request.
*/
export const validatePersonaRequest = (request: PersonaGenerationRequest): string[] => {
const errors: string[] = [];
if (!request.onboarding_data) {
errors.push('Onboarding data is required');
}
if (!request.selected_platforms || request.selected_platforms.length === 0) {
errors.push('At least one platform must be selected');
}
if (request.selected_platforms && request.selected_platforms.length > 5) {
errors.push('Maximum 5 platforms can be selected');
}
return errors;
};