ALwrity AI Blog Writer - Added Google Grounding UI Implementation
This commit is contained in:
@@ -17,61 +17,64 @@ class OutlineOptimizer:
|
||||
"""Optimize entire outline for better flow, SEO, and engagement."""
|
||||
outline_text = "\n".join([f"{i+1}. {s.heading}" for i, s in enumerate(outline)])
|
||||
|
||||
optimization_prompt = f"""
|
||||
Optimize this blog outline for better flow, engagement, and SEO:
|
||||
|
||||
Current Outline:
|
||||
{outline_text}
|
||||
|
||||
Optimization Focus: {focus}
|
||||
|
||||
Optimization Goals:
|
||||
- Improve narrative flow and logical progression
|
||||
- Enhance SEO with better keyword distribution
|
||||
- Increase engagement with compelling headings
|
||||
- Ensure comprehensive coverage of the topic
|
||||
- Optimize for featured snippets and voice search
|
||||
|
||||
Respond with JSON array of optimized sections:
|
||||
[
|
||||
{{
|
||||
"heading": "Optimized heading",
|
||||
"subheadings": ["subheading 1", "subheading 2"],
|
||||
"key_points": ["point 1", "point 2"],
|
||||
"target_words": 300,
|
||||
"keywords": ["keyword1", "keyword2"]
|
||||
}}
|
||||
]
|
||||
"""
|
||||
optimization_prompt = f"""Optimize this blog outline for better flow, engagement, and SEO:
|
||||
|
||||
Current Outline:
|
||||
{outline_text}
|
||||
|
||||
Optimization Focus: {focus}
|
||||
|
||||
Goals: Improve narrative flow, enhance SEO, increase engagement, ensure comprehensive coverage.
|
||||
|
||||
Return JSON format:
|
||||
{{
|
||||
"outline": [
|
||||
{{
|
||||
"heading": "Optimized heading",
|
||||
"subheadings": ["subheading 1", "subheading 2"],
|
||||
"key_points": ["point 1", "point 2"],
|
||||
"target_words": 300,
|
||||
"keywords": ["keyword1", "keyword2"]
|
||||
}}
|
||||
]
|
||||
}}"""
|
||||
|
||||
try:
|
||||
from services.llm_providers.gemini_provider import gemini_structured_json_response
|
||||
|
||||
optimization_schema = {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"heading": {"type": "string"},
|
||||
"subheadings": {"type": "array", "items": {"type": "string"}},
|
||||
"key_points": {"type": "array", "items": {"type": "string"}},
|
||||
"target_words": {"type": "integer"},
|
||||
"keywords": {"type": "array", "items": {"type": "string"}}
|
||||
},
|
||||
"required": ["heading", "subheadings", "key_points", "target_words", "keywords"]
|
||||
}
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"outline": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"heading": {"type": "string"},
|
||||
"subheadings": {"type": "array", "items": {"type": "string"}},
|
||||
"key_points": {"type": "array", "items": {"type": "string"}},
|
||||
"target_words": {"type": "integer"},
|
||||
"keywords": {"type": "array", "items": {"type": "string"}}
|
||||
},
|
||||
"required": ["heading", "subheadings", "key_points", "target_words", "keywords"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": ["outline"],
|
||||
"propertyOrdering": ["outline"]
|
||||
}
|
||||
|
||||
optimized_data = gemini_structured_json_response(
|
||||
prompt=optimization_prompt,
|
||||
schema=optimization_schema,
|
||||
temperature=0.3,
|
||||
max_tokens=2000
|
||||
max_tokens=6000 # Match main outline generator
|
||||
)
|
||||
|
||||
if isinstance(optimized_data, list):
|
||||
# Handle the new schema format with "outline" wrapper
|
||||
if isinstance(optimized_data, dict) and 'outline' in optimized_data:
|
||||
optimized_sections = []
|
||||
for i, section_data in enumerate(optimized_data):
|
||||
for i, section_data in enumerate(optimized_data['outline']):
|
||||
section = BlogOutlineSection(
|
||||
id=f"s{i+1}",
|
||||
heading=section_data.get('heading', f'Section {i+1}'),
|
||||
@@ -82,9 +85,14 @@ class OutlineOptimizer:
|
||||
keywords=section_data.get('keywords', [])
|
||||
)
|
||||
optimized_sections.append(section)
|
||||
logger.info(f"✅ Outline optimization completed: {len(optimized_sections)} sections optimized")
|
||||
return optimized_sections
|
||||
else:
|
||||
logger.warning(f"Invalid optimization response format: {type(optimized_data)}")
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"AI outline optimization failed: {e}")
|
||||
logger.info("Returning original outline without optimization")
|
||||
|
||||
return outline
|
||||
|
||||
|
||||
Reference in New Issue
Block a user