aboutsummaryrefslogtreecommitdiff
path: root/autogpt/llm/chat.py
diff options
context:
space:
mode:
Diffstat (limited to 'autogpt/llm/chat.py')
-rw-r--r--autogpt/llm/chat.py203
1 files changed, 0 insertions, 203 deletions
diff --git a/autogpt/llm/chat.py b/autogpt/llm/chat.py
deleted file mode 100644
index 4364cb1d8..000000000
--- a/autogpt/llm/chat.py
+++ /dev/null
@@ -1,203 +0,0 @@
-from __future__ import annotations
-
-import time
-from typing import TYPE_CHECKING
-
-if TYPE_CHECKING:
- from autogpt.agent.agent import Agent
-
-from autogpt.config import Config
-from autogpt.llm.api_manager import ApiManager
-from autogpt.llm.base import ChatSequence, Message
-from autogpt.llm.providers.openai import (
- count_openai_functions_tokens,
- get_openai_command_specs,
-)
-from autogpt.llm.utils import count_message_tokens, create_chat_completion
-from autogpt.logs import CURRENT_CONTEXT_FILE_NAME, logger
-
-
-# TODO: Change debug from hardcode to argument
-def chat_with_ai(
- config: Config,
- agent: Agent,
- system_prompt: str,
- triggering_prompt: str,
- token_limit: int,
- model: str | None = None,
-):
- """
- Interact with the OpenAI API, sending the prompt, user input,
- message history, and permanent memory.
-
- Args:
- config (Config): The config to use.
- agent (Agent): The agent to use.
- system_prompt (str): The prompt explaining the rules to the AI.
- triggering_prompt (str): The input from the user.
- token_limit (int): The maximum number of tokens allowed in the API call.
- model (str, optional): The model to use. By default, the config.smart_llm will be used.
-
- Returns:
- str: The AI's response.
- """
- if model is None:
- model = config.smart_llm
-
- # Reserve 1000 tokens for the response
- logger.debug(f"Token limit: {token_limit}")
- send_token_limit = token_limit - 1000
-
- # if len(agent.history) == 0:
- # relevant_memory = ""
- # else:
- # recent_history = agent.history[-5:]
- # shuffle(recent_history)
- # relevant_memories = agent.memory.get_relevant(
- # str(recent_history), 5
- # )
- # if relevant_memories:
- # shuffle(relevant_memories)
- # relevant_memory = str(relevant_memories)
- # logger.debug(f"Memory Stats: {agent.memory.get_stats()}")
- relevant_memory = []
-
- message_sequence = ChatSequence.for_model(
- model,
- [
- Message("system", system_prompt),
- Message("system", f"The current time and date is {time.strftime('%c')}"),
- # Message(
- # "system",
- # f"This reminds you of these events from your past:\n{relevant_memory}\n\n",
- # ),
- ],
- )
-
- # Count the currently used tokens
- current_tokens_used = message_sequence.token_length
- insertion_index = len(message_sequence)
-
- # Account for tokens used by OpenAI functions
- openai_functions = None
- if agent.config.openai_functions:
- openai_functions = get_openai_command_specs(agent.command_registry)
- functions_tlength = count_openai_functions_tokens(openai_functions, model)
- current_tokens_used += functions_tlength
- logger.debug(f"OpenAI Functions take up {functions_tlength} tokens in API call")
-
- # Account for user input (appended later)
- user_input_msg = Message("user", triggering_prompt)
- current_tokens_used += count_message_tokens(user_input_msg, model)
-
- current_tokens_used += agent.history.max_summary_tlength # Reserve space
- current_tokens_used += 500 # Reserve space for the openai functions TODO improve
-
- # Add historical Messages until the token limit is reached
- # or there are no more messages to add.
- for cycle in reversed(list(agent.history.per_cycle())):
- messages_to_add = [msg for msg in cycle if msg is not None]
- tokens_to_add = count_message_tokens(messages_to_add, model)
- if current_tokens_used + tokens_to_add > send_token_limit:
- break
-
- # Add the most recent message to the start of the chain,
- # after the system prompts.
- message_sequence.insert(insertion_index, *messages_to_add)
- current_tokens_used += tokens_to_add
-
- # Update & add summary of trimmed messages
- if len(agent.history) > 0:
- new_summary_message, trimmed_messages = agent.history.trim_messages(
- current_message_chain=list(message_sequence), config=agent.config
- )
- tokens_to_add = count_message_tokens(new_summary_message, model)
- message_sequence.insert(insertion_index, new_summary_message)
- current_tokens_used += tokens_to_add - agent.history.max_summary_tlength
-
- # FIXME: uncomment when memory is back in use
- # memory_store = get_memory(config)
- # for _, ai_msg, result_msg in agent.history.per_cycle(trimmed_messages):
- # memory_to_add = MemoryItem.from_ai_action(ai_msg, result_msg)
- # logger.debug(f"Storing the following memory:\n{memory_to_add.dump()}")
- # memory_store.add(memory_to_add)
-
- api_manager = ApiManager()
- # inform the AI about its remaining budget (if it has one)
- if api_manager.get_total_budget() > 0.0:
- remaining_budget = api_manager.get_total_budget() - api_manager.get_total_cost()
- if remaining_budget < 0:
- remaining_budget = 0
- budget_message = f"Your remaining API budget is ${remaining_budget:.3f}" + (
- " BUDGET EXCEEDED! SHUT DOWN!\n\n"
- if remaining_budget == 0
- else " Budget very nearly exceeded! Shut down gracefully!\n\n"
- if remaining_budget < 0.005
- else " Budget nearly exceeded. Finish up.\n\n"
- if remaining_budget < 0.01
- else "\n\n"
- )
- logger.debug(budget_message)
- message_sequence.add("system", budget_message)
- current_tokens_used += count_message_tokens(message_sequence[-1], model)
-
- # Append user input, the length of this is accounted for above
- message_sequence.append(user_input_msg)
-
- plugin_count = len(config.plugins)
- for i, plugin in enumerate(config.plugins):
- if not plugin.can_handle_on_planning():
- continue
- plugin_response = plugin.on_planning(
- agent.ai_config.prompt_generator, message_sequence.raw()
- )
- if not plugin_response or plugin_response == "":
- continue
- tokens_to_add = count_message_tokens(Message("system", plugin_response), model)
- if current_tokens_used + tokens_to_add > send_token_limit:
- logger.debug(f"Plugin response too long, skipping: {plugin_response}")
- logger.debug(f"Plugins remaining at stop: {plugin_count - i}")
- break
- message_sequence.add("system", plugin_response)
- current_tokens_used += tokens_to_add
-
- # Calculate remaining tokens
- tokens_remaining = token_limit - current_tokens_used
- # assert tokens_remaining >= 0, "Tokens remaining is negative.
- # This should never happen, please submit a bug report at
- # https://www.github.com/Torantulino/Auto-GPT"
-
- # Debug print the current context
- logger.debug(f"Token limit: {token_limit}")
- logger.debug(f"Send Token Count: {current_tokens_used}")
- logger.debug(f"Tokens remaining for response: {tokens_remaining}")
- logger.debug("------------ CONTEXT SENT TO AI ---------------")
- for message in message_sequence:
- # Skip printing the prompt
- if message.role == "system" and message.content == system_prompt:
- continue
- logger.debug(f"{message.role.capitalize()}: {message.content}")
- logger.debug("")
- logger.debug("----------- END OF CONTEXT ----------------")
- agent.log_cycle_handler.log_cycle(
- agent.ai_name,
- agent.created_at,
- agent.cycle_count,
- message_sequence.raw(),
- CURRENT_CONTEXT_FILE_NAME,
- )
-
- # TODO: use a model defined elsewhere, so that model can contain
- # temperature and other settings we care about
- assistant_reply = create_chat_completion(
- prompt=message_sequence,
- config=agent.config,
- functions=openai_functions,
- max_tokens=tokens_remaining,
- )
-
- # Update full message history
- agent.history.append(user_input_msg)
- agent.history.add("assistant", assistant_reply.content, "ai_response")
-
- return assistant_reply