LLMBB-Agent / agent /actions /function_calling.py
ff_li
目录调整
f67d239
from typing import Dict, Iterator, List
from agent.actions.base import Action
from agent.actions.react import ReAct
from agent.tools import call_plugin
class FunctionCalling(Action):
def _run(self,
user_request,
functions: List[Dict] = None,
lang: str = 'en') -> Iterator[str]:
functions = functions or []
if not self.llm.support_function_calling():
return ReAct(llm=self.llm,
stream=self.stream).run(user_request,
functions=functions,
lang=lang)
messages = [{'role': 'user', 'content': user_request}]
is_first_yield = True
while True:
rsp = self.llm.chat_with_functions(
messages=messages,
functions=functions,
)
if is_first_yield:
is_first_yield = False
else:
yield '\n'
if rsp.get('function_call', None):
yield rsp['content']
yield '\nAction: ' + rsp['function_call']['name']
yield '\nAction Input:\n'
yield rsp['function_call']['arguments']
bot_msg = {
'role': 'assistant',
'content': rsp['content'],
'function_call': {
'name': rsp['function_call']['name'],
'arguments': rsp['function_call']['arguments'],
},
}
messages.append(bot_msg)
obs = call_plugin(rsp['function_call']['name'],
rsp['function_call']['arguments'])
yield '\nObservation: ' + obs + '\n'
fn_msg = {
'role': 'function',
'name': rsp['function_call']['name'],
'content': obs,
}
messages.append(fn_msg)
else:
yield 'Thought: I now know the final answer.'
yield '\nFinal Answer: ' + rsp['content']
bot_msg = {
'role': 'assistant',
'content': rsp['content'],
}
messages.append(bot_msg)
break