utils.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from fastapi import APIRouter, UploadFile, File, Response
  2. from fastapi import Depends, HTTPException, status
  3. from starlette.responses import StreamingResponse, FileResponse
  4. from pydantic import BaseModel
  5. from fpdf import FPDF
  6. import markdown
  7. from utils.utils import get_admin_user
  8. from utils.misc import calculate_sha256, get_gravatar_url
  9. from config import OLLAMA_BASE_URLS, DATA_DIR, UPLOAD_DIR
  10. from constants import ERROR_MESSAGES
  11. from typing import List
  12. router = APIRouter()
  13. @router.get("/gravatar")
  14. async def get_gravatar(
  15. email: str,
  16. ):
  17. return get_gravatar_url(email)
  18. class MarkdownForm(BaseModel):
  19. md: str
  20. @router.post("/markdown")
  21. async def get_html_from_markdown(
  22. form_data: MarkdownForm,
  23. ):
  24. return {"html": markdown.markdown(form_data.md)}
  25. class ChatForm(BaseModel):
  26. title: str
  27. messages: List[dict]
  28. @router.post("/pdf")
  29. async def download_chat_as_pdf(
  30. form_data: ChatForm,
  31. ):
  32. pdf = FPDF()
  33. pdf.add_page()
  34. STATIC_DIR = "./static"
  35. FONTS_DIR = f"{STATIC_DIR}/fonts"
  36. pdf.add_font("NotoSans", "", f"{FONTS_DIR}/NotoSans-Regular.ttf")
  37. pdf.add_font("NotoSans", "b", f"{FONTS_DIR}/NotoSans-Bold.ttf")
  38. pdf.add_font("NotoSans", "i", f"{FONTS_DIR}/NotoSans-Italic.ttf")
  39. pdf.add_font("NotoSansKR", "", f"{FONTS_DIR}/NotoSansKR-Regular.ttf")
  40. pdf.add_font("NotoSansJP", "", f"{FONTS_DIR}/NotoSansJP-Regular.ttf")
  41. pdf.set_font("NotoSans", size=12)
  42. pdf.set_fallback_fonts(["NotoSansKR", "NotoSansJP"])
  43. pdf.set_auto_page_break(auto=True, margin=15)
  44. # Adjust the effective page width for multi_cell
  45. effective_page_width = (
  46. pdf.w - 2 * pdf.l_margin - 10
  47. ) # Subtracted an additional 10 for extra padding
  48. # Add chat messages
  49. for message in form_data.messages:
  50. role = message["role"]
  51. content = message["content"]
  52. pdf.set_font("NotoSans", "B", size=12) # Bold for the role
  53. pdf.multi_cell(effective_page_width, 10, f"{role.upper()}", 0, "L")
  54. pdf.ln(1) # Extra space between messages
  55. pdf.set_font("NotoSans", size=10) # Regular for content
  56. pdf.multi_cell(effective_page_width, 10, content, 0, "L")
  57. pdf.ln(1) # Extra space between messages
  58. # Save the pdf with name .pdf
  59. pdf_bytes = pdf.output()
  60. return Response(
  61. content=bytes(pdf_bytes),
  62. media_type="application/pdf",
  63. headers={"Content-Disposition": f"attachment;filename=chat.pdf"},
  64. )
  65. @router.get("/db/download")
  66. async def download_db(user=Depends(get_admin_user)):
  67. return FileResponse(
  68. f"{DATA_DIR}/webui.db",
  69. media_type="application/octet-stream",
  70. filename="webui.db",
  71. )