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. Для некоторых из них может потребоваться итерация с помощью асинхронных методов итерации.