This commit is contained in:
2026-03-25 01:56:41 +03:30
parent eb34360345
commit 98406cfd59
99 changed files with 3156 additions and 232 deletions
+60 -63
View File
@@ -1,7 +1,10 @@
"""
ویوهای RAG — چت با استریم
"""
import logging
from django.http import StreamingHttpResponse
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import (
OpenApiExample,
OpenApiResponse,
@@ -13,14 +16,46 @@ from rest_framework import serializers as drf_serializers
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
import logging
from config.openapi import (
build_envelope_serializer,
build_message_response_serializer,
build_response,
build_task_queue_data_serializer,
build_task_status_data_serializer,
)
from .chat import chat_rag_stream
logger = logging.getLogger(__name__)
RagChatErrorResponseSerializer = build_message_response_serializer(
"RagChatErrorResponseSerializer"
)
RagIrrigationQueueResponseSerializer = build_envelope_serializer(
"RagIrrigationQueueResponseSerializer",
build_task_queue_data_serializer("RagIrrigationQueueDataSerializer"),
)
RagIrrigationStatusResponseSerializer = build_envelope_serializer(
"RagIrrigationStatusResponseSerializer",
build_task_status_data_serializer("RagIrrigationStatusDataSerializer"),
)
RagFertilizationQueueResponseSerializer = build_envelope_serializer(
"RagFertilizationQueueResponseSerializer",
build_task_queue_data_serializer("RagFertilizationQueueDataSerializer"),
)
RagFertilizationStatusResponseSerializer = build_envelope_serializer(
"RagFertilizationStatusResponseSerializer",
build_task_status_data_serializer("RagFertilizationStatusDataSerializer"),
)
RagValidationErrorResponseSerializer = build_envelope_serializer(
"RagValidationErrorResponseSerializer",
data_required=False,
allow_null=True,
)
class ChatView(APIView):
"""
چت RAG با استریم.
@@ -44,10 +79,12 @@ class ChatView(APIView):
),
responses={
200: OpenApiResponse(
response=OpenApiTypes.STR,
description="پاسخ استریم متنی (text/plain)",
),
400: OpenApiResponse(
description="پارامتر ورودی نامعتبر",
400: build_response(
RagChatErrorResponseSerializer,
"پارامترهای ورودی نامعتبر هستند.",
),
},
examples=[
@@ -152,21 +189,14 @@ class IrrigationRecommendationView(APIView):
},
),
responses={
202: inline_serializer(
name="IrrigationRecommendationResponse",
fields={
"code": drf_serializers.IntegerField(),
"msg": drf_serializers.CharField(),
"data": inline_serializer(
name="IrrigationRecommendationData",
fields={
"task_id": drf_serializers.CharField(),
"status_url": drf_serializers.CharField(),
},
),
},
202: build_response(
RagIrrigationQueueResponseSerializer,
"تسک توصیه آبیاری در صف قرار گرفت.",
),
400: build_response(
RagValidationErrorResponseSerializer,
"پارامتر ورودی نامعتبر است.",
),
400: OpenApiResponse(description="پارامتر ورودی نامعتبر"),
},
examples=[
OpenApiExample(
@@ -219,22 +249,9 @@ class IrrigationRecommendationStatusView(APIView):
summary="وضعیت تسک توصیه آبیاری",
description="وضعیت تسک Celery توصیه آبیاری را برمی‌گرداند.",
responses={
200: inline_serializer(
name="IrrigationRecommendationStatusResponse",
fields={
"code": drf_serializers.IntegerField(),
"msg": drf_serializers.CharField(),
"data": inline_serializer(
name="IrrigationRecommendationStatusData",
fields={
"task_id": drf_serializers.CharField(),
"status": drf_serializers.CharField(),
"result": drf_serializers.JSONField(required=False),
"progress": drf_serializers.DictField(required=False),
"error": drf_serializers.CharField(required=False),
},
),
},
200: build_response(
RagIrrigationStatusResponseSerializer,
"وضعیت فعلی تسک توصیه آبیاری.",
),
},
)
@@ -281,21 +298,14 @@ class FertilizationRecommendationView(APIView):
},
),
responses={
202: inline_serializer(
name="FertilizationRecommendationResponse",
fields={
"code": drf_serializers.IntegerField(),
"msg": drf_serializers.CharField(),
"data": inline_serializer(
name="FertilizationRecommendationData",
fields={
"task_id": drf_serializers.CharField(),
"status_url": drf_serializers.CharField(),
},
),
},
202: build_response(
RagFertilizationQueueResponseSerializer,
"تسک توصیه کودهی در صف قرار گرفت.",
),
400: build_response(
RagValidationErrorResponseSerializer,
"پارامتر ورودی نامعتبر است.",
),
400: OpenApiResponse(description="پارامتر ورودی نامعتبر"),
},
examples=[
OpenApiExample(
@@ -346,22 +356,9 @@ class FertilizationRecommendationStatusView(APIView):
summary="وضعیت تسک توصیه کودهی",
description="وضعیت تسک Celery توصیه کودهی را برمی‌گرداند.",
responses={
200: inline_serializer(
name="FertilizationRecommendationStatusResponse",
fields={
"code": drf_serializers.IntegerField(),
"msg": drf_serializers.CharField(),
"data": inline_serializer(
name="FertilizationRecommendationStatusData",
fields={
"task_id": drf_serializers.CharField(),
"status": drf_serializers.CharField(),
"result": drf_serializers.JSONField(required=False),
"progress": drf_serializers.DictField(required=False),
"error": drf_serializers.CharField(required=False),
},
),
},
200: build_response(
RagFertilizationStatusResponseSerializer,
"وضعیت فعلی تسک توصیه کودهی.",
),
},
)