Lagent / lagent /agents /aggregator /tool_aggregator.py
Superkingjcj's picture
Upload 111 files
e679d69 verified
from typing import Dict, List, Optional, Union
from lagent.agents.aggregator.default_aggregator import DefaultAggregator
from lagent.memory.base_memory import Memory
from lagent.prompts.parsers.tool_parser import MixedToolParser, ToolParser, ToolStatusCode
class InternLMToolAggregator(DefaultAggregator):
def __init__(self,
environment_role='environment',
environment_begin='',
environment_end='',
user_names: Optional[List[str]] = None,
few_shot: Optional[List[List[dict]]] = None):
self.environment_role = environment_role
self.environment_begin = environment_begin
self.environment_end = environment_end
self.user_names = user_names or ['user']
self.few_shot = few_shot or []
def aggregate(self,
messages: Memory,
name: str,
parser: Union[ToolParser, MixedToolParser],
system_instruction: str = None) -> List[Dict[str, str]]:
_message = []
messages = messages.get_memory()
if system_instruction:
_message.extend(
self.aggregate_system_intruction(system_instruction))
tool_instruction = parser.format_instruction()
if tool_instruction:
if isinstance(tool_instruction, str):
tool_instruction = dict(
role='system', content=tool_instruction)
if parser.tool_type:
tool_instruction['name'] = parser.tool_type
if isinstance(tool_instruction, dict):
tool_instruction = [tool_instruction]
_message.extend(tool_instruction)
for shot in self.few_shot:
i = 0
while i < len(shot):
msg = shot[i]
if msg['role'] in ['assistant', 'user', 'system']:
_message.append(msg)
elif msg['role'] == self.environment_role:
if not msg['content'].startswith(self.environment_begin):
msg['content'] = self.environment_begin + msg['content']
if not msg['content'].endswith(self.environment_end):
msg['content'] += self.environment_end
_message.append(msg)
elif msg['role'] in ['thought', 'language']:
if i < len(shot) - 1 and shot[i + 1]['role'] == 'tool':
_message.append(
dict(
role='assistant',
content=parser.format_response(
dict(
tool_type=shot[i + 1]['name'],
thought=msg['content'],
action=shot[i + 1]['content'],
status=None))))
i += 1
else:
_message.append(
dict(
role='assistant',
content=parser.format_response(
dict(
tool_type=None,
thought=msg['content'],
action=None,
status=None))))
else:
raise KeyError(f'Unkown role: {msg["role"]}')
i += 1
tool_type = None
for message in messages:
if message.sender == name:
if isinstance(message.formatted, dict):
parsed = message.formatted
if parsed['status'] == ToolStatusCode.PARSING_ERROR:
continue
_message.append(
dict(
role='assistant',
content=parser.format_response(parsed)))
tool_type = parsed['tool_type']
else:
_message.append(
dict(role='assistant', content=str(message.content)))
elif message.sender in self.user_names:
_message.append(dict(role='user', content=message.content))
else:
msg = dict(
role=self.environment_role,
content=self.environment_begin + str(message.content) +
self.environment_end)
if tool_type:
msg['name'] = tool_type
_message.append(msg)
return _message