Files
ALwrity/frontend/src/services/linkedInWriterApi.ts

288 lines
7.1 KiB
TypeScript

import { apiClient, aiApiClient } from '../api/client';
// LinkedIn-specific enums
export enum LinkedInPostType {
PROFESSIONAL = 'professional',
THOUGHT_LEADERSHIP = 'thought_leadership',
INDUSTRY_NEWS = 'industry_news',
PERSONAL_STORY = 'personal_story',
COMPANY_UPDATE = 'company_update',
POLL = 'poll'
}
export enum LinkedInTone {
PROFESSIONAL = 'professional',
CONVERSATIONAL = 'conversational',
AUTHORITATIVE = 'authoritative',
INSPIRATIONAL = 'inspirational',
EDUCATIONAL = 'educational',
FRIENDLY = 'friendly'
}
export enum SearchEngine {
GOOGLE = 'google',
TAVILY = 'tavily'
}
export enum GroundingLevel {
NONE = 'none',
BASIC = 'basic',
ENHANCED = 'enhanced',
ENTERPRISE = 'enterprise'
}
// Request interfaces
export interface LinkedInPostRequest {
topic: string;
industry: string;
post_type?: LinkedInPostType;
tone?: LinkedInTone;
target_audience?: string;
key_points?: string[];
include_hashtags?: boolean;
include_call_to_action?: boolean;
research_enabled?: boolean;
search_engine?: SearchEngine;
max_length?: number;
grounding_level?: GroundingLevel;
include_citations?: boolean;
}
export interface LinkedInArticleRequest {
topic: string;
industry: string;
tone?: LinkedInTone;
target_audience?: string;
key_sections?: string[];
include_images?: boolean;
seo_optimization?: boolean;
research_enabled?: boolean;
search_engine?: SearchEngine;
word_count?: number;
grounding_level?: GroundingLevel;
include_citations?: boolean;
}
export interface LinkedInCarouselRequest {
topic: string;
industry: string;
slide_count?: number;
tone?: LinkedInTone;
target_audience?: string;
key_takeaways?: string[];
include_cover_slide?: boolean;
include_cta_slide?: boolean;
visual_style?: string;
}
export interface LinkedInVideoScriptRequest {
topic: string;
industry: string;
video_length?: number;
tone?: LinkedInTone;
target_audience?: string;
key_messages?: string[];
include_hook?: boolean;
include_captions?: boolean;
}
export interface LinkedInCommentResponseRequest {
original_post: string;
comment: string;
response_type?: 'professional' | 'appreciative' | 'clarifying' | 'disagreement' | 'value_add';
tone?: LinkedInTone;
include_question?: boolean;
brand_voice?: string;
}
// Response interfaces
export interface ResearchSource {
title: string;
url: string;
content: string;
relevance_score?: number;
credibility_score?: number;
domain_authority?: number;
source_type?: string;
publication_date?: string;
}
export interface HashtagSuggestion {
hashtag: string;
category: string;
popularity_score?: number;
}
export interface ImageSuggestion {
description: string;
alt_text: string;
style?: string;
placement?: string;
}
export interface PostContent {
content: string;
character_count: number;
hashtags: HashtagSuggestion[];
call_to_action?: string;
engagement_prediction?: Record<string, any>;
// Grounding data
citations?: Citation[];
source_list?: string;
quality_metrics?: ContentQualityMetrics;
grounding_enabled?: boolean;
search_queries?: string[];
}
export interface Citation {
type: string;
reference: string;
position?: number;
source_index?: number;
text?: string;
start_index?: number;
end_index?: number;
source_indices?: number[];
}
export interface ContentQualityMetrics {
overall_score: number;
factual_accuracy: number;
source_verification: number;
professional_tone: number;
industry_relevance: number;
citation_coverage: number;
content_length: number;
word_count: number;
analysis_timestamp: string;
recommendations?: string[];
}
export interface ArticleContent {
title: string;
content: string;
word_count: number;
sections: Array<Record<string, string>>;
seo_metadata?: Record<string, any>;
image_suggestions: ImageSuggestion[];
reading_time?: number;
// Grounding data
citations?: Citation[];
source_list?: string;
quality_metrics?: ContentQualityMetrics;
grounding_enabled?: boolean;
search_queries?: string[];
}
export interface CarouselSlide {
slide_number: number;
title: string;
content: string;
visual_elements: string[];
design_notes?: string;
}
export interface CarouselContent {
title: string;
slides: CarouselSlide[];
cover_slide?: CarouselSlide;
cta_slide?: CarouselSlide;
design_guidelines: Record<string, string>;
}
export interface VideoScript {
hook: string;
main_content: Array<Record<string, string>>;
conclusion: string;
captions?: string[];
thumbnail_suggestions: string[];
video_description: string;
}
export interface LinkedInPostResponse {
success: boolean;
data?: PostContent;
research_sources: ResearchSource[];
generation_metadata: Record<string, any>;
error?: string;
}
export interface LinkedInArticleResponse {
success: boolean;
data?: ArticleContent;
research_sources: ResearchSource[];
generation_metadata: Record<string, any>;
error?: string;
}
export interface LinkedInCarouselResponse {
success: boolean;
data?: CarouselContent;
generation_metadata: Record<string, any>;
error?: string;
}
export interface LinkedInVideoScriptResponse {
success: boolean;
data?: VideoScript;
generation_metadata: Record<string, any>;
error?: string;
}
export interface LinkedInCommentResponseResult {
success: boolean;
response?: string;
alternative_responses: string[];
tone_analysis?: Record<string, any>;
generation_metadata: Record<string, any>;
error?: string;
}
// API client
export const linkedInWriterApi = {
async health(): Promise<any> {
const { data } = await apiClient.get('/api/linkedin/health');
return data;
},
async generatePost(request: LinkedInPostRequest): Promise<LinkedInPostResponse> {
const { data } = await aiApiClient.post('/api/linkedin/generate-post', request);
return data;
},
async generateArticle(request: LinkedInArticleRequest): Promise<LinkedInArticleResponse> {
const { data } = await aiApiClient.post('/api/linkedin/generate-article', request);
return data;
},
async generateCarousel(request: LinkedInCarouselRequest): Promise<LinkedInCarouselResponse> {
const { data } = await aiApiClient.post('/api/linkedin/generate-carousel', request);
return data;
},
async generateVideoScript(request: LinkedInVideoScriptRequest): Promise<LinkedInVideoScriptResponse> {
const { data } = await aiApiClient.post('/api/linkedin/generate-video-script', request);
return data;
},
async generateCommentResponse(request: LinkedInCommentResponseRequest): Promise<LinkedInCommentResponseResult> {
const { data } = await apiClient.post('/api/linkedin/generate-comment-response', request);
return data;
},
async optimizeProfile(request: any): Promise<any> {
const { data } = await apiClient.post('/api/linkedin/optimize-profile', request);
return data;
},
async generatePoll(request: any): Promise<any> {
const { data } = await apiClient.post('/api/linkedin/generate-poll', request);
return data;
},
async generateCompanyUpdate(request: any): Promise<any> {
const { data } = await apiClient.post('/api/linkedin/generate-company-update', request);
return data;
}
};