systex_app.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import datetime
  2. from json import loads
  3. import time
  4. from typing import List
  5. from fastapi import Body, FastAPI
  6. from fastapi.middleware.cors import CORSMiddleware
  7. import pandas as pd
  8. from pydantic import BaseModel
  9. import uvicorn
  10. from dotenv import load_dotenv
  11. import os
  12. from supabase.client import Client, create_client
  13. from langchain.callbacks import get_openai_callback
  14. from ai_agent import main
  15. from semantic_search import semantic_cache
  16. load_dotenv()
  17. URI = os.getenv("SUPABASE_URI")
  18. supabase_url = os.environ.get("SUPABASE_URL")
  19. supabase_key = os.environ.get("SUPABASE_KEY")
  20. supabase: Client = create_client(supabase_url, supabase_key)
  21. app = FastAPI()
  22. app.add_middleware(
  23. CORSMiddleware,
  24. allow_origins=["*"],
  25. allow_credentials=True,
  26. allow_methods=["*"],
  27. allow_headers=["*"],
  28. )
  29. class ChatHistoryItem(BaseModel):
  30. q: str
  31. a: str
  32. @app.post("/agents")
  33. def agent(question: str, chat_history: List[ChatHistoryItem] = Body(...)):
  34. start = time.time()
  35. with get_openai_callback() as cb:
  36. cache_question, cache_answer = semantic_cache(supabase, question)
  37. if cache_answer:
  38. processing_time = time.time() - start
  39. save_history(question, cache_answer, cb, processing_time)
  40. return {"Answer": cache_answer}
  41. answer = main(question)
  42. processing_time = time.time() - start
  43. save_history(question, answer, cb, processing_time)
  44. return {"Answer": answer}
  45. def save_history(question, answer, cb, processing_time):
  46. # reference = [doc.dict() for doc in reference]
  47. record = {
  48. 'Question': question,
  49. 'Answer': answer,
  50. 'Total_Tokens': cb.total_tokens,
  51. 'Total_Cost': cb.total_cost,
  52. 'Processing_time': processing_time,
  53. }
  54. response = (
  55. supabase.table("agent_records")
  56. .insert(record)
  57. .execute()
  58. )
  59. class history_output(BaseModel):
  60. Question: str
  61. Answer: str
  62. Total_Tokens: int
  63. Total_Cost: float
  64. Processing_time: float
  65. Time: datetime.datetime
  66. @app.get('/history', response_model=List[history_output])
  67. async def get_history():
  68. response = supabase.table("agent_records").select("*").execute()
  69. df = pd.DataFrame(response.data)
  70. # engine = create_engine(URI, echo=True)
  71. # df = pd.read_sql_table("systex_records", engine.connect())
  72. # df.fillna('', inplace=True)
  73. result = df.to_json(orient='index', force_ascii=False)
  74. result = loads(result)
  75. return result.values()
  76. if __name__ == "__main__":
  77. uvicorn.run("systex_app:app", host='0.0.0.0', reload=True, port=8080,
  78. ssl_keyfile="/etc/ssl_file/key.pem",
  79. ssl_certfile="/etc/ssl_file/cert.pem")