feat: Auto-adapt content to platform limits when creating posts

- Add adapt_with_ai() method to PlatformAdapter that uses DeepSeek
  to condense content when it exceeds platform character limits
- Add adapt_for_all_platforms_smart() for batch adaptation
- Modify create_post endpoint to auto-generate content_x, content_threads,
  content_instagram, content_facebook with adapted versions
- Modify update_post to re-adapt content when main content changes
- If content fits within limit, use as-is (no AI call)
- If content exceeds limit, AI condenses while preserving message
- Fallback to rule-based truncation if DeepSeek API unavailable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 21:20:04 +00:00
parent cf1e06bb11
commit 9008c5d945
2 changed files with 140 additions and 3 deletions

View File

@@ -10,6 +10,7 @@ from pydantic import BaseModel
from app.core.database import get_db
from app.models.post import Post
from app.services.ai.platform_adapter import platform_adapter
router = APIRouter()
@@ -122,7 +123,14 @@ async def get_post(post_id: int, db: Session = Depends(get_db)):
@router.post("/", response_model=PostResponse)
async def create_post(post_data: PostCreate, db: Session = Depends(get_db)):
"""Crear un nuevo post."""
"""Crear un nuevo post con auto-adaptación de contenido por plataforma."""
# Adaptar contenido para cada plataforma
adapted_content = await platform_adapter.adapt_for_all_platforms_smart(
post_data.content,
post_data.platforms
)
post = Post(
content=post_data.content,
content_type=post_data.content_type,
@@ -131,7 +139,12 @@ async def create_post(post_data: PostCreate, db: Session = Depends(get_db)):
image_url=post_data.image_url,
approval_required=post_data.approval_required,
hashtags=post_data.hashtags,
status="pending_approval" if post_data.approval_required else "scheduled"
status="pending_approval" if post_data.approval_required else "scheduled",
# Contenido adaptado por plataforma
content_x=adapted_content.get("x"),
content_threads=adapted_content.get("threads"),
content_instagram=adapted_content.get("instagram"),
content_facebook=adapted_content.get("facebook"),
)
db.add(post)
@@ -143,12 +156,30 @@ async def create_post(post_data: PostCreate, db: Session = Depends(get_db)):
@router.put("/{post_id}")
async def update_post(post_id: int, post_data: PostUpdate, db: Session = Depends(get_db)):
"""Actualizar un post."""
"""Actualizar un post con re-adaptación automática si cambia el contenido."""
post = db.query(Post).filter(Post.id == post_id).first()
if not post:
raise HTTPException(status_code=404, detail="Post no encontrado")
update_data = post_data.dict(exclude_unset=True)
# Si cambia el contenido principal, re-adaptar para todas las plataformas
if "content" in update_data:
platforms = update_data.get("platforms", post.platforms)
adapted_content = await platform_adapter.adapt_for_all_platforms_smart(
update_data["content"],
platforms
)
# Solo actualizar campos de plataforma si no vienen explícitos en la request
if "content_x" not in update_data and "x" in platforms:
update_data["content_x"] = adapted_content.get("x")
if "content_threads" not in update_data and "threads" in platforms:
update_data["content_threads"] = adapted_content.get("threads")
if "content_instagram" not in update_data and "instagram" in platforms:
update_data["content_instagram"] = adapted_content.get("instagram")
if "content_facebook" not in update_data and "facebook" in platforms:
update_data["content_facebook"] = adapted_content.get("facebook")
for field, value in update_data.items():
setattr(post, field, value)