cot_chat_agent_runner.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import json
  2. from core.agent.cot_agent_runner import CotAgentRunner
  3. from core.file import file_manager
  4. from core.model_runtime.entities import (
  5. AssistantPromptMessage,
  6. PromptMessage,
  7. SystemPromptMessage,
  8. TextPromptMessageContent,
  9. UserPromptMessage,
  10. )
  11. from core.model_runtime.entities.message_entities import ImagePromptMessageContent, PromptMessageContentUnionTypes
  12. from core.model_runtime.utils.encoders import jsonable_encoder
  13. class CotChatAgentRunner(CotAgentRunner):
  14. def _organize_system_prompt(self) -> SystemPromptMessage:
  15. """
  16. Organize system prompt
  17. """
  18. assert self.app_config.agent
  19. assert self.app_config.agent.prompt
  20. prompt_entity = self.app_config.agent.prompt
  21. if not prompt_entity:
  22. raise ValueError("Agent prompt configuration is not set")
  23. first_prompt = prompt_entity.first_prompt
  24. system_prompt = (
  25. first_prompt.replace("{{instruction}}", self._instruction)
  26. .replace("{{tools}}", json.dumps(jsonable_encoder(self._prompt_messages_tools)))
  27. .replace("{{tool_names}}", ", ".join([tool.name for tool in self._prompt_messages_tools]))
  28. )
  29. return SystemPromptMessage(content=system_prompt)
  30. def _organize_user_query(self, query, prompt_messages: list[PromptMessage]) -> list[PromptMessage]:
  31. """
  32. Organize user query
  33. """
  34. if self.files:
  35. # get image detail config
  36. image_detail_config = (
  37. self.application_generate_entity.file_upload_config.image_config.detail
  38. if (
  39. self.application_generate_entity.file_upload_config
  40. and self.application_generate_entity.file_upload_config.image_config
  41. )
  42. else None
  43. )
  44. image_detail_config = image_detail_config or ImagePromptMessageContent.DETAIL.LOW
  45. prompt_message_contents: list[PromptMessageContentUnionTypes] = []
  46. for file in self.files:
  47. prompt_message_contents.append(
  48. file_manager.to_prompt_message_content(
  49. file,
  50. image_detail_config=image_detail_config,
  51. )
  52. )
  53. prompt_message_contents.append(TextPromptMessageContent(data=query))
  54. prompt_messages.append(UserPromptMessage(content=prompt_message_contents))
  55. else:
  56. prompt_messages.append(UserPromptMessage(content=query))
  57. return prompt_messages
  58. def _organize_prompt_messages(self) -> list[PromptMessage]:
  59. """
  60. Organize
  61. """
  62. # organize system prompt
  63. system_message = self._organize_system_prompt()
  64. # organize current assistant messages
  65. agent_scratchpad = self._agent_scratchpad
  66. if not agent_scratchpad:
  67. assistant_messages = []
  68. else:
  69. assistant_message = AssistantPromptMessage(content="")
  70. assistant_message.content = "" # FIXME: type check tell mypy that assistant_message.content is str
  71. for unit in agent_scratchpad:
  72. if unit.is_final():
  73. assert isinstance(assistant_message.content, str)
  74. assistant_message.content += f"Final Answer: {unit.agent_response}"
  75. else:
  76. assert isinstance(assistant_message.content, str)
  77. assistant_message.content += f"Thought: {unit.thought}\n\n"
  78. if unit.action_str:
  79. assistant_message.content += f"Action: {unit.action_str}\n\n"
  80. if unit.observation:
  81. assistant_message.content += f"Observation: {unit.observation}\n\n"
  82. assistant_messages = [assistant_message]
  83. # query messages
  84. query_messages = self._organize_user_query(self._query, [])
  85. if assistant_messages:
  86. # organize historic prompt messages
  87. historic_messages = self._organize_historic_prompt_messages(
  88. [system_message, *query_messages, *assistant_messages, UserPromptMessage(content="continue")]
  89. )
  90. messages = [
  91. system_message,
  92. *historic_messages,
  93. *query_messages,
  94. *assistant_messages,
  95. UserPromptMessage(content="continue"),
  96. ]
  97. else:
  98. # organize historic prompt messages
  99. historic_messages = self._organize_historic_prompt_messages([system_message, *query_messages])
  100. messages = [system_message, *historic_messages, *query_messages]
  101. # join all messages
  102. return messages