AI UPDATE

This commit is contained in:
2026-03-22 03:08:27 +03:30
parent 3ee14ca977
commit d977a583c6
37 changed files with 3525 additions and 263 deletions
+46 -16
View File
@@ -24,8 +24,8 @@ logger = logging.getLogger(__name__)
class ChatView(APIView):
"""
چت RAG با استریم.
POST با {"message": "متن سوال", "sensor_uuid": "uuid-سنسور"}
sensor_uuid اجباری — هر کاربر فقط به دیتای خودش دسترسی دارد.
POST با {"service_id": "...", "query": "متن سوال", "user_id": "شناسه کاربر"}
service_id اجباری است. user_id فقط برای سرویس‌هایی که user embeddings دارند اجباری می‌شود.
"""
@extend_schema(
@@ -35,8 +35,11 @@ class ChatView(APIView):
request=inline_serializer(
name="ChatRequest",
fields={
"message": drf_serializers.CharField(help_text="متن سوال کاربر"),
"sensor_uuid": drf_serializers.CharField(help_text="شناسه یکتای سنسور"),
"service_id": drf_serializers.CharField(help_text="شناسه سرویس"),
"query": drf_serializers.CharField(required=False, help_text="متن سوال کاربر"),
"message": drf_serializers.CharField(required=False, help_text="نام قبلی فیلد query"),
"user_id": drf_serializers.CharField(required=False, help_text="شناسه کاربر"),
"sensor_uuid": drf_serializers.CharField(required=False, help_text="نام قبلی فیلد user_id"),
},
),
responses={
@@ -50,19 +53,25 @@ class ChatView(APIView):
examples=[
OpenApiExample(
"نمونه درخواست",
value={"message": "وضعیت خاک من چطوره؟", "sensor_uuid": "550e8400-e29b-41d4-a716-446655440000"},
value={
"service_id": "support_bot",
"user_id": "12345",
"query": "How do I reset my password?",
},
request_only=True,
),
],
)
def post(self, request: Request):
from .config import load_rag_config, get_service_config
data = request.data if request.method == "POST" else request.query_params
message = data.get("message")
sensor_uuid = data.get("sensor_uuid")
logging.info("jhh")
service_id = data.get("service_id")
message = data.get("query", data.get("message"))
user_id = data.get("user_id", data.get("sensor_uuid"))
if not message or not isinstance(message, str):
return Response(
{"code": 400, "msg": "پارامتر message الزامی است."},
{"code": 400, "msg": "پارامتر query الزامی است."},
status=status.HTTP_400_BAD_REQUEST,
)
message = str(message).strip()
@@ -71,22 +80,43 @@ class ChatView(APIView):
{"code": 400, "msg": "پیام نباید خالی باشد."},
status=status.HTTP_400_BAD_REQUEST,
)
if not sensor_uuid or not isinstance(sensor_uuid, str):
if not service_id or not isinstance(service_id, str):
return Response(
{"code": 400, "msg": "پارامتر sensor_uuid الزامی است."},
{"code": 400, "msg": "پارامتر service_id الزامی است."},
status=status.HTTP_400_BAD_REQUEST,
)
sensor_uuid = str(sensor_uuid).strip()
if not sensor_uuid:
service_id = str(service_id).strip()
if not service_id:
return Response(
{"code": 400, "msg": "sensor_uuid نباید خالی باشد."},
{"code": 400, "msg": "service_id نباید خالی باشد."},
status=status.HTTP_400_BAD_REQUEST,
)
cfg = load_rag_config()
try:
service = get_service_config(service_id, cfg)
except KeyError:
return Response(
{"code": 400, "msg": f"service_id نامعتبر است: {service_id}"},
status=status.HTTP_400_BAD_REQUEST,
)
if user_id is not None:
user_id = str(user_id).strip()
if not user_id:
user_id = None
if service.use_user_embeddings and not user_id:
return Response(
{"code": 400, "msg": "برای این service_id، پارامتر user_id الزامی است."},
status=status.HTTP_400_BAD_REQUEST,
)
def generate():
try:
for chunk in chat_rag_stream(message, sensor_uuid=sensor_uuid):
for chunk in chat_rag_stream(
message,
sensor_uuid=user_id,
service_id=service_id,
config=cfg,
):
yield chunk
except Exception as e:
yield f"\n[خطا: {e}]"