|
@@ -17,6 +17,7 @@ from core.model_runtime.entities.message_entities import (
|
|
|
ToolPromptMessage,
|
|
|
UserPromptMessage,
|
|
|
)
|
|
|
+from core.prompt.agent_history_prompt_transform import AgentHistoryPromptTransform
|
|
|
from core.tools.entities.tool_entities import ToolInvokeMeta
|
|
|
from core.tools.tool_engine import ToolEngine
|
|
|
from models.model import Message
|
|
@@ -24,21 +25,18 @@ from models.model import Message
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
+
|
|
|
def run(self,
|
|
|
message: Message, query: str, **kwargs: Any
|
|
|
) -> Generator[LLMResultChunk, None, None]:
|
|
|
"""
|
|
|
Run FunctionCall agent application
|
|
|
"""
|
|
|
+ self.query = query
|
|
|
app_generate_entity = self.application_generate_entity
|
|
|
|
|
|
app_config = self.app_config
|
|
|
|
|
|
- prompt_template = app_config.prompt_template.simple_prompt_template or ''
|
|
|
- prompt_messages = self.history_prompt_messages
|
|
|
- prompt_messages = self._init_system_message(prompt_template, prompt_messages)
|
|
|
- prompt_messages = self._organize_user_query(query, prompt_messages)
|
|
|
-
|
|
|
# convert tools into ModelRuntime Tool format
|
|
|
tool_instances, prompt_messages_tools = self._init_prompt_tools()
|
|
|
|
|
@@ -81,6 +79,7 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
)
|
|
|
|
|
|
# recalc llm max tokens
|
|
|
+ prompt_messages = self._organize_prompt_messages()
|
|
|
self.recalc_llm_max_tokens(self.model_config, prompt_messages)
|
|
|
# invoke model
|
|
|
chunks: Union[Generator[LLMResultChunk, None, None], LLMResult] = model_instance.invoke_llm(
|
|
@@ -203,7 +202,7 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
else:
|
|
|
assistant_message.content = response
|
|
|
|
|
|
- prompt_messages.append(assistant_message)
|
|
|
+ self._current_thoughts.append(assistant_message)
|
|
|
|
|
|
# save thought
|
|
|
self.save_agent_thought(
|
|
@@ -265,12 +264,14 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
}
|
|
|
|
|
|
tool_responses.append(tool_response)
|
|
|
- prompt_messages = self._organize_assistant_message(
|
|
|
- tool_call_id=tool_call_id,
|
|
|
- tool_call_name=tool_call_name,
|
|
|
- tool_response=tool_response['tool_response'],
|
|
|
- prompt_messages=prompt_messages,
|
|
|
- )
|
|
|
+ if tool_response['tool_response'] is not None:
|
|
|
+ self._current_thoughts.append(
|
|
|
+ ToolPromptMessage(
|
|
|
+ content=tool_response['tool_response'],
|
|
|
+ tool_call_id=tool_call_id,
|
|
|
+ name=tool_call_name,
|
|
|
+ )
|
|
|
+ )
|
|
|
|
|
|
if len(tool_responses) > 0:
|
|
|
# save agent thought
|
|
@@ -300,8 +301,6 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
|
|
|
iteration_step += 1
|
|
|
|
|
|
- prompt_messages = self._clear_user_prompt_image_messages(prompt_messages)
|
|
|
-
|
|
|
self.update_db_variables(self.variables_pool, self.db_variables_pool)
|
|
|
# publish end event
|
|
|
self.queue_manager.publish(QueueMessageEndEvent(llm_result=LLMResult(
|
|
@@ -393,24 +392,6 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
|
|
|
return prompt_messages
|
|
|
|
|
|
- def _organize_assistant_message(self, tool_call_id: str = None, tool_call_name: str = None, tool_response: str = None,
|
|
|
- prompt_messages: list[PromptMessage] = None) -> list[PromptMessage]:
|
|
|
- """
|
|
|
- Organize assistant message
|
|
|
- """
|
|
|
- prompt_messages = deepcopy(prompt_messages)
|
|
|
-
|
|
|
- if tool_response is not None:
|
|
|
- prompt_messages.append(
|
|
|
- ToolPromptMessage(
|
|
|
- content=tool_response,
|
|
|
- tool_call_id=tool_call_id,
|
|
|
- name=tool_call_name,
|
|
|
- )
|
|
|
- )
|
|
|
-
|
|
|
- return prompt_messages
|
|
|
-
|
|
|
def _clear_user_prompt_image_messages(self, prompt_messages: list[PromptMessage]) -> list[PromptMessage]:
|
|
|
"""
|
|
|
As for now, gpt supports both fc and vision at the first iteration.
|
|
@@ -428,4 +409,26 @@ class FunctionCallAgentRunner(BaseAgentRunner):
|
|
|
for content in prompt_message.content
|
|
|
])
|
|
|
|
|
|
- return prompt_messages
|
|
|
+ return prompt_messages
|
|
|
+
|
|
|
+ def _organize_prompt_messages(self):
|
|
|
+ prompt_template = self.app_config.prompt_template.simple_prompt_template or ''
|
|
|
+ self.history_prompt_messages = self._init_system_message(prompt_template, self.history_prompt_messages)
|
|
|
+ query_prompt_messages = self._organize_user_query(self.query, [])
|
|
|
+
|
|
|
+ self.history_prompt_messages = AgentHistoryPromptTransform(
|
|
|
+ model_config=self.model_config,
|
|
|
+ prompt_messages=[*query_prompt_messages, *self._current_thoughts],
|
|
|
+ history_messages=self.history_prompt_messages,
|
|
|
+ memory=self.memory
|
|
|
+ ).get_prompt()
|
|
|
+
|
|
|
+ prompt_messages = [
|
|
|
+ *self.history_prompt_messages,
|
|
|
+ *query_prompt_messages,
|
|
|
+ *self._current_thoughts
|
|
|
+ ]
|
|
|
+ if len(self._current_thoughts) != 0:
|
|
|
+ # clear messages after the first iteration
|
|
|
+ prompt_messages = self._clear_user_prompt_image_messages(prompt_messages)
|
|
|
+ return prompt_messages
|