-
Notifications
You must be signed in to change notification settings - Fork 3.3k
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
Python: history is not extended with tool call related messages automatically #9408
Comments
Hi @bbence84, thanks for continuing the conversation here. As I mentioned in our previous thread in #8071, all of the relevant calls are contained in the metadata's chat history. After each kernel invocation, you have access to the underlying content types (whether FunctionCallContent or FunctionResultContent -- even if not using a filter). For the caller's ChatHistory, that's their responsibility to manage. The caller shall populate their chat history with the information required to either maintain context (or not). Can you please help me understand what the gap is? |
Sorry for the late response and thanks for the reply. |
You are right, I understand now, that the caller needs to fill the ChatHistory. However as I mentioned above, there seems to be a difference between how the kernel.invoke and kernel.invoke_stream returns relevant info. The stream based invoke does not seem to contain the tool call related messages. I can do the following for the kernel.invoke version though: But this is not available for the invoke_stream. Am I missing something? Thanks! |
Thanks for the ping on this. Will have a look tomorrow morning and get back to you. |
Hi @bbence84, I've been looking into this more. Sorry for the delay. In the if result_content:
# this line is new to view content types
streaming_chat_message = reduce(lambda first, second: first + second, result_content)
return "".join([str(content) for content in result_content]) I can see that we get the We are yielding those two content types out as they are what we receive streaming from the model. The gap here is that we aren't yielding out the |
Thanks a lot! :) I was beginning to have doubts that I don't understand how this supposed to work, but thanks for confirming that it does not work the same way with streaming. |
@moonbox3 sorry for pinging you, but is the yielding of FunctionResultContent already part of the backlog for an upcoming sprint? |
Describe the bug
Not exactly sure if this is a bug, but at least a gap. I have moved away from using the Planners and rely on "vanilla" function calling. Yet my tools that I defined can be chained after each other, and the LLM does come up with a plan how to chain them, and can call them after each other pretty well.
Now my problem is that my tool functions usually return a JSON which contains i.e. the IDs of certain business objects that were created, and then the followup tool has a parameter that should use this (technical ID). The LLM response (the textual response) based on the function return value usually does not contain this ID (rightly so, as it's indeed a technical detail). The problem is that now followup functions have no clue about the ID, because the ChatHistory does not contain the tool calls.
Rerefencing issue #8071 and #8020.
To Reproduce
I tested this with a simpler example, as per recommendation the following:
https://github.com/microsoft/semantic-kernel/blob/main/python/samples/concepts/filtering/auto_function_invoke_filters.py
Also here printing the ChatHistory does not contain any tool call or tool call results:
Expected behavior
Chat history contains FunctionResultContent and FunctionCallContent automatically, as that is needed if tool functions are to be chained and one tool uses the result of a previous tool call.
Platform
Additional context
Add any other context about the problem here.
The text was updated successfully, but these errors were encountered: