Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
"""Celery application for VoIdea."""
|
||||
|
||||
from celery import Celery
|
||||
|
||||
from app.core.config import get_settings
|
||||
|
||||
settings = get_settings()
|
||||
|
||||
celery_app = Celery(
|
||||
"voidea",
|
||||
broker=settings.celery_broker_url,
|
||||
backend=settings.celery_result_backend,
|
||||
)
|
||||
|
||||
celery_app.conf.update(
|
||||
task_track_started=settings.celery_task_track_started,
|
||||
task_time_limit=settings.celery_task_time_limit,
|
||||
task_serializer="json",
|
||||
accept_content=["json"],
|
||||
result_serializer="json",
|
||||
timezone="UTC",
|
||||
enable_utc=True,
|
||||
)
|
||||
@@ -0,0 +1,100 @@
|
||||
"""Analysis tasks for VoIdea."""
|
||||
|
||||
import asyncio
|
||||
import time
|
||||
from functools import lru_cache
|
||||
from uuid import uuid4
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from app.agents.models import AgentReport
|
||||
from app.core.database import async_session_maker
|
||||
from app.integrations.ai.prompt_loader import get_prompt_config
|
||||
from app.models.idea import Idea
|
||||
from app.tasks import celery_app
|
||||
|
||||
|
||||
@lru_cache
|
||||
def _get_fallback():
|
||||
from app.integrations.ai.fallback import FallbackChain
|
||||
|
||||
return FallbackChain()
|
||||
|
||||
|
||||
@celery_app.task(bind=True, max_retries=2, name="analyze_idea")
|
||||
def analyze_idea(self, idea_id: str, role: str) -> dict:
|
||||
"""Analyze an idea using AI fallback chain.
|
||||
|
||||
Args:
|
||||
idea_id: UUID of the idea
|
||||
role: Agent role (e.g. "coordinator", "business_analyst")
|
||||
|
||||
Returns:
|
||||
Dict with analysis result
|
||||
"""
|
||||
return asyncio.run(_analyze_idea_async(idea_id, role, self.request.id))
|
||||
|
||||
|
||||
async def _analyze_idea_async(idea_id: str, role: str, task_id: str) -> dict:
|
||||
"""Async implementation of idea analysis."""
|
||||
start = time.time()
|
||||
report_id = str(uuid4())
|
||||
|
||||
fallback = _get_fallback()
|
||||
|
||||
async with async_session_maker() as db:
|
||||
result = await db.execute(select(Idea).where(Idea.id == idea_id))
|
||||
idea = result.scalar_one_or_none()
|
||||
|
||||
if not idea:
|
||||
return {"status": "error", "error": "Idea not found"}
|
||||
|
||||
prompt_config = get_prompt_config(role)
|
||||
if not prompt_config:
|
||||
return {"status": "error", "error": f"No prompt config for role: {role}"}
|
||||
|
||||
system_prompt = prompt_config.get("system_prompt", "")
|
||||
user_prompt = f"Проанализируй идею:\n\nНазвание: {idea.title}\n\nОписание: {idea.content}"
|
||||
|
||||
if idea.tags:
|
||||
user_prompt += f"\n\nТеги: {', '.join(idea.tags)}"
|
||||
|
||||
full_prompt = f"{system_prompt}\n\n{user_prompt}"
|
||||
|
||||
ai_result = await fallback.analyze(
|
||||
full_prompt,
|
||||
temperature=prompt_config.get("temperature", 0.7),
|
||||
max_tokens=prompt_config.get("max_tokens", 2000),
|
||||
)
|
||||
|
||||
duration_ms = int((time.time() - start) * 1000)
|
||||
|
||||
report = AgentReport(
|
||||
id=report_id,
|
||||
agent_id=f"ai_{role}",
|
||||
status="completed" if ai_result.success else "failed",
|
||||
message=ai_result.content[:500] if ai_result.success else ai_result.error,
|
||||
details={
|
||||
"idea_id": idea_id,
|
||||
"role": role,
|
||||
"model": ai_result.model,
|
||||
"provider": ai_result.provider,
|
||||
"tokens_used": ai_result.tokens_used,
|
||||
"task_id": task_id,
|
||||
} | ({"full_content": ai_result.content} if ai_result.success else {}),
|
||||
duration_ms=duration_ms,
|
||||
success=ai_result.success,
|
||||
errors=[] if ai_result.success else [ai_result.error],
|
||||
context={"idea_title": idea.title, "role": role},
|
||||
)
|
||||
db.add(report)
|
||||
await db.commit()
|
||||
|
||||
return {
|
||||
"status": "completed" if ai_result.success else "failed",
|
||||
"report_id": report_id,
|
||||
"idea_id": idea_id,
|
||||
"role": role,
|
||||
"duration_ms": duration_ms,
|
||||
"success": ai_result.success,
|
||||
}
|
||||
Reference in New Issue
Block a user