Ai_Admin/MyApi/AiMssage.py
2024-06-05 05:25:27 +08:00

191 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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")