UPDATE
This commit is contained in:
+23
-32
@@ -59,8 +59,8 @@ RagValidationErrorResponseSerializer = build_envelope_serializer(
|
||||
class ChatView(APIView):
|
||||
"""
|
||||
چت RAG با استریم.
|
||||
POST با {"service_id": "...", "query": "متن سوال", "user_id": "شناسه کاربر"}
|
||||
service_id اجباری است. user_id فقط برای سرویسهایی که user embeddings دارند اجباری میشود.
|
||||
POST با {"query": "متن سوال", "farm_uuid": "شناسه مزرعه"}.
|
||||
همیشه از سرویس ثابت `chat` استفاده میکند و اطلاعات مزرعه را مستقیم به مدل میفرستد.
|
||||
"""
|
||||
|
||||
@extend_schema(
|
||||
@@ -70,11 +70,9 @@ class ChatView(APIView):
|
||||
request=inline_serializer(
|
||||
name="ChatRequest",
|
||||
fields={
|
||||
"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"),
|
||||
"farm_uuid": drf_serializers.CharField(help_text="شناسه مزرعه"),
|
||||
},
|
||||
),
|
||||
responses={
|
||||
@@ -86,26 +84,29 @@ class ChatView(APIView):
|
||||
RagChatErrorResponseSerializer,
|
||||
"پارامترهای ورودی نامعتبر هستند.",
|
||||
),
|
||||
404: build_response(
|
||||
RagChatErrorResponseSerializer,
|
||||
"مزرعه پیدا نشد.",
|
||||
),
|
||||
},
|
||||
examples=[
|
||||
OpenApiExample(
|
||||
"نمونه درخواست",
|
||||
value={
|
||||
"service_id": "support_bot",
|
||||
"user_id": "12345",
|
||||
"query": "How do I reset my password?",
|
||||
"farm_uuid": "550e8400-e29b-41d4-a716-446655440000",
|
||||
"query": "وضعیت مزرعه من چطور است؟",
|
||||
},
|
||||
request_only=True,
|
||||
),
|
||||
],
|
||||
)
|
||||
def post(self, request: Request):
|
||||
from .config import load_rag_config, get_service_config
|
||||
from farm_data.services import get_farm_details
|
||||
from .config import load_rag_config
|
||||
|
||||
data = request.data if request.method == "POST" else request.query_params
|
||||
service_id = data.get("service_id")
|
||||
message = data.get("query", data.get("message"))
|
||||
user_id = data.get("user_id", data.get("sensor_uuid"))
|
||||
farm_uuid = data.get("farm_uuid")
|
||||
if not message or not isinstance(message, str):
|
||||
return Response(
|
||||
{"code": 400, "msg": "پارامتر query الزامی است."},
|
||||
@@ -117,42 +118,32 @@ class ChatView(APIView):
|
||||
{"code": 400, "msg": "پیام نباید خالی باشد."},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
if not service_id or not isinstance(service_id, str):
|
||||
if not farm_uuid or not isinstance(farm_uuid, str):
|
||||
return Response(
|
||||
{"code": 400, "msg": "پارامتر service_id الزامی است."},
|
||||
{"code": 400, "msg": "پارامتر farm_uuid الزامی است."},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
service_id = str(service_id).strip()
|
||||
if not service_id:
|
||||
farm_uuid = str(farm_uuid).strip()
|
||||
if not farm_uuid:
|
||||
return Response(
|
||||
{"code": 400, "msg": "service_id نباید خالی باشد."},
|
||||
{"code": 400, "msg": "farm_uuid نباید خالی باشد."},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
cfg = load_rag_config()
|
||||
try:
|
||||
service = get_service_config(service_id, cfg)
|
||||
except KeyError:
|
||||
farm_details = get_farm_details(farm_uuid)
|
||||
if farm_details is None:
|
||||
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,
|
||||
{"code": 404, "msg": "farm پیدا نشد."},
|
||||
status=status.HTTP_404_NOT_FOUND,
|
||||
)
|
||||
|
||||
def generate():
|
||||
try:
|
||||
for chunk in chat_rag_stream(
|
||||
message,
|
||||
sensor_uuid=user_id,
|
||||
service_id=service_id,
|
||||
farm_uuid=farm_uuid,
|
||||
config=cfg,
|
||||
farm_details=farm_details,
|
||||
):
|
||||
yield chunk
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user