feat(chat): 支持流式回复与用户节点导航
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from django.http import HttpRequest, HttpResponse, JsonResponse, StreamingHttpResponse
|
||||
from django.shortcuts import redirect, render
|
||||
from django.views.decorators.http import require_http_methods
|
||||
|
||||
from .services import create_conversation, get_conversation_for_user, list_conversations, send_message
|
||||
from .services import (
|
||||
create_conversation,
|
||||
get_conversation_for_user,
|
||||
list_conversations,
|
||||
send_message,
|
||||
stream_message,
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -45,3 +51,25 @@ def workspace(request: HttpRequest) -> HttpResponse:
|
||||
"messages": current.messages.all() if current else [],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@require_http_methods(["POST"])
|
||||
def stream_chat(request: HttpRequest) -> HttpResponse:
|
||||
"""Streams one assistant reply so the UI can render incremental output."""
|
||||
|
||||
content = (request.POST.get("prompt") or "").strip()
|
||||
if not content:
|
||||
return JsonResponse({"error": "消息内容不能为空。"}, status=400)
|
||||
|
||||
conversation = get_conversation_for_user(request.user, request.POST.get("conversation_id"))
|
||||
if not conversation:
|
||||
conversation = create_conversation(request.user)
|
||||
|
||||
response = StreamingHttpResponse(
|
||||
streaming_content=stream_message(conversation, content),
|
||||
content_type="text/event-stream",
|
||||
)
|
||||
response["Cache-Control"] = "no-cache"
|
||||
response["X-Accel-Buffering"] = "no"
|
||||
return response
|
||||
|
||||
Reference in New Issue
Block a user