{"repo": "abinaya2006/nagare", "files": {"backend/app/services/ai/deepseek.py": {"8ca571803048608ca6b8d03821080720d0978fab": {"t": 1785745438.4490519, "n": 2498, "h": "fc5faa2b6620245b", "c": "import json\nimport httpx\nimport structlog\nfrom app.core.config import get_settings\nfrom app.schemas.schedules import ScheduleOutput, WorkPreferences\nfrom app.schemas.tasks import Priority, Task, TaskStatus\nfrom app.services.ai.base import AIProvider\nfrom app.services.ai.prompts import schedule_prompt\n\nlog = structlog.get_logger()\n\n\nclass DeepSeekProvider(AIProvider):\n async def generate_schedule(self, tasks: list[Task], preferences: WorkPreferences) -> ScheduleOutput:\n settings = get_settings()\n if not settings.deepseek_api_key:\n return self._fallback(tasks)\n\n prompt = schedule_prompt(tasks, preferences)\n headers = {\"Authorization\": f\"Bearer {settings.deepseek_api_key}\", \"Content-Type\": \"application/json\"}\n payload = {\n \"model\": settings.deepseek_model,\n \"messages\": [\n {\"role\": \"system\", \"content\": \"Return strict JSON only. No markdown.\"},\n {\"role\": \"user\", \"content\": prompt},\n ],\n \"temperature\": 0.2,\n }\n\n async with httpx.AsyncClient(timeout=30) as client:\n for attempt in range(3):\n try:\n response = await client.post(\"https://api.deepseek.com/chat/completions\", headers=headers, json=payload)\n response.raise_for_status()\n content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n return ScheduleOutput.model_validate_json(content)\n except (httpx.HTTPError, KeyError, json.JSONDecodeError, ValueError) as exc:\n log.warning(\"ai_schedule_invalid\", attempt=attempt + 1, error=str(exc))\n return self._fallback(tasks)\n\n def _fallback(self, tasks: list[Task]) -> ScheduleOutput:\n from datetime import datetime, timedelta\n\n cursor = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)\n items = []\n ordered = sorted(tasks, key=lambda task: (task.priority != Priority.high, task.deadline.isoformat() if task.deadline else \"9999\"))\n for task in ordered:\n if task.status == TaskStatus.completed:\n continue\n end = cursor + timedelta(minutes=task.estimated_duration_minutes)\n items.append({\"task_id\": str(task.id), \"task_title\": task.title, \"start_time\": cursor, \"end_time\": end})\n cursor = end + timedelta(minutes=15)\n return ScheduleOutput.model_validate({\"schedule\": items})\n"}, "5ca6362f90d62488869d039ffbce2df5e32124e9": {"t": 1785753219.8219388, "n": 2498, "h": "fc5faa2b6620245b", "c": "import json\nimport httpx\nimport structlog\nfrom app.core.config import get_settings\nfrom app.schemas.schedules import ScheduleOutput, WorkPreferences\nfrom app.schemas.tasks import Priority, Task, TaskStatus\nfrom app.services.ai.base import AIProvider\nfrom app.services.ai.prompts import schedule_prompt\n\nlog = structlog.get_logger()\n\n\nclass DeepSeekProvider(AIProvider):\n async def generate_schedule(self, tasks: list[Task], preferences: WorkPreferences) -> ScheduleOutput:\n settings = get_settings()\n if not settings.deepseek_api_key:\n return self._fallback(tasks)\n\n prompt = schedule_prompt(tasks, preferences)\n headers = {\"Authorization\": f\"Bearer {settings.deepseek_api_key}\", \"Content-Type\": \"application/json\"}\n payload = {\n \"model\": settings.deepseek_model,\n \"messages\": [\n {\"role\": \"system\", \"content\": \"Return strict JSON only. No markdown.\"},\n {\"role\": \"user\", \"content\": prompt},\n ],\n \"temperature\": 0.2,\n }\n\n async with httpx.AsyncClient(timeout=30) as client:\n for attempt in range(3):\n try:\n response = await client.post(\"https://api.deepseek.com/chat/completions\", headers=headers, json=payload)\n response.raise_for_status()\n content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n return ScheduleOutput.model_validate_json(content)\n except (httpx.HTTPError, KeyError, json.JSONDecodeError, ValueError) as exc:\n log.warning(\"ai_schedule_invalid\", attempt=attempt + 1, error=str(exc))\n return self._fallback(tasks)\n\n def _fallback(self, tasks: list[Task]) -> ScheduleOutput:\n from datetime import datetime, timedelta\n\n cursor = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)\n items = []\n ordered = sorted(tasks, key=lambda task: (task.priority != Priority.high, task.deadline.isoformat() if task.deadline else \"9999\"))\n for task in ordered:\n if task.status == TaskStatus.completed:\n continue\n end = cursor + timedelta(minutes=task.estimated_duration_minutes)\n items.append({\"task_id\": str(task.id), \"task_title\": task.title, \"start_time\": cursor, \"end_time\": end})\n cursor = end + timedelta(minutes=15)\n return ScheduleOutput.model_validate({\"schedule\": items})\n"}, "5b87fdac26bda2550d39ab19b479c8ea6b702df0": {"t": 1785753222.1079907, "n": 2460, "h": "4e9a73ab7ab26012", "c": "import json\nimport httpx\nimport structlog\nfrom app.core.config import get_settings\nfrom app.schemas.schedules import ScheduleOutput, WorkPreferences\nfrom app.schemas.tasks import Task\nfrom app.services.ai.base import AIProvider\nfrom app.services.ai.prompts import schedule_prompt\n\nlog = structlog.get_logger()\n\n\nclass DeepSeekProvider(AIProvider):\n async def generate_schedule(self, tasks: list[Task], preferences: WorkPreferences) -> ScheduleOutput:\n settings = get_settings()\n if not settings.deepseek_api_key:\n return self._fallback(tasks)\n\n prompt = schedule_prompt(tasks, preferences)\n headers = {\"Authorization\": f\"Bearer {settings.deepseek_api_key}\", \"Content-Type\": \"application/json\"}\n payload = {\n \"model\": settings.deepseek_model,\n \"messages\": [\n {\"role\": \"system\", \"content\": \"Return strict JSON only. No markdown.\"},\n {\"role\": \"user\", \"content\": prompt},\n ],\n \"temperature\": 0.2,\n }\n\n async with httpx.AsyncClient(timeout=30) as client:\n for attempt in range(3):\n try:\n response = await client.post(\"https://api.deepseek.com/chat/completions\", headers=headers, json=payload)\n response.raise_for_status()\n content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n return ScheduleOutput.model_validate_json(content)\n except (httpx.HTTPError, KeyError, json.JSONDecodeError, ValueError) as exc:\n log.warning(\"ai_schedule_invalid\", attempt=attempt + 1, error=str(exc))\n return self._fallback(tasks)\n\n def _fallback(self, tasks: list[Task]) -> ScheduleOutput:\n from datetime import datetime, timedelta\n\n cursor = datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)\n items = []\n ordered = sorted(tasks, key=lambda task: (task.priority != \"High\", task.deadline.isoformat() if task.deadline else \"9999\"))\n for task in ordered:\n if task.status == \"Completed\":\n continue\n end = cursor + timedelta(minutes=task.estimated_duration_minutes)\n items.append({\"task_id\": str(task.id), \"task_title\": task.title, \"start_time\": cursor, \"end_time\": end})\n cursor = end + timedelta(minutes=15)\n return ScheduleOutput.model_validate({\"schedule\": items})\n"}}}}