320 lines
9.2 KiB
Markdown
320 lines
9.2 KiB
Markdown
# AI Generation Feature Documentation
|
|
|
|
## Overview
|
|
|
|
The AI Generation feature uses OpenAI's GPT-4 to automatically generate production-ready blog articles based on:
|
|
- Audio transcriptions from recorded clips
|
|
- Selected images from the media library
|
|
- User-provided AI prompts
|
|
|
|
## Features
|
|
|
|
### 1. **Intelligent Content Generation**
|
|
- Uses GPT-4o model with internet access capability
|
|
- Generates semantic HTML5 content ready for Ghost CMS
|
|
- Automatically inserts image placeholders where images should appear
|
|
- Respects user instructions and context from audio/images
|
|
|
|
### 2. **Image Placeholder System**
|
|
- AI generates placeholders in format: `{{IMAGE:description_of_image}}`
|
|
- Placeholders use snake_case descriptive names
|
|
- System tracks all placeholders for later replacement
|
|
- Placeholders are displayed to user for review
|
|
|
|
### 3. **Draft Persistence**
|
|
- Generated drafts are automatically saved to the post
|
|
- Drafts persist across sessions
|
|
- Users can manually edit generated content
|
|
- Re-generation is supported (overwrites previous draft)
|
|
|
|
### 4. **System Prompt Configuration**
|
|
- Default system prompt defines output format and requirements
|
|
- Can be overridden via API for custom generation rules
|
|
- Ensures consistent, production-ready HTML output
|
|
|
|
## Architecture
|
|
|
|
### Backend Components
|
|
|
|
#### 1. AI Generation API (`apps/api/src/ai-generate.ts`)
|
|
**Endpoints:**
|
|
- `POST /api/ai/generate` - Generate article content
|
|
- `GET /api/ai/system-prompt` - Get default system prompt
|
|
|
|
**Request Payload:**
|
|
```typescript
|
|
{
|
|
prompt: string; // User's generation instructions
|
|
audioTranscriptions?: string[]; // Transcribed audio clips
|
|
selectedImageUrls?: string[]; // URLs of selected images
|
|
systemPromptOverride?: string; // Optional custom system prompt
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```typescript
|
|
{
|
|
content: string; // Generated HTML content
|
|
imagePlaceholders: string[]; // Array of placeholder descriptions
|
|
tokensUsed: number; // OpenAI tokens consumed
|
|
model: string; // Model used (gpt-4o)
|
|
}
|
|
```
|
|
|
|
#### 2. Database Schema Updates
|
|
**New Fields in `posts` table:**
|
|
- `generated_draft` (TEXT) - Stores the AI-generated HTML content
|
|
- `image_placeholders` (TEXT) - JSON array of image placeholder descriptions
|
|
|
|
**Migration:** `apps/api/drizzle/0002_soft_star_brand.sql`
|
|
|
|
#### 3. Posts API Updates
|
|
- GET `/api/posts/:id` now returns `generatedDraft` and `imagePlaceholders`
|
|
- POST `/api/posts` accepts and saves these fields
|
|
- JSON serialization/deserialization handled automatically
|
|
|
|
### Frontend Components
|
|
|
|
#### 1. AI Service (`apps/admin/src/services/ai.ts`)
|
|
```typescript
|
|
generateDraft(payload) => Promise<{
|
|
content: string;
|
|
imagePlaceholders: string[];
|
|
tokensUsed: number;
|
|
model: string;
|
|
}>
|
|
|
|
getSystemPrompt() => Promise<{ systemPrompt: string }>
|
|
```
|
|
|
|
#### 2. StepGenerate Component
|
|
**Features:**
|
|
- Display audio transcriptions in chronological order
|
|
- Show selected images
|
|
- AI prompt input field with placeholder example
|
|
- "Generate Draft" button (becomes "Re-generate Draft" after first use)
|
|
- Loading state with spinner during generation
|
|
- Error handling and display
|
|
- Generated content preview with HTML rendering
|
|
- Image placeholder detection and display
|
|
- Auto-save on generation
|
|
|
|
**Props:**
|
|
```typescript
|
|
{
|
|
postClips: Clip[];
|
|
genImageKeys: string[];
|
|
onToggleGenImage: (key: string) => void;
|
|
promptText: string;
|
|
onChangePrompt: (v: string) => void;
|
|
generatedDraft: string;
|
|
imagePlaceholders: string[];
|
|
onGeneratedDraft: (content: string) => void;
|
|
onImagePlaceholders: (placeholders: string[]) => void;
|
|
}
|
|
```
|
|
|
|
#### 3. usePostEditor Hook Updates
|
|
**New State:**
|
|
- `generatedDraft` - Current generated content
|
|
- `imagePlaceholders` - Array of placeholder descriptions
|
|
|
|
**New Setters:**
|
|
- `setGeneratedDraft`
|
|
- `setImagePlaceholders`
|
|
|
|
**Persistence:**
|
|
- Loads from backend on post open
|
|
- Saves to backend when updated
|
|
- Included in savePost payload
|
|
|
|
## System Prompt
|
|
|
|
The default system prompt ensures:
|
|
1. Production-ready HTML output
|
|
2. Semantic HTML5 tags only
|
|
3. Consistent image placeholder format
|
|
4. No markdown or wrapper tags
|
|
5. SEO-friendly structure
|
|
6. Proper heading hierarchy
|
|
7. Valid, properly closed HTML
|
|
|
|
**Image Placeholder Format:**
|
|
```
|
|
{{IMAGE:description_of_image}}
|
|
```
|
|
|
|
Examples:
|
|
- `{{IMAGE:screenshot_of_dashboard}}`
|
|
- `{{IMAGE:team_photo_at_conference}}`
|
|
- `{{IMAGE:architecture_diagram}}`
|
|
|
|
## Usage Flow
|
|
|
|
1. **User records audio** in Step 1 (Assets)
|
|
- Audio auto-uploads
|
|
- User transcribes clips
|
|
|
|
2. **User selects images** in Step 1 (Assets)
|
|
- Images marked for generation
|
|
- Selection persists with post
|
|
|
|
3. **User writes AI prompt** in Step 2 (AI Prompt)
|
|
- Describes article goals, audience, tone
|
|
- References transcriptions and images
|
|
|
|
4. **User generates draft** in Step 3 (Generate)
|
|
- Clicks "Generate Draft"
|
|
- System sends prompt + transcriptions + image info to OpenAI
|
|
- AI generates HTML with image placeholders
|
|
- Draft auto-saves to post
|
|
- Placeholders displayed for review
|
|
|
|
5. **User reviews/edits** in Step 4 (Edit)
|
|
- Can manually edit generated content
|
|
- Or return to Step 3 to re-generate
|
|
|
|
6. **Future: Image Replacement** (Next Step)
|
|
- Replace placeholders with actual images
|
|
- Match placeholder descriptions to selected images
|
|
- Or allow manual image selection per placeholder
|
|
|
|
## Environment Variables Required
|
|
|
|
```bash
|
|
# .env file
|
|
OPENAI_API_KEY=sk-...your-key-here...
|
|
```
|
|
|
|
## Installation
|
|
|
|
### 1. Install OpenAI Package
|
|
```bash
|
|
cd apps/api
|
|
pnpm add openai
|
|
```
|
|
|
|
### 2. Run Database Migration
|
|
```bash
|
|
cd apps/api
|
|
pnpm drizzle:migrate
|
|
```
|
|
|
|
### 3. Set Environment Variable
|
|
Add `OPENAI_API_KEY` to your `.env` file in the project root.
|
|
|
|
### 4. Restart API Server
|
|
```bash
|
|
cd apps/api
|
|
pnpm run dev
|
|
```
|
|
|
|
## API Rate Limits & Costs
|
|
|
|
- Model: GPT-4o
|
|
- Typical article: ~2000-4000 tokens
|
|
- Cost: ~$0.01-0.04 per generation
|
|
- Rate limits: Per OpenAI account tier
|
|
|
|
## Error Handling
|
|
|
|
**Frontend:**
|
|
- Validates prompt is not empty
|
|
- Shows loading spinner during generation
|
|
- Displays error messages in Alert component
|
|
- Gracefully handles API failures
|
|
|
|
**Backend:**
|
|
- Validates required fields
|
|
- Checks for OpenAI API key
|
|
- Catches and logs OpenAI errors
|
|
- Returns descriptive error messages
|
|
|
|
## Future Enhancements
|
|
|
|
1. **Image Placeholder Replacement Step**
|
|
- New step between Generate and Edit
|
|
- Match placeholders to selected images
|
|
- AI-assisted matching based on descriptions
|
|
- Manual override capability
|
|
|
|
2. **System Prompt Customization**
|
|
- UI for editing system prompt
|
|
- Save custom prompts per user
|
|
- Prompt templates library
|
|
|
|
3. **Generation History**
|
|
- Save multiple generated versions
|
|
- Compare versions side-by-side
|
|
- Rollback to previous generation
|
|
|
|
4. **Advanced AI Features**
|
|
- SEO optimization suggestions
|
|
- Readability scoring
|
|
- Tone adjustment
|
|
- Length targeting
|
|
|
|
5. **Multi-Model Support**
|
|
- Support for Claude, Gemini
|
|
- Model selection in UI
|
|
- Cost comparison
|
|
|
|
## Testing
|
|
|
|
### Manual Testing Checklist
|
|
- [ ] Generate draft with audio transcriptions
|
|
- [ ] Generate draft with selected images
|
|
- [ ] Generate draft with both audio and images
|
|
- [ ] Verify image placeholders are detected
|
|
- [ ] Verify draft persists after save
|
|
- [ ] Test re-generation (overwrites previous)
|
|
- [ ] Test error handling (invalid API key, network error)
|
|
- [ ] Verify HTML output is valid
|
|
- [ ] Test with empty prompt (should show error)
|
|
- [ ] Test with very long prompt
|
|
|
|
### Example Prompts
|
|
|
|
**Basic Article:**
|
|
```
|
|
Write a 1000-word technical article about building a modern blog platform with React and Ghost CMS. Include sections on architecture, key features, and deployment. Target audience: developers with React experience.
|
|
```
|
|
|
|
**With Context:**
|
|
```
|
|
Based on the audio transcriptions provided, write a comprehensive guide about the topics discussed. Structure it as a tutorial with clear steps. Include code examples where mentioned in the transcriptions. Use the selected images to illustrate key concepts.
|
|
```
|
|
|
|
**SEO-Focused:**
|
|
```
|
|
Write an SEO-optimized article about [topic]. Include an engaging introduction, 5-7 main sections with H2 headings, bullet points for key takeaways, and a strong conclusion with a call-to-action. Target keyword: [keyword]. Word count: 1500-2000 words.
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
**Issue: "OpenAI API key not configured"**
|
|
- Solution: Add `OPENAI_API_KEY` to `.env` file
|
|
|
|
**Issue: Generation takes too long**
|
|
- Cause: Large prompts or transcriptions
|
|
- Solution: Reduce input size or increase timeout
|
|
|
|
**Issue: Invalid HTML output**
|
|
- Cause: System prompt not followed
|
|
- Solution: Review and adjust system prompt
|
|
|
|
**Issue: No image placeholders generated**
|
|
- Cause: Prompt doesn't mention images
|
|
- Solution: Explicitly request image placement in prompt
|
|
|
|
## Summary
|
|
|
|
The AI Generation feature provides a powerful, automated way to create production-ready blog content from audio recordings and images. The system is designed to be:
|
|
- **Reliable**: Robust error handling and validation
|
|
- **Flexible**: Customizable prompts and system configuration
|
|
- **Persistent**: All generated content is saved
|
|
- **User-Friendly**: Clear UI with loading states and error messages
|
|
- **Production-Ready**: Generates valid HTML for direct Ghost publishing
|
|
|
|
All components are implemented and ready for use. The next logical enhancement is the image placeholder replacement step.
|