Как использовать свойство OpenAI stream=true в ответе Django Rest Framework и при этом сохранить возвращаемое содержимое?

Я пытаюсь использовать свойство stream=true следующим образом.

completion = openai.Completion.create(
            model="text-davinci-003",
            prompt="Write me a story about dogs.",
            temperature=0.7,
            max_tokens=MAX_TOKENS,
            frequency_penalty=1.0,
            presence_penalty=1.0,
            stream=True,
        )

К сожалению, я не знаю, что делать дальше, чтобы вернуть его в мой фронтенд React. Обычно я использовал стандартные объекты ответа, задавая статус и serializer.data в качестве данных. Из прочитанного в интернете, кажется, что я должен использовать StreamingHttpResponse, но я не уверен, как интегрировать это с объектом-итератором completion, и фактически сохранить выведенные данные после завершения потоковой передачи, поскольку представление завершится после возврата итератора в конечную точку. Есть помощь?

Ответ оказался таким: я думал, что подхожу к этому неправильно. Используйте websockets! А не StreamingHttpResponse.

Вы можете использовать StreamingHttpResponse. Обратите внимание, что большинство api клиентов, таких как postman, не видят его в реальном времени, но вы можете увидеть его в терминале. Если вы хотите использовать его для react, вам придется использовать fetch api.

@api_view(["POST"])
def generate_names(request):
    if request.method == 'POST':
        # Parse the request body and extract the prompt
        prompt = request.data.get('prompt')
        
        # Set up the OpenAI API client
        openai.api_key = OPENAI_API_KEY
        
        # Define a generator function to stream the response
        def generate_response():
            for chunk in openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=[{
                    "role": "user",
                    "content": prompt
                }],
                stream=True,
            ):
                content = chunk["choices"][0].get("delta", {}).get("content")
                if content is not None:
                    
                    yield content
        
        # Return a streaming response to the client
        return StreamingHttpResponse(generate_response(), content_type='text/event-stream'))
    
    # Return a JSON error if the request method is not POST
    return JsonResponse({'error': 'Method not allowed.'}, status=405)

Чтобы увидеть его в терминале, используйте эту команду Curl http://127.0.0.1:8000/api/v1/askkk --header "Content-Type: application/json" --data '{"prompt": "How do I set up payment invoices?"}'

Вернуться на верх