BF / api_server.py
SamiKoen's picture
Add real-time conversation dashboard for BF
1c57887
raw
history blame
3.03 kB
"""API server for BF conversation tracking"""
from fastapi import FastAPI, Response
from fastapi.middleware.cors import CORSMiddleware
import json
import os
from datetime import datetime
from typing import List, Dict, Any
import uvicorn
app = FastAPI()
# CORS middleware - HTML'den erişim için
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Production'da bunu kısıtla
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
CONVERSATIONS_FILE = "conversations.json"
def load_conversations():
"""Load conversation history from file"""
if os.path.exists(CONVERSATIONS_FILE):
try:
with open(CONVERSATIONS_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except:
return []
return []
@app.get("/api/conversations")
async def get_conversations():
"""Get all conversations"""
conversations = load_conversations()
# Format for dashboard
formatted = {}
for conv in conversations:
# Create a session ID from timestamp
session_id = f"session_{conv['timestamp'].replace(':', '').replace('-', '').replace('T', '_')[:15]}"
if session_id not in formatted:
formatted[session_id] = {
"customer": "Kullanıcı",
"phone": session_id,
"messages": []
}
# Add user message
formatted[session_id]["messages"].append({
"type": "received",
"text": conv["user"],
"time": conv["timestamp"]
})
# Add bot response
formatted[session_id]["messages"].append({
"type": "sent",
"text": conv["bot"],
"time": conv["timestamp"]
})
return formatted
@app.get("/api/stats")
async def get_stats():
"""Get conversation statistics"""
conversations = load_conversations()
today = datetime.now().date()
today_count = sum(1 for conv in conversations
if datetime.fromisoformat(conv["timestamp"]).date() == today)
# Find most asked questions
questions = {}
for conv in conversations:
q = conv["user"].lower()
# Simple categorization
if "madone" in q:
questions["Madone"] = questions.get("Madone", 0) + 1
elif "marlin" in q:
questions["Marlin"] = questions.get("Marlin", 0) + 1
elif "fiyat" in q or "kaç" in q:
questions["Fiyat"] = questions.get("Fiyat", 0) + 1
elif "stok" in q or "var mı" in q:
questions["Stok"] = questions.get("Stok", 0) + 1
return {
"total": len(conversations),
"today": today_count,
"categories": questions
}
@app.get("/api/health")
async def health_check():
"""Health check endpoint"""
return {"status": "ok", "timestamp": datetime.now().isoformat()}
if __name__ == "__main__":
# This will be imported by Gradio app, not run directly
pass