cot_completion_agent_runner.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import json
  2. from typing import Optional
  3. from core.agent.cot_agent_runner import CotAgentRunner
  4. from core.model_runtime.entities.message_entities import (
  5. AssistantPromptMessage,
  6. PromptMessage,
  7. TextPromptMessageContent,
  8. UserPromptMessage,
  9. )
  10. from core.model_runtime.utils.encoders import jsonable_encoder
  11. class CotCompletionAgentRunner(CotAgentRunner):
  12. def _organize_instruction_prompt(self) -> str:
  13. """
  14. Organize instruction prompt
  15. """
  16. if self.app_config.agent is None:
  17. raise ValueError("Agent configuration is not set")
  18. prompt_entity = self.app_config.agent.prompt
  19. if prompt_entity is None:
  20. raise ValueError("prompt entity is not set")
  21. first_prompt = prompt_entity.first_prompt
  22. system_prompt = (
  23. first_prompt.replace("{{instruction}}", self._instruction)
  24. .replace("{{tools}}", json.dumps(jsonable_encoder(self._prompt_messages_tools)))
  25. .replace("{{tool_names}}", ", ".join([tool.name for tool in self._prompt_messages_tools]))
  26. )
  27. return system_prompt
  28. def _organize_historic_prompt(self, current_session_messages: Optional[list[PromptMessage]] = None) -> str:
  29. """
  30. Organize historic prompt
  31. """
  32. historic_prompt_messages = self._organize_historic_prompt_messages(current_session_messages)
  33. historic_prompt = ""
  34. for message in historic_prompt_messages:
  35. if isinstance(message, UserPromptMessage):
  36. historic_prompt += f"Question: {message.content}\n\n"
  37. elif isinstance(message, AssistantPromptMessage):
  38. if isinstance(message.content, str):
  39. historic_prompt += message.content + "\n\n"
  40. elif isinstance(message.content, list):
  41. for content in message.content:
  42. if not isinstance(content, TextPromptMessageContent):
  43. continue
  44. historic_prompt += content.data
  45. return historic_prompt
  46. def _organize_prompt_messages(self) -> list[PromptMessage]:
  47. """
  48. Organize prompt messages
  49. """
  50. # organize system prompt
  51. system_prompt = self._organize_instruction_prompt()
  52. # organize historic prompt messages
  53. historic_prompt = self._organize_historic_prompt()
  54. # organize current assistant messages
  55. agent_scratchpad = self._agent_scratchpad
  56. assistant_prompt = ""
  57. for unit in agent_scratchpad or []:
  58. if unit.is_final():
  59. assistant_prompt += f"Final Answer: {unit.agent_response}"
  60. else:
  61. assistant_prompt += f"Thought: {unit.thought}\n\n"
  62. if unit.action_str:
  63. assistant_prompt += f"Action: {unit.action_str}\n\n"
  64. if unit.observation:
  65. assistant_prompt += f"Observation: {unit.observation}\n\n"
  66. # query messages
  67. query_prompt = f"Question: {self._query}"
  68. # join all messages
  69. prompt = (
  70. system_prompt.replace("{{historic_messages}}", historic_prompt)
  71. .replace("{{agent_scratchpad}}", assistant_prompt)
  72. .replace("{{query}}", query_prompt)
  73. )
  74. return [UserPromptMessage(content=prompt)]