Django Rest Framework Ошибка Async: "'async_generator' object is not iterable"

Я работаю над проектом Django Rest Framework с асинхронными представлениями. У меня есть конечная точка для потоковых ответов, вот мой код:

Я получаю следующую ошибку{"error": "'async_generator' object is not iterable"}

У меня есть асинхронная конечная точка Django Rest Framework (DRF) для потоковых ответов. Я использую Django Rest Framework, langchain и asyncio. В моем фрагменте кода я пытаюсь сгенерировать поток с помощью асинхронного генератора

Я ожидал, что асинхронный генератор будет итерируемым и предоставит куски данных для потокового ответа. Цель состоит в том, чтобы выполнять итерации в генераторе и выдавать JSON-форматированные фрагменты в функции generate_stream.

Эта ошибка возникает именно при попытке выполнить итерацию над асинхронным генератором с помощью async for chunk in agent.astream({"input": prompt}):.

Я изучил документацию по используемым библиотекам (Django Rest Framework, langchain) и попробовал несколько вариаций в своем коде, но проблема сохраняется.

Используйте async_gen.__anext__() для ручного продвижения асинхронного генератора. Имейте в виду, что этот подход зависит от используемой библиотеки, и вы можете обратиться к документации или исходному коду библиотеки, чтобы узнать, как правильно выполнять итерации над ее асинхронным генератором.

async def generate_stream():
    print("...........>", prompt)
    async_gen = agent.astream({"input": prompt})
    
    try:
        while True:
            chunk = await async_gen.__anext__()
            
            res = ""
            if "actions" in chunk:
                for action in chunk["actions"]:
                    res += f"Calling Tool: `{action.tool}` with input `{action.tool_input}`\n"
            elif "steps" in chunk:
                for step in chunk["steps"]:
                    res += f"Tool Result: `{step.observation}`\n"
            elif "output" in chunk:
                res += f'Final Output: {chunk["output"]}\n'
            else:
                raise ValueError()

            # Send each print statement as a separate chunk in the streaming response
            yield json.dumps({"res": res})
    except StopAsyncIteration:
        pass

response = await generate_stream()
return StreamingHttpResponse(response, content_type='text/event-stream')

Возникшая ошибка "'async_generator' object is not iterable" говорит о том, что agent.astream({"input": prompt}) не возвращает итерируемый объект. В асинхронном программировании не все асинхронные генераторы можно итерировать напрямую, используя стандартный синтаксис цикла async for. Для некоторых из них может потребоваться итерация с помощью асинхронных методов итерации.

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