chat_model.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import pandas as pd
  2. from openai import OpenAI
  3. import requests
  4. import json
  5. import re
  6. from pic_read import pic_see
  7. from config import config_get,key_get
  8. import os
  9. # 全局变量在这里改写:
  10. max_length = 20
  11. max_pic_see = 1
  12. prompt_pic = config_get("prompt_pic")
  13. prompt_lora = config_get("prompt_lora")
  14. prompt_chpic = config_get("prompt_chpic")
  15. pro_good = "solo,cat ears,black_hair,black_eye,"
  16. pro_bad = config_get("pro_bad")
  17. groq_key = key_get("groq")
  18. siliflow_key = key_get("siliflow")
  19. def AI_chat(group_id ,word ,prompt):
  20. """
  21. 猫猫人格,输入群号获取聊天记录,输入问题获取对话对象,返回字符串
  22. """
  23. # 加载聊天记录
  24. folder_path = '群聊记录'
  25. file_path = os.path.join(folder_path, str(group_id) + '.csv')
  26. df = pd.read_csv(file_path)
  27. recent = str("")
  28. recent_list = []
  29. for i in range(len(df)):
  30. if i >= len(df ) -max_length:
  31. recent_list.append(str(df.loc[i ,'user_name']))
  32. recent_list.append(str(df.loc[i, 'message']))
  33. pic_num = 0
  34. list_num = len(recent_list)
  35. for i in reversed(recent_list):
  36. list_num = list_num -1
  37. if pic_num >= max_pic_see:
  38. break
  39. if str(i).startswith("图片内容:"):
  40. url = i[5:]
  41. recent_list[list_num] = "发送了一张图片," + str(pic_see(url)).replace("\n", "")
  42. pic_num +=1
  43. for i in range(len(recent_list)):
  44. if i% 2 == 0:
  45. recent += recent_list[i] + ":"
  46. else:
  47. recent += recent_list[i] + "\n"
  48. print("-------------recent---------------")
  49. print(recent)
  50. messages = [{'role': 'system', 'content': prompt + recent}]
  51. messages.append({'role': 'user', 'content': word})
  52. try:
  53. ans = groq_chat(messages)
  54. except Exception as e:
  55. ans = siliflow_chat(messages)
  56. ans = ans.lstrip()
  57. ans = ans.lstrip("猫猫:")
  58. while True:
  59. if ans.endswith("\n") or ans.endswith(" "):
  60. ans = ans[:-1]
  61. else:
  62. break
  63. return ans
  64. def groq_chat(messages, model = "deepseek-r1-distill-llama-70b"):
  65. """
  66. 主对话通道,https://api.gxx12138.space/groq/v1
  67. """
  68. client = OpenAI(
  69. base_url="https://api.gxx12138.space/groq/v1",
  70. api_key=groq_key
  71. )
  72. completion = client.chat.completions.create(
  73. model=model,
  74. stream=False,
  75. messages=messages
  76. )
  77. ans = completion.choices[0].message.content
  78. return ans
  79. def siliflow_chat(messages, model = "THUDM/glm-4-9b-chat"):
  80. """
  81. 备用对话通道,https://api.siliconflow.cn/v1'
  82. """
  83. client = OpenAI(
  84. base_url='https://api.siliconflow.cn/v1',
  85. api_key=siliflow_key
  86. )
  87. try:
  88. print("硅基模型正常运作")
  89. # 发送AI请求
  90. # THUDM/glm-4-9b-chat google/gemma-2-9b-it
  91. response = client.chat.completions.create(
  92. model=model,
  93. messages=messages,
  94. stream=False,
  95. temperature=0.8,
  96. )
  97. ans = response.choices[0].message.content
  98. except Exception as e:
  99. print("硅基模型爆了")
  100. ans = ""
  101. return ans
  102. def AI_get_picprompt(group_id):
  103. """
  104. 群聊id自动获取群聊记录来获取绘画提示词
  105. """
  106. global pro_good
  107. # 加载聊天记录
  108. folder_path = '群聊记录'
  109. file_path = os.path.join(folder_path, str(group_id) + '.csv')
  110. df = pd.read_csv(file_path)
  111. recent = ""
  112. for i in range(len(df) - 4, len(df)):
  113. recent += str(df.loc[i, 'user_name']) + ":" + str(df.loc[i, 'message']) + "\n"
  114. messages = [{'role': 'system', 'content': prompt_pic}]
  115. messages.append({'role': 'user', 'content': recent})
  116. ans = groq_chat(messages)
  117. return pro_good + ans.strip().replace("\n", "") + ","
  118. def AI_sendphoto_ornot(event):
  119. """
  120. AI思考链,判断是否应该发送图片
  121. """
  122. messages = [{'role': 'system', 'content': prompt_chpic}]
  123. messages.append({'role': 'user', 'content': event})
  124. client = OpenAI(
  125. base_url='https://api.siliconflow.cn/v1',
  126. api_key=siliflow_key
  127. )
  128. # 发送AI请求
  129. response = client.chat.completions.create(
  130. model="THUDM/glm-4-9b-chat",
  131. messages=messages,
  132. stream=False,
  133. temperature=0.7,
  134. )
  135. ans = response.choices[0].message.content
  136. ans = ans.lstrip()
  137. print(f"图片发送决定:{ans}")
  138. return ans
  139. def AI_lora_getpic_prompt(word):
  140. """
  141. 群聊id自动获取群聊记录来获取绘画提示词
  142. 版本2
  143. """
  144. messages = [{'role': 'system', 'content': prompt_lora}]
  145. messages.append({'role': 'user', 'content': word})
  146. ans = siliflow_chat(messages).replace(", ", ",")
  147. return ans.strip().replace("\n", "") + ","
  148. def detect_tool(message):
  149. """
  150. 新方法,编写中
  151. """
  152. model = "llama-3.3-70b-versatile"