{"repo": "anishapaturi/viztalk", "files": {"backend/app/services/llm_service.py": {"661b91f3b124814e7cfa7b59f27aa67bf72f0f6b": {"t": 1786068458.8641725, "n": 2191, "h": "f0949cc25de62239", "c": "import os\nimport json\nimport requests\nfrom dotenv import load_dotenv\nimport sqlite3\n\nload_dotenv()\n\nAPI_KEY = os.getenv(\"OPENROUTER_API_KEY\")\n\n\ndef get_uploaded_schema():\n\n try:\n conn = sqlite3.connect(\"marketing.db\")\n cursor = conn.cursor()\n\n cursor.execute(\"PRAGMA table_info(uploaded_data)\")\n columns = cursor.fetchall()\n\n conn.close()\n\n if len(columns) == 0:\n return \"\"\n\n column_names = [col[1] for col in columns]\n\n return f\"\"\"\nTable: uploaded_data\nColumns:\n{chr(10).join(column_names)}\n\"\"\"\n\n except Exception:\n return \"\"\n\n\ndef generate_sql(user_prompt):\n\n base_schema = \"\"\"\nTable: campaigns\n\nColumns:\nCampaign_ID\nCampaign_Type\nTarget_Audience\nDuration\nChannel_Used\nImpressions\nClicks\nLeads\nConversions\nRevenue\nAcquisition_Cost\nROI\nLanguage\nEngagement_Score\nCustomer_Segment\nDate\n\"\"\"\n\n uploaded_schema = get_uploaded_schema()\n\n schema = base_schema + \"\\n\" + uploaded_schema\n\n prompt = f\"\"\"\nYou are a data analyst.\n\nConvert the user's request into:\n\n1. SQL query\n2. Best chart type\n3. X axis column\n4. Y axis column\n\nDatabase schema:\n{schema}\n\nRules:\n\nUse SQLite syntax\nDo NOT explain anything\nReturn ONLY JSON\nPrefer using uploaded_data if user asks about uploaded dataset\nAggregated columns must have aliases\n\nReturn JSON in this format:\n\n{{\n\"sql\": \"SQL QUERY\",\n\"chart\": \"bar | line | pie\",\n\"x_axis\": \"column\",\n\"y_axis\": \"column\"\n}}\n\nUser request:\n{user_prompt}\n\"\"\"\n\n response = requests.post(\n \"https://openrouter.ai/api/v1/chat/completions\",\n headers={\n \"Authorization\": f\"Bearer {API_KEY}\",\n \"HTTP-Referer\": \"http://localhost:5173\",\n \"X-Title\": \"Conversational BI Dashboard\"\n },\n json={\n \"model\": \"deepseek/deepseek-chat\",\n \"messages\": [\n {\"role\": \"user\", \"content\": prompt}\n ]\n }\n )\n\n result = response.json()\n\n if \"choices\" not in result:\n raise Exception(f\"OpenRouter API error: {result}\")\n\n content = result[\"choices\"][0][\"message\"][\"content\"]\n\n content = content.replace(\"```json\", \"\").replace(\"```\", \"\").strip()\n\n return json.loads(content)"}}}}