Ai_Admin/MyApi/AiMssage.py

191 lines
7.3 KiB
Python
Raw Normal View History

2024-06-05 05:25:27 +08:00
from django.shortcuts import render
import json
from http import HTTPStatus
from dashscope import Application
from django.http import JsonResponse
from .models import User, ChatRecord
from django.utils.crypto import get_random_string
from Crypto.Cipher import AES
import base64
from .views import update_usage_count
def decrypt_param(x, t):
# 创建AES解密器对象
key = b'qw5w6SFE2D1jmxyd'
iv = b'345GDFED433223DF'
# 检查 x 和 t 是否为空
if not x or not t:
return False
try:
cipher = AES.new(key, AES.MODE_CBC, iv)
# 将密文进行Base64解码
ciphertext_bytes = base64.b64decode(x)
# 使用解密器解密密文
plaintext_bytes = cipher.decrypt(ciphertext_bytes)
# 删除填充字符
plaintext = plaintext_bytes.rstrip(b'\0').decode('utf-8')
# 比较解密后的明文和 t
if plaintext.rstrip('\x03') == t.rstrip('\x03'):
return True
else:
return False
except Exception as e:
print(f"解密过程出现错误: {e}")
return False
def call_bailian_app(request):
body = request.body.decode("utf-8")
data = json.loads(body)
user_id = data.get("user_id")
openid = data.get("openid")
role_name = data.get("role", "AI助手") # 默认角色为“默认AI聊天”
prompt = data.get("prompt")
x = request.headers.get('X', '')
t = request.headers.get('T', '')
increment = -1
function_type = 'call_bailian_app'
result = update_usage_count(openid, increment, function_type)
if decrypt_param(x, t):
if result['success']:
print(f"收到请求: user_id={user_id}, role_name={role_name}, prompt={prompt}")
try:
user = User.objects.get(nickname=user_id)
print(f"找到用户: {user.nickname}")
except User.DoesNotExist:
print("用户不存在")
return JsonResponse({"message": "用户不存在"}, status=404)
# 检查是否已有该用户和角色的会话
conversation = ChatRecord.objects.filter(nickname=user.nickname, role=role_name).first()
if not conversation:
print(f"新会话ID")
response = Application.call(
app_id=get_app_id(role_name),
prompt=prompt,
api_key="sk-9458cae1bed7460c9780e52ca6005cae",
)
conversation_id = response.output.get('session_id')
else:
conversation_id = conversation.conversation_id
response = Application.call(
app_id=get_app_id(role_name),
prompt=prompt,
api_key="sk-9458cae1bed7460c9780e52ca6005cae",
session_id=conversation_id
)
print(f"已有会话ID: {conversation_id}")
print(f"API调用响应状态: {response.status_code}")
if response.status_code != HTTPStatus.OK:
print(f"API调用失败: request_id={response.request_id}, message={response.message}")
return JsonResponse({
"message": "调用应用程序失败",
"request_id": response.request_id,
"code": response.status_code,
"details": response.message
}, status=response.status_code)
ai_response = response.output.get('text') if response.output else "AI无回复"
print(f"AI回复: {ai_response}")
ChatRecord.objects.create(
openid=user.openid,
nickname=user.nickname,
conversation_id=conversation_id,
role=role_name,
message_content=prompt,
is_response=False
)
# 保存AI回复
ChatRecord.objects.create(
openid=user.openid,
nickname=user.nickname,
conversation_id=conversation_id,
role=role_name,
message_content=ai_response,
is_response=True
)
# 检索会话的最近10条消息
last_messages = ChatRecord.objects.filter(nickname=user.nickname, conversation_id=conversation_id).order_by('-timestamp')[:10]
last_messages_list = [
{
"content": msg.message_content,
"is_response": msg.is_response,
"role":msg.role,
"timestamp": msg.timestamp.strftime('%Y-%m-%d %H:%M:%S')
} for msg in reversed(last_messages)
]
print(f"最近10条消息: {last_messages_list}")
return JsonResponse({
"message": "成功",
"ai_response": ai_response,
"conversation_id": conversation_id,
"last_messages": last_messages_list
}, status=HTTPStatus.OK)
else:
return JsonResponse(result)
else:
return JsonResponse({'error': '非法参数'}, status=400)
# 新增接口获取用户和角色的最近10条聊天记录
def get_recent_chat_records(request):
body = request.body.decode("utf-8")
data = json.loads(body)
user_id = data.get("user_id")
role_name = data.get("role", "AI助手") # 默认角色为“默认AI聊天”
x = request.headers.get('X', '')
t = request.headers.get('T', '')
if decrypt_param(x, t):
print(f"收到请求: user_id={user_id}, role_name={role_name}")
try:
user = User.objects.get(nickname=user_id)
print(f"找到用户: {user.nickname}")
except User.DoesNotExist:
print("用户不存在")
return JsonResponse({"message": "用户不存在"}, status=404)
# 获取该用户和角色的最近10条聊天记录
last_messages = ChatRecord.objects.filter(nickname=user.nickname, role=role_name).order_by('-timestamp')[:10]
last_messages_list = [
{
"content": msg.message_content,
"is_response": msg.is_response,
"role": msg.role,
"timestamp": msg.timestamp.strftime('%Y-%m-%d %H:%M:%S')
} for msg in reversed(last_messages)
]
print(f"最近10条消息: {last_messages_list}")
return JsonResponse({
"message": "成功",
"last_messages": last_messages_list
}, status=HTTPStatus.OK)
else:
return JsonResponse({'error': '非法参数'}, status=400)
def get_app_id(role_name):
role_app_id_map = {
"法律咨询": "446cde34829e4d6490667b1271dee537",
"行业分析师": "bdce7fba11b147ca846a1b4d1f5e7e72",
"写工作报告": "f340613da5574815975acdc10bac4e47",
"产品顾问": "f9b0612793e94a669fe7ad2fecbda50e",
"写爆款文案": "2c8d6675a9794711a886a5e8cf714afe",
"写公众号文章": "4fb69f6bd9bb49c9a6329202c6f28c84",
"文案改写": "b94734c09c414814bc0505a4e5b636c6",
"招聘助理": "c70caf3fd67b44c4947df70f05cf9f10",
"AI助手": "92d23cd2c5d64ef5ac6ad02692fc510b",
"小红书文案": "c5211023cbf64d548ea55a47c516007a",
"写广告文案": "6c9770da90ec47979ce899cec49c396c",
}
return role_app_id_map.get(role_name, "app_id_default")