main.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import os
  2. import openai
  3. from flask import Flask, request, jsonify, send_from_directory, url_for
  4. import json
  5. app = Flask(__name__)
  6. ssl = None
  7. # ssl =('/etc/ssl/sample.crt', '/etc/ssl/sample.pem')
  8. openai_key = os.environ.get("OPENAI_KEY", "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")
  9. openai.api_key = openai_key
  10. app.chat_messages = [
  11. {"role": "system",
  12. "content": "Please respond professionally and in a friendly manner, using the same language as the original request."}
  13. ]
  14. app.translate_messages = [
  15. {"role": "system",
  16. "content": "Please translate using the requested language."}
  17. ]
  18. app.suggest_messages = [
  19. {"role": "system",
  20. "content": "Please suggest reply messages based on the previous conversations and the user's request."}
  21. ]
  22. app.recommend_messages = [
  23. {"role": "system",
  24. "content": "Give normalized total weight of each category in json based on headlines"
  25. }
  26. ]
  27. app.summary_messages = [
  28. {"role": "system",
  29. "content": "Please summarize an article."
  30. }
  31. ]
  32. UPLOAD_FOLDER = 'files'
  33. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
  34. @app.route('/files/<name>')
  35. def download_file(name):
  36. return send_from_directory(app.config["UPLOAD_FOLDER"], name)
  37. @app.route('/', methods=['GET', 'POST'])
  38. def test():
  39. return jsonify({"status": "0"})
  40. def recommend(headlines, category):
  41. chat_messages = app.recommend_messages.copy()
  42. try:
  43. json_payload = {
  44. "role": "user",
  45. "content": f"""{headlines}
  46. Berikan nilai berat masing-masing kategori, jumlahkan dan normalisasikan:
  47. {category}
  48. Berikan dalam bentuk json
  49. """
  50. }
  51. chat_messages.append(json_payload)
  52. print(chat_messages)
  53. json_response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",
  54. messages=chat_messages,
  55. response_format={ "type": "json_object" }
  56. )
  57. print(json_response.choices[0]["message"]["content"])
  58. return json.loads(json_response.choices[0]["message"]["content"])
  59. except Exception as error_print:
  60. app.logger.error(error_print)
  61. result = {}, 405
  62. def vision(message, image_url=None, image_b64=None):
  63. chat_messages = app.chat_messages.copy()
  64. url = ""
  65. if image_url:
  66. url = f"{image_url}"
  67. elif image_b64:
  68. url = f"data:image/jpeg;base64,{image_b64}"
  69. try:
  70. json_payload = {
  71. "role": "user",
  72. "content": [
  73. {"type": "text", "text": message},
  74. {
  75. "type": "image_url",
  76. "image_url": {
  77. "url": url,
  78. },
  79. },
  80. ],
  81. }
  82. chat_messages.append(json_payload)
  83. print(chat_messages)
  84. json_response = openai.ChatCompletion.create(
  85. model="gpt-4-vision-preview",
  86. messages=chat_messages,
  87. max_tokens=500
  88. )
  89. return json_response.choices[0]["message"]
  90. except Exception as error_print:
  91. app.logger.error(error_print)
  92. result = {}, 405
  93. @app.route('/gpt', methods=['POST'])
  94. def gpt():
  95. chat_messages = app.chat_messages.copy()
  96. use_video = False
  97. suggest = False
  98. summarize = False
  99. max_char_msg = 500
  100. max_resp_token = 600
  101. category = []
  102. headlines = []
  103. image_url = ""
  104. num_choices = 1
  105. json_payload = request.get_json()
  106. if not json_payload:
  107. json_payload = []
  108. has_named_params = False
  109. if isinstance(json_payload, dict):
  110. has_named_params = 'payload' in json_payload
  111. if 'payload' in json_payload:
  112. if 'num_choices' in json_payload:
  113. num_choices = 5 if json_payload['num_choices'] > 5 else json_payload['num_choices']
  114. if 'use_video' in json_payload:
  115. use_video = json_payload['use_video'] == "1"
  116. if 'translate' in json_payload:
  117. chat_messages = app.translate_messages.copy()
  118. json_payload['payload'][-1]['content'] = json_payload['payload'][-1]['content'] + f" (Translate to {json_payload['translate']})"
  119. elif 'suggest' in json_payload:
  120. suggest = json_payload['suggest'] == "1"
  121. if suggest:
  122. chat_messages = app.suggest_messages.copy()
  123. else:
  124. chat_messages = app.chat_messages.copy()
  125. json_payload['payload'][-1]['content'] = json_payload['payload'][-1]['content'] + f" What can I say to him/her?"
  126. elif 'summarize' in json_payload:
  127. summarize = json_payload['summarize'] == "1"
  128. if summarize:
  129. chat_messages = app.summary_messages.copy()
  130. max_char_msg = 2000
  131. max_resp_token = 4096
  132. else:
  133. chat_messages = app.chat_messages.copy()
  134. json_payload['payload'][-1]['content'] = f"Please summarize this article:\n" + json_payload['payload'][-1]['content']
  135. else:
  136. chat_messages = app.chat_messages.copy()
  137. json_payload = json_payload['payload']
  138. if isinstance(json_payload, dict):
  139. json_payload = [json_payload]
  140. elif 'greeting' in json_payload:
  141. chat_messages = app.chat_messages.copy()
  142. company_name = json_payload['greeting']['company_name']
  143. timestamp = json_payload['greeting']['timestamp']
  144. islamic_message = f"Apakah Nama '{company_name}' terdapat unsur islami? Jawab dengan 'Ya' atau 'Tidak'"
  145. islam_messages = app.chat_messages.copy()
  146. islam_messages.append({
  147. "role": "user",
  148. "content": islamic_message
  149. })
  150. islamic_response = openai.ChatCompletion.create(model="gpt-3.5-turbo", # GPT-3.5 Turbo engine
  151. messages=islam_messages,
  152. max_tokens=2, temperature=0.5)
  153. if 'Ya' in islamic_response.choices[0].message['content']:
  154. greeting_message = f"Buatkan respons chatbot berupa greeting dari chat perusahaan bernama {company_name} pada jam {timestamp}, tidak perlu mention waktu, dan jawab dengan 'Assalamu'alaikum...' terlebih dahulu"
  155. else:
  156. greeting_message = f"Buatkan respons chatbot berupa greeting dari chat perusahaan bernama {company_name} pada jam {timestamp}, tidak perlu mention waktu"
  157. json_payload = [
  158. {
  159. "role": "user",
  160. "content": greeting_message
  161. }
  162. ]
  163. elif 'recommend' in json_payload:
  164. headlines = json_payload['recommend']['headlines']
  165. category = json_payload['recommend']['category']
  166. return recommend(headlines, category)
  167. elif 'image_url' in json_payload:
  168. image = json_payload['image_url']
  169. message = json_payload["message"] if 'message' in json_payload else "Ini gambar apa?"
  170. return vision(message,image_url=image)
  171. elif 'image_b64' in json_payload:
  172. image = json_payload['image_b64']
  173. message = json_payload["message"] if 'message' in json_payload else "Ini gambar apa?"
  174. return vision(message,image_b64=image_url)
  175. else:
  176. chat_messages = app.chat_messages.copy()
  177. json_payload = [json_payload]
  178. json_payload = json_payload[-7:]
  179. for message in json_payload:
  180. content = message['content']
  181. content_arr = content.split(" ")
  182. new_content_arr = content[:max_char_msg].split(" ")
  183. new_content_len = len(new_content_arr)
  184. arr = []
  185. for i in range(new_content_len):
  186. arr.append(content_arr[i])
  187. message['content'] = " ".join(arr)
  188. chat_messages.append(message)
  189. app.logger.info(chat_messages)
  190. result = {}
  191. try:
  192. n = num_choices
  193. json_response = openai.ChatCompletion.create(model="gpt-3.5-turbo", # GPT-3.5 Turbo engine
  194. messages=chat_messages,
  195. max_tokens=max_resp_token, temperature=0.7, n = n)
  196. app.logger.info(json_response.choices[0].message)
  197. if has_named_params:
  198. if suggest:
  199. choices = json_response.choices
  200. messages = [i.message for i in choices]
  201. result = {"url": "", "message": messages}
  202. elif use_video:
  203. # TODO: to be implemented
  204. result = {"url": url_for('download_file', name="test.mp4", _external=True), "message": json_response.choices[0].message}
  205. else:
  206. result = {"url": "", "message": json_response.choices[0].message}
  207. else:
  208. result = json_response.choices[0].message
  209. except Exception as error_print:
  210. app.logger.error(error_print)
  211. result = {}, 405
  212. return result
  213. # Press the green button in the gutter to run the script.
  214. if __name__ == '__main__':
  215. app.run(host='0.0.0.0', port=8348, debug=True, ssl_context=ssl)
  216. # See PyCharm help at https://www.jetbrains.com/help/pycharm/