-
Notifications
You must be signed in to change notification settings - Fork 107
[Bug] dispatcher.py task factory doesn't allow for optional context
parameter
#1508
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
@jreed-Aces have you found a workaround for this? I'm having the same issue right now and you just happened to create this 2 days ago 🙂 |
@brbarnett We downgraded to Python 3.10, which doesn't have the optional Locally the code fix I posted above works, but that doesn't help when deploying to Azure. |
I have the same issue with py 3.11... Fixed for the moment with py 3.10 version |
ran into the same issue with python 3.11 when working on http stream mode on azure function app |
run into the same issue using langchain Runnable method ainvoke. This worked for me but don't know why: loop = asyncio.get_running_loop() |
Any update on this? I see there's an open PR to solve it since more than a month ago? And @TobiConti's solution doesn't really work for me within an Azure functions environment |
The fix has been merged and will be in the next worker release. Thanks for your patience! |
any timeline for the next release? |
Hi @tmusbi, sorry for the late response! We've hit some delays with getting a new release out, but we hope to have this out by late October / early November. Thanks for your patience! |
Posting a quick update here -- unfortunately we've hit some other delays in releasing, and we are slowing releases during the holiday season. Updated ETA is January. Sorry for the delays, and thanks again for your patience. |
any timeline for the next release? |
Try the comment right before yours. |
I see that the ticket is closed, but I don't see any comments about release. Has this been released, or is it still waiting? |
@jreed-Aces, the release will start next week. The changes should be rolled out to all regions by end of February / early March and are included in runtime version 4.1037. |
@hallvictoria great, thank you for the update. I appreciate it |
This also helped me |
Hi @hallvictoria, thank you for your work and availability, I see that Function Apps runtime version 4.1037.0 has been released but I couldn't find an explicit mention for this bug there. Can you please confirm it's included in the release, and migrating back to this runtime is safe? In the meantime, +1 to @jreed-Aces 's suggested workaround. I deployed a new container with Python 3.10 2 months ago and it works like a charm. I'm just preoccupied about tech debt on this old runtime. Thanks for your time and efforts! |
Hi @robincolinet, yes, this fix is included in the 4.1037 train. 4.1037 is still being rolled out but will be available for all regions by the end of next week at the latest. The runtime release notes will show updates to the Python worker version. You can view the changes for the Python worker in the releases page, and it will list what runtime version the changes will be a part of. Hope that helps! |
This Worked for Me! 🚀I was facing an issue where my Azure Function using LangChain's
After some debugging, I realized that resetting the task factory multiple times was causing issues. Initially, I was doing: loop = asyncio.get_running_loop()
loop.set_task_factory(None) But this was being called on every request, which was breaking things. How I Fixed ItI wrapped the task factory reset in a context manager, so it only resets during execution and restores the original factory after: import asyncio
class ResetTaskFactory:
def __enter__(self):
self.loop = asyncio.get_running_loop()
self.old_factory = self.loop.get_task_factory()
self.loop.set_task_factory(None)
def __exit__(self, exc_type, exc_value, traceback):
self.loop.set_task_factory(self.old_factory)
# ✅ Usage inside Azure Function
async def main(req):
with ResetTaskFactory(): # Ensures proper reset
response = await tool.ainvoke("Hello!")
return response Why This Works?✅ Prevents multiple resets that break async execution. Hope this helps someone! 🚀 Let me know if you have a better approach! 😊 |
Expected Behavior
Python 3.11 allows for a named
context
parameter to be passed in when constructing a task (https://github.com/python/cpython/blob/3.11/Lib/asyncio/tasks.py#L106). However, the task factory that creates aContextEnabledTask
inside ofdispatcher.py
doesn't allow for that parameter. When a task is added that attempts to utilize the parameter, an error is raised instead:Actual Behavior
The task_factory lambda and the ContextEnabledTask should be able to accept the optional, named parameter of
context
Steps to Reproduce
Using the existing task_factory, attempt to add a new task along with the named
context
parameter.Relevant code being tried
The text was updated successfully, but these errors were encountered: