Bima Ardhia commited on
Commit
57ab0d2
·
1 Parent(s): 57d3b24
Files changed (1) hide show
  1. api/api_mage_x.py +100 -24
api/api_mage_x.py CHANGED
@@ -16,15 +16,15 @@ import uuid
16
  import tempfile
17
  import firebase_admin
18
  from agent.retrive_agent import run_llm
 
 
 
19
 
20
  # Load environment variables
21
 
22
 
23
  # Memuat FIREBASE_SECRET dari environment variable
24
- firebase_secret_string = os.getenv("FIREBASE_SECRET")
25
- if not firebase_secret_string:
26
- raise ValueError("Environment variable FIREBASE_SECRET is not set or empty.")
27
- firebase_secret_dict = json.loads(firebase_secret_string)
28
 
29
  # Memuat SERVICE_ACCOUNT_SECRET dari environment variable
30
  service_account_secret_string = os.getenv("SERVICE_ACCOUNT_SECRET")
@@ -32,21 +32,27 @@ if not service_account_secret_string:
32
  raise ValueError("Environment variable SERVICE_ACCOUNT_SECRET is not set or empty.")
33
  service_account_secret_dict = json.loads(service_account_secret_string)
34
 
35
- # Initialize Firebase
36
- if not firebase_admin._apps:
37
- cred = credentials.Certificate(firebase_secret_dict)
38
- firebase_admin.initialize_app(cred)
39
- client = firestore.client()
40
 
41
  # Initialize Google Drive API
42
  FOLDER_ID = '1SUjdlLkt58srCwSffDMAoZJKpzPCWszn'
43
  drive_creds = service_account.Credentials.from_service_account_info(service_account_secret_dict)
44
  drive_service = build('drive', 'v3', credentials=drive_creds)
45
 
 
 
 
 
 
 
 
46
  # Initialize FastAPI
47
  app = FastAPI()
48
 
49
- # Add CORS Middleware
 
 
 
50
  app.add_middleware(
51
  CORSMiddleware,
52
  allow_origins=["*"], # Gantilah "*" dengan URL spesifik jika perlu
@@ -55,6 +61,70 @@ app.add_middleware(
55
  allow_headers=["*"],
56
  )
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  # Define data models
59
  class ChatRequest(BaseModel):
60
  user_id: str
@@ -63,15 +133,13 @@ class ChatRequest(BaseModel):
63
  class NewSessionRequest(BaseModel):
64
  user_id: str
65
 
66
- # Endpoint to check if API is running
67
- @app.get("/")
68
- async def check():
69
- return "API redi bolo!"
70
 
71
  # Endpoint to initialize a new chat session
72
  @app.post("/initialize_session")
73
  def initialize_session(request: NewSessionRequest):
74
- user_doc_ref = client.collection("data_user").document(request.user_id)
75
  user_doc = user_doc_ref.get()
76
 
77
  if not user_doc.exists:
@@ -84,25 +152,27 @@ def initialize_session(request: NewSessionRequest):
84
 
85
  return {"session_id": session_id}
86
 
87
- # Endpoint to handle chat requests
88
  @app.post("/chat")
89
  def chat(request: ChatRequest):
90
- user_doc_ref = client.collection("data_user").document(request.user_id)
91
  user_doc = user_doc_ref.get()
92
 
93
  if not user_doc.exists:
94
  raise HTTPException(status_code=404, detail="User ID not found in Firebase.")
95
 
96
- session_id = user_doc.get("last_session_id", str(uuid.uuid4()))
 
97
  user_doc_ref.set({"last_session_id": session_id}, merge=True)
98
 
 
99
  chat_history = FirestoreChatMessageHistory(
100
  session_id=session_id,
101
- collection=f"data_user/{request.user_id}/message_history",
102
  client=client,
103
  )
104
  memory = ConversationBufferWindowMemory(k=5, chat_memory=chat_history)
105
 
 
106
  generated_response = run_llm(query=request.prompt, chat_history=memory.chat_memory.messages)
107
  generated_response = generated_response.replace("```", "").strip()
108
  memory.save_context({"input": request.prompt}, {"output": generated_response})
@@ -114,15 +184,21 @@ def chat(request: ChatRequest):
114
  def get_chat_history(user_id: str, session_id: str):
115
  chat_history = FirestoreChatMessageHistory(
116
  session_id=session_id,
117
- collection=f"data_user/{user_id}/message_history",
118
  client=client,
119
  )
120
- messages = [
121
- {"role": "user" if isinstance(msg, HumanMessage) else "assistant", "content": msg.content}
122
- for msg in chat_history.messages
123
- ]
124
  return {"chat_history": messages}
125
 
 
 
 
 
 
 
 
 
 
126
  # Fungsi untuk mengunggah file ke Google Drive
127
  def upload_to_drive(file_path: str, folder_id: str) -> str:
128
  file_name = os.path.basename(file_path)
 
16
  import tempfile
17
  import firebase_admin
18
  from agent.retrive_agent import run_llm
19
+ from pinecone import Pinecone
20
+ from langchain_openai import OpenAIEmbeddings
21
+
22
 
23
  # Load environment variables
24
 
25
 
26
  # Memuat FIREBASE_SECRET dari environment variable
27
+
 
 
 
28
 
29
  # Memuat SERVICE_ACCOUNT_SECRET dari environment variable
30
  service_account_secret_string = os.getenv("SERVICE_ACCOUNT_SECRET")
 
32
  raise ValueError("Environment variable SERVICE_ACCOUNT_SECRET is not set or empty.")
33
  service_account_secret_dict = json.loads(service_account_secret_string)
34
 
35
+
 
 
 
 
36
 
37
  # Initialize Google Drive API
38
  FOLDER_ID = '1SUjdlLkt58srCwSffDMAoZJKpzPCWszn'
39
  drive_creds = service_account.Credentials.from_service_account_info(service_account_secret_dict)
40
  drive_service = build('drive', 'v3', credentials=drive_creds)
41
 
42
+ chatgpt_api_key = os.getenv("OPENAI_API_KEY")
43
+ pinecone_api_key = os.getenv("PINECONE_API_KEY")
44
+ firebase_credentials_json = os.getenv("FIREBASE_SECRET")
45
+
46
+ # Load environment variables
47
+ load_dotenv()
48
+
49
  # Initialize FastAPI
50
  app = FastAPI()
51
 
52
+ app.get("/")
53
+ async def check():
54
+ return "API redi bolo !"
55
+
56
  app.add_middleware(
57
  CORSMiddleware,
58
  allow_origins=["*"], # Gantilah "*" dengan URL spesifik jika perlu
 
61
  allow_headers=["*"],
62
  )
63
 
64
+ # Initialize Firebase
65
+ PROJECT_ID = "recommendation-system-mage"
66
+ COLLECTION_NAME = "data_user"
67
+ # if not firebase_admin._apps:
68
+ # cred = credentials.Certificate("./recommendation-system-mage-firebase-adminsdk-ds1lw-1ac94ba6dd.json")
69
+ # firebase_admin.initialize_app(cred)
70
+ # client = firestore.client()
71
+
72
+ if firebase_credentials_json:
73
+ firebase_credentials_dict = json.loads(firebase_credentials_json)
74
+
75
+ # Inisialisasi Firebase hanya jika belum diinisialisasi
76
+ if not firebase_admin._apps:
77
+ cred = credentials.Certificate(firebase_credentials_dict)
78
+ firebase_admin.initialize_app(cred)
79
+
80
+ # Membuat klien Firestore
81
+ client = firestore.client()
82
+
83
+ pc = Pinecone(api_key=pinecone_api_key)
84
+ index_name = "mage-x-embeddings-all"
85
+ index = pc.Index(index_name)
86
+
87
+ embedding_model = OpenAIEmbeddings(model="text-embedding-ada-002", openai_api_key=chatgpt_api_key)
88
+
89
+ def create_embeddings(text):
90
+ return embedding_model.embed_query(text)
91
+
92
+ def fetch_and_embed_data(user_id):
93
+ collections = ["data_wisata", "data_umkm", "data_berita"]
94
+
95
+ for collection in collections:
96
+
97
+ doc_ref = client.collection(collection).document(user_id)
98
+ doc = doc_ref.get()
99
+
100
+ if doc.exists:
101
+
102
+ data = doc.to_dict()
103
+
104
+ if 'created_at' in data and data['created_at'] is not None:
105
+ data['created_at'] = data['created_at'].replace(tzinfo=None).isoformat()
106
+
107
+ if 'updated_at' in data and data['updated_at'] is not None:
108
+ data['updated_at'] = data['updated_at'].replace(tzinfo=None).isoformat()
109
+
110
+ text = ' '.join(str(value) for value in data.values() if value is not None)
111
+ print(text)
112
+ embedding = create_embeddings(text)
113
+
114
+ index.upsert(vectors=[{
115
+ "id": str(doc.id),
116
+ "values": embedding,
117
+ "metadata": {
118
+ "collection_type": collection,
119
+ "text": json.dumps(data),
120
+ "firebase_id": str(doc.id)
121
+ }
122
+ }])
123
+
124
+ output = f"Data {user_id} berhasil di embbedings"
125
+
126
+ return output
127
+
128
  # Define data models
129
  class ChatRequest(BaseModel):
130
  user_id: str
 
133
  class NewSessionRequest(BaseModel):
134
  user_id: str
135
 
136
+ class UserInput(BaseModel):
137
+ user_id: str
 
 
138
 
139
  # Endpoint to initialize a new chat session
140
  @app.post("/initialize_session")
141
  def initialize_session(request: NewSessionRequest):
142
+ user_doc_ref = client.collection(COLLECTION_NAME).document(request.user_id)
143
  user_doc = user_doc_ref.get()
144
 
145
  if not user_doc.exists:
 
152
 
153
  return {"session_id": session_id}
154
 
 
155
  @app.post("/chat")
156
  def chat(request: ChatRequest):
157
+ user_doc_ref = client.collection(COLLECTION_NAME).document(request.user_id)
158
  user_doc = user_doc_ref.get()
159
 
160
  if not user_doc.exists:
161
  raise HTTPException(status_code=404, detail="User ID not found in Firebase.")
162
 
163
+ # Corrected session ID retrieval
164
+ session_id = user_doc.get("last_session_id") if user_doc.exists and "last_session_id" in user_doc.to_dict() else str(uuid.uuid4())
165
  user_doc_ref.set({"last_session_id": session_id}, merge=True)
166
 
167
+ # Initialize chat history and memory
168
  chat_history = FirestoreChatMessageHistory(
169
  session_id=session_id,
170
+ collection=f"{COLLECTION_NAME}/{request.user_id}/message_history",
171
  client=client,
172
  )
173
  memory = ConversationBufferWindowMemory(k=5, chat_memory=chat_history)
174
 
175
+ # Generate response
176
  generated_response = run_llm(query=request.prompt, chat_history=memory.chat_memory.messages)
177
  generated_response = generated_response.replace("```", "").strip()
178
  memory.save_context({"input": request.prompt}, {"output": generated_response})
 
184
  def get_chat_history(user_id: str, session_id: str):
185
  chat_history = FirestoreChatMessageHistory(
186
  session_id=session_id,
187
+ collection=f"{COLLECTION_NAME}/{user_id}/message_history",
188
  client=client,
189
  )
190
+ messages = [{"role": "user" if isinstance(msg, HumanMessage) else "assistant", "content": msg.content} for msg in chat_history.messages]
 
 
 
191
  return {"chat_history": messages}
192
 
193
+ @app.post("/embeddings")
194
+ async def get_recommendations(user_input: UserInput):
195
+ user_id = user_input.user_id
196
+ processed_documents = fetch_and_embed_data(user_id)
197
+ return {
198
+ "status": "success",
199
+ "processed_documents": processed_documents
200
+ }
201
+
202
  # Fungsi untuk mengunggah file ke Google Drive
203
  def upload_to_drive(file_path: str, folder_id: str) -> str:
204
  file_name = os.path.basename(file_path)