diff --git a/agentgpt_pip/README.md b/agentgpt_pip/README.md new file mode 100644 index 0000000000..26ee156f14 --- /dev/null +++ b/agentgpt_pip/README.md @@ -0,0 +1,48 @@ +# AgentGPT Pip Package + +This directory contains the pip package for AgentGPT. The package provides tools and utilities for using AgentGPT for custom code. + +## Installation + +To install the AgentGPT pip package, run the following command: + +```bash +pip install agentgpt +``` + +## Usage + +After installing the package, you can use the argument tools provided by AgentGPT. Below are some examples of how to use the package. + +### Example 1: Running a Task + +```python +from agentgpt import main + +main(["--task", "example_task"]) +``` + +### Example 2: Using Argument Tools + +```python +from agentgpt.arg_tools import parse_arguments, handle_arguments + +args = parse_arguments(["--task", "example_task", "--config", "config.yaml"]) +handle_arguments(args) +``` + +## Contributing + +We welcome contributions to the AgentGPT pip package. To contribute, please follow these steps: + +1. Fork the repository. +2. Create a new branch for your feature or bugfix. +3. Make your changes and commit them with a descriptive message. +4. Push your changes to your fork. +5. Create a pull request to the main repository. + +Please ensure that your code adheres to the project's coding standards and passes all tests. + +## License + +This project is licensed under the MIT License. See the [LICENSE](../LICENSE) file for details. diff --git a/agentgpt_pip/agentgpt/__init__.py b/agentgpt_pip/agentgpt/__init__.py new file mode 100644 index 0000000000..577b4796d9 --- /dev/null +++ b/agentgpt_pip/agentgpt/__init__.py @@ -0,0 +1,19 @@ +""" +AgentGPT package initialization. +""" + +import argparse +import sys + +def main(): + parser = argparse.ArgumentParser(description="AgentGPT CLI") + parser.add_argument("--task", type=str, help="Task to perform") + args = parser.parse_args() + + if args.task: + print(f"Performing task: {args.task}") + else: + print("No task provided") + +if __name__ == "__main__": + main() diff --git a/agentgpt_pip/agentgpt/arg_tools.py b/agentgpt_pip/agentgpt/arg_tools.py new file mode 100644 index 0000000000..9dc2fbc043 --- /dev/null +++ b/agentgpt_pip/agentgpt/arg_tools.py @@ -0,0 +1,33 @@ +""" +Argument tools for custom code in AgentGPT. +""" + +import argparse + +def parse_arguments(): + """ + Parse command-line arguments. + + Returns: + argparse.Namespace: Parsed arguments. + """ + parser = argparse.ArgumentParser(description="AgentGPT Argument Tools") + parser.add_argument("--task", type=str, help="Task to perform") + parser.add_argument("--config", type=str, help="Path to configuration file") + return parser.parse_args() + +def handle_arguments(args): + """ + Handle parsed arguments. + + Args: + args (argparse.Namespace): Parsed arguments. + """ + if args.task: + print(f"Performing task: {args.task}") + if args.config: + print(f"Using configuration file: {args.config}") + +if __name__ == "__main__": + args = parse_arguments() + handle_arguments(args) diff --git a/agentgpt_pip/setup.py b/agentgpt_pip/setup.py new file mode 100644 index 0000000000..e77662c8b2 --- /dev/null +++ b/agentgpt_pip/setup.py @@ -0,0 +1,35 @@ +from setuptools import setup, find_packages + +setup( + name="agentgpt", + version="0.1.0", + packages=find_packages(), + install_requires=[ + "fastapi>=0.98.0", + "boto3>=1.28.51", + "uvicorn[standard]>=0.22.0", + "pydantic[dotenv]<2.0", + "ujson>=5.8.0", + "sqlalchemy[mypy,asyncio]>=2.0.21", + "aiomysql>=0.1.1", + "mysqlclient>=2.2.0", + "sentry-sdk>=1.31.0", + "loguru>=0.7.2", + "aiokafka>=0.8.1", + "requests>=2.31.0", + "langchain>=0.0.295", + "openai>=0.28.0", + "wikipedia>=1.4.0", + "replicate>=0.8.4", + "lanarky>=0.7.15", + "tiktoken>=0.5.1", + "grpcio>=1.58.0", + "pinecone-client>=2.2.4", + "python-multipart>=0.0.6", + "aws-secretsmanager-caching>=1.1.1.5", + "botocore>=1.31.51", + "stripe>=5.5.0", + "cryptography>=41.0.4", + "httpx>=0.25.0", + ], +) diff --git a/agentgpt_pip/tests/test_arg_tools.py b/agentgpt_pip/tests/test_arg_tools.py new file mode 100644 index 0000000000..b11cf028e8 --- /dev/null +++ b/agentgpt_pip/tests/test_arg_tools.py @@ -0,0 +1,34 @@ +import unittest +from agentgpt.arg_tools import parse_arguments, handle_arguments + +class TestArgTools(unittest.TestCase): + + def test_parse_arguments_with_task(self): + args = parse_arguments(['--task', 'test_task']) + self.assertEqual(args.task, 'test_task') + self.assertIsNone(args.config) + + def test_parse_arguments_with_config(self): + args = parse_arguments(['--config', 'test_config']) + self.assertEqual(args.config, 'test_config') + self.assertIsNone(args.task) + + def test_handle_arguments_with_task(self): + args = parse_arguments(['--task', 'test_task']) + with self.assertLogs(level='INFO') as log: + handle_arguments(args) + self.assertIn('Performing task: test_task', log.output) + + def test_handle_arguments_with_config(self): + args = parse_arguments(['--config', 'test_config']) + with self.assertLogs(level='INFO') as log: + handle_arguments(args) + self.assertIn('Using configuration file: test_config', log.output) + + def test_parse_arguments_with_no_args(self): + args = parse_arguments([]) + self.assertIsNone(args.task) + self.assertIsNone(args.config) + +if __name__ == '__main__': + unittest.main() diff --git a/next/src/components/console/AgentControls.tsx b/next/src/components/console/AgentControls.tsx index a70cbb9da4..2020cb0b3a 100644 --- a/next/src/components/console/AgentControls.tsx +++ b/next/src/components/console/AgentControls.tsx @@ -1,10 +1,11 @@ import clsx from "clsx"; import React from "react"; -import { FaPause, FaPlay, FaStop, FaUndo } from "react-icons/fa"; +import { FaPause, FaPlay, FaStop, FaUndo, FaTrash } from "react-icons/fa"; import { ImSpinner2 } from "react-icons/im"; import type { AgentLifecycle } from "../../services/agent/agent-run-model"; import Button from "../Button"; +import { AgentApi } from "../../services/agent/agent-api"; type AgentControlsProps = { disablePlay: boolean; @@ -12,14 +13,21 @@ type AgentControlsProps = { handlePlay: () => void; handlePause: () => void; handleStop: () => void; + agentApi: AgentApi; }; + const AgentControls = ({ lifecycle, disablePlay, handlePlay, handlePause, handleStop, + agentApi, }: AgentControlsProps) => { + const handleDelete = async () => { + await agentApi.deleteAgent(); + }; + return (
+
); }; diff --git a/next/src/hooks/useAgent.ts b/next/src/hooks/useAgent.ts index 2917725a88..d534219930 100644 --- a/next/src/hooks/useAgent.ts +++ b/next/src/hooks/useAgent.ts @@ -8,6 +8,7 @@ import { api } from "../utils/api"; export type AgentUtils = { createAgent: (data: CreateAgentProps) => Promise; saveAgent: (data: SaveAgentProps) => void; + deleteAgent: (id: string) => void; }; export function useAgent(): AgentUtils { @@ -33,8 +34,18 @@ export function useAgent(): AgentUtils { if (status === "authenticated") saveMutation.mutate(data); }; + const deleteMutation = api.agent.deleteById.useMutation({ + onSuccess: (id: string) => { + utils.agent.getAll.setData(void 0, (oldData) => oldData?.filter(agent => agent.id !== id)); + }, + }); + const deleteAgent = (id: string) => { + if (status === "authenticated") deleteMutation.mutate(id); + }; + return { createAgent, saveAgent, + deleteAgent, }; } diff --git a/next/src/services/agent/agent-api.ts b/next/src/services/agent/agent-api.ts index 5f8f80ef22..2d2420014d 100644 --- a/next/src/services/agent/agent-api.ts +++ b/next/src/services/agent/agent-api.ts @@ -38,6 +38,12 @@ export class AgentApi { }); } + async deleteAgent(): Promise { + if (!this.agentId) return; + this.props.agentUtils.deleteAgent(this.agentId); + this.agentId = undefined; + } + async getInitialTasks(): Promise { return (await this.post<{ newTasks: string[] }>("/api/agent/start", {})).newTasks; } diff --git a/tkinter_app.py b/tkinter_app.py new file mode 100644 index 0000000000..33a098921a --- /dev/null +++ b/tkinter_app.py @@ -0,0 +1,19 @@ +import tkinter as tk + +def update_label(): + label.config(text="Button Clicked!") + +# Create the main window +root = tk.Tk() +root.title("Tkinter App") + +# Create a label +label = tk.Label(root, text="Hello, Tkinter!") +label.pack(pady=10) + +# Create a button +button = tk.Button(root, text="Click Me", command=update_label) +button.pack(pady=10) + +# Run the Tkinter main loop +root.mainloop()