diff options
Diffstat (limited to 'autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py')
-rw-r--r-- | autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py b/autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py new file mode 100644 index 000000000..907a9717b --- /dev/null +++ b/autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py @@ -0,0 +1,150 @@ +import logging + +from autogpt.core.configuration import SystemConfiguration, UserConfigurable +from autogpt.core.prompting import PromptStrategy +from autogpt.core.prompting.schema import ChatPrompt, LanguageModelClassification +from autogpt.core.prompting.utils import json_loads +from autogpt.core.resource.model_providers import ( + AssistantChatMessage, + ChatMessage, + CompletionModelFunction, +) +from autogpt.core.utils.json_schema import JSONSchema + +logger = logging.getLogger(__name__) + + +class NameAndGoalsConfiguration(SystemConfiguration): + model_classification: LanguageModelClassification = UserConfigurable() + system_prompt: str = UserConfigurable() + user_prompt_template: str = UserConfigurable() + create_agent_function: dict = UserConfigurable() + + +class NameAndGoals(PromptStrategy): + DEFAULT_SYSTEM_PROMPT = ( + "Your job is to respond to a user-defined task, given in triple quotes, by " + "invoking the `create_agent` function to generate an autonomous agent to " + "complete the task. " + "You should supply a role-based name for the agent, " + "an informative description for what the agent does, and " + "1 to 5 goals that are optimally aligned with the successful completion of " + "its assigned task.\n" + "\n" + "Example Input:\n" + '"""Help me with marketing my business"""\n\n' + "Example Function Call:\n" + "create_agent(name='CMOGPT', " + "description='A professional digital marketer AI that assists Solopreneurs in " + "growing their businesses by providing world-class expertise in solving " + "marketing problems for SaaS, content products, agencies, and more.', " + "goals=['Engage in effective problem-solving, prioritization, planning, and " + "supporting execution to address your marketing needs as your virtual Chief " + "Marketing Officer.', 'Provide specific, actionable, and concise advice to " + "help you make informed decisions without the use of platitudes or overly " + "wordy explanations.', 'Identify and prioritize quick wins and cost-effective " + "campaigns that maximize results with minimal time and budget investment.', " + "'Proactively take the lead in guiding you and offering suggestions when faced " + "with unclear information or uncertainty to ensure your marketing strategy " + "remains on track.'])" + ) + + DEFAULT_USER_PROMPT_TEMPLATE = '"""{user_objective}"""' + + DEFAULT_CREATE_AGENT_FUNCTION = CompletionModelFunction( + name="create_agent", + description="Create a new autonomous AI agent to complete a given task.", + parameters={ + "agent_name": JSONSchema( + type=JSONSchema.Type.STRING, + description="A short role-based name for an autonomous agent.", + ), + "agent_role": JSONSchema( + type=JSONSchema.Type.STRING, + description=( + "An informative one sentence description of what the AI agent does" + ), + ), + "agent_goals": JSONSchema( + type=JSONSchema.Type.ARRAY, + minItems=1, + maxItems=5, + items=JSONSchema( + type=JSONSchema.Type.STRING, + ), + description=( + "One to five highly effective goals that are optimally aligned " + "with the completion of a specific task. " + "The number and complexity of the goals should correspond to the " + "complexity of the agent's primary objective." + ), + ), + }, + ) + + default_configuration: NameAndGoalsConfiguration = NameAndGoalsConfiguration( + model_classification=LanguageModelClassification.SMART_MODEL, + system_prompt=DEFAULT_SYSTEM_PROMPT, + user_prompt_template=DEFAULT_USER_PROMPT_TEMPLATE, + create_agent_function=DEFAULT_CREATE_AGENT_FUNCTION.schema, + ) + + def __init__( + self, + model_classification: LanguageModelClassification, + system_prompt: str, + user_prompt_template: str, + create_agent_function: dict, + ): + self._model_classification = model_classification + self._system_prompt_message = system_prompt + self._user_prompt_template = user_prompt_template + self._create_agent_function = CompletionModelFunction.parse( + create_agent_function + ) + + @property + def model_classification(self) -> LanguageModelClassification: + return self._model_classification + + def build_prompt(self, user_objective: str = "", **kwargs) -> ChatPrompt: + system_message = ChatMessage.system(self._system_prompt_message) + user_message = ChatMessage.user( + self._user_prompt_template.format( + user_objective=user_objective, + ) + ) + prompt = ChatPrompt( + messages=[system_message, user_message], + functions=[self._create_agent_function], + # TODO + tokens_used=0, + ) + return prompt + + def parse_response_content( + self, + response_content: AssistantChatMessage, + ) -> dict: + """Parse the actual text response from the objective model. + + Args: + response_content: The raw response content from the objective model. + + Returns: + The parsed response. + + """ + try: + if not response_content.tool_calls: + raise ValueError( + f"LLM did not call {self._create_agent_function} function; " + "agent profile creation failed" + ) + parsed_response = json_loads( + response_content.tool_calls[0].function.arguments + ) + except KeyError: + logger.debug(f"Failed to parse this response content: {response_content}") + raise + return parsed_response |