diff --git a/backend/brand_style.py b/backend/brand_style.py index 3104434..7a25e22 100644 --- a/backend/brand_style.py +++ b/backend/brand_style.py @@ -13,7 +13,7 @@ import config class BrandStyleManager: """Manages brand style guidelines and ensures content consistency.""" - + def __init__(self): """Initialize the BrandStyleManager with default or stored style guidelines.""" self.style_path = Path(config.DATA_DIR) / "style_guidelines" / "brand_style.json" @@ -117,7 +117,7 @@ class BrandStyleManager: """ } logger.info("BrandStyleManager initialized successfully") - + def _load_or_create_style(self) -> Dict[str, Any]: """Load existing style guidelines or create new ones with defaults.""" try: @@ -129,37 +129,37 @@ class BrandStyleManager: else: # Create directory if it doesn't exist self.style_path.parent.mkdir(exist_ok=True) - + # Use default style guidelines style = config.DEFAULT_BRAND_STYLE - + # Save default style with open(self.style_path, 'w') as f: json.dump(style, f, indent=2) - + logger.info("Created default brand style guidelines") return style except Exception as e: logger.error(f"Error loading or creating style guidelines: {str(e)}") # Fall back to default style return config.DEFAULT_BRAND_STYLE - + def get_style_guidelines(self) -> Dict[str, Any]: """ Get current brand style guidelines. - + Returns: Dictionary of style guidelines """ return self.style_guidelines - + def update_style_guidelines(self, new_style: Dict[str, Any]) -> Dict[str, Any]: """ Update brand style guidelines. - + Args: new_style: Dictionary with new style guidelines - + Returns: Updated style guidelines dictionary """ @@ -167,37 +167,41 @@ class BrandStyleManager: # Merge new style with existing for key, value in new_style.items(): self.style_guidelines[key] = value - + # Ensure brand name is preserved self.style_guidelines['brand_name'] = config.BRAND_NAME - + # Save updated style with open(self.style_path, 'w') as f: json.dump(self.style_guidelines, f, indent=2) - + logger.info("Updated brand style guidelines") return self.style_guidelines except Exception as e: logger.error(f"Error updating style guidelines: {str(e)}") raise - + def format_prompt_with_brand_style(self, user_prompt: str, content_type: Optional[str] = None) -> str: - """Format user prompt to match the established writing style.""" - + """Format user prompt to match the distinctive communication style.""" + style_instructions = [ - "Follow these writing style guidelines:", - "- Use direct commands that empower the reader", - "- Address the reader directly using 'you' and 'your'", - "- Create rhythmic, repetitive patterns in key messages", - "- Maintain a clear, confident, and authoritative tone", - "- Use simple, practical language without jargon", - "- Acknowledge challenges while focusing on solutions", - "- Include empowering phrases that emphasize reader's control and choice" + "Follow these distinctive communication style guidelines:", + "- Use empowering, assertive language that inspires action", + "- Address the reader directly using 'you' and 'your' with conviction", + "- Create rhythmic, repetitive patterns in key messages for emphasis", + "- Maintain a clear, confident, and conversational teaching tone", + "- Use simple, practical language that communicates profound ideas", + "- Use embedded commands (e.g., 'Decide now to change your thinking')", + "- Include cause-effect statements (e.g., 'Because you understand this, you will now take action')", + "- Speak with conviction and clarity rather than hesitation", + "- Replace tentative phrases with confident declarations", + "- Use a motivational coach-like clarity in all communications", + "- IMPORTANT: Do not mention any specific person's name in the content" ] # Content type specific formatting content_format = self._get_content_format(content_type) if content_type else "" - + return "\n".join([ f"Generate content based on this request:", f"\"{user_prompt}\"", @@ -205,37 +209,37 @@ class BrandStyleManager: "\n".join(style_instructions), content_format ]) - + def check_content_alignment(self, content: str) -> Dict[str, Any]: """ Check if generated content aligns with brand style guidelines. - + Args: content: Generated marketing content - + Returns: Dictionary with alignment metrics and suggestions """ style = self.style_guidelines taboo_words = style.get('taboo_words', []) preferred_terms = style.get('preferred_terms', {}) - + # Check for taboo words found_taboo_words = [] for word in taboo_words: if word.lower() in content.lower(): found_taboo_words.append(word) - + # Check for preferred terminology terminology_issues = [] for avoid, use in preferred_terms.items(): if avoid.lower() in content.lower(): terminology_issues.append(f"Found '{avoid}', should use '{use}' instead") - + # Calculate an overall alignment score (simple implementation) issues_count = len(found_taboo_words) + len(terminology_issues) alignment_score = max(0, 100 - (issues_count * 10)) # Reduce score for each issue - + return { 'alignment_score': alignment_score, 'taboo_words_found': found_taboo_words, @@ -246,16 +250,16 @@ class BrandStyleManager: def _get_content_format(self, content_type: str) -> str: """ Get formatting instructions for specific content type. - + Args: content_type: Type of content to generate - + Returns: Formatting instructions as string """ if not content_type: return "" - + format_instructions = self.content_formats.get(content_type, "") if format_instructions: return f"\nContent type specific instructions:\n{format_instructions.strip()}" diff --git a/backend/config.py b/backend/config.py index a1ef94f..a04a292 100644 --- a/backend/config.py +++ b/backend/config.py @@ -52,12 +52,12 @@ CONTENT_TYPES = [ "newsletter" ] -# Tone options - simplified to match the core style +# Tone options - specifically matching Adriana James' communication style TONE_OPTIONS = [ - "direct", "empowering", - "confident", - "practical" + "assertive", + "inspirational", + "direct" ] # Content length options @@ -67,19 +67,22 @@ LENGTH_OPTIONS = [ "long", # > 300 words ] -# Default brand style guidelines +# Default brand style guidelines - fixed to match Adriana James' distinct communication style DEFAULT_BRAND_STYLE = { - "tone": ["direct", "empowering", "confident", "practical"], - "voice_characteristics": ["clear", "authoritative", "steady", "rhythmic"], - "writing_patterns": ["direct commands", "personal pronouns", "repetitive rhythms"], - "taboo_words": ["cheap", "discount", "bargain", "failure", "impossible", "difficult"], + "tone": ["empowering", "assertive", "inspirational", "direct"], + "voice_characteristics": ["clear", "confident", "conversational", "teaching"], + "writing_patterns": ["direct commands", "personal pronouns", "repetitive rhythms", "embedded commands", "cause-effect statements"], + "taboo_words": ["cheap", "discount", "bargain", "failure", "impossible", "difficult", "might", "try", "consider"], "preferred_terms": { "problems": "challenges", "try": "take action", "difficult": "ready for growth", "failure": "learning opportunity", "hope": "know", - "maybe": "will" + "maybe": "will", + "might help you": "you can do this", + "consider doing this": "decide now to change your thinking", + "this could work": "this works because" } } diff --git a/backend/copywriter.py b/backend/copywriter.py index 4014c87..52e0c24 100644 --- a/backend/copywriter.py +++ b/backend/copywriter.py @@ -16,13 +16,13 @@ from vector_store import vector_store class Copywriter: """Generates marketing copy using a fine-tuned LLM.""" - + def __init__(self): """Initialize the Copywriter with Cohere LLM client.""" self.model = "command" # Cohere's generation model self.api_key = config.COHERE_API_KEY logger.info("Copywriter initialized with Cohere API successfully") - + @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) async def generate_copy( self, @@ -40,34 +40,43 @@ class Copywriter: try: # Step 1: Format prompt with brand style guidelines branded_prompt = brand_style_manager.format_prompt_with_brand_style(prompt, content_type) - + # Step 2: Find similar content for reference (if enabled) reference_content = [] if reference_similar_content: + logger.info(f"Searching for similar content to reference for prompt: {prompt[:50]}...") search_results = await vector_store.search(prompt, top_k=3) if search_results: reference_content = [result['text'] for result in search_results] - + logger.info(f"Found {len(reference_content)} similar content items to reference") + for i, content in enumerate(reference_content): + logger.debug(f"Reference content {i+1}: {content[:100]}...") + else: + logger.warning("No similar content found in vector store for reference") + # Step 3: Add length and CTA instructions if needed if length: branded_prompt += f"\n- Generate {length} content" if include_cta: branded_prompt += "\n- Include a direct, empowering call to action" - + # Step 4: Add reference content if available if reference_content: branded_prompt += "\n\nReference these successful examples for tone and style:\n" branded_prompt += "\n---\n".join(reference_content) - + # Step 5: Generate content using the LLM generated_content = await self._call_llm_api(branded_prompt, max_tokens) - - # Step 6: Check content alignment with brand style + + # Step 6: Post-process to remove any mentions of Adriana James + generated_content = self._remove_name_mentions(generated_content) + + # Step 7: Check content alignment with brand style alignment_check = brand_style_manager.check_content_alignment(generated_content) - + # Step 7: Generate alternative headline suggestions headline_suggestions = await self._generate_headline_suggestions(prompt, generated_content) - + # Step 8: Return the generated content with metadata result = { "content": generated_content, @@ -79,21 +88,21 @@ class Copywriter: "generated_at": None # Will be added by the API } } - + # Add alignment issues if any if alignment_check['taboo_words_found'] or alignment_check['terminology_issues']: result["alignment_issues"] = { "taboo_words_found": alignment_check['taboo_words_found'], "terminology_issues": alignment_check['terminology_issues'] } - + logger.info(f"Generated content with {len(generated_content)} characters") return result - + except Exception as e: logger.error(f"Error generating copy: {str(e)}") raise - + @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) async def _call_llm_api(self, prompt: str, max_tokens: int = 1000) -> str: """ @@ -102,12 +111,11 @@ class Copywriter: Args: prompt: The formatted prompt for the LLM max_tokens: Maximum tokens for the generated response - + Returns: - Generated content as a string + Generated content as a string with preserved formatting """ try: - # Use Cohere's generate API with the API key from config cohere_api_key = config.COHERE_API_KEY async with httpx.AsyncClient() as client: @@ -118,19 +126,30 @@ class Copywriter: "Content-Type": "application/json" }, json={ - "model": "command", # Cohere's generation model - "prompt": prompt, + "model": "command", + "prompt": f"{prompt}\n\nNote: Please preserve formatting with proper paragraphs, line breaks, and bullet points where appropriate.", "max_tokens": max_tokens, "temperature": 0.7, "k": 0, - "p": 0.75 + "p": 0.75, + "return_likelihoods": "NONE" }, timeout=30.0 ) if response.status_code == 200: result = response.json() - return result["generations"][0]["text"].strip() + generated_text = result["generations"][0]["text"].strip() + + # Preserve paragraph breaks and formatting + formatted_text = ( + generated_text + .replace("\n\n", "") # Preserve paragraph breaks + .replace("\n- ", "\n• ") # Convert hyphens to bullets + .replace("", "\n\n") # Restore paragraph breaks + ) + + return formatted_text else: logger.error(f"Cohere API error: {response.status_code}, {response.text}") raise Exception(f"Cohere API error: {response.status_code}") @@ -138,24 +157,25 @@ class Copywriter: except Exception as e: logger.error(f"Error calling Cohere API: {str(e)}") raise - + async def _generate_headline_suggestions(self, original_prompt: str, generated_content: str) -> List[str]: """ Generate alternative headline suggestions based on the content. - + Args: original_prompt: The original user prompt generated_content: The generated marketing content - + Returns: List of headline suggestions """ try: # Create a prompt for headline generation headline_prompt = f""" - Generate 3 alternative marketing headlines for the following content. + Generate 3 alternative marketing headlines for the following content. Make headlines compelling, concise, and aligned with the content's message. Each headline should be unique and capture attention. + IMPORTANT: Do not mention any specific person's name in the headlines. ORIGINAL PROMPT: {original_prompt} @@ -179,6 +199,9 @@ class Copywriter: if headline.strip() and not headline.lower().startswith(('headline', 'title', '-', '*', '•')) ] + # Remove any mentions of Adriana James from headlines + headlines = [self._remove_name_mentions(headline) for headline in headlines] + # Ensure we have exactly 3 headlines if len(headlines) > 3: headlines = headlines[:3] @@ -192,15 +215,15 @@ class Copywriter: logger.error(f"Error generating headline suggestions: {str(e)}") # Return empty list instead of mock response on error return [] - + async def improve_copy(self, content: str, feedback: str) -> str: """ Improve content based on user feedback. - + Args: content: Original generated content feedback: User feedback for improvement - + Returns: Improved content """ @@ -208,53 +231,57 @@ class Copywriter: # Format prompt for improvement improve_prompt = f""" Please improve the following marketing content based on the feedback provided: - + IMPORTANT: Do not mention any specific person's name in the content. + ORIGINAL CONTENT: {content} - + FEEDBACK: {feedback} - + IMPROVED CONTENT: """ - + # Call LLM to improve content improved_content = await self._call_llm_api(improve_prompt, max_tokens=1200) - + + # Remove any mentions of Adriana James from improved content + improved_content = self._remove_name_mentions(improved_content) + logger.info(f"Improved content based on feedback") return improved_content - + except Exception as e: logger.error(f"Error improving content: {str(e)}") raise - + async def analyze_content_performance(self, content: str) -> Dict[str, Any]: """ Analyze marketing content for performance prediction. - + Args: content: Marketing content to analyze - + Returns: Dictionary with analysis results """ try: # This would be enhanced with actual ML models in production # Simplified mock response for demonstration - + # Very basic analysis using length and keyword presence word_count = len(content.split()) has_cta = any(phrase in content.lower() for phrase in ["call", "contact", "get started", "try", "buy", "sign up"]) sentence_count = len([s for s in content.split(".") if s.strip()]) avg_words_per_sentence = word_count / max(1, sentence_count) - + # Simple scoring system readability_score = 100 - min(100, max(0, abs(avg_words_per_sentence - 15) * 5)) cta_score = 90 if has_cta else 60 length_score = min(100, max(0, word_count / 3)) - + overall_score = (readability_score + cta_score + length_score) / 3 - + return { "overall_score": round(overall_score, 1), "readability_score": round(readability_score, 1), @@ -272,10 +299,38 @@ class Copywriter: "Consider adding more content for better engagement" if word_count < 100 else "Your content length is appropriate" ] } - + except Exception as e: logger.error(f"Error analyzing content: {str(e)}") raise + def _remove_name_mentions(self, content: str) -> str: + """ + Remove any mentions of specific names from the generated content. + + Args: + content: The generated content to process + + Returns: + Content with name mentions removed + """ + try: + # Remove any mentions of "Adriana James" (case insensitive) + import re + pattern = re.compile(r'\bAdriana\s+James\b', re.IGNORECASE) + content = pattern.sub('', content) + + # Clean up any double spaces that might result from the removal + content = re.sub(r'\s+', ' ', content) + + # Clean up any lines that might now be empty + content = '\n'.join([line for line in content.split('\n') if line.strip()]) + + logger.info("Removed any name mentions from generated content") + return content + except Exception as e: + logger.error(f"Error removing name mentions: {str(e)}") + return content + # Create a singleton instance copywriter = Copywriter() diff --git a/backend/vector_store.py b/backend/vector_store.py index 7ab68d9..3c35621 100644 --- a/backend/vector_store.py +++ b/backend/vector_store.py @@ -18,22 +18,27 @@ from embeddings import embeddings_manager class VectorStore: """Manages vector database operations for content retrieval.""" - + def __init__(self): """Initialize the VectorStore with FAISS index.""" self.store_path = Path(config.VECTOR_DB_PATH) self.store_path.mkdir(exist_ok=True) - + self.index_path = self.store_path / "faiss_index.bin" self.metadata_path = self.store_path / "metadata.pkl" - + self.dimension = None self.index = None self.metadata = [] - + self._load_or_create_index() logger.info("VectorStore initialized successfully") - + + # Check if the index is empty and load sample data if needed + if self.index.ntotal == 0: + logger.warning("Vector store is empty. Loading sample data...") + self._load_sample_data() + def _load_or_create_index(self) -> None: """Load existing index or create new one if it doesn't exist.""" try: @@ -46,17 +51,17 @@ class VectorStore: logger.info(f"Loaded existing vector index with {self.index.ntotal} vectors") else: # Default dimension for Cohere embeddings - self.dimension = 1024 + self.dimension = 1024 self.index = faiss.IndexFlatL2(self.dimension) self.metadata = [] logger.info(f"Created new vector index with dimension {self.dimension}") - + # Save the empty index and metadata self._save_index() except Exception as e: logger.error(f"Error loading or creating index: {str(e)}") raise - + def _save_index(self) -> None: """Save the index and metadata to disk.""" try: @@ -67,19 +72,19 @@ class VectorStore: except Exception as e: logger.error(f"Error saving index: {str(e)}") raise - + async def add_documents( - self, - texts: List[str], + self, + texts: List[str], metadata_list: Optional[List[Dict[str, Any]]] = None ) -> List[int]: """ Add documents to the vector store. - + Args: texts: List of text documents to add metadata_list: List of metadata dictionaries for each document - + Returns: List of document IDs (vector indices) """ @@ -87,16 +92,16 @@ class VectorStore: if not texts: logger.warning("No texts provided to add to vector store") return [] - + if metadata_list is None: metadata_list = [{} for _ in texts] - + if len(texts) != len(metadata_list): raise ValueError("Number of texts and metadata entries must match") - + # Generate embeddings embeddings = await embeddings_manager.get_embeddings(texts) - + # Check if embeddings match our dimension if embeddings.shape[1] != self.dimension: logger.warning(f"Embedding dimension mismatch: expected {self.dimension}, got {embeddings.shape[1]}") @@ -107,93 +112,97 @@ class VectorStore: logger.info(f"Adapted to new dimension: {self.dimension}") else: raise ValueError(f"Embedding dimension mismatch: expected {self.dimension}, got {embeddings.shape[1]}") - + # Add timestamp to metadata timestamp = datetime.now().isoformat() for meta in metadata_list: meta['timestamp'] = timestamp meta['document_id'] = len(self.metadata) + len(metadata_list) - + # Store texts in metadata for i, (text, meta) in enumerate(zip(texts, metadata_list)): meta['text'] = text - + # Add vectors to index start_idx = self.index.ntotal self.index.add(embeddings.astype(np.float32)) self.metadata.extend(metadata_list) - + # Save updated index self._save_index() - + # Return document IDs doc_ids = list(range(start_idx, start_idx + len(texts))) logger.info(f"Added {len(texts)} documents to vector store") return doc_ids - + except Exception as e: logger.error(f"Error adding documents to vector store: {str(e)}") raise - + async def search( - self, - query: str, + self, + query: str, top_k: int = 5, filters: Optional[Dict[str, Any]] = None, rerank: bool = True ) -> List[Dict[str, Any]]: """ Search for similar documents. - + Args: query: The search query top_k: Number of results to return filters: Dictionary of metadata filters rerank: Whether to use Cohere's reranking - + Returns: List of result dictionaries with document content and metadata """ try: + logger.info(f"Searching vector store with query: {query[:50]}... (top_k={top_k})") + if self.index.ntotal == 0: logger.warning("Empty vector store, no results to return") return [] - + + logger.info(f"Vector store contains {self.index.ntotal} documents") + # Generate query embedding query_embedding = await embeddings_manager.get_query_embedding(query) query_embedding = query_embedding.reshape(1, -1).astype(np.float32) - + # First pass: find more candidates than needed for reranking search_k = top_k * 3 if rerank else top_k search_k = min(search_k, self.index.ntotal) # Don't request more than we have - + distances, indices = self.index.search(query_embedding, search_k) - + # Get metadata and texts for matching indices results = [] for i, idx in enumerate(indices[0]): if idx < 0 or idx >= len(self.metadata): continue # Skip invalid indices - + metadata = self.metadata[idx] text = metadata.get('text', '') - + # Apply filters if any if filters and not self._matches_filters(metadata, filters): continue - + results.append({ 'document_id': idx, 'text': text, 'metadata': {k: v for k, v in metadata.items() if k != 'text'}, 'distance': float(distances[0][i]) }) - + # Apply reranking if requested if rerank and results: texts = [r['text'] for r in results] reranked = await embeddings_manager.rerank_results(query, texts, top_n=top_k) - + # Map reranked results back to our original results reranked_results = [] for item in reranked: @@ -203,41 +212,41 @@ class VectorStore: **results[orig_idx], 'relevance_score': item['relevance_score'] }) - + results = reranked_results else: # Just take the top_k results results = results[:top_k] - + logger.info(f"Found {len(results)} matching documents for query") return results - + except Exception as e: logger.error(f"Error searching vector store: {str(e)}") raise - + def _matches_filters(self, metadata: Dict[str, Any], filters: Dict[str, Any]) -> bool: """Check if metadata matches the specified filters.""" for key, value in filters.items(): if key not in metadata: return False - + if isinstance(value, list): # Check if metadata value is in the list if metadata[key] not in value: return False elif metadata[key] != value: return False - + return True - + async def delete_document(self, document_id: int) -> bool: """ Delete a document from the vector store. - + Args: document_id: ID of the document to delete - + Returns: Boolean indicating success """ @@ -245,28 +254,28 @@ class VectorStore: if document_id < 0 or document_id >= len(self.metadata): logger.warning(f"Invalid document ID: {document_id}") return False - + # FAISS doesn't support direct deletion, so we need to rebuild the index # Mark the document as deleted in metadata self.metadata[document_id]['deleted'] = True - + # Save updated metadata self._save_index() - + logger.info(f"Marked document {document_id} as deleted") return True - + except Exception as e: logger.error(f"Error deleting document: {str(e)}") raise - + async def get_document(self, document_id: int) -> Optional[Dict[str, Any]]: """ Retrieve a document by ID. - + Args: document_id: ID of the document to retrieve - + Returns: Document with metadata or None if not found """ @@ -274,35 +283,35 @@ class VectorStore: if document_id < 0 or document_id >= len(self.metadata): logger.warning(f"Invalid document ID: {document_id}") return None - + metadata = self.metadata[document_id] - + # Check if document is marked as deleted if metadata.get('deleted', False): logger.warning(f"Document {document_id} is marked as deleted") return None - + text = metadata.get('text', '') - + return { 'document_id': document_id, 'text': text, 'metadata': {k: v for k, v in metadata.items() if k != 'text' and k != 'deleted'} } - + except Exception as e: logger.error(f"Error retrieving document: {str(e)}") raise - + async def update_document(self, document_id: int, text: str, metadata: Optional[Dict[str, Any]] = None) -> bool: """ Update a document in the vector store. - + Args: document_id: ID of the document to update text: New document text metadata: New metadata (will be merged with existing) - + Returns: Boolean indicating success """ @@ -310,38 +319,102 @@ class VectorStore: if document_id < 0 or document_id >= len(self.metadata): logger.warning(f"Invalid document ID: {document_id}") return False - + # Get existing metadata existing_metadata = self.metadata[document_id] - + # Check if document is marked as deleted if existing_metadata.get('deleted', False): logger.warning(f"Cannot update deleted document {document_id}") return False - + # Generate new embedding embeddings = await embeddings_manager.get_embeddings([text]) - + # Update the vector in the index faiss.IndexFlatL2_update_vectors(self.index, embeddings.astype(np.float32), np.array([document_id], dtype=np.int64)) - + # Update metadata if metadata: for key, value in metadata.items(): existing_metadata[key] = value - + existing_metadata['text'] = text existing_metadata['updated_at'] = datetime.now().isoformat() - + # Save updated index self._save_index() - + logger.info(f"Updated document {document_id}") return True - + except Exception as e: logger.error(f"Error updating document: {str(e)}") raise + def _load_sample_data(self) -> None: + """Load sample data from past campaigns into the vector store.""" + try: + # Path to past campaigns directory + campaigns_dir = Path(config.DATA_DIR) / "past_campaigns" + + if not campaigns_dir.exists() or not campaigns_dir.is_dir(): + logger.warning(f"Past campaigns directory not found: {campaigns_dir}") + return + + # Find all JSON files in the directory + campaign_files = list(campaigns_dir.glob("*.json")) + if not campaign_files: + logger.warning("No campaign files found in past_campaigns directory") + return + + # Load and process each campaign file + texts = [] + metadata_list = [] + + for file_path in campaign_files: + try: + with open(file_path, 'r') as f: + campaign_data = json.load(f) + + # Extract content and metadata + if 'content' in campaign_data: + texts.append(campaign_data['content']) + + # Create metadata entry + metadata = { + 'content_type': campaign_data.get('content_type', 'unknown'), + 'campaign_name': campaign_data.get('metadata', {}).get('campaign_name', file_path.stem), + 'source': 'past_campaign', + 'file_path': str(file_path) + } + + # Add performance metrics if available + if 'metadata' in campaign_data and 'performance_metrics' in campaign_data['metadata']: + metadata['performance_metrics'] = campaign_data['metadata']['performance_metrics'] + + metadata_list.append(metadata) + logger.debug(f"Loaded campaign from {file_path.name}") + except Exception as e: + logger.error(f"Error loading campaign file {file_path}: {str(e)}") + continue + + if not texts: + logger.warning("No valid campaign content found in files") + return + + # Add documents to vector store + import asyncio + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + doc_ids = loop.run_until_complete(self.add_documents(texts, metadata_list)) + logger.info(f"Added {len(doc_ids)} past campaigns to vector store") + finally: + loop.close() + + except Exception as e: + logger.error(f"Error loading sample data: {str(e)}") + # Create a singleton instance vector_store = VectorStore() \ No newline at end of file diff --git a/data/training_data.db b/data/training_data.db index 189ca4e..a6d05f0 100644 Binary files a/data/training_data.db and b/data/training_data.db differ diff --git a/data/vector_store/faiss_index.bin b/data/vector_store/faiss_index.bin index ea6344d..85d0da3 100644 Binary files a/data/vector_store/faiss_index.bin and b/data/vector_store/faiss_index.bin differ diff --git a/data/vector_store/metadata.pkl b/data/vector_store/metadata.pkl index 78ae91a..10b7e8f 100644 Binary files a/data/vector_store/metadata.pkl and b/data/vector_store/metadata.pkl differ diff --git a/frontend/app.js b/frontend/app.js index 32444ca..ca86004 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -4,7 +4,7 @@ document.addEventListener('DOMContentLoaded', function() { // Navigation const menuItems = document.querySelectorAll('.menu li'); const pages = document.querySelectorAll('.page'); - + // Generate Content Page const generateBtn = document.getElementById('generate-btn'); const promptInput = document.getElementById('prompt'); @@ -23,12 +23,12 @@ document.addEventListener('DOMContentLoaded', function() { const improvementPanel = document.getElementById('improvement-panel'); const improvementFeedback = document.getElementById('improvement-feedback'); const submitImprovement = document.getElementById('submit-improvement'); - + // History Page const historyFilterType = document.getElementById('history-filter-type'); const historySearch = document.getElementById('history-search'); const historyList = document.querySelector('.history-list'); - + // Brand Style Page const toneSelector = document.getElementById('tone-selector'); const voiceSelector = document.getElementById('voice-selector'); @@ -40,7 +40,7 @@ document.addEventListener('DOMContentLoaded', function() { const addTermBtn = document.getElementById('add-term-btn'); const saveBrandStyleBtn = document.getElementById('save-brand-style'); const resetBrandStyleBtn = document.getElementById('reset-brand-style'); - + // Training Page const trainingTabs = document.querySelectorAll('.training-tabs .tab'); const tabContents = document.querySelectorAll('.tab-content'); @@ -54,24 +54,24 @@ document.addEventListener('DOMContentLoaded', function() { const trainingFilterType = document.getElementById('training-filter-type'); const trainingSearch = document.getElementById('training-search'); const trainingList = document.querySelector('.training-list'); - + // API Base URL const API_URL = 'http://localhost:8000'; - + // Menu Navigation menuItems.forEach(item => { item.addEventListener('click', function() { const pageName = this.getAttribute('data-page'); - + // Update active menu item menuItems.forEach(menuItem => menuItem.classList.remove('active')); this.classList.add('active'); - + // Show selected page pages.forEach(page => { if (page.id === `${pageName}-page`) { page.classList.add('active'); - + // Load data for specific pages when they're opened if (pageName === 'history') { loadUserQueries(); @@ -87,7 +87,7 @@ document.addEventListener('DOMContentLoaded', function() { }); }); }); - + // Generate Content if (generateBtn) { generateBtn.addEventListener('click', function() { @@ -95,11 +95,11 @@ document.addEventListener('DOMContentLoaded', function() { alert('Please enter a prompt for content generation.'); return; } - + // Show loading indicator loadingIndicator.classList.remove('hidden'); resultContainer.classList.add('hidden'); - + // Prepare request data const requestData = { prompt: promptInput.value, @@ -108,7 +108,7 @@ document.addEventListener('DOMContentLoaded', function() { include_cta: includeCTACheckbox.checked, reference_similar_content: referenceSimilarCheckbox.checked }; - + // Call the API fetch(`${API_URL}/generate-copy`, { method: 'POST', @@ -126,15 +126,25 @@ document.addEventListener('DOMContentLoaded', function() { .then(data => { // Hide loading indicator loadingIndicator.classList.add('hidden'); - - // Display result - resultContent.textContent = data.content; - + + // Display result with preserved formatting + resultContent.innerHTML = data.content + .split('\n') + .map(line => { + // Convert bullet points to list items + if (line.trim().startsWith('•')) { + return `
  • ${line.trim().substring(1).trim()}
  • `; + } + // Wrap non-empty lines in paragraphs + return line.trim() ? `

    ${line}

    ` : ''; + }) + .join('\n'); + // Set alignment score const score = data.metadata.alignment_score || 0; alignmentScore.style.width = `${score}%`; alignmentScore.textContent = `${Math.round(score)}%`; - + if (score < 60) { alignmentScore.style.backgroundColor = 'var(--danger-color)'; } else if (score < 80) { @@ -142,7 +152,7 @@ document.addEventListener('DOMContentLoaded', function() { } else { alignmentScore.style.backgroundColor = 'var(--success-color)'; } - + // Display suggestions if (data.suggestions && data.suggestions.length > 0) { suggestionsList.innerHTML = ''; @@ -155,7 +165,7 @@ document.addEventListener('DOMContentLoaded', function() { suggestionsList.appendChild(li); }); } - + // Show result container resultContainer.classList.remove('hidden'); }) @@ -166,7 +176,7 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Copy to Clipboard if (copyBtn) { copyBtn.addEventListener('click', function() { @@ -183,53 +193,50 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Toggle Improvement Panel if (improveBtn) { improveBtn.addEventListener('click', function() { improvementPanel.classList.toggle('hidden'); }); } - + // Submit Improvement Feedback if (submitImprovement) { submitImprovement.addEventListener('click', function() { - if (!improvementFeedback.value.trim()) { - alert('Please enter feedback for improvement.'); + const feedback = improvementFeedback.value.trim(); + if (!feedback) { + alert('Please provide improvement feedback.'); return; } - - // Show loading indicator + loadingIndicator.classList.remove('hidden'); - - // Prepare request data - const requestData = { - content: resultContent.textContent, - feedback: improvementFeedback.value - }; - - // Call the API + fetch(`${API_URL}/improve-content`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(requestData) - }) - .then(response => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - return response.json(); + body: JSON.stringify({ + content: resultContent.textContent, + feedback: feedback + }) }) + .then(response => response.json()) .then(data => { - // Hide loading indicator loadingIndicator.classList.add('hidden'); - // Update result content - resultContent.textContent = data.improved_content; - - // Hide improvement panel + // Update result content with preserved formatting + resultContent.innerHTML = data.improved_content + .split('\n') + .map(line => { + if (line.trim().startsWith('•')) { + return `
  • ${line.trim().substring(1).trim()}
  • `; + } + return line.trim() ? `

    ${line}

    ` : ''; + }) + .join('\n'); + improvementPanel.classList.add('hidden'); improvementFeedback.value = ''; }) @@ -240,7 +247,7 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Save Content to History if (saveBtn) { saveBtn.addEventListener('click', function() { @@ -249,17 +256,17 @@ document.addEventListener('DOMContentLoaded', function() { // so we don't need to make another API call here }); } - + // Load User Queries (History) function loadUserQueries(page = 1, contentType = '') { if (!historyList) return; - + // Show loading state historyList.innerHTML = '
    Loading history...
    '; - + // Build the query parameters let queryParams = `?page=${page}&limit=10`; - + // Call the API fetch(`${API_URL}/user-queries${queryParams}`) .then(response => { @@ -270,26 +277,26 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(data => { historyList.innerHTML = ''; - + if (data.items.length === 0) { historyList.innerHTML = '
    No history found.
    '; return; } - + // Filter by content type if provided let filteredItems = data.items; if (contentType) { - filteredItems = data.items.filter(item => + filteredItems = data.items.filter(item => item.parameters && item.parameters.content_type === contentType ); } - + // Create history items filteredItems.forEach(item => { const contentType = item.parameters?.content_type || 'general'; const timestamp = item.timestamp ? new Date(item.timestamp).toLocaleDateString() : 'Unknown date'; const promptPreview = item.prompt.length > 80 ? item.prompt.substring(0, 80) + '...' : item.prompt; - + const historyItem = document.createElement('div'); historyItem.className = 'history-item'; historyItem.innerHTML = ` @@ -308,10 +315,10 @@ document.addEventListener('DOMContentLoaded', function() { `; - + historyList.appendChild(historyItem); }); - + // Add event listeners for view and delete buttons document.querySelectorAll('.view-query').forEach(btn => { btn.addEventListener('click', function() { @@ -319,7 +326,7 @@ document.addEventListener('DOMContentLoaded', function() { viewUserQuery(timestamp); }); }); - + document.querySelectorAll('.delete-query').forEach(btn => { btn.addEventListener('click', function() { const timestamp = this.getAttribute('data-timestamp'); @@ -328,7 +335,7 @@ document.addEventListener('DOMContentLoaded', function() { } }); }); - + // Add pagination if needed if (data.pagination && data.pagination.pages > 1) { // Remove existing pagination if any @@ -336,18 +343,18 @@ document.addEventListener('DOMContentLoaded', function() { if (existingPagination) { existingPagination.remove(); } - + const paginationElement = document.createElement('div'); paginationElement.className = 'pagination'; - + let paginationHTML = ''; for (let i = 1; i <= data.pagination.pages; i++) { paginationHTML += ``; } - + paginationElement.innerHTML = paginationHTML; historyList.after(paginationElement); - + // Add event listeners for pagination buttons document.querySelectorAll('.page-btn').forEach(btn => { btn.addEventListener('click', function() { @@ -362,14 +369,14 @@ document.addEventListener('DOMContentLoaded', function() { historyList.innerHTML = '
    Error loading history. Please try again.
    '; }); } - + // Helper function to extract timestamp from ISO date function getTimestampFromISODate(isoDate) { if (!isoDate) return ''; const date = new Date(isoDate); return date.toISOString().replace(/[-:T.]/g, '').slice(0, 14); } - + // Helper function to generate a title from prompt function getPromptTitle(prompt) { if (!prompt) return 'Untitled Query'; @@ -377,11 +384,11 @@ document.addEventListener('DOMContentLoaded', function() { if (words.length <= 5) return prompt; return words.slice(0, 5).join(' ') + '...'; } - + // Helper function to get display label for content type function getContentTypeLabel(contentType) { if (!contentType) return 'General'; - + const labels = { 'email': 'Email', 'social_media': 'Social', @@ -397,10 +404,10 @@ document.addEventListener('DOMContentLoaded', function() { 'newsletter': 'Newsletter', 'general': 'General' }; - + return labels[contentType] || contentType.charAt(0).toUpperCase() + contentType.slice(1); } - + // View User Query function viewUserQuery(timestamp) { fetch(`${API_URL}/user-queries/${timestamp}`) @@ -414,15 +421,15 @@ document.addEventListener('DOMContentLoaded', function() { // Create a modal to display the query details const modal = document.createElement('div'); modal.className = 'modal'; - + const modalContent = document.createElement('div'); modalContent.className = 'modal-content'; - + const parameters = data.parameters || {}; const contentType = parameters.content_type || 'Not specified'; const length = parameters.length || 'Not specified'; const includeCTA = parameters.include_cta ? 'Yes' : 'No'; - + modalContent.innerHTML = ` `; - + modal.appendChild(modalContent); document.body.appendChild(modal); - + // Close button functionality modal.querySelector('.modal-close').addEventListener('click', function() { document.body.removeChild(modal); }); - + // Close when clicking outside the modal window.addEventListener('click', function(event) { if (event.target === modal) { @@ -472,7 +479,7 @@ document.addEventListener('DOMContentLoaded', function() { alert('Error viewing query details. Please try again.'); }); } - + // Delete User Query function deleteUserQuery(timestamp) { fetch(`${API_URL}/user-queries/${timestamp}`, { @@ -486,7 +493,7 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(data => { alert('Query successfully deleted.'); - + // Reload the user queries loadUserQueries(); }) @@ -495,20 +502,20 @@ document.addEventListener('DOMContentLoaded', function() { alert('Error deleting query. Please try again.'); }); } - + // History Filter Handlers if (historyFilterType) { historyFilterType.addEventListener('change', function() { loadUserQueries(1, this.value); }); } - + if (historySearch) { historySearch.addEventListener('input', function() { // Client-side filtering - this would ideally be server-side, // but we'll implement a simple client-side filter for now const searchTerm = this.value.toLowerCase(); - + document.querySelectorAll('.history-item').forEach(item => { const content = item.querySelector('.history-item-content').textContent.toLowerCase(); if (content.includes(searchTerm)) { @@ -519,185 +526,63 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - - // Brand Style Tag Selection - if (toneSelector) { - const tagElements = toneSelector.querySelectorAll('.tag'); - tagElements.forEach(tag => { - tag.addEventListener('click', function() { - this.classList.toggle('selected'); - }); - }); + + // Brand Style Tag Selection - Disabled as brand style is fixed to Adriana James' style + // Read-only display of brand style tags + + // Taboo Words - Read-only as brand style is fixed to Adriana James' style + // Disabled taboo word editing functionality + if (tabooInput) { + tabooInput.disabled = true; + tabooInput.placeholder = "Taboo words are fixed to maintain brand consistency"; } - - if (voiceSelector) { - const tagElements = voiceSelector.querySelectorAll('.tag'); - tagElements.forEach(tag => { - tag.addEventListener('click', function() { - this.classList.toggle('selected'); - }); - }); + + if (addTabooBtn) { + addTabooBtn.disabled = true; } - - // Add Taboo Word - if (addTabooBtn && tabooInput && tabooWords) { - addTabooBtn.addEventListener('click', function() { - const word = tabooInput.value.trim(); - if (word) { - const tagElement = document.createElement('span'); - tagElement.classList.add('tag', 'removable'); - tagElement.innerHTML = `${word}`; - - // Add click event to remove the tag - tagElement.querySelector('i').addEventListener('click', function() { - tagElement.remove(); - }); - - tabooWords.appendChild(tagElement); - tabooInput.value = ''; - } - }); - - // Allow pressing Enter to add a word - tabooInput.addEventListener('keypress', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - addTabooBtn.click(); - } - }); + + // Terminology - Read-only as brand style is fixed to Adriana James' style + // Disabled terminology editing functionality + if (avoidTerm) { + avoidTerm.disabled = true; + avoidTerm.placeholder = "Terminology is fixed"; } - - // Add Terminology Term - if (addTermBtn && avoidTerm && useTerm) { - addTermBtn.addEventListener('click', function() { - const avoid = avoidTerm.value.trim(); - const use = useTerm.value.trim(); - - if (avoid && use) { - const tableRow = document.createElement('div'); - tableRow.classList.add('terminology-row'); - tableRow.innerHTML = ` -
    ${avoid}
    -
    ${use}
    -
    - -
    - `; - - // Add click event to remove the row - tableRow.querySelector('.btn-icon').addEventListener('click', function() { - tableRow.remove(); - }); - - // Insert before the add row - const addRow = document.querySelector('.terminology-row.add-row'); - addRow.parentNode.insertBefore(tableRow, addRow); - - avoidTerm.value = ''; - useTerm.value = ''; - } - }); - - // Allow pressing Enter to add a term - useTerm.addEventListener('keypress', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - addTermBtn.click(); - } - }); + + if (useTerm) { + useTerm.disabled = true; + useTerm.placeholder = "Terminology is fixed"; } - - // Save Brand Style - if (saveBrandStyleBtn) { - saveBrandStyleBtn.addEventListener('click', function() { - // Collect tone tags - const selectedTones = []; - toneSelector.querySelectorAll('.tag.selected').forEach(tag => { - selectedTones.push(tag.textContent); - }); - - // Collect voice characteristics - const selectedVoice = []; - voiceSelector.querySelectorAll('.tag.selected').forEach(tag => { - selectedVoice.push(tag.textContent); - }); - - // Collect taboo words - const tabooWordsList = []; - tabooWords.querySelectorAll('.tag').forEach(tag => { - // Extract just the text without the 'x' icon - const text = tag.textContent.replace('×', '').trim(); - tabooWordsList.push(text); - }); - - // Collect preferred terms - const preferredTerms = {}; - document.querySelectorAll('.terminology-row:not(.add-row):not(.terminology-header)').forEach(row => { - const avoid = row.querySelector('.term-avoid').textContent.trim(); - const use = row.querySelector('.term-use').textContent.trim(); - if (avoid && use) { - preferredTerms[avoid] = use; - } - }); - - // Prepare request data - const requestData = { - tone: selectedTones, - voice_characteristics: selectedVoice, - taboo_words: tabooWordsList, - preferred_terms: preferredTerms - }; - - // Call the API - fetch(`${API_URL}/brand-style`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestData) - }) - .then(response => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - return response.json(); - }) - .then(data => { - alert('Brand style updated successfully!'); - }) - .catch(error => { - console.error('Error:', error); - alert('An error occurred while updating brand style. Please try again.'); - }); - }); + + if (addTermBtn) { + addTermBtn.disabled = true; } - - // Reset Brand Style - if (resetBrandStyleBtn) { - resetBrandStyleBtn.addEventListener('click', function() { - if (confirm('Are you sure you want to reset brand style to defaults?')) { - // In a real implementation, you would call an API to reset - // For now, just reload the page - window.location.reload(); - } - }); - } - + + // Disable remove buttons for terminology rows + document.querySelectorAll('.terminology-row:not(.add-row):not(.terminology-header) .btn-icon').forEach(btn => { + btn.disabled = true; + btn.style.opacity = '0.5'; + btn.style.cursor = 'not-allowed'; + }); + + // Brand Style is fixed - removed save functionality + + // Brand Style is fixed - removed reset functionality + // Training Tabs if (trainingTabs.length > 0) { trainingTabs.forEach(tab => { tab.addEventListener('click', function() { const tabName = this.getAttribute('data-tab'); - + // Update active tab trainingTabs.forEach(t => t.classList.remove('active')); this.classList.add('active'); - + // Show selected tab content tabContents.forEach(content => { if (content.id === `${tabName}-tab`) { content.classList.add('active'); - + // Load training data when the View tab is selected if (tabName === 'view-training') { loadTrainingData(); @@ -709,7 +594,7 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Add Training Data if (addTrainingBtn) { addTrainingBtn.addEventListener('click', function() { @@ -717,12 +602,12 @@ document.addEventListener('DOMContentLoaded', function() { alert('Please select a content type.'); return; } - + if (!trainingContent.value.trim()) { alert('Please enter content for training.'); return; } - + // Prepare request data const requestData = { content_type: trainingContentType.value, @@ -732,20 +617,20 @@ document.addEventListener('DOMContentLoaded', function() { performance_metrics: {} } }; - + // Add performance metrics if provided if (openRate.value) { requestData.metadata.performance_metrics.open_rate = parseFloat(openRate.value) / 100; } - + if (clickRate.value) { requestData.metadata.performance_metrics.click_rate = parseFloat(clickRate.value) / 100; } - + if (conversionRate.value) { requestData.metadata.performance_metrics.conversion_rate = parseFloat(conversionRate.value) / 100; } - + // Call the API fetch(`${API_URL}/training-data`, { method: 'POST', @@ -762,7 +647,7 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(data => { alert('Training data added successfully!'); - + // Clear form trainingContentType.value = ''; campaignName.value = ''; @@ -770,7 +655,7 @@ document.addEventListener('DOMContentLoaded', function() { openRate.value = ''; clickRate.value = ''; conversionRate.value = ''; - + // Switch to view tab document.querySelector('.tab[data-tab="view-training"]').click(); }) @@ -780,20 +665,20 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Load Training Data function loadTrainingData(page = 1, contentType = '') { if (!trainingList) return; - + // Show loading state trainingList.innerHTML = '
    Loading training data...
    '; - + // Build the query parameters let queryParams = `?page=${page}&limit=10`; if (contentType) { queryParams += `&content_type=${contentType}`; } - + // Call the API fetch(`${API_URL}/training-data${queryParams}`) .then(response => { @@ -804,17 +689,17 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(data => { trainingList.innerHTML = ''; - + if (data.items.length === 0) { trainingList.innerHTML = '
    No training data found.
    '; return; } - + // Create training items data.items.forEach(item => { const trainingItem = document.createElement('div'); trainingItem.className = 'training-item'; - + // Generate metrics HTML let metricsHTML = ''; if (item.metadata && item.metadata.performance_metrics) { @@ -829,13 +714,13 @@ document.addEventListener('DOMContentLoaded', function() { metricsHTML += `Conversion: ${(metrics.conversion_rate * 100).toFixed(1)}%`; } } - + if (!metricsHTML) { metricsHTML = 'No metrics available'; } - + const campaignName = item.metadata?.campaign_name || 'Untitled'; - + trainingItem.innerHTML = `
    ${getContentTypeLabel(item.content_type)}
    @@ -845,7 +730,7 @@ document.addEventListener('DOMContentLoaded', function() { ${metricsHTML}
    - +
    `; - + trainingList.appendChild(trainingItem); }); - + // Add event listeners for view and delete buttons document.querySelectorAll('.view-training').forEach(btn => { btn.addEventListener('click', function() { @@ -866,7 +751,7 @@ document.addEventListener('DOMContentLoaded', function() { viewTrainingData(id); }); }); - + document.querySelectorAll('.delete-training').forEach(btn => { btn.addEventListener('click', function() { const id = this.getAttribute('data-id'); @@ -875,7 +760,7 @@ document.addEventListener('DOMContentLoaded', function() { } }); }); - + // Add pagination for training data if (data.pagination && data.pagination.pages > 1) { // Remove existing pagination if any @@ -883,18 +768,18 @@ document.addEventListener('DOMContentLoaded', function() { if (existingPagination) { existingPagination.remove(); } - + const paginationElement = document.createElement('div'); paginationElement.className = 'pagination'; - + let paginationHTML = ''; for (let i = 1; i <= data.pagination.pages; i++) { paginationHTML += ``; } - + paginationElement.innerHTML = paginationHTML; trainingList.after(paginationElement); - + // Add event listeners for pagination buttons document.querySelectorAll('.page-btn').forEach(btn => { btn.addEventListener('click', function() { @@ -909,7 +794,7 @@ document.addEventListener('DOMContentLoaded', function() { trainingList.innerHTML = '
    Error loading training data. Please try again.
    '; }); } - + // View Training Data function viewTrainingData(id) { fetch(`${API_URL}/training-data/${id}`) @@ -923,12 +808,12 @@ document.addEventListener('DOMContentLoaded', function() { // Create a modal to display the training data details const modal = document.createElement('div'); modal.className = 'modal'; - + const modalContent = document.createElement('div'); modalContent.className = 'modal-content'; - + const campaignName = data.metadata?.campaign_name || 'Untitled'; - + let metricsHTML = ''; if (data.metadata && data.metadata.performance_metrics) { const metrics = data.metadata.performance_metrics; @@ -942,7 +827,7 @@ document.addEventListener('DOMContentLoaded', function() { metricsHTML += `
    Conversion Rate: ${(metrics.conversion_rate * 100).toFixed(1)}%
    `; } } - + modalContent.innerHTML = ` `; - + modal.appendChild(modalContent); document.body.appendChild(modal); - + // Close button functionality modal.querySelector('.modal-close').addEventListener('click', function() { document.body.removeChild(modal); }); - + // Close when clicking outside the modal window.addEventListener('click', function(event) { if (event.target === modal) { @@ -985,7 +870,7 @@ document.addEventListener('DOMContentLoaded', function() { alert('Error viewing training data details. Please try again.'); }); } - + // Delete Training Data function deleteTrainingData(id) { fetch(`${API_URL}/training-data/${id}`, { @@ -999,7 +884,7 @@ document.addEventListener('DOMContentLoaded', function() { }) .then(data => { alert('Training data successfully deleted.'); - + // Reload the training data loadTrainingData(); }) @@ -1008,19 +893,19 @@ document.addEventListener('DOMContentLoaded', function() { alert('Error deleting training data. Please try again.'); }); } - + // Training Filter Handlers if (trainingFilterType) { trainingFilterType.addEventListener('change', function() { loadTrainingData(1, this.value); }); } - + if (trainingSearch) { trainingSearch.addEventListener('input', function() { // Client-side filtering const searchTerm = this.value.toLowerCase(); - + document.querySelectorAll('.training-item').forEach(item => { const content = item.querySelector('.training-item-content').textContent.toLowerCase(); if (content.includes(searchTerm)) { @@ -1031,7 +916,7 @@ document.addEventListener('DOMContentLoaded', function() { }); }); } - + // Load Brand Style on Page Load fetch(`${API_URL}/brand-style`) .then(response => { @@ -1047,11 +932,11 @@ document.addEventListener('DOMContentLoaded', function() { .catch(error => { console.error('Error loading brand style:', error); }); - + // 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 = 'Generate an email campaign for a product launch'; - + // Add CSS for modal const modalStyle = document.createElement('style'); modalStyle.textContent = ` @@ -1066,7 +951,7 @@ document.addEventListener('DOMContentLoaded', function() { background-color: rgba(0, 0, 0, 0.5); overflow: auto; } - + .modal-content { background-color: white; margin: 5% auto; @@ -1077,12 +962,12 @@ document.addEventListener('DOMContentLoaded', function() { max-width: 800px; animation: modalOpen 0.3s ease-out; } - + @keyframes modalOpen { from {opacity: 0; transform: translateY(-20px);} to {opacity: 1; transform: translateY(0);} } - + .modal-header { padding: 20px 25px; border-bottom: 1px solid var(--grey-200); @@ -1090,11 +975,11 @@ document.addEventListener('DOMContentLoaded', function() { justify-content: space-between; align-items: center; } - + .modal-header h3 { margin: 0; } - + .modal-close { background: transparent; border: none; @@ -1102,34 +987,34 @@ document.addEventListener('DOMContentLoaded', function() { cursor: pointer; color: var(--grey-600); } - + .modal-close:hover { color: var(--grey-800); } - + .modal-body { padding: 25px; } - + .detail-item { margin-bottom: 15px; } - + .detail-label { font-weight: 600; color: var(--grey-700); display: block; margin-bottom: 5px; } - + .detail-value { color: var(--grey-800); } - + .content-preview { margin-top: 25px; } - + .content-box { background-color: var(--grey-100); border: 1px solid var(--grey-200); @@ -1140,20 +1025,20 @@ document.addEventListener('DOMContentLoaded', function() { max-height: 300px; overflow-y: auto; } - + .loading-state, .empty-state, .error-state { text-align: center; padding: 30px; color: var(--grey-500); } - + .pagination { display: flex; justify-content: center; gap: 5px; margin-top: 20px; } - + .page-btn { padding: 8px 12px; border: 1px solid var(--grey-300); @@ -1161,7 +1046,7 @@ document.addEventListener('DOMContentLoaded', function() { border-radius: var(--radius-md); cursor: pointer; } - + .page-btn.active { background-color: var(--primary-color); color: white; diff --git a/frontend/index.html b/frontend/index.html index d349df1..4258713 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -71,7 +71,7 @@ - +
    @@ -227,38 +227,36 @@

    Brand Tone

    -

    Select the tone options that best represent the brand.

    -
    - professional - friendly - inspirational +

    Adriana James' distinctive tone is characterized by:

    +
    empowering - excited - authoritative - casual - humorous + assertive + inspirational + direct
    +

    Her tone carries a motivational coach-like clarity, using embedded commands and cause-effect statements that inspire action.

    Voice Characteristics

    -

    Define the key characteristics of the brand voice.

    -
    +

    Adriana James speaks with these distinctive characteristics:

    +
    clear - direct - empowering confident - authentic - innovative - visionary - approachable + conversational + teaching
    +

    She speaks with conviction and clarity, using simple language to communicate profound ideas. Instead of saying "This might help you," she would say "You can do this—because your unconscious mind already knows how."

    @@ -339,8 +337,7 @@
    - - +

    Brand style settings are locked to maintain Adriana James' authentic voice across all content.

    diff --git a/frontend/styles.css b/frontend/styles.css index 4661797..e90b6f0 100644 --- a/frontend/styles.css +++ b/frontend/styles.css @@ -446,9 +446,30 @@ header { } .result-content { - padding: 25px; white-space: pre-wrap; + font-family: var(--font-family); line-height: 1.6; + padding: 20px; + background: white; + border-radius: 8px; + box-shadow: var(--shadow-sm); +} + +.result-content ul, +.result-content ol { + padding-left: 20px; + margin: 1em 0; +} + +.result-content p { + margin: 1em 0; +} + +/* Style bullet points */ +.result-content • { + margin-left: 1em; + display: list-item; + list-style-type: disc; } .metadata-panel { @@ -745,6 +766,48 @@ header { margin-top: 10px; } +.tag-selector.read-only .tag { + cursor: default; +} + +.style-description { + margin-top: 15px; + font-style: italic; + color: var(--grey-600); + line-height: 1.6; +} + +.style-note { + display: flex; + align-items: center; + color: var(--grey-600); + font-style: italic; +} + +.style-note i { + margin-right: 8px; + color: var(--grey-500); +} + +.alert { + padding: 15px; + border-radius: var(--radius-md); + margin-top: 15px; + display: flex; + align-items: center; +} + +.alert i { + margin-right: 10px; + font-size: 18px; +} + +.alert-info { + background-color: rgba(98, 54, 255, 0.1); + color: var(--primary-dark); + border-left: 4px solid var(--primary-color); +} + .tag { display: inline-flex; align-items: center; @@ -885,40 +948,40 @@ header { width: 80px; padding: 15px 0; } - + .logo h2 { width: 50px; height: 50px; font-size: 20px; } - + .menu li { justify-content: center; padding: 12px; } - + .menu li i { margin-right: 0; font-size: 20px; } - + .menu li span { display: none; } - + .user-info { justify-content: center; padding: 10px; } - + .user-avatar { margin-right: 0; } - + .user-name { display: none; } - + .content { margin-left: 80px; max-width: calc(100vw - 80px); @@ -930,35 +993,35 @@ header { flex-direction: column; gap: 10px; } - + .templates-grid { grid-template-columns: 1fr; } - - .history-item, + + .history-item, .training-item { flex-direction: column; align-items: flex-start; } - + .history-item-type, .training-item-type { margin-bottom: 10px; } - + .history-item-content, .training-item-content { padding: 0; margin-bottom: 10px; } - + .history-item-date { text-align: left; margin-bottom: 10px; } - + .checkbox-group { flex-direction: column; gap: 10px; } -} \ No newline at end of file +} diff --git a/logs/app.log b/logs/app.log index 95a31a6..5342add 100644 --- a/logs/app.log +++ b/logs/app.log @@ -1,970 +1,420 @@ -2025-04-17 07:08:51.543 | WARNING | vector_store:search:159 - Empty vector store, no results to return -2025-04-17 07:08:51.543 | WARNING | vector_store:search:159 - Empty vector store, no results to return -2025-04-17 07:08:51.551 | INFO | copywriter:generate_copy:118 - Generated content with 159 characters -2025-04-17 07:08:51.551 | INFO | copywriter:generate_copy:118 - Generated content with 159 characters -2025-04-17 07:08:52.803 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:08:52.803 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:12:18.934 | INFO | vector_store:search:212 - Found 1 matching documents for query -2025-04-17 07:12:18.934 | INFO | vector_store:search:212 - Found 1 matching documents for query -2025-04-17 07:12:18.936 | INFO | copywriter:generate_copy:118 - Generated content with 159 characters -2025-04-17 07:12:18.936 | INFO | copywriter:generate_copy:118 - Generated content with 159 characters -2025-04-17 07:12:19.677 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:12:19.677 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:15:03.309 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:03.309 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:05.643 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:05.643 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:05.644 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:05.644 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:10.452 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:10.452 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:10.455 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:10.455 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:15.166 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:15.166 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:15.168 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:15.168 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:15.170 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:15.170 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:20.280 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:20.280 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:21.317 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:21.317 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:21.369 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:21.369 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:26.051 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:26.051 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:26.052 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:26.052 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:30.842 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:30.842 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:30.847 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:30.847 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:30.859 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:30.859 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:36.115 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:36.115 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:15:36.882 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:36.882 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:36.885 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:36.885 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:41.549 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:41.549 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:41.551 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:41.551 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:46.258 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:46.258 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 404, { - "error": { - "message": "The model `gpt-4` does not exist or you do not have access to it.", - "type": "invalid_request_error", - "param": null, - "code": "model_not_found" - } -} - -2025-04-17 07:15:46.266 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:46.266 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 404 -2025-04-17 07:15:46.269 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:46.269 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:15:46.274 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-17 07:15:46.274 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-17 07:18:54.993 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:18:54.993 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:18:57.991 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:18:57.991 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:18:57.993 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:18:57.993 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:02.717 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:02.717 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:02.719 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:02.719 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:07.525 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:07.525 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:07.526 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:07.526 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:07.527 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:07.527 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:12.302 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:19:12.302 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:19:13.063 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:13.063 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:13.064 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:13.064 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:21.192 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:21.192 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:21.199 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:21.199 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:26.353 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:26.353 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:26.360 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:26.360 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:26.364 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:26.364 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:31.480 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:19:31.480 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:19:32.593 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:32.593 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:32.597 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:32.597 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:37.418 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:37.418 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:37.425 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:37.425 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:42.179 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:42.179 | ERROR | copywriter:_call_llm_api:161 - OpenAI API error: 429, { - "error": { - "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", - "type": "insufficient_quota", - "param": null, - "code": "insufficient_quota" - } -} - -2025-04-17 07:19:42.180 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:42.180 | ERROR | copywriter:_call_llm_api:165 - Error calling OpenAI API: OpenAI API error: 429 -2025-04-17 07:19:42.181 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:42.181 | ERROR | copywriter:generate_copy:122 - Error generating copy: RetryError[] -2025-04-17 07:19:42.182 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-17 07:19:42.182 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-17 07:23:26.426 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:23:26.426 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-17 07:23:41.296 | INFO | copywriter:generate_copy:118 - Generated content with 1092 characters -2025-04-17 07:23:41.296 | INFO | copywriter:generate_copy:118 - Generated content with 1092 characters -2025-04-17 07:23:41.800 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:23:41.800 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:24:54.053 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:24:54.053 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:25:04.622 | INFO | copywriter:generate_copy:118 - Generated content with 1528 characters -2025-04-17 07:25:04.622 | INFO | copywriter:generate_copy:118 - Generated content with 1528 characters -2025-04-17 07:25:05.154 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:25:05.154 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:36:21.399 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:36:21.399 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:36:38.021 | INFO | copywriter:generate_copy:118 - Generated content with 1506 characters -2025-04-17 07:36:38.021 | INFO | copywriter:generate_copy:118 - Generated content with 1506 characters -2025-04-17 07:36:38.691 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:36:38.691 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:52:38.745 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:52:38.745 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:52:43.989 | INFO | copywriter:generate_copy:118 - Generated content with 735 characters -2025-04-17 07:52:43.989 | INFO | copywriter:generate_copy:118 - Generated content with 735 characters -2025-04-17 07:52:44.389 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:52:44.389 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:53:48.816 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 07:53:48.816 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 07:53:53.715 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 07:53:53.715 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 07:57:41.845 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:57:41.845 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 07:57:49.623 | INFO | copywriter:generate_copy:118 - Generated content with 1037 characters -2025-04-17 07:57:49.623 | INFO | copywriter:generate_copy:118 - Generated content with 1037 characters -2025-04-17 07:57:49.997 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:57:49.997 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:58:37.795 | INFO | copywriter:generate_copy:118 - Generated content with 1229 characters -2025-04-17 07:58:37.795 | INFO | copywriter:generate_copy:118 - Generated content with 1229 characters -2025-04-17 07:58:38.334 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 07:58:38.334 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:00:19.501 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 08:00:19.501 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 08:02:10.367 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 08:02:10.367 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 08:03:00.533 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 08:03:00.533 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 08:03:15.382 | INFO | copywriter:generate_copy:118 - Generated content with 2057 characters -2025-04-17 08:03:15.382 | INFO | copywriter:generate_copy:118 - Generated content with 2057 characters -2025-04-17 08:03:15.964 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:03:15.964 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:04:49.387 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 08:04:49.387 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 08:05:19.792 | ERROR | copywriter:_call_llm_api:167 - Error calling Cohere API: -2025-04-17 08:05:19.792 | ERROR | copywriter:_call_llm_api:167 - Error calling Cohere API: -2025-04-17 08:05:33.019 | INFO | copywriter:generate_copy:118 - Generated content with 938 characters -2025-04-17 08:05:33.019 | INFO | copywriter:generate_copy:118 - Generated content with 938 characters -2025-04-17 08:05:33.540 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:05:33.540 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:08:22.724 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 08:08:22.724 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-17 08:10:36.577 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 08:10:36.577 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:14:52.646 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 09:14:52.646 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 09:15:06.876 | INFO | copywriter:generate_copy:118 - Generated content with 775 characters -2025-04-17 09:15:06.876 | INFO | copywriter:generate_copy:118 - Generated content with 775 characters -2025-04-17 09:15:07.331 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:15:07.331 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:15:45.897 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:15:45.897 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:21:39.757 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 09:21:39.757 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-17 09:21:55.770 | INFO | copywriter:generate_copy:118 - Generated content with 1778 characters -2025-04-17 09:21:55.770 | INFO | copywriter:generate_copy:118 - Generated content with 1778 characters -2025-04-17 09:21:56.229 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:21:56.229 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:23:23.199 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:23:23.199 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:24:27.186 | INFO | copywriter:generate_copy:118 - Generated content with 1353 characters -2025-04-17 09:24:27.186 | INFO | copywriter:generate_copy:118 - Generated content with 1353 characters -2025-04-17 09:24:33.304 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:24:33.304 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:25:18.277 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:25:18.277 | INFO | copywriter:improve_copy:221 - Improved content based on feedback -2025-04-17 09:27:47.580 | INFO | copywriter:generate_copy:118 - Generated content with 1316 characters -2025-04-17 09:27:47.580 | INFO | copywriter:generate_copy:118 - Generated content with 1316 characters -2025-04-17 09:27:48.175 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:27:48.175 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:28:28.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-17 09:28:28.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 00:48:00.063 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-18 00:48:00.063 | INFO | brand_style:update_style_guidelines:80 - Updated brand style guidelines -2025-04-18 01:00:14.884 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:14.884 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:18.898 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:18.898 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:22.903 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:22.903 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:00:22.904 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-18 01:00:22.904 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-18 01:02:05.000 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:05.000 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:09.006 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:09.006 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:13.014 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:13.014 | ERROR | copywriter:generate_copy:122 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:02:13.015 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-18 01:02:13.015 | ERROR | main:generate_copy:157 - Error generating copy: RetryError[] -2025-04-18 01:14:27.689 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:27.689 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:31.699 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:31.699 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:35.702 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:35.702 | ERROR | copywriter:generate_copy:94 - Error generating copy: 'BrandStyleManager' object has no attribute '_get_content_format' -2025-04-18 01:14:35.703 | ERROR | main:generate_copy:133 - Error generating copy: RetryError[] -2025-04-18 01:14:35.703 | ERROR | main:generate_copy:133 - Error generating copy: RetryError[] -2025-04-18 01:17:10.288 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:17:10.288 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:17:16.813 | INFO | copywriter:generate_copy:90 - Generated content with 770 characters -2025-04-18 01:17:16.813 | INFO | copywriter:generate_copy:90 - Generated content with 770 characters -2025-04-18 01:17:17.285 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:17:17.285 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:18:21.877 | INFO | copywriter:generate_copy:90 - Generated content with 583 characters -2025-04-18 01:18:21.877 | INFO | copywriter:generate_copy:90 - Generated content with 583 characters -2025-04-18 01:18:22.645 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:18:22.645 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:18:52.465 | INFO | copywriter:generate_copy:90 - Generated content with 791 characters -2025-04-18 01:18:52.465 | INFO | copywriter:generate_copy:90 - Generated content with 791 characters -2025-04-18 01:18:52.905 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:18:52.905 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:20:01.008 | INFO | copywriter:generate_copy:90 - Generated content with 1695 characters -2025-04-18 01:20:01.008 | INFO | copywriter:generate_copy:90 - Generated content with 1695 characters -2025-04-18 01:20:01.566 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:20:01.566 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:20:26.004 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:20:26.004 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:34:03.153 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:34:03.153 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:34:22.102 | INFO | copywriter:generate_copy:90 - Generated content with 2004 characters -2025-04-18 01:34:22.102 | INFO | copywriter:generate_copy:90 - Generated content with 2004 characters -2025-04-18 01:34:22.524 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:34:22.524 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:35:24.984 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:35:24.984 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:35:41.564 | INFO | copywriter:generate_copy:90 - Generated content with 1635 characters -2025-04-18 01:35:41.564 | INFO | copywriter:generate_copy:90 - Generated content with 1635 characters -2025-04-18 01:35:42.025 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:35:42.025 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:36:43.029 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:36:43.029 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:36:51.487 | INFO | copywriter:generate_copy:90 - Generated content with 1163 characters -2025-04-18 01:36:51.487 | INFO | copywriter:generate_copy:90 - Generated content with 1163 characters -2025-04-18 01:36:51.866 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:36:51.866 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:37:35.913 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:37:35.913 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:38:04.403 | INFO | copywriter:generate_copy:90 - Generated content with 1374 characters -2025-04-18 01:38:04.403 | INFO | copywriter:generate_copy:90 - Generated content with 1374 characters -2025-04-18 01:38:05.011 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:38:05.011 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:38:44.318 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:38:44.318 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 01:39:14.512 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 01:39:14.512 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 01:39:48.781 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 01:39:48.781 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 01:40:08.963 | INFO | copywriter:generate_copy:90 - Generated content with 1831 characters -2025-04-18 01:40:08.963 | INFO | copywriter:generate_copy:90 - Generated content with 1831 characters -2025-04-18 01:40:09.921 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:40:09.921 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 01:44:03.287 | INFO | copywriter:improve_copy:193 - Improved content based on feedback -2025-04-18 01:44:03.287 | INFO | copywriter:improve_copy:193 - Improved content based on feedback -2025-04-18 01:44:55.624 | INFO | copywriter:improve_copy:193 - Improved content based on feedback -2025-04-18 01:44:55.624 | INFO | copywriter:improve_copy:193 - Improved content based on feedback -2025-04-18 02:07:19.823 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 02:07:19.823 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 02:07:27.541 | INFO | copywriter:generate_copy:90 - Generated content with 226 characters -2025-04-18 02:07:27.541 | INFO | copywriter:generate_copy:90 - Generated content with 226 characters -2025-04-18 02:07:28.463 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:07:28.463 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:08:38.495 | INFO | copywriter:generate_copy:90 - Generated content with 239 characters -2025-04-18 02:08:38.495 | INFO | copywriter:generate_copy:90 - Generated content with 239 characters -2025-04-18 02:08:38.965 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:08:38.965 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:09:04.045 | INFO | copywriter:generate_copy:90 - Generated content with 229 characters -2025-04-18 02:09:04.045 | INFO | copywriter:generate_copy:90 - Generated content with 229 characters -2025-04-18 02:09:04.476 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:09:04.476 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:09:33.639 | INFO | copywriter:generate_copy:90 - Generated content with 686 characters -2025-04-18 02:09:33.639 | INFO | copywriter:generate_copy:90 - Generated content with 686 characters -2025-04-18 02:09:34.290 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:09:34.290 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:10:29.627 | INFO | copywriter:generate_copy:90 - Generated content with 383 characters -2025-04-18 02:10:29.627 | INFO | copywriter:generate_copy:90 - Generated content with 383 characters -2025-04-18 02:10:30.087 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:10:30.087 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:19:13.085 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:19:13.085 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:19:22.542 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:19:22.542 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:19:22.543 | INFO | copywriter:generate_copy:90 - Generated content with 963 characters -2025-04-18 02:19:22.543 | INFO | copywriter:generate_copy:90 - Generated content with 963 characters -2025-04-18 02:20:37.281 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:20:37.281 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:20:37.283 | INFO | copywriter:generate_copy:90 - Generated content with 1278 characters -2025-04-18 02:20:37.283 | INFO | copywriter:generate_copy:90 - Generated content with 1278 characters -2025-04-18 02:21:03.210 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:21:03.210 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 02:21:03.212 | INFO | copywriter:generate_copy:90 - Generated content with 1099 characters -2025-04-18 02:21:03.212 | INFO | copywriter:generate_copy:90 - Generated content with 1099 characters -2025-04-18 02:26:17.803 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:26:17.803 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:26:25.385 | INFO | copywriter:generate_copy:90 - Generated content with 1128 characters -2025-04-18 02:26:25.385 | INFO | copywriter:generate_copy:90 - Generated content with 1128 characters -2025-04-18 02:26:25.823 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:26:25.823 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:28:15.335 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:28:15.335 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:28:24.861 | INFO | copywriter:generate_copy:90 - Generated content with 1197 characters -2025-04-18 02:28:24.861 | INFO | copywriter:generate_copy:90 - Generated content with 1197 characters -2025-04-18 02:28:25.253 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:28:25.253 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:29:27.025 | INFO | copywriter:generate_copy:90 - Generated content with 852 characters -2025-04-18 02:29:27.025 | INFO | copywriter:generate_copy:90 - Generated content with 852 characters -2025-04-18 02:29:27.561 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:29:27.561 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:30:18.629 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:30:18.629 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:30:31.984 | INFO | copywriter:generate_copy:90 - Generated content with 1280 characters -2025-04-18 02:30:31.984 | INFO | copywriter:generate_copy:90 - Generated content with 1280 characters -2025-04-18 02:30:32.533 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:30:32.533 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:50:52.050 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:50:52.050 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 02:51:08.753 | INFO | copywriter:generate_copy:90 - Generated content with 1621 characters -2025-04-18 02:51:08.753 | INFO | copywriter:generate_copy:90 - Generated content with 1621 characters -2025-04-18 02:51:09.188 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:51:09.188 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:54:25.384 | INFO | copywriter:generate_copy:90 - Generated content with 1304 characters -2025-04-18 02:54:25.384 | INFO | copywriter:generate_copy:90 - Generated content with 1304 characters -2025-04-18 02:54:26.186 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:54:26.186 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:54:46.982 | INFO | copywriter:generate_copy:90 - Generated content with 815 characters -2025-04-18 02:54:46.982 | INFO | copywriter:generate_copy:90 - Generated content with 815 characters -2025-04-18 02:54:47.508 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:54:47.508 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:55:50.883 | INFO | copywriter:generate_copy:90 - Generated content with 1827 characters -2025-04-18 02:55:50.883 | INFO | copywriter:generate_copy:90 - Generated content with 1827 characters -2025-04-18 02:55:51.314 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 02:55:51.314 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:02:34.882 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:02:34.882 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:02:55.595 | INFO | copywriter:generate_copy:90 - Generated content with 1571 characters -2025-04-18 03:02:55.595 | INFO | copywriter:generate_copy:90 - Generated content with 1571 characters -2025-04-18 03:02:57.531 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:02:57.531 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:11:46.772 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:11:46.772 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:12:00.197 | INFO | copywriter:generate_copy:90 - Generated content with 971 characters -2025-04-18 03:12:00.197 | INFO | copywriter:generate_copy:90 - Generated content with 971 characters -2025-04-18 03:12:00.621 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:12:00.621 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:14:42.619 | INFO | copywriter:generate_copy:90 - Generated content with 1146 characters -2025-04-18 03:14:42.619 | INFO | copywriter:generate_copy:90 - Generated content with 1146 characters -2025-04-18 03:14:43.225 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:14:43.225 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:29:08.562 | INFO | copywriter:generate_copy:90 - Generated content with 1423 characters -2025-04-18 03:29:08.562 | INFO | copywriter:generate_copy:90 - Generated content with 1423 characters -2025-04-18 03:29:09.128 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:29:09.128 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:30:04.797 | INFO | copywriter:generate_copy:90 - Generated content with 1475 characters -2025-04-18 03:30:04.797 | INFO | copywriter:generate_copy:90 - Generated content with 1475 characters -2025-04-18 03:30:05.244 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:30:05.244 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:43:52.883 | INFO | copywriter:generate_copy:90 - Generated content with 1123 characters -2025-04-18 03:43:52.883 | INFO | copywriter:generate_copy:90 - Generated content with 1123 characters -2025-04-18 03:44:41.387 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:44:41.387 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:45:23.813 | INFO | copywriter:generate_copy:90 - Generated content with 2004 characters -2025-04-18 03:45:23.813 | INFO | copywriter:generate_copy:90 - Generated content with 2004 characters -2025-04-18 03:45:24.224 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:45:24.224 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:46:06.815 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:46:06.815 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:46:23.745 | INFO | copywriter:generate_copy:90 - Generated content with 1750 characters -2025-04-18 03:46:23.745 | INFO | copywriter:generate_copy:90 - Generated content with 1750 characters -2025-04-18 03:46:50.243 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:46:50.243 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:49:53.371 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:49:53.371 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:50:01.024 | INFO | copywriter:generate_copy:90 - Generated content with 1182 characters -2025-04-18 03:50:01.024 | INFO | copywriter:generate_copy:90 - Generated content with 1182 characters -2025-04-18 03:50:01.557 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:50:01.557 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:52:18.453 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:52:18.453 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:52:25.589 | INFO | copywriter:generate_copy:90 - Generated content with 1040 characters -2025-04-18 03:52:25.589 | INFO | copywriter:generate_copy:90 - Generated content with 1040 characters -2025-04-18 03:52:26.378 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:52:26.378 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:53:03.190 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:53:03.190 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:53:09.327 | INFO | copywriter:generate_copy:90 - Generated content with 883 characters -2025-04-18 03:53:09.327 | INFO | copywriter:generate_copy:90 - Generated content with 883 characters -2025-04-18 03:53:09.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:53:09.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:54:12.575 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:54:12.575 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:54:29.054 | INFO | copywriter:generate_copy:90 - Generated content with 1439 characters -2025-04-18 03:54:29.054 | INFO | copywriter:generate_copy:90 - Generated content with 1439 characters -2025-04-18 03:54:29.441 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:54:29.441 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:55:16.974 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:55:16.974 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:55:26.092 | INFO | copywriter:generate_copy:90 - Generated content with 1243 characters -2025-04-18 03:55:26.092 | INFO | copywriter:generate_copy:90 - Generated content with 1243 characters -2025-04-18 03:55:26.505 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:55:26.505 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:56:15.753 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:56:15.753 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 03:56:24.050 | INFO | copywriter:generate_copy:90 - Generated content with 1189 characters -2025-04-18 03:56:24.050 | INFO | copywriter:generate_copy:90 - Generated content with 1189 characters -2025-04-18 03:56:53.669 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:56:53.669 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:59:44.352 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 03:59:44.352 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 03:59:44.355 | INFO | copywriter:generate_copy:90 - Generated content with 906 characters -2025-04-18 03:59:44.355 | INFO | copywriter:generate_copy:90 - Generated content with 906 characters -2025-04-18 03:59:45.100 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 03:59:45.100 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:00:08.827 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:00:08.827 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:00:21.413 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:00:21.413 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:00:21.413 | INFO | copywriter:generate_copy:90 - Generated content with 1350 characters -2025-04-18 04:00:21.413 | INFO | copywriter:generate_copy:90 - Generated content with 1350 characters -2025-04-18 04:00:21.848 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:00:21.848 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:01:23.133 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:01:23.133 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:01:23.138 | INFO | copywriter:generate_copy:90 - Generated content with 1525 characters -2025-04-18 04:01:23.138 | INFO | copywriter:generate_copy:90 - Generated content with 1525 characters -2025-04-18 04:01:23.727 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:01:23.727 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:02:32.346 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:02:32.346 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:03:46.372 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:03:46.372 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:05:53.862 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:05:53.862 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:06:28.073 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:06:28.073 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 04:10:51.448 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:10:51.448 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:11:15.704 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:11:15.704 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:11:15.705 | INFO | copywriter:generate_copy:90 - Generated content with 1647 characters -2025-04-18 04:11:15.705 | INFO | copywriter:generate_copy:90 - Generated content with 1647 characters -2025-04-18 04:11:16.128 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:11:16.128 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:19:51.595 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:19:51.595 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:20:10.910 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:20:10.910 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:20:10.910 | INFO | copywriter:generate_copy:90 - Generated content with 1248 characters -2025-04-18 04:20:10.910 | INFO | copywriter:generate_copy:90 - Generated content with 1248 characters -2025-04-18 04:20:11.454 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:20:11.454 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:21:29.147 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:21:29.147 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 04:21:59.320 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 04:21:59.320 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 04:22:36.137 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:22:36.137 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 04:22:36.139 | INFO | copywriter:generate_copy:90 - Generated content with 3409 characters -2025-04-18 04:22:36.139 | INFO | copywriter:generate_copy:90 - Generated content with 3409 characters -2025-04-18 04:22:36.945 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 04:22:36.945 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:07:13.340 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:07:13.340 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:08:07.769 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:08:07.769 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:08:07.772 | INFO | copywriter:generate_copy:90 - Generated content with 651 characters -2025-04-18 16:08:07.772 | INFO | copywriter:generate_copy:90 - Generated content with 651 characters -2025-04-18 16:08:09.329 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:08:09.329 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:08:47.520 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:08:47.520 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:09:56.223 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:09:56.223 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:10:00.678 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:10:00.678 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:14:28.677 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:14:28.677 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:16:04.245 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:16:04.245 | ERROR | main:list_training_data:268 - Error listing training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 16:19:37.169 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:19:37.169 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:22:09.127 | WARNING | vector_store:delete_document:246 - Invalid document ID: 1 -2025-04-18 16:22:09.127 | WARNING | vector_store:delete_document:246 - Invalid document ID: 1 -2025-04-18 16:22:27.719 | WARNING | vector_store:delete_document:246 - Invalid document ID: 2 -2025-04-18 16:22:27.719 | WARNING | vector_store:delete_document:246 - Invalid document ID: 2 -2025-04-18 16:30:22.904 | INFO | vector_store:search:212 - Found 1 matching documents for query -2025-04-18 16:30:22.904 | INFO | vector_store:search:212 - Found 1 matching documents for query -2025-04-18 16:30:31.859 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:30:31.859 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:30:31.859 | INFO | copywriter:generate_copy:90 - Generated content with 604 characters -2025-04-18 16:30:31.859 | INFO | copywriter:generate_copy:90 - Generated content with 604 characters -2025-04-18 16:30:32.289 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:30:32.289 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:32:33.304 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-18 16:32:33.304 | INFO | vector_store:search:212 - Found 2 matching documents for query -2025-04-18 16:32:42.281 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:32:42.281 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 16:32:42.283 | INFO | copywriter:generate_copy:90 - Generated content with 632 characters -2025-04-18 16:32:42.283 | INFO | copywriter:generate_copy:90 - Generated content with 632 characters -2025-04-18 16:32:42.750 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 16:32:42.750 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:12:33.909 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:12:33.909 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:12:33.912 | INFO | copywriter:generate_copy:90 - Generated content with 2740 characters -2025-04-18 17:12:33.912 | INFO | copywriter:generate_copy:90 - Generated content with 2740 characters -2025-04-18 17:12:37.538 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:12:37.538 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:13:04.600 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:13:04.600 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:13:17.051 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:13:17.051 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:13:17.052 | INFO | copywriter:generate_copy:90 - Generated content with 577 characters -2025-04-18 17:13:17.052 | INFO | copywriter:generate_copy:90 - Generated content with 577 characters -2025-04-18 17:13:17.652 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:13:17.652 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:14:08.039 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:14:08.039 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:14:33.729 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:14:33.729 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:14:33.741 | INFO | copywriter:generate_copy:90 - Generated content with 1717 characters -2025-04-18 17:14:33.741 | INFO | copywriter:generate_copy:90 - Generated content with 1717 characters -2025-04-18 17:14:34.184 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:14:34.184 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:28:38.798 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:28:38.798 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:28:38.800 | INFO | copywriter:generate_copy:90 - Generated content with 1962 characters -2025-04-18 17:28:38.800 | INFO | copywriter:generate_copy:90 - Generated content with 1962 characters -2025-04-18 17:28:39.569 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:28:39.569 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:29:13.466 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:29:13.466 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:29:30.844 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:29:30.844 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:29:30.845 | INFO | copywriter:generate_copy:90 - Generated content with 1416 characters -2025-04-18 17:29:30.845 | INFO | copywriter:generate_copy:90 - Generated content with 1416 characters -2025-04-18 17:29:31.237 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:29:31.237 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:31:18.658 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T16:32:42.751434 not found -2025-04-18 17:31:18.658 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T16:32:42.751434 not found -2025-04-18 17:31:40.805 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp "2025-04-18T16:32:42.751434" not found -2025-04-18 17:31:40.805 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp "2025-04-18T16:32:42.751434" not found -2025-04-18 17:32:24.114 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T17:12:37.541148 not found -2025-04-18 17:32:24.114 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T17:12:37.541148 not found -2025-04-18 17:34:18.118 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T171237541148 not found -2025-04-18 17:34:18.118 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T171237541148 not found -2025-04-18 17:34:40.614 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T035226 not found -2025-04-18 17:34:40.614 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T035226 not found -2025-04-18 17:35:36.594 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418171317. not found -2025-04-18 17:35:36.594 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418171317. not found -2025-04-18 17:36:13.263 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T17:13:17 not found -2025-04-18 17:36:13.263 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 2025-04-18T17:13:17 not found -2025-04-18 17:36:23.158 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T171317 not found -2025-04-18 17:36:23.158 | ERROR | main:get_user_query:429 - Error getting user query: 404: Query with timestamp 20250418T171317 not found -2025-04-18 17:40:24.503 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:40:24.503 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:40:54.614 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:40:54.614 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:40:54.615 | INFO | copywriter:generate_copy:90 - Generated content with 2080 characters -2025-04-18 17:40:54.615 | INFO | copywriter:generate_copy:90 - Generated content with 2080 characters -2025-04-18 17:40:55.135 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:40:55.135 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:41:16.349 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:41:16.349 | INFO | vector_store:search:212 - Found 3 matching documents for query -2025-04-18 17:41:55.042 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:41:55.042 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 17:41:55.046 | INFO | copywriter:generate_copy:90 - Generated content with 2070 characters -2025-04-18 17:41:55.046 | INFO | copywriter:generate_copy:90 - Generated content with 2070 characters -2025-04-18 17:41:55.458 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 17:41:55.458 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:11:18.236 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:11:18.236 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:11:40.648 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:11:40.648 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:13:01.347 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:13:01.347 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:36:18.449 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418164155 not found -2025-04-18 18:36:18.449 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418164155 not found -2025-04-18 18:36:43.730 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418161237 not found -2025-04-18 18:36:43.730 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418161237 not found -2025-04-18 18:37:32.259 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 18:37:32.259 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 18:38:06.509 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 18:38:06.509 | ERROR | copywriter:_call_llm_api:139 - Error calling Cohere API: -2025-04-18 18:38:48.267 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:38:48.267 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:38:48.272 | INFO | copywriter:generate_copy:90 - Generated content with 3812 characters -2025-04-18 18:38:48.272 | INFO | copywriter:generate_copy:90 - Generated content with 3812 characters -2025-04-18 18:38:51.235 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:38:51.235 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:39:59.364 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250418173851 not found -2025-04-18 18:39:59.364 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250418173851 not found -2025-04-18 18:40:23.978 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250418173851 not found -2025-04-18 18:40:23.978 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250418173851 not found -2025-04-18 18:43:01.011 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:43:01.011 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:43:07.295 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:43:07.295 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:44:21.955 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:44:21.955 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:44:28.293 | INFO | vector_store:delete_document:256 - Marked document 2 as deleted -2025-04-18 18:44:28.293 | INFO | vector_store:delete_document:256 - Marked document 2 as deleted -2025-04-18 18:44:32.713 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:44:32.713 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:47:11.756 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:47:11.756 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:47:12.100 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:47:12.100 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:47:21.198 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:47:21.198 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? -2025-04-18 18:48:22.623 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:48:22.623 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:48:22.636 | INFO | copywriter:generate_copy:90 - Generated content with 1802 characters -2025-04-18 18:48:22.636 | INFO | copywriter:generate_copy:90 - Generated content with 1802 characters -2025-04-18 18:48:23.411 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:48:23.411 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:48:46.063 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418153242 not found -2025-04-18 18:48:46.063 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418153242 not found -2025-04-18 18:49:03.774 | INFO | vector_store:delete_document:256 - Marked document 3 as deleted -2025-04-18 18:49:03.774 | INFO | vector_store:delete_document:256 - Marked document 3 as deleted -2025-04-18 18:49:06.850 | INFO | vector_store:delete_document:256 - Marked document 2 as deleted -2025-04-18 18:49:06.850 | INFO | vector_store:delete_document:256 - Marked document 2 as deleted -2025-04-18 18:49:11.443 | INFO | vector_store:delete_document:256 - Marked document 1 as deleted -2025-04-18 18:49:11.443 | INFO | vector_store:delete_document:256 - Marked document 1 as deleted -2025-04-18 18:51:53.774 | ERROR | main:add_training_data:214 - Error adding training data: no such table: training_data -2025-04-18 18:51:53.774 | ERROR | main:add_training_data:214 - Error adding training data: no such table: training_data -2025-04-18 18:52:03.005 | ERROR | main:add_training_data:214 - Error adding training data: no such table: training_data -2025-04-18 18:52:03.005 | ERROR | main:add_training_data:214 - Error adding training data: no such table: training_data -2025-04-18 18:52:49.739 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:52:49.739 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:52:55.266 | INFO | vector_store:delete_document:256 - Marked document 1 as deleted -2025-04-18 18:52:55.266 | INFO | vector_store:delete_document:256 - Marked document 1 as deleted -2025-04-18 18:56:30.386 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:56:30.386 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:56:30.388 | INFO | copywriter:generate_copy:90 - Generated content with 1580 characters -2025-04-18 18:56:30.388 | INFO | copywriter:generate_copy:90 - Generated content with 1580 characters -2025-04-18 18:56:30.997 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:56:30.997 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:57:15.893 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:57:15.893 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:58:37.976 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:58:37.976 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions -2025-04-18 18:58:37.980 | INFO | copywriter:generate_copy:90 - Generated content with 579 characters -2025-04-18 18:58:37.980 | INFO | copywriter:generate_copy:90 - Generated content with 579 characters -2025-04-18 18:58:38.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:58:38.798 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store -2025-04-18 18:59:13.625 | INFO | copywriter:improve_copy:224 - Improved content based on feedback -2025-04-18 18:59:13.625 | INFO | copywriter:improve_copy:224 - Improved content based on feedback -2025-04-18 18:59:58.642 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 18:59:58.642 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:00:09.875 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:00:09.875 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:00:20.643 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:00:20.643 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:05:10.093 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines -2025-04-18 19:05:10.093 | INFO | brand_style:update_style_guidelines:178 - Updated brand style guidelines +2025-04-21 15:34:55.240 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:34:55.240 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:34:55.249 | INFO | copywriter:generate_copy:90 - Generated content with 1525 characters +2025-04-21 15:34:55.249 | INFO | copywriter:generate_copy:90 - Generated content with 1525 characters +2025-04-21 15:34:57.296 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 15:34:57.296 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 15:38:32.741 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250421143457 not found +2025-04-21 15:38:32.741 | ERROR | main:get_user_query:437 - Error getting user query: 404: Query with timestamp 20250421143457 not found +2025-04-21 15:39:36.125 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418175631 not found +2025-04-21 15:39:36.125 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250418175631 not found +2025-04-21 15:39:46.658 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421142257 not found +2025-04-21 15:39:46.658 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421142257 not found +2025-04-21 15:44:00.355 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:44:00.355 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:44:00.370 | INFO | copywriter:generate_copy:90 - Generated content with 1582 characters +2025-04-21 15:44:00.370 | INFO | copywriter:generate_copy:90 - Generated content with 1582 characters +2025-04-21 15:44:01.801 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 15:44:01.801 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 15:45:45.462 | INFO | vector_store:search:212 - Found 2 matching documents for query +2025-04-21 15:45:45.462 | INFO | vector_store:search:212 - Found 2 matching documents for query +2025-04-21 15:46:00.302 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:46:00.302 | INFO | copywriter:_generate_headline_suggestions:188 - Generated 3 headline suggestions +2025-04-21 15:46:00.306 | INFO | copywriter:generate_copy:90 - Generated content with 1446 characters +2025-04-21 15:46:00.306 | INFO | copywriter:generate_copy:90 - Generated content with 1446 characters +2025-04-21 15:46:00.942 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 15:46:00.942 | INFO | vector_store:add_documents:131 - Added 1 documents to vector store +2025-04-21 16:00:18.779 | INFO | copywriter:_generate_headline_suggestions:194 - Generated 3 headline suggestions +2025-04-21 16:00:18.779 | INFO | copywriter:_generate_headline_suggestions:194 - Generated 3 headline suggestions +2025-04-21 16:00:18.794 | INFO | copywriter:generate_copy:96 - Generated content with 2146 characters +2025-04-21 16:00:18.794 | INFO | copywriter:generate_copy:96 - Generated content with 2146 characters +2025-04-21 16:00:23.811 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:00:23.811 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:11:10.788 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:10.788 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.235 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.235 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.240 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.240 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.240 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.240 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.241 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.241 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.241 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.241 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:11:16.242 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:11:16.242 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:11:16.242 | INFO | copywriter:generate_copy:99 - Generated content with 1447 characters +2025-04-21 16:11:16.242 | INFO | copywriter:generate_copy:99 - Generated content with 1447 characters +2025-04-21 16:11:17.068 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:11:17.068 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:13:36.551 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:36.551 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.502 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.502 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.503 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:13:41.504 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:13:41.504 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:13:41.504 | INFO | copywriter:generate_copy:99 - Generated content with 745 characters +2025-04-21 16:13:41.504 | INFO | copywriter:generate_copy:99 - Generated content with 745 characters +2025-04-21 16:13:42.012 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:13:42.012 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:14:14.319 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421151342 not found +2025-04-21 16:14:14.319 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421151342 not found +2025-04-21 16:14:47.616 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Generate two short Google Search ad texts for the ... +2025-04-21 16:14:47.616 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Generate two short Google Search ad texts for the ... +2025-04-21 16:14:47.622 | INFO | vector_store:search:163 - Searching vector store with query: Generate two short Google Search ad texts for the ... (top_k=3) +2025-04-21 16:14:47.622 | INFO | vector_store:search:163 - Searching vector store with query: Generate two short Google Search ad texts for the ... (top_k=3) +2025-04-21 16:14:47.624 | INFO | vector_store:search:169 - Vector store contains 13 documents +2025-04-21 16:14:47.624 | INFO | vector_store:search:169 - Vector store contains 13 documents +2025-04-21 16:14:51.728 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:14:51.728 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:14:51.729 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:14:51.729 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:15:01.679 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:01.679 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.208 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.208 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.208 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.208 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.209 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.209 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.209 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.209 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.211 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.211 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:15:05.212 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:15:05.212 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:15:05.212 | INFO | copywriter:generate_copy:99 - Generated content with 843 characters +2025-04-21 16:15:05.212 | INFO | copywriter:generate_copy:99 - Generated content with 843 characters +2025-04-21 16:15:05.697 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:15:05.697 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:17:18.505 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:17:18.505 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:17:23.989 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? +2025-04-21 16:17:23.989 | ERROR | main:get_training_data:306 - Error retrieving training data: Column expression, FROM clause, or other columns clause element expected, got [Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None)]. Did you mean to say select(Table('training_data', MetaData(), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('content', String(), table=, nullable=False), Column('content_type', String(), table=, nullable=False), Column('metadata', JSON(), table=, nullable=False), Column('added_at', DateTime(), table=, nullable=False, default=CallableColumnDefault()), Column('is_training_data', Boolean(), table=, nullable=False, default=ScalarElementColumnDefault(True)), schema=None))? +2025-04-21 16:18:27.027 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Generate two short Google Search ad texts for the ... +2025-04-21 16:18:27.027 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Generate two short Google Search ad texts for the ... +2025-04-21 16:18:27.033 | INFO | vector_store:search:163 - Searching vector store with query: Generate two short Google Search ad texts for the ... (top_k=3) +2025-04-21 16:18:27.033 | INFO | vector_store:search:163 - Searching vector store with query: Generate two short Google Search ad texts for the ... (top_k=3) +2025-04-21 16:18:27.036 | INFO | vector_store:search:169 - Vector store contains 15 documents +2025-04-21 16:18:27.036 | INFO | vector_store:search:169 - Vector store contains 15 documents +2025-04-21 16:18:29.029 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:18:29.029 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:18:29.029 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:18:29.029 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:18:36.563 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:36.563 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.121 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.121 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.122 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.123 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.123 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:18:41.123 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:18:41.123 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:18:41.123 | INFO | copywriter:generate_copy:99 - Generated content with 901 characters +2025-04-21 16:18:41.123 | INFO | copywriter:generate_copy:99 - Generated content with 901 characters +2025-04-21 16:18:42.126 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:18:42.126 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:20:39.321 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a high-coverting sales email for a digital ... +2025-04-21 16:20:39.321 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a high-coverting sales email for a digital ... +2025-04-21 16:20:39.335 | INFO | vector_store:search:163 - Searching vector store with query: Create a high-coverting sales email for a digital ... (top_k=3) +2025-04-21 16:20:39.335 | INFO | vector_store:search:163 - Searching vector store with query: Create a high-coverting sales email for a digital ... (top_k=3) +2025-04-21 16:20:39.339 | INFO | vector_store:search:169 - Vector store contains 16 documents +2025-04-21 16:20:39.339 | INFO | vector_store:search:169 - Vector store contains 16 documents +2025-04-21 16:20:41.978 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:20:41.978 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:20:41.979 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:20:41.979 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:21:18.404 | ERROR | copywriter:_call_llm_api:148 - Error calling Cohere API: +2025-04-21 16:21:18.404 | ERROR | copywriter:_call_llm_api:148 - Error calling Cohere API: +2025-04-21 16:21:34.274 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:34.274 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.016 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.017 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.017 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:21:41.017 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:21:41.017 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:21:41.017 | INFO | copywriter:generate_copy:99 - Generated content with 1481 characters +2025-04-21 16:21:41.017 | INFO | copywriter:generate_copy:99 - Generated content with 1481 characters +2025-04-21 16:21:41.519 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:21:41.519 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:22:55.193 | INFO | vector_store:delete_document:265 - Marked document 1 as deleted +2025-04-21 16:22:55.193 | INFO | vector_store:delete_document:265 - Marked document 1 as deleted +2025-04-21 16:29:00.997 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a high-coverting sales email for a digital ... +2025-04-21 16:29:00.997 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a high-coverting sales email for a digital ... +2025-04-21 16:29:01.003 | INFO | vector_store:search:163 - Searching vector store with query: Create a high-coverting sales email for a digital ... (top_k=3) +2025-04-21 16:29:01.003 | INFO | vector_store:search:163 - Searching vector store with query: Create a high-coverting sales email for a digital ... (top_k=3) +2025-04-21 16:29:01.007 | INFO | vector_store:search:169 - Vector store contains 17 documents +2025-04-21 16:29:01.007 | INFO | vector_store:search:169 - Vector store contains 17 documents +2025-04-21 16:29:05.853 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:29:05.853 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 16:29:05.855 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:29:05.855 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 16:29:24.095 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:24.095 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:24.106 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:29:24.106 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:29:30.427 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.427 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.449 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.449 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.450 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.450 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.491 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.491 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.497 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.497 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:29:30.498 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:29:30.498 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:29:30.498 | INFO | copywriter:generate_copy:103 - Generated content with 2087 characters +2025-04-21 16:29:30.498 | INFO | copywriter:generate_copy:103 - Generated content with 2087 characters +2025-04-21 16:29:31.871 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:29:31.871 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:31:15.444 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:15.444 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:15.453 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:31:15.453 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:31:20.673 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.673 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.674 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.674 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.675 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.675 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.676 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.676 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.677 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.677 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:31:20.677 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:31:20.677 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:31:20.677 | INFO | copywriter:generate_copy:103 - Generated content with 996 characters +2025-04-21 16:31:20.677 | INFO | copywriter:generate_copy:103 - Generated content with 996 characters +2025-04-21 16:31:21.193 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:31:21.193 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:32:32.709 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:32.709 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:32.740 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:32:32.740 | INFO | copywriter:_format_content_structure:385 - Formatted content structure with proper paragraphs and headings +2025-04-21 16:32:34.753 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.753 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.754 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.754 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.755 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.755 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:32:34.758 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:32:34.758 | INFO | copywriter:_generate_headline_suggestions:205 - Generated 3 headline suggestions +2025-04-21 16:32:34.765 | INFO | copywriter:generate_copy:103 - Generated content with 1026 characters +2025-04-21 16:32:34.765 | INFO | copywriter:generate_copy:103 - Generated content with 1026 characters +2025-04-21 16:32:35.376 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:32:35.376 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:36:01.084 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421153235 not found +2025-04-21 16:36:01.084 | ERROR | main:delete_user_query:461 - Error deleting user query: 404: Query with timestamp 20250421153235 not found +2025-04-21 16:40:23.882 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:23.882 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.769 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.769 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.770 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.770 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.770 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.770 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:40:27.773 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:40:27.773 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:40:27.774 | INFO | copywriter:generate_copy:99 - Generated content with 1777 characters +2025-04-21 16:40:27.774 | INFO | copywriter:generate_copy:99 - Generated content with 1777 characters +2025-04-21 16:40:28.504 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:40:28.504 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:47:04.591 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:04.591 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:09.999 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:09.999 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.000 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.000 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.001 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.001 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.001 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.001 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.002 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.002 | INFO | copywriter:_remove_name_mentions:319 - Removed any name mentions from generated content +2025-04-21 16:47:10.002 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:47:10.002 | INFO | copywriter:_generate_headline_suggestions:201 - Generated 3 headline suggestions +2025-04-21 16:47:10.002 | INFO | copywriter:generate_copy:99 - Generated content with 2140 characters +2025-04-21 16:47:10.002 | INFO | copywriter:generate_copy:99 - Generated content with 2140 characters +2025-04-21 16:47:10.914 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:47:10.914 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:52:55.889 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:52:55.889 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.637 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.637 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.637 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.637 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.638 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.638 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.638 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.638 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.639 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.639 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 16:53:09.639 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 16:53:09.639 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 16:53:09.640 | INFO | copywriter:generate_copy:99 - Generated content with 1788 characters +2025-04-21 16:53:09.640 | INFO | copywriter:generate_copy:99 - Generated content with 1788 characters +2025-04-21 16:56:55.426 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 16:56:55.426 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:00:00.233 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:00.233 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.202 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.202 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.202 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.202 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.207 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.207 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.208 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.208 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.208 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.208 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:00:04.208 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:00:04.208 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:00:04.208 | INFO | copywriter:generate_copy:99 - Generated content with 704 characters +2025-04-21 17:00:04.208 | INFO | copywriter:generate_copy:99 - Generated content with 704 characters +2025-04-21 17:00:04.835 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:00:04.835 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:10:03.603 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:03.603 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.477 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.477 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.479 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.479 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.479 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.479 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.480 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.480 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.480 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.480 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:10:07.480 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:10:07.480 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:10:07.480 | INFO | copywriter:generate_copy:99 - Generated content with 998 characters +2025-04-21 17:10:07.480 | INFO | copywriter:generate_copy:99 - Generated content with 998 characters +2025-04-21 17:10:09.061 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:10:09.061 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:12:18.637 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:12:18.637 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:12:37.954 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:37.954 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.224 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.224 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.225 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.225 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.225 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.225 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.226 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.226 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.226 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.226 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:12:42.227 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:12:42.227 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:12:42.227 | INFO | copywriter:generate_copy:99 - Generated content with 2231 characters +2025-04-21 17:12:42.227 | INFO | copywriter:generate_copy:99 - Generated content with 2231 characters +2025-04-21 17:12:42.790 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:12:42.790 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:15:41.413 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:41.413 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.040 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.040 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.074 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.074 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.076 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.076 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.089 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:15:46.104 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:15:46.104 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:15:46.106 | INFO | copywriter:generate_copy:99 - Generated content with 1872 characters +2025-04-21 17:15:46.106 | INFO | copywriter:generate_copy:99 - Generated content with 1872 characters +2025-04-21 17:15:47.264 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:15:47.264 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:20:37.970 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:37.970 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.131 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.131 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.141 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.141 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.142 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.142 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.142 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.142 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:20:41.142 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:20:41.142 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:20:41.153 | INFO | copywriter:generate_copy:99 - Generated content with 1825 characters +2025-04-21 17:20:41.153 | INFO | copywriter:generate_copy:99 - Generated content with 1825 characters +2025-04-21 17:20:42.278 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:20:42.278 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:22:32.905 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:22:32.905 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:23:09.640 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a twitter thread on personal branding tips... +2025-04-21 17:23:09.640 | INFO | copywriter:generate_copy:47 - Searching for similar content to reference for prompt: Create a twitter thread on personal branding tips... +2025-04-21 17:23:09.657 | INFO | vector_store:search:163 - Searching vector store with query: Create a twitter thread on personal branding tips... (top_k=3) +2025-04-21 17:23:09.657 | INFO | vector_store:search:163 - Searching vector store with query: Create a twitter thread on personal branding tips... (top_k=3) +2025-04-21 17:23:09.672 | INFO | vector_store:search:169 - Vector store contains 29 documents +2025-04-21 17:23:09.672 | INFO | vector_store:search:169 - Vector store contains 29 documents +2025-04-21 17:23:14.759 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 17:23:14.759 | INFO | vector_store:search:221 - Found 3 matching documents for query +2025-04-21 17:23:14.763 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 17:23:14.763 | INFO | copywriter:generate_copy:51 - Found 3 similar content items to reference +2025-04-21 17:23:45.589 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:23:45.589 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:24:20.350 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:24:20.350 | ERROR | copywriter:_call_llm_api:158 - Error calling Cohere API: +2025-04-21 17:24:43.789 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:43.789 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.514 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.514 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.516 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.516 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.516 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.516 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.517 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:24:54.518 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:24:54.518 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:24:54.518 | INFO | copywriter:generate_copy:99 - Generated content with 2538 characters +2025-04-21 17:24:54.518 | INFO | copywriter:generate_copy:99 - Generated content with 2538 characters +2025-04-21 17:24:55.436 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:24:55.436 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:26:27.287 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:27.287 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.676 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.676 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.678 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.678 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.682 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.682 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.682 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.682 | INFO | copywriter:_remove_name_mentions:329 - Removed any name mentions from generated content +2025-04-21 17:26:32.683 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:26:32.683 | INFO | copywriter:_generate_headline_suggestions:211 - Generated 3 headline suggestions +2025-04-21 17:26:32.683 | INFO | copywriter:generate_copy:99 - Generated content with 2734 characters +2025-04-21 17:26:32.683 | INFO | copywriter:generate_copy:99 - Generated content with 2734 characters +2025-04-21 17:26:33.488 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store +2025-04-21 17:26:33.488 | INFO | vector_store:add_documents:136 - Added 1 documents to vector store