|
@@ -1,3 +1,4 @@
|
|
|
+import datetime
|
|
|
import logging
|
|
|
import os
|
|
|
import json
|
|
@@ -147,6 +148,66 @@ def vision(message, image_url=None, image_b64=None):
|
|
|
result = {"status": "error", "message": "Please try again"}, 405
|
|
|
return result
|
|
|
|
|
|
+def suggest_schedule(sched, message: list, assistant_id=None, timestamp=None):
|
|
|
+ result = {}
|
|
|
+ if timestamp is None:
|
|
|
+ timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
|
|
|
+ message[-1]["content"] = f"{message[-1]['content']} Sekarang jam {timestamp}.\n\n{json.dumps(sched)}"
|
|
|
+ try:
|
|
|
+ if assistant_id:
|
|
|
+ runs = app.openai_client.beta.threads.create_and_run_poll(
|
|
|
+ assistant_id=assistant_id,
|
|
|
+ thread={
|
|
|
+ "messages": message
|
|
|
+ }
|
|
|
+ )
|
|
|
+ if runs.status == "completed":
|
|
|
+ messages = list(app.openai_client.beta.threads.messages.list(thread_id=runs.thread_id, run_id=runs.id))
|
|
|
+ message_content = messages[0].content[0].text
|
|
|
+ app.logger.info(message_content.value)
|
|
|
+ pattern = re.compile(r"【\d+:\d+†\(?source\)?】")
|
|
|
+ filtered_message = pattern.sub("", message_content.value)
|
|
|
+ result = {"role": "assistant", "content": filtered_message}
|
|
|
+ else:
|
|
|
+ json_response = app.openai_client.chat.completions.create(model="gpt-4o",
|
|
|
+ messages=message,
|
|
|
+ temperature=0.7)
|
|
|
+ response_message = json_response.choices[0].message.content
|
|
|
+ result = {"role": "assistant", "content": response_message}
|
|
|
+ except openai.APITimeoutError as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": e.message}, 408
|
|
|
+ except openai.NotFoundError as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": json.loads(e.response.content)['error']['message']}, e.status_code
|
|
|
+ except Exception as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": "Please try again"}, 405
|
|
|
+ return result
|
|
|
+
|
|
|
+
|
|
|
+def convert_to_schedule(message: list):
|
|
|
+ result = {}
|
|
|
+ message[-1]["content"] = f'{message[-1]["content"]} Ubah menjadi format json seperti berikut:\n\n{{"start_time": "2025-10-01 11:00", "end_time": "2025-10-01 13:00", "description": "Deskripsi kegiatan" }}'
|
|
|
+ try:
|
|
|
+ json_response = app.openai_client.chat.completions.create(
|
|
|
+ model="gpt-4o",
|
|
|
+ messages=message,
|
|
|
+ temperature=0.2,
|
|
|
+ response_format={"type": "json_object"}
|
|
|
+ )
|
|
|
+ response_message = json_response.choices[0].message.content
|
|
|
+ result = json.loads(response_message)
|
|
|
+ except openai.APITimeoutError as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": e.message}, 408
|
|
|
+ except openai.NotFoundError as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": json.loads(e.response.content)['error']['message']}, e.status_code
|
|
|
+ except Exception as e:
|
|
|
+ app.logger.exception("error")
|
|
|
+ result = {"status": "error", "message": "Please try again"}, 405
|
|
|
+ return result
|
|
|
|
|
|
@app.route('/gpt', methods=['POST'])
|
|
|
def gpt():
|
|
@@ -214,6 +275,16 @@ def gpt():
|
|
|
chat_model = assistant.model
|
|
|
else:
|
|
|
chat_messages = app.chat_messages.copy()
|
|
|
+ if 'schedule' in json_payload:
|
|
|
+ timestamp = None
|
|
|
+ if 'timestamp' in json_payload:
|
|
|
+ timestamp = json_payload["timestamp"]
|
|
|
+ sched = json_payload["schedule"].copy()
|
|
|
+ message = json_payload["payload"].copy()
|
|
|
+ return suggest_schedule(sched, message, assistant_id, timestamp)
|
|
|
+ elif 'convert_schedule' in json_payload:
|
|
|
+ if json_payload['convert_schedule'] == "1":
|
|
|
+ return convert_to_schedule(json_payload['payload'].copy())
|
|
|
json_payload = json_payload['payload']
|
|
|
if isinstance(json_payload, dict):
|
|
|
json_payload = [json_payload]
|