Initial commit: VoIdeaAI - voice-first AI idea assistant

This commit is contained in:
2026-05-13 12:51:42 +03:00
commit 688d043dad
421 changed files with 47915 additions and 0 deletions
+23
View File
@@ -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,
)
+100
View File
@@ -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,
}