feat(feedback): Add content improvement feedback system

Frontend (frontend/app.js):

- Add textarea for improvement feedback

- Add submit button with loading state

- Handle API response and display improved content

Backend (backend/copywriter.py):

- Add improve_copy() method using Cohere API

- Integrate retry mechanism for API calls

Backend (backend/main.py):

- Add /improve-content POST endpoint

- Implement error handling and return improved content with metadata

Testing:

- Verified feedback submission flow

- Confirmed improved content generation

- Tested error scenarios and loading states
This commit is contained in:
Michael Ikehi
2025-04-18 04:39:06 +01:00
parent 6fd7213076
commit af8f99dea3
13 changed files with 550 additions and 167 deletions
+1 -3
View File
@@ -8,7 +8,6 @@ document.addEventListener('DOMContentLoaded', function() {
const generateBtn = document.getElementById('generate-btn');
const promptInput = document.getElementById('prompt');
const contentTypeSelect = document.getElementById('content-type');
const toneSelect = document.getElementById('tone');
const lengthSelect = document.getElementById('length');
const includeCTACheckbox = document.getElementById('include-cta');
const referenceSimilarCheckbox = document.getElementById('reference-similar');
@@ -86,7 +85,6 @@ document.addEventListener('DOMContentLoaded', function() {
const requestData = {
prompt: promptInput.value,
content_type: contentTypeSelect.value || null,
tone: toneSelect.value || null,
length: lengthSelect.value || null,
include_cta: includeCTACheckbox.checked,
reference_similar_content: referenceSimilarCheckbox.checked
@@ -510,4 +508,4 @@ document.addEventListener('DOMContentLoaded', function() {
// For demonstration purposes, let's create a mocked pre-filled content
// In a real implementation, this would be loaded from the backend
document.getElementById('prompt').value = 'Write a social media post about our new coaching program';
});
});
+9 -18
View File
@@ -56,30 +56,21 @@
<label for="content-type">Content Type</label>
<select id="content-type">
<option value="">Select Type</option>
<option value="email_campaign">Email Campaign</option>
<option value="social_media">Social Media</option>
<option value="blog_post">Blog Post</option>
<option value="website_copy">Website Copy</option>
<option value="email">Email Campaign</option>
<option value="social_media">Social Media Post</option>
<option value="blog_post">Blog Post</option>
<option value="sales_copy">Sales Copy</option>
<option value="ad_copy">Ad Copy</option>
<option value="funnel_page">Funnel Page</option>
<option value="video_script">Video Script</option>
<option value="case_study">Case Study</option>
<option value="product_description">Product Description</option>
<option value="landing_page">Landing Page</option>
<option value="press_release">Press Release</option>
<option value="newsletter">Newsletter</option>
</select>
</div>
<div class="form-group">
<label for="tone">Tone</label>
<select id="tone">
<option value="">Select Tone</option>
<option value="professional">Professional</option>
<option value="friendly">Friendly</option>
<option value="excited">Excited</option>
<option value="authoritative">Authoritative</option>
<option value="casual">Casual</option>
<option value="inspirational">Inspirational</option>
<option value="empathetic">Empathetic</option>
<option value="humorous">Humorous</option>
</select>
</div>
<div class="form-group">
<label for="length">Length</label>
<select id="length">