# Copyright (c) ModelScope Contributors. All rights reserved.
import json
from typing import TYPE_CHECKING, List, Optional, Tuple, Union
from .hermes import HermesAgentTemplate
if TYPE_CHECKING:
from swift.template import Prompt
class YoutuAgentTemplate(HermesAgentTemplate):
"""Agent template for Youtu-LLM models.
Tool calling format:
- Tool call: {"name": "function-name", "arguments": {...}}
- Tool response: ...
"""
def _get_tool_responses(self, tool_messages):
res_tool = []
for tool_message in tool_messages:
tool_content = tool_message['content']
res_tool.append(f'{tool_content}')
return '\n'.join(res_tool)
def _format_tool_responses(
self,
assistant_content: str,
tool_messages,
) -> Tuple[str, 'Prompt']:
with_action = self.keyword.action in assistant_content and self.keyword.action_input in assistant_content
if with_action:
return super()._format_tool_responses(assistant_content, tool_messages)
# For Youtu-LLM, tool responses are placed in user message
if hasattr(self, 'template_meta'):
prompt = self.template_meta.prompt
chat_sep = self.template_meta.chat_sep
else:
prompt = ['<|User|>{{QUERY}}<|Assistant|>']
chat_sep = ['<|end_of_text|>']
res = chat_sep.copy()
total_tool = self._get_tool_responses(tool_messages)
for context in prompt:
if isinstance(context, str):
context = context.replace('{{QUERY}}', total_tool)
res.append(context)
return assistant_content, res
def _format_tools(self, tools: List[Union[str, dict]], system: Optional[str] = None, user_message=None) -> str:
tool_descs = [json.dumps(self.wrap_tool(tool), ensure_ascii=False) for tool in tools]
system = system or ''
if system:
system = f'{system}\n\n'
return f"""{system}<|begin_of_tool_description|>Tool calling capabilities.
You may call one or more functions to assist with the user query. You have the following functions available:
""" + '\n'.join([f'```json\n{desc}\n```' for desc in tool_descs]) + """
For tool call returns, you MUST use the following format:
{"name": "function-name", "arguments": {"param1": "value1", "param2": "value2"}}
<|end_of_tool_description|>"""
def _format_tool_calls(self, tool_call_messages):
tool_calls = []
for message in tool_call_messages:
tool_call = self._parse_tool_call(message['content'])
tool_calls.append(f'{json.dumps(tool_call, ensure_ascii=False)}')
return ''.join(tool_calls)