aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Reinier van der Leer <pwuts@agpt.co> 2024-05-04 20:55:42 +0200
committerGravatar Reinier van der Leer <pwuts@agpt.co> 2024-05-04 20:55:42 +0200
commit9bac6f4ce2a2eb846ec1a5c897db9ba6eb65c302 (patch)
tree215964df31b5ea01172fee9b2e438fecd4714e79
parentfeat(agent/core): Add Anthropic Claude 3 support (#7085) (diff)
downloadAuto-GPT-9bac6f4ce2a2eb846ec1a5c897db9ba6eb65c302.tar.gz
Auto-GPT-9bac6f4ce2a2eb846ec1a5c897db9ba6eb65c302.tar.bz2
Auto-GPT-9bac6f4ce2a2eb846ec1a5c897db9ba6eb65c302.zip
feat(agent/scripts): Add git_log_to_release_notes.py
This script asks the user to choose two git refs, and then writes release notes for the diff between those two refs.
-rwxr-xr-xautogpts/autogpt/scripts/git_log_to_release_notes.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/autogpts/autogpt/scripts/git_log_to_release_notes.py b/autogpts/autogpt/scripts/git_log_to_release_notes.py
new file mode 100755
index 000000000..123a8c6c4
--- /dev/null
+++ b/autogpts/autogpt/scripts/git_log_to_release_notes.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python3
+
+import logging
+from pathlib import Path
+from typing import Optional
+
+import click
+from git import Repo, TagReference
+
+from autogpt.core.resource.model_providers import ChatMessage, MultiProvider
+from autogpt.core.resource.model_providers.anthropic import AnthropicModelName
+from autogpt.core.resource.model_providers.openai import OpenAIModelName
+from autogpt.core.runner.client_lib.utils import coroutine
+
+
+@click.command()
+@click.option(
+ "--repo-path",
+ type=click.Path(file_okay=False, exists=True),
+ help="Path to the git repository",
+)
+@coroutine
+async def generate_release_notes(repo_path: Optional[Path] = None):
+ logger = logging.getLogger(generate_release_notes.name)
+
+ repo = Repo(repo_path, search_parent_directories=True)
+ tags = list(repo.tags)
+ if not tags:
+ click.echo("No tags found in the repository.")
+ return
+
+ click.echo("Available tags:")
+ for index, tag in enumerate(tags):
+ click.echo(f"{index + 1}: {tag.name}")
+
+ last_release_index = (
+ click.prompt("Enter the number for the last release tag", type=int) - 1
+ )
+ if last_release_index >= len(tags) or last_release_index < 0:
+ click.echo("Invalid tag number entered.")
+ return
+ last_release_tag: TagReference = tags[last_release_index]
+
+ new_release_ref = click.prompt(
+ "Enter the name of the release branch or git ref",
+ default=repo.active_branch.name,
+ )
+ try:
+ new_release_ref = repo.heads[new_release_ref].name
+ except IndexError:
+ try:
+ new_release_ref = repo.tags[new_release_ref].name
+ except IndexError:
+ new_release_ref = repo.commit(new_release_ref).hexsha
+ logger.debug(f"Selected release ref: {new_release_ref}")
+
+ git_log = repo.git.log(
+ f"{last_release_tag.name}...{new_release_ref}",
+ "autogpts/autogpt/",
+ no_merges=True,
+ follow=True,
+ )
+ logger.debug(f"-------------- GIT LOG --------------\n\n{git_log}\n")
+
+ model_provider = MultiProvider()
+ chat_messages = [
+ ChatMessage.system(SYSTEM_PROMPT),
+ ChatMessage.user(content=git_log),
+ ]
+ click.echo("Writing release notes ...")
+ completion = await model_provider.create_chat_completion(
+ model_prompt=chat_messages,
+ model_name=AnthropicModelName.CLAUDE3_OPUS_v1,
+ # model_name=OpenAIModelName.GPT4_v4,
+ )
+
+ click.echo("-------------- LLM RESPONSE --------------\n")
+ click.echo(completion.response.content)
+
+
+EXAMPLE_RELEASE_NOTES = """
+First some important notes w.r.t. using the application:
+* `run.sh` has been renamed to `autogpt.sh`
+* The project has been restructured. The AutoGPT Agent is now located in `autogpts/autogpt`.
+* The application no longer uses a single workspace for all tasks. Instead, every task that you run the agent on creates a new workspace folder. See the [usage guide](https://docs.agpt.co/autogpt/usage/#workspace) for more information.
+
+## New features ✨
+
+* **Agent Protocol 🔌**
+ Our agent now works with the [Agent Protocol](/#-agent-protocol), a REST API that allows creating tasks and executing the agent's step-by-step process. This allows integration with other applications, and we also use it to connect to the agent through the UI.
+* **UI 💻**
+ With the aforementioned Agent Protocol integration comes the benefit of using our own open-source Agent UI. Easily create, use, and chat with multiple agents from one interface.
+ When starting the application through the project's new [CLI](/#-cli), it runs with the new frontend by default, with benchmarking capabilities. Running `autogpt.sh serve` in the subproject folder (`autogpts/autogpt`) will also serve the new frontend, but without benchmarking functionality.
+ Running the application the "old-fashioned" way, with the terminal interface (let's call it TTY mode), is still possible with `autogpt.sh run`.
+* **Resuming agents 🔄️**
+ In TTY mode, the application will now save the agent's state when quitting, and allows resuming where you left off at a later time!
+* **GCS and S3 workspace backends 📦**
+ To further support running the application as part of a larger system, Google Cloud Storage and S3 workspace backends were added. Configuration options for this can be found in [`.env.template`](/autogpts/autogpt/.env.template).
+* **Documentation Rewrite 📖**
+ The [documentation](https://docs.agpt.co) has been restructured and mostly rewritten to clarify and simplify the instructions, and also to accommodate the other subprojects that are now in the repo.
+* **New Project CLI 🔧**
+ The project has a new CLI to provide easier usage of all of the components that are now in the repo: different agents, frontend and benchmark. More info can be found [here](/#-cli).
+* **Docker dev build 🐳**
+ In addition to the regular Docker release [images](https://hub.docker.com/r/significantgravitas/auto-gpt/tags) (`latest`, `v0.5.0` in this case), we now also publish a `latest-dev` image that always contains the latest working build from `master`. This allows you to try out the latest bleeding edge version, but be aware that these builds may contain bugs!
+
+## Architecture changes & improvements 👷🏼
+* **PromptStrategy**
+ To make it easier to harness the power of LLMs and use them to fulfil tasks within the application, we adopted the `PromptStrategy` class from `autogpt.core` (AKA re-arch) to encapsulate prompt generation and response parsing throughout the application.
+* **Config modularization**
+ To reduce the complexity of the application's config structure, parts of the monolithic `Config` have been moved into smaller, tightly scoped config objects. Also, the logic for building the configuration from environment variables was decentralized to make it all a lot more maintainable.
+ This is mostly made possible by the `autogpt.core.configuration` module, which was also expanded with a few new features for it. Most notably, the new `from_env` attribute on the `UserConfigurable` field decorator and corresponding logic in `SystemConfiguration.from_env()` and related functions.
+* **Monorepo**
+ As mentioned, the repo has been restructured to accommodate the AutoGPT Agent, Forge, AGBenchmark and the new Frontend.
+ * AutoGPT Agent has been moved to `autogpts/autogpt`
+ * Forge now lives in `autogpts/forge`, and the project's new CLI makes it easy to create new Forge-based agents.
+ * AGBenchmark -> `benchmark`
+ * Frontend -> `frontend`
+
+ See also the [README](/#readme).
+""".lstrip()
+
+
+SYSTEM_PROMPT = f"""
+Please generate release notes based on the user's git log and the example release notes.
+
+Here is an example of what we like our release notes to look and read like:
+---------------------------------------------------------------------------
+{EXAMPLE_RELEASE_NOTES}
+---------------------------------------------------------------------------
+NOTE: These example release notes are not related to the git log that you should write release notes for!
+Do not mention the changes in the example when writing your release notes!
+""".lstrip()
+
+if __name__ == "__main__":
+ import dotenv
+
+ from autogpt.logs.config import configure_logging
+
+ configure_logging(debug=True)
+
+ dotenv.load_dotenv()
+ generate_release_notes()