From 3475aaf3843b5fb798277664dab4d94af711f2ef Mon Sep 17 00:00:00 2001 From: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Date: Wed, 22 May 2024 09:43:15 +0100 Subject: [PATCH] refactor(agent): Remove unused `autogpt` code (#7112) Remove unused `autogpt` code and reorganize its file structure. * Moved: * `autogpt/agent_manager/agent_manager.py` to `autogpt/agents/agent_manager.py`, so the dir `agent_manager` was removed * `dump_prompt` from `autogpt.core.runner.client_lib.logging.helpers` to `forge/llm/prompting/utils.py` * `coroutine` decorator from `autogpt.core.runner.client_lib.utils` to `autogpt/app/utils.py` * Removed within `autogpt`: * Memory-related code from multiple files (not used), including `memory/*` * Memory-related config entries/env vars: `memory_backend`, `memory_index`, `redis_host`, `redis_port`, `redis_password`, `wipe_redis_on_start` * `core` files, from failed re-arch: * `*.md` docs * `core/ability/*` * `core/agent/*` * `core/memory/*` * `core/planning/*` * `core/plugin/*` * `core/workspace/*` * `core/runner/*` (`dump_prompt` and `coroutine` were moved) * Related tests * Updated relevant docs --- autogpts/autogpt/README.md | 2 - .../autogpt/agbenchmark_config/benchmarks.py | 3 +- .../autogpt/agent_factory/configurators.py | 2 - .../autogpt/autogpt/agent_manager/__init__.py | 3 - autogpts/autogpt/autogpt/agents/__init__.py | 2 + autogpts/autogpt/autogpt/agents/agent.py | 2 +- .../agent_manager.py | 0 .../autogpt/app/agent_protocol_server.py | 2 +- autogpts/autogpt/autogpt/app/configurator.py | 20 +- autogpts/autogpt/autogpt/app/main.py | 4 +- autogpts/autogpt/autogpt/app/utils.py | 14 + .../autogpt/core/ARCHITECTURE_NOTES.md | 271 ---- autogpts/autogpt/autogpt/core/README.md | 92 -- autogpts/autogpt/autogpt/core/__init__.py | 0 .../autogpt/autogpt/core/ability/__init__.py | 18 - autogpts/autogpt/autogpt/core/ability/base.py | 88 -- .../autogpt/core/ability/builtins/__init__.py | 12 - .../ability/builtins/create_new_ability.py | 108 -- .../core/ability/builtins/file_operations.py | 171 --- .../ability/builtins/query_language_model.py | 67 - .../autogpt/autogpt/core/ability/schema.py | 30 - .../autogpt/autogpt/core/ability/simple.py | 98 -- .../autogpt/autogpt/core/agent/__init__.py | 9 - autogpts/autogpt/autogpt/core/agent/base.py | 26 - autogpts/autogpt/autogpt/core/agent/simple.py | 398 ----- .../autogpt/autogpt/core/memory/__init__.py | 9 - autogpts/autogpt/autogpt/core/memory/base.py | 13 - .../autogpt/autogpt/core/memory/simple.py | 48 - .../autogpt/autogpt/core/planning/__init__.py | 11 - .../autogpt/autogpt/core/planning/base.py | 54 - .../planning/prompt_strategies/__init__.py | 12 - .../prompt_strategies/initial_plan.py | 204 --- .../prompt_strategies/name_and_goals.py | 146 -- .../prompt_strategies/next_ability.py | 201 --- .../autogpt/autogpt/core/planning/schema.py | 48 - .../autogpt/autogpt/core/planning/simple.py | 188 --- .../autogpt/core/planning/templates.py | 84 - .../autogpt/autogpt/core/plugin/__init__.py | 6 - autogpts/autogpt/autogpt/core/plugin/base.py | 159 -- .../autogpt/autogpt/core/plugin/simple.py | 75 - autogpts/autogpt/autogpt/core/poetry.lock | 1345 ----------------- autogpts/autogpt/autogpt/core/pyproject.toml | 77 - .../autogpt/autogpt/core/runner/__init__.py | 3 - .../autogpt/core/runner/cli_app/__init__.py | 0 .../autogpt/core/runner/cli_app/cli.py | 47 - .../autogpt/core/runner/cli_app/main.py | 74 - .../core/runner/cli_web_app/__init__.py | 0 .../autogpt/core/runner/cli_web_app/cli.py | 58 - .../runner/cli_web_app/server/__init__.py | 0 .../core/runner/cli_web_app/server/api.py | 96 -- .../core/runner/client_lib/__init__.py | 0 .../runner/client_lib/logging/__init__.py | 22 - .../core/runner/client_lib/logging/config.py | 27 - .../core/runner/client_lib/logging/helpers.py | 28 - .../autogpt/core/runner/client_lib/parser.py | 45 - .../core/runner/client_lib/settings.py | 14 - .../client_lib/shared_click_commands.py | 19 - .../autogpt/core/runner/client_lib/utils.py | 62 - .../autogpt/core/workspace/__init__.py | 9 - .../autogpt/autogpt/core/workspace/base.py | 70 - .../autogpt/autogpt/core/workspace/simple.py | 194 --- .../autogpt/autogpt/memory/vector/__init__.py | 156 -- .../autogpt/memory/vector/memory_item.py | 280 ---- .../memory/vector/providers/__init__.py | 7 - .../autogpt/memory/vector/providers/base.py | 78 - .../memory/vector/providers/json_file.py | 91 -- .../memory/vector/providers/no_memory.py | 36 - .../autogpt/autogpt/memory/vector/utils.py | 79 - .../scripts/git_log_to_release_notes.py | 2 +- autogpts/autogpt/tests/memory/__init__.py | 0 .../tests/memory/_test_json_file_memory.py | 126 -- autogpts/autogpt/tests/memory/conftest.py | 17 - autogpts/autogpt/tests/memory/utils.py | 44 - autogpts/forge/forge/__main__.py | 1 - autogpts/forge/forge/config/config.py | 13 - autogpts/forge/forge/llm/prompting/utils.py | 21 + autogpts/forge/forge/logging/config.py | 1 + docs/content/AutoGPT/configuration/options.md | 5 - .../content/challenges/building_challenges.md | 3 +- 79 files changed, 46 insertions(+), 5804 deletions(-) delete mode 100644 autogpts/autogpt/autogpt/agent_manager/__init__.py rename autogpts/autogpt/autogpt/{agent_manager => agents}/agent_manager.py (100%) delete mode 100644 autogpts/autogpt/autogpt/core/ARCHITECTURE_NOTES.md delete mode 100644 autogpts/autogpt/autogpt/core/README.md delete mode 100644 autogpts/autogpt/autogpt/core/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/base.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/builtins/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/builtins/create_new_ability.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/builtins/file_operations.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/builtins/query_language_model.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/schema.py delete mode 100644 autogpts/autogpt/autogpt/core/ability/simple.py delete mode 100644 autogpts/autogpt/autogpt/core/agent/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/agent/base.py delete mode 100644 autogpts/autogpt/autogpt/core/agent/simple.py delete mode 100644 autogpts/autogpt/autogpt/core/memory/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/memory/base.py delete mode 100644 autogpts/autogpt/autogpt/core/memory/simple.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/base.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/prompt_strategies/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/prompt_strategies/initial_plan.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/prompt_strategies/next_ability.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/schema.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/simple.py delete mode 100644 autogpts/autogpt/autogpt/core/planning/templates.py delete mode 100644 autogpts/autogpt/autogpt/core/plugin/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/plugin/base.py delete mode 100644 autogpts/autogpt/autogpt/core/plugin/simple.py delete mode 100644 autogpts/autogpt/autogpt/core/poetry.lock delete mode 100644 autogpts/autogpt/autogpt/core/pyproject.toml delete mode 100644 autogpts/autogpt/autogpt/core/runner/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_app/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_app/cli.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_app/main.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_web_app/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_web_app/cli.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_web_app/server/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/cli_web_app/server/api.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/logging/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/logging/config.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/logging/helpers.py delete mode 100755 autogpts/autogpt/autogpt/core/runner/client_lib/parser.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/settings.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/shared_click_commands.py delete mode 100644 autogpts/autogpt/autogpt/core/runner/client_lib/utils.py delete mode 100644 autogpts/autogpt/autogpt/core/workspace/__init__.py delete mode 100644 autogpts/autogpt/autogpt/core/workspace/base.py delete mode 100644 autogpts/autogpt/autogpt/core/workspace/simple.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/__init__.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/memory_item.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/providers/__init__.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/providers/base.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/providers/json_file.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/providers/no_memory.py delete mode 100644 autogpts/autogpt/autogpt/memory/vector/utils.py delete mode 100644 autogpts/autogpt/tests/memory/__init__.py delete mode 100644 autogpts/autogpt/tests/memory/_test_json_file_memory.py delete mode 100644 autogpts/autogpt/tests/memory/conftest.py delete mode 100644 autogpts/autogpt/tests/memory/utils.py diff --git a/autogpts/autogpt/README.md b/autogpts/autogpt/README.md index 0ad7c77303..773805daf1 100644 --- a/autogpts/autogpt/README.md +++ b/autogpts/autogpt/README.md @@ -70,7 +70,6 @@ Options: --debug Enable Debug Mode --gpt3only Enable GPT3.5 Only Mode --gpt4only Enable GPT4 Only Mode - -m, --use-memory TEXT Defines which Memory backend to use -b, --browser-name TEXT Specifies which web-browser to use when using selenium to scrape the web. --allow-downloads Dangerous: Allows AutoGPT to download files @@ -116,7 +115,6 @@ Options: --debug Enable Debug Mode --gpt3only Enable GPT3.5 Only Mode --gpt4only Enable GPT4 Only Mode - -m, --use-memory TEXT Defines which Memory backend to use -b, --browser-name TEXT Specifies which web-browser to use when using selenium to scrape the web. --allow-downloads Dangerous: Allows AutoGPT to download files diff --git a/autogpts/autogpt/agbenchmark_config/benchmarks.py b/autogpts/autogpt/agbenchmark_config/benchmarks.py index 7f60774fd2..e9899ff13c 100644 --- a/autogpts/autogpt/agbenchmark_config/benchmarks.py +++ b/autogpts/autogpt/agbenchmark_config/benchmarks.py @@ -8,8 +8,8 @@ from forge.config.config import ConfigBuilder from forge.file_storage import FileStorageBackendName, get_storage from forge.logging.config import configure_logging -from autogpt.agent_manager.agent_manager import AgentManager from autogpt.agents.agent import Agent, AgentConfiguration, AgentSettings +from autogpt.agents.agent_manager import AgentManager from autogpt.app.main import _configure_llm_provider, run_interaction_loop LOG_DIR = Path(__file__).parent / "logs" @@ -31,7 +31,6 @@ def bootstrap_agent(task: str, continuous_mode: bool) -> Agent: config.continuous_mode = continuous_mode config.continuous_limit = 20 config.noninteractive_mode = True - config.memory_backend = "no_memory" ai_profile = AIProfile( ai_name="AutoGPT", diff --git a/autogpts/autogpt/autogpt/agent_factory/configurators.py b/autogpts/autogpt/autogpt/agent_factory/configurators.py index 7b3816f052..b4eabb70b8 100644 --- a/autogpts/autogpt/autogpt/agent_factory/configurators.py +++ b/autogpts/autogpt/autogpt/agent_factory/configurators.py @@ -73,8 +73,6 @@ def _configure_agent( app_config=app_config, ) - # TODO: configure memory - return Agent( settings=agent_state, llm_provider=llm_provider, diff --git a/autogpts/autogpt/autogpt/agent_manager/__init__.py b/autogpts/autogpt/autogpt/agent_manager/__init__.py deleted file mode 100644 index a412566bf3..0000000000 --- a/autogpts/autogpt/autogpt/agent_manager/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .agent_manager import AgentManager - -__all__ = ["AgentManager"] diff --git a/autogpts/autogpt/autogpt/agents/__init__.py b/autogpts/autogpt/autogpt/agents/__init__.py index 1ee5800d70..3abf44be0d 100644 --- a/autogpts/autogpt/autogpt/agents/__init__.py +++ b/autogpts/autogpt/autogpt/agents/__init__.py @@ -1,7 +1,9 @@ from .agent import Agent +from .agent_manager import AgentManager from .prompt_strategies.one_shot import OneShotAgentActionProposal __all__ = [ + "AgentManager", "Agent", "OneShotAgentActionProposal", ] diff --git a/autogpts/autogpt/autogpt/agents/agent.py b/autogpts/autogpt/autogpt/agents/agent.py index fef7b84ea4..d9a0e381c6 100644 --- a/autogpts/autogpt/autogpt/agents/agent.py +++ b/autogpts/autogpt/autogpt/agents/agent.py @@ -30,6 +30,7 @@ from forge.components.watchdog import WatchdogComponent from forge.components.web import WebSearchComponent, WebSeleniumComponent from forge.file_storage.base import FileStorage from forge.llm.prompting.schema import ChatPrompt +from forge.llm.prompting.utils import dump_prompt from forge.llm.providers import ( AssistantFunctionCall, ChatMessage, @@ -58,7 +59,6 @@ from autogpt.app.log_cycle import ( USER_INPUT_FILE_NAME, LogCycleHandler, ) -from autogpt.core.runner.client_lib.logging.helpers import dump_prompt from .prompt_strategies.one_shot import ( OneShotAgentActionProposal, diff --git a/autogpts/autogpt/autogpt/agent_manager/agent_manager.py b/autogpts/autogpt/autogpt/agents/agent_manager.py similarity index 100% rename from autogpts/autogpt/autogpt/agent_manager/agent_manager.py rename to autogpts/autogpt/autogpt/agents/agent_manager.py diff --git a/autogpts/autogpt/autogpt/app/agent_protocol_server.py b/autogpts/autogpt/autogpt/app/agent_protocol_server.py index 4fb6eac8f3..520ccbc11f 100644 --- a/autogpts/autogpt/autogpt/app/agent_protocol_server.py +++ b/autogpts/autogpt/autogpt/app/agent_protocol_server.py @@ -35,7 +35,7 @@ from sentry_sdk import set_user from autogpt.agent_factory.configurators import configure_agent_with_state from autogpt.agent_factory.generators import generate_agent_for_task -from autogpt.agent_manager import AgentManager +from autogpt.agents.agent_manager import AgentManager from autogpt.app.utils import is_port_free logger = logging.getLogger(__name__) diff --git a/autogpts/autogpt/autogpt/app/configurator.py b/autogpts/autogpt/autogpt/app/configurator.py index dc9b7b1637..1b54405157 100644 --- a/autogpts/autogpt/autogpt/app/configurator.py +++ b/autogpts/autogpt/autogpt/app/configurator.py @@ -5,12 +5,10 @@ import logging from typing import Literal, Optional import click -from colorama import Back, Fore, Style +from colorama import Back, Style from forge.config.config import GPT_3_MODEL, GPT_4_MODEL, Config from forge.llm.providers import ModelName, MultiProvider -from autogpt.memory.vector import get_supported_memory_backends - logger = logging.getLogger(__name__) @@ -21,7 +19,6 @@ async def apply_overrides_to_config( skip_reprompt: bool = False, gpt3only: bool = False, gpt4only: bool = False, - memory_type: Optional[str] = None, browser_name: Optional[str] = None, allow_downloads: bool = False, skip_news: bool = False, @@ -40,7 +37,6 @@ async def apply_overrides_to_config( log_file_format (str): Override the format for the log file. gpt3only (bool): Whether to enable GPT3.5 only mode. gpt4only (bool): Whether to enable GPT4 only mode. - memory_type (str): The type of memory backend to use. browser_name (str): The name of the browser to use for scraping the web. allow_downloads (bool): Whether to allow AutoGPT to download files natively. skips_news (bool): Whether to suppress the output of latest news on startup. @@ -78,20 +74,6 @@ async def apply_overrides_to_config( config.fast_llm = await check_model(config.fast_llm, "fast_llm") config.smart_llm = await check_model(config.smart_llm, "smart_llm") - if memory_type: - supported_memory = get_supported_memory_backends() - chosen = memory_type - if chosen not in supported_memory: - logger.warning( - extra={ - "title": "ONLY THE FOLLOWING MEMORY BACKENDS ARE SUPPORTED:", - "title_color": Fore.RED, - }, - msg=f"{supported_memory}", - ) - else: - config.memory_backend = chosen - if skip_reprompt: config.skip_reprompt = True diff --git a/autogpts/autogpt/autogpt/app/main.py b/autogpts/autogpt/autogpt/app/main.py index 866e124a2c..a3f2574206 100644 --- a/autogpts/autogpt/autogpt/app/main.py +++ b/autogpts/autogpt/autogpt/app/main.py @@ -32,9 +32,8 @@ from forge.utils.exceptions import AgentTerminated, InvalidAgentResponseError from autogpt.agent_factory.configurators import configure_agent_with_state, create_agent from autogpt.agent_factory.profile_generator import generate_agent_profile_for_task -from autogpt.agent_manager import AgentManager +from autogpt.agents.agent_manager import AgentManager from autogpt.agents.prompt_strategies.one_shot import AssistantThoughts -from autogpt.core.runner.client_lib.utils import coroutine if TYPE_CHECKING: from autogpt.agents.agent import Agent @@ -44,6 +43,7 @@ from .input import clean_input from .setup import apply_overrides_to_ai_settings, interactively_revise_ai_settings from .spinner import Spinner from .utils import ( + coroutine, get_legal_warning, markdown_to_ansi_style, print_git_branch_info, diff --git a/autogpts/autogpt/autogpt/app/utils.py b/autogpts/autogpt/autogpt/app/utils.py index 04a8f96d44..7c0452a7c9 100644 --- a/autogpts/autogpt/autogpt/app/utils.py +++ b/autogpts/autogpt/autogpt/app/utils.py @@ -1,15 +1,21 @@ +import asyncio import contextlib +import functools import logging import os import re import socket import sys from pathlib import Path +from typing import Any, Callable, Coroutine, ParamSpec, TypeVar import requests from colorama import Fore, Style from git import InvalidGitRepositoryError, Repo +P = ParamSpec("P") +T = TypeVar("T") + logger = logging.getLogger(__name__) @@ -231,3 +237,11 @@ def is_port_free(port: int, host: str = "127.0.0.1"): return True # If successful, the port is free except OSError: return False # If failed, the port is likely in use + + +def coroutine(f: Callable[P, Coroutine[Any, Any, T]]) -> Callable[P, T]: + @functools.wraps(f) + def wrapper(*args: P.args, **kwargs: P.kwargs): + return asyncio.run(f(*args, **kwargs)) + + return wrapper diff --git a/autogpts/autogpt/autogpt/core/ARCHITECTURE_NOTES.md b/autogpts/autogpt/autogpt/core/ARCHITECTURE_NOTES.md deleted file mode 100644 index af6aac7b78..0000000000 --- a/autogpts/autogpt/autogpt/core/ARCHITECTURE_NOTES.md +++ /dev/null @@ -1,271 +0,0 @@ -# Re-architecture Notes - -## Key Documents - -- [Planned Agent Workflow](https://whimsical.com/agent-workflow-v2-NmnTQ8R7sVo7M3S43XgXmZ) -- [Original Architecture Diagram](https://www.figma.com/file/fwdj44tPR7ArYtnGGUKknw/Modular-Architecture?type=whiteboard&node-id=0-1) - This is sadly well out of date at this point. -- [Kanban](https://github.com/orgs/Significant-Gravitas/projects/1/views/1?filterQuery=label%3Are-arch) - -## The Motivation - -The `master` branch of AutoGPT is an organically grown amalgamation of many thoughts -and ideas about agent-driven autonomous systems. It lacks clear abstraction boundaries, -has issues of global state and poorly encapsulated state, and is generally just hard to -make effective changes to. Mainly it's just a system that's hard to make changes to. -And research in the field is moving fast, so we want to be able to try new ideas -quickly. - -## Initial Planning - -A large group of maintainers and contributors met do discuss the architectural -challenges associated with the existing codebase. Many much-desired features (building -new user interfaces, enabling project-specific agents, enabling multi-agent systems) -are bottlenecked by the global state in the system. We discussed the tradeoffs between -an incremental system transition and a big breaking version change and decided to go -for the breaking version change. We justified this by saying: - -- We can maintain, in essence, the same user experience as now even with a radical - restructuring of the codebase -- Our developer audience is struggling to use the existing codebase to build - applications and libraries of their own, so this breaking change will largely be - welcome. - -## Primary Goals - -- Separate the AutoGPT application code from the library code. -- Remove global state from the system -- Allow for multiple agents per user (with facilities for running simultaneously) -- Create a serializable representation of an Agent -- Encapsulate the core systems in abstractions with clear boundaries. - -## Secondary goals - -- Use existing tools to ditch any unnecessary cruft in the codebase (document loading, - json parsing, anything easier to replace than to port). -- Bring in the [core agent loop updates](https://whimsical.com/agent-workflow-v2-NmnTQ8R7sVo7M3S43XgXmZ) - being developed simultaneously by @Pwuts - -# The Agent Subsystems - -## Configuration - -We want a lot of things from a configuration system. We lean heavily on it in the -`master` branch to allow several parts of the system to communicate with each other. -[Recent work](https://github.com/Significant-Gravitas/AutoGPT/pull/4737) has made it -so that the config is no longer a singleton object that is materialized from the import -state, but it's still treated as a -[god object](https://en.wikipedia.org/wiki/God_object) containing all information about -the system and _critically_ allowing any system to reference configuration information -about other parts of the system. - -### What we want - -- It should still be reasonable to collate the entire system configuration in a - sensible way. -- The configuration should be validatable and validated. -- The system configuration should be a _serializable_ representation of an `Agent`. -- The configuration system should provide a clear (albeit very low-level) contract - about user-configurable aspects of the system. -- The configuration should reasonably manage default values and user-provided overrides. -- The configuration system needs to handle credentials in a reasonable way. -- The configuration should be the representation of some amount of system state, like - api budgets and resource usage. These aspects are recorded in the configuration and - updated by the system itself. -- Agent systems should have encapsulated views of the configuration. E.g. the memory - system should know about memory configuration but nothing about command configuration. - -## Workspace - -There are two ways to think about the workspace: - -- The workspace is a scratch space for an agent where it can store files, write code, - and do pretty much whatever else it likes. -- The workspace is, at any given point in time, the single source of truth for what an - agent is. It contains the serializable state (the configuration) as well as all - other working state (stored files, databases, memories, custom code). - -In the existing system there is **one** workspace. And because the workspace holds so -much agent state, that means a user can only work with one agent at a time. - -## Memory - -The memory system has been under extremely active development. -See [#3536](https://github.com/Significant-Gravitas/AutoGPT/issues/3536) and -[#4208](https://github.com/Significant-Gravitas/AutoGPT/pull/4208) for discussion and -work in the `master` branch. The TL;DR is -that we noticed a couple of months ago that the `Agent` performed **worse** with -permanent memory than without it. Since then the knowledge storage and retrieval -system has been [redesigned](https://whimsical.com/memory-system-8Ae6x6QkjDwQAUe9eVJ6w1) -and partially implemented in the `master` branch. - -## Planning/Prompt-Engineering - -The planning system is the system that translates user desires/agent intentions into -language model prompts. In the course of development, it has become pretty clear -that `Planning` is the wrong name for this system - -### What we want - -- It should be incredibly obvious what's being passed to a language model, when it's - being passed, and what the language model response is. The landscape of language - model research is developing very rapidly, so building complex abstractions between - users/contributors and the language model interactions is going to make it very - difficult for us to nimbly respond to new research developments. -- Prompt-engineering should ideally be exposed in a parameterizeable way to users. -- We should, where possible, leverage OpenAI's new - [function calling api](https://openai.com/blog/function-calling-and-other-api-updates) - to get outputs in a standard machine-readable format and avoid the deep pit of - parsing json (and fixing unparsable json). - -### Planning Strategies - -The [new agent workflow](https://whimsical.com/agent-workflow-v2-NmnTQ8R7sVo7M3S43XgXmZ) -has many, many interaction points for language models. We really would like to not -distribute prompt templates and raw strings all through the system. The re-arch solution -is to encapsulate language model interactions into planning strategies. -These strategies are defined by - -- The `LanguageModelClassification` they use (`FAST` or `SMART`) -- A function `build_prompt` that takes strategy specific arguments and constructs a - `LanguageModelPrompt` (a simple container for lists of messages and functions to - pass to the language model) -- A function `parse_content` that parses the response content (a dict) into a better - formatted dict. Contracts here are intentionally loose and will tighten once we have - at least one other language model provider. - -## Resources - -Resources are kinds of services we consume from external APIs. They may have associated -credentials and costs we need to manage. Management of those credentials is implemented -as manipulation of the resource configuration. We have two categories of resources -currently - -- AI/ML model providers (including language model providers and embedding model providers, ie OpenAI) -- Memory providers (e.g. Pinecone, Weaviate, ChromaDB, etc.) - -### What we want - -- Resource abstractions should provide a common interface to different service providers - for a particular kind of service. -- Resource abstractions should manipulate the configuration to manage their credentials - and budget/accounting. -- Resource abstractions should be composable over an API (e.g. I should be able to make - an OpenAI provider that is both a LanguageModelProvider and an EmbeddingModelProvider - and use it wherever I need those services). - -## Abilities - -Along with planning and memory usage, abilities are one of the major augmentations of -augmented language models. They allow us to expand the scope of what language models -can do by hooking them up to code they can execute to obtain new knowledge or influence -the world. - -### What we want - -- Abilities should have an extremely clear interface that users can write to. -- Abilities should have an extremely clear interface that a language model can - understand -- Abilities should be declarative about their dependencies so the system can inject them -- Abilities should be executable (where sensible) in an async run loop. -- Abilities should be not have side effects unless those side effects are clear in - their representation to an agent (e.g. the BrowseWeb ability shouldn't write a file, - but the WriteFile ability can). - -## Plugins - -Users want to add lots of features that we don't want to support as first-party. -Or solution to this is a plugin system to allow users to plug in their functionality or -to construct their agent from a public plugin marketplace. Our primary concern in the -re-arch is to build a stateless plugin service interface and a simple implementation -that can load plugins from installed packages or from zip files. Future efforts will -expand this system to allow plugins to load from a marketplace or some other kind -of service. - -### What is a Plugin - -Plugins are a kind of garbage term. They refer to a number of things. - -- New commands for the agent to execute. This is the most common usage. -- Replacements for entire subsystems like memory or language model providers -- Application plugins that do things like send emails or communicate via whatsapp -- The repositories contributors create that may themselves have multiple plugins in them. - -### Usage in the existing system - -The current plugin system is _hook-based_. This means plugins don't correspond to -kinds of objects in the system, but rather to times in the system at which we defer -execution to them. The main advantage of this setup is that user code can hijack -pretty much any behavior of the agent by injecting code that supersedes the normal -agent execution. The disadvantages to this approach are numerous: - -- We have absolutely no mechanisms to enforce any security measures because the threat - surface is everything. -- We cannot reason about agent behavior in a cohesive way because control flow can be - ceded to user code at pretty much any point and arbitrarily change or break the - agent behavior -- The interface for designing a plugin is kind of terrible and difficult to standardize -- The hook based implementation means we couple ourselves to a particular flow of - control (or otherwise risk breaking plugin behavior). E.g. many of the hook targets - in the [old workflow](https://whimsical.com/agent-workflow-VAzeKcup3SR7awpNZJKTyK) - are not present or mean something entirely different in the - [new workflow](https://whimsical.com/agent-workflow-v2-NmnTQ8R7sVo7M3S43XgXmZ). -- Etc. - -### What we want - -- A concrete definition of a plugin that is narrow enough in scope that we can define - it well and reason about how it will work in the system. -- A set of abstractions that let us define a plugin by its storage format and location -- A service interface that knows how to parse the plugin abstractions and turn them - into concrete classes and objects. - - -## Some Notes on how and why we'll use OO in this project - -First and foremost, Python itself is an object-oriented language. It's -underlying [data model](https://docs.python.org/3/reference/datamodel.html) is built -with object-oriented programming in mind. It offers useful tools like abstract base -classes to communicate interfaces to developers who want to, e.g., write plugins, or -help work on implementations. If we were working in a different language that offered -different tools, we'd use a different paradigm. - -While many things are classes in the re-arch, they are not classes in the same way. -There are three kinds of things (roughly) that are written as classes in the re-arch: -1. **Configuration**: AutoGPT has *a lot* of configuration. This configuration - is *data* and we use **[Pydantic](https://docs.pydantic.dev/latest/)** to manage it as - pydantic is basically industry standard for this stuff. It provides runtime validation - for all the configuration and allows us to easily serialize configuration to both basic - python types (dicts, lists, and primitives) as well as serialize to json, which is - important for us being able to put representations of agents - [on the wire](https://en.wikipedia.org/wiki/Wire_protocol) for web applications and - agent-to-agent communication. *These are essentially - [structs](https://en.wikipedia.org/wiki/Struct_(C_programming_language)) rather than - traditional classes.* -2. **Internal Data**: Very similar to configuration, AutoGPT passes around boatloads - of internal data. We are interacting with language models and language model APIs - which means we are handling lots of *structured* but *raw* text. Here we also - leverage **pydantic** to both *parse* and *validate* the internal data and also to - give us concrete types which we can use static type checkers to validate against - and discover problems before they show up as bugs at runtime. *These are - essentially [structs](https://en.wikipedia.org/wiki/Struct_(C_programming_language)) - rather than traditional classes.* -3. **System Interfaces**: This is our primary traditional use of classes in the - re-arch. We have a bunch of systems. We want many of those systems to have - alternative implementations (e.g. via plugins). We use abstract base classes to - define interfaces to communicate with people who might want to provide those - plugins. We provide a single concrete implementation of most of those systems as a - subclass of the interface. This should not be controversial. - -The approach is consistent with -[prior](https://github.com/Significant-Gravitas/AutoGPT/issues/2458) -[work](https://github.com/Significant-Gravitas/AutoGPT/pull/2442) done by other -maintainers in this direction. - -From an organization standpoint, OO programming is by far the most popular programming -paradigm (especially for Python). It's the one most often taught in programming classes -and the one with the most available online training for people interested in -contributing. - -Finally, and importantly, we scoped the plan and initial design of the re-arch as a -large group of maintainers and collaborators early on. This is consistent with the -design we chose and no-one offered alternatives. diff --git a/autogpts/autogpt/autogpt/core/README.md b/autogpts/autogpt/autogpt/core/README.md deleted file mode 100644 index ff97e2c59f..0000000000 --- a/autogpts/autogpt/autogpt/core/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# AutoGPT Core - -This subpackage contains the ongoing work for the -[AutoGPT Re-arch](https://github.com/Significant-Gravitas/AutoGPT/issues/4770). It is -a work in progress and is not yet feature complete. In particular, it does not yet -have many of the AutoGPT commands implemented and is pending ongoing work to -[re-incorporate vector-based memory and knowledge retrieval](https://github.com/Significant-Gravitas/AutoGPT/issues/3536). - -## [Overview](ARCHITECTURE_NOTES.md) - -The AutoGPT Re-arch is a re-implementation of the AutoGPT agent that is designed to be more modular, -more extensible, and more maintainable than the original AutoGPT agent. It is also designed to be -more accessible to new developers and to be easier to contribute to. The re-arch is a work in progress -and is not yet feature complete. It is also not yet ready for production use. - -## Running the Re-arch Code - -1. Open the `autogpt/core` folder in a terminal - -2. Set up a dedicated virtual environment: - `python -m venv .venv` - -3. Install everything needed to run the project: - `poetry install` - - -## CLI Application - -There are two client applications for AutoGPT included. - -:star2: **This is the reference application I'm working with for now** :star2: - -The first app is a straight CLI application. I have not done anything yet to port all the friendly display stuff from the ~~`logger.typewriter_log`~~`user_friendly_output` logic. - -- [Entry Point](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpts/autogpt/autogpt/core/runner/cli_app/cli.py) -- [Client Application](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpts/autogpt/autogpt/core/runner/cli_app/main.py) - -You'll then need a settings file. Run - -``` -poetry run cli make-settings -``` - -This will write a file called `default_agent_settings.yaml` with all the user-modifiable -configuration keys to `~/auto-gpt/default_agent_settings.yml` and make the `auto-gpt` directory -in your user directory if it doesn't exist). Your user directory is located in different places -depending on your operating system: - -- On Linux, it's `/home/USERNAME` -- On Windows, it's `C:\Users\USERNAME` -- On Mac, it's `/Users/USERNAME` - -At a bare minimum, you'll need to set `openai.credentials.api_key` to your OpenAI API Key to run -the model. - -You can then run AutoGPT with - -``` -poetry run cli run -``` - -to launch the interaction loop. - -### CLI Web App - -:warning: I am not actively developing this application. I am primarily working with the traditional CLI app -described above. It is a very good place to get involved if you have web application design experience and are -looking to get involved in the re-arch. - -The second app is still a CLI, but it sets up a local webserver that the client application talks to -rather than invoking calls to the Agent library code directly. This application is essentially a sketch -at this point as the folks who were driving it have had less time (and likely not enough clarity) to proceed. - -- [Entry Point](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpts/autogpt/autogpt/core/runner/cli_web_app/cli.py) -- [Client Application](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpts/autogpt/autogpt/core/runner/cli_web_app/client/client.py) -- [Server API](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/api.py) - -To run, you still need to generate a default configuration. You can do - -``` -poetry run cli-web make-settings -``` - -It invokes the same command as the bare CLI app, so follow the instructions above about setting your API key. - -To run, do - -``` -poetry run cli-web client -``` - -This will launch a webserver and then start the client cli application to communicate with it. diff --git a/autogpts/autogpt/autogpt/core/__init__.py b/autogpts/autogpt/autogpt/core/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/autogpt/core/ability/__init__.py b/autogpts/autogpt/autogpt/core/ability/__init__.py deleted file mode 100644 index 3709b9277a..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -"""The command system provides a way to extend the functionality of the AI agent.""" -from autogpt.core.ability.base import Ability, AbilityConfiguration, AbilityRegistry -from autogpt.core.ability.schema import AbilityResult -from autogpt.core.ability.simple import ( - AbilityRegistryConfiguration, - AbilityRegistrySettings, - SimpleAbilityRegistry, -) - -__all__ = [ - "Ability", - "AbilityConfiguration", - "AbilityRegistry", - "AbilityResult", - "AbilityRegistryConfiguration", - "AbilityRegistrySettings", - "SimpleAbilityRegistry", -] diff --git a/autogpts/autogpt/autogpt/core/ability/base.py b/autogpts/autogpt/autogpt/core/ability/base.py deleted file mode 100644 index d6acd87013..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/base.py +++ /dev/null @@ -1,88 +0,0 @@ -import abc -from pprint import pformat -from typing import Any, ClassVar - -import inflection -from forge.llm.providers import CompletionModelFunction -from forge.models.config import SystemConfiguration -from forge.models.json_schema import JSONSchema -from pydantic import Field - -from autogpt.core.planning.simple import LanguageModelConfiguration -from autogpt.core.plugin.base import PluginLocation - -from .schema import AbilityResult - - -class AbilityConfiguration(SystemConfiguration): - """Struct for model configuration.""" - - location: PluginLocation - packages_required: list[str] = Field(default_factory=list) - language_model_required: LanguageModelConfiguration = None - memory_provider_required: bool = False - workspace_required: bool = False - - -class Ability(abc.ABC): - """A class representing an agent ability.""" - - default_configuration: ClassVar[AbilityConfiguration] - - @classmethod - def name(cls) -> str: - """The name of the ability.""" - return inflection.underscore(cls.__name__) - - @property - @classmethod - @abc.abstractmethod - def description(cls) -> str: - """A detailed description of what the ability does.""" - ... - - @property - @classmethod - @abc.abstractmethod - def parameters(cls) -> dict[str, JSONSchema]: - ... - - @abc.abstractmethod - async def __call__(self, *args: Any, **kwargs: Any) -> AbilityResult: - ... - - def __str__(self) -> str: - return pformat(self.spec) - - @property - @classmethod - def spec(cls) -> CompletionModelFunction: - return CompletionModelFunction( - name=cls.name(), - description=cls.description, - parameters=cls.parameters, - ) - - -class AbilityRegistry(abc.ABC): - @abc.abstractmethod - def register_ability( - self, ability_name: str, ability_configuration: AbilityConfiguration - ) -> None: - ... - - @abc.abstractmethod - def list_abilities(self) -> list[str]: - ... - - @abc.abstractmethod - def dump_abilities(self) -> list[CompletionModelFunction]: - ... - - @abc.abstractmethod - def get_ability(self, ability_name: str) -> Ability: - ... - - @abc.abstractmethod - async def perform(self, ability_name: str, **kwargs: Any) -> AbilityResult: - ... diff --git a/autogpts/autogpt/autogpt/core/ability/builtins/__init__.py b/autogpts/autogpt/autogpt/core/ability/builtins/__init__.py deleted file mode 100644 index 93936dbc68..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/builtins/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from autogpt.core.ability.builtins.create_new_ability import CreateNewAbility -from autogpt.core.ability.builtins.query_language_model import QueryLanguageModel - -BUILTIN_ABILITIES = { - QueryLanguageModel.name(): QueryLanguageModel, -} - -__all__ = [ - "BUILTIN_ABILITIES", - "CreateNewAbility", - "QueryLanguageModel", -] diff --git a/autogpts/autogpt/autogpt/core/ability/builtins/create_new_ability.py b/autogpts/autogpt/autogpt/core/ability/builtins/create_new_ability.py deleted file mode 100644 index 110cff0145..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/builtins/create_new_ability.py +++ /dev/null @@ -1,108 +0,0 @@ -import logging -from typing import ClassVar - -from forge.models.json_schema import JSONSchema - -from autogpt.core.ability.base import Ability, AbilityConfiguration -from autogpt.core.ability.schema import AbilityResult -from autogpt.core.plugin.simple import PluginLocation, PluginStorageFormat - - -class CreateNewAbility(Ability): - default_configuration = AbilityConfiguration( - location=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.ability.builtins.CreateNewAbility", - ), - ) - - def __init__( - self, - logger: logging.Logger, - configuration: AbilityConfiguration, - ): - self._logger = logger - self._configuration = configuration - - description: ClassVar[str] = "Create a new ability by writing python code." - - parameters: ClassVar[dict[str, JSONSchema]] = { - "ability_name": JSONSchema( - description="A meaningful and concise name for the new ability.", - type=JSONSchema.Type.STRING, - required=True, - ), - "description": JSONSchema( - description=( - "A detailed description of the ability and its uses, " - "including any limitations." - ), - type=JSONSchema.Type.STRING, - required=True, - ), - "arguments": JSONSchema( - description="A list of arguments that the ability will accept.", - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - type=JSONSchema.Type.OBJECT, - properties={ - "name": JSONSchema( - description="The name of the argument.", - type=JSONSchema.Type.STRING, - ), - "type": JSONSchema( - description=( - "The type of the argument. " - "Must be a standard json schema type." - ), - type=JSONSchema.Type.STRING, - ), - "description": JSONSchema( - description=( - "A detailed description of the argument and its uses." - ), - type=JSONSchema.Type.STRING, - ), - }, - ), - ), - "required_arguments": JSONSchema( - description="A list of the names of the arguments that are required.", - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - description="The names of the arguments that are required.", - type=JSONSchema.Type.STRING, - ), - ), - "package_requirements": JSONSchema( - description=( - "A list of the names of the Python packages that are required to " - "execute the ability." - ), - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - description=( - "The of the Python package that is required to execute the ability." - ), - type=JSONSchema.Type.STRING, - ), - ), - "code": JSONSchema( - description=( - "The Python code that will be executed when the ability is called." - ), - type=JSONSchema.Type.STRING, - required=True, - ), - } - - async def __call__( - self, - ability_name: str, - description: str, - arguments: list[dict], - required_arguments: list[str], - package_requirements: list[str], - code: str, - ) -> AbilityResult: - raise NotImplementedError diff --git a/autogpts/autogpt/autogpt/core/ability/builtins/file_operations.py b/autogpts/autogpt/autogpt/core/ability/builtins/file_operations.py deleted file mode 100644 index 44b4d5f9c0..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/builtins/file_operations.py +++ /dev/null @@ -1,171 +0,0 @@ -import logging -import os -from typing import ClassVar - -from forge.models.json_schema import JSONSchema - -from autogpt.core.ability.base import Ability, AbilityConfiguration -from autogpt.core.ability.schema import AbilityResult, ContentType, Knowledge -from autogpt.core.plugin.simple import PluginLocation, PluginStorageFormat -from autogpt.core.workspace import Workspace - - -class ReadFile(Ability): - default_configuration = AbilityConfiguration( - location=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.ability.builtins.ReadFile", - ), - packages_required=["unstructured"], - workspace_required=True, - ) - - def __init__( - self, - logger: logging.Logger, - workspace: Workspace, - ): - self._logger = logger - self._workspace = workspace - - description: ClassVar[str] = "Read and parse all text from a file." - - parameters: ClassVar[dict[str, JSONSchema]] = { - "filename": JSONSchema( - type=JSONSchema.Type.STRING, - description="The name of the file to read.", - ), - } - - def _check_preconditions(self, filename: str) -> AbilityResult | None: - message = "" - try: - pass - except ImportError: - message = "Package charset_normalizer is not installed." - - try: - file_path = self._workspace.get_path(filename) - if not file_path.exists(): - message = f"File {filename} does not exist." - if not file_path.is_file(): - message = f"{filename} is not a file." - except ValueError as e: - message = str(e) - - if message: - return AbilityResult( - ability_name=self.name(), - ability_args={"filename": filename}, - success=False, - message=message, - data=None, - ) - - def __call__(self, filename: str) -> AbilityResult: - if result := self._check_preconditions(filename): - return result - - from unstructured.partition.auto import partition - - file_path = self._workspace.get_path(filename) - try: - elements = partition(str(file_path)) - # TODO: Lots of other potentially useful information is available - # in the partitioned file. Consider returning more of it. - new_knowledge = Knowledge( - content="\n\n".join([element.text for element in elements]), - content_type=ContentType.TEXT, - content_metadata={"filename": filename}, - ) - success = True - message = f"File {file_path} read successfully." - except IOError as e: - new_knowledge = None - success = False - message = str(e) - - return AbilityResult( - ability_name=self.name(), - ability_args={"filename": filename}, - success=success, - message=message, - new_knowledge=new_knowledge, - ) - - -class WriteFile(Ability): - default_configuration = AbilityConfiguration( - location=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.ability.builtins.WriteFile", - ), - packages_required=["unstructured"], - workspace_required=True, - ) - - def __init__( - self, - logger: logging.Logger, - workspace: Workspace, - ): - self._logger = logger - self._workspace = workspace - - description: ClassVar[str] = "Write text to a file." - - parameters: ClassVar[dict[str, JSONSchema]] = { - "filename": JSONSchema( - type=JSONSchema.Type.STRING, - description="The name of the file to write.", - ), - "contents": JSONSchema( - type=JSONSchema.Type.STRING, - description="The contents of the file to write.", - ), - } - - def _check_preconditions( - self, filename: str, contents: str - ) -> AbilityResult | None: - message = "" - try: - file_path = self._workspace.get_path(filename) - if file_path.exists(): - message = f"File {filename} already exists." - if len(contents): - message = f"File {filename} was not given any content." - except ValueError as e: - message = str(e) - - if message: - return AbilityResult( - ability_name=self.name(), - ability_args={"filename": filename, "contents": contents}, - success=False, - message=message, - data=None, - ) - - def __call__(self, filename: str, contents: str) -> AbilityResult: - if result := self._check_preconditions(filename, contents): - return result - - file_path = self._workspace.get_path(filename) - try: - directory = os.path.dirname(file_path) - os.makedirs(directory) - with open(filename, "w", encoding="utf-8") as f: - f.write(contents) - success = True - message = f"File {file_path} written successfully." - except IOError as e: - success = False - message = str(e) - - return AbilityResult( - ability_name=self.name(), - ability_args={"filename": filename}, - success=success, - message=message, - ) diff --git a/autogpts/autogpt/autogpt/core/ability/builtins/query_language_model.py b/autogpts/autogpt/autogpt/core/ability/builtins/query_language_model.py deleted file mode 100644 index f694651dba..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/builtins/query_language_model.py +++ /dev/null @@ -1,67 +0,0 @@ -import logging -from typing import ClassVar - -from forge.llm.providers import ( - ChatMessage, - ChatModelProvider, - ModelProviderName, - OpenAIModelName, -) -from forge.models.json_schema import JSONSchema - -from autogpt.core.ability.base import Ability, AbilityConfiguration -from autogpt.core.ability.schema import AbilityResult -from autogpt.core.planning.simple import LanguageModelConfiguration -from autogpt.core.plugin.simple import PluginLocation, PluginStorageFormat - - -class QueryLanguageModel(Ability): - default_configuration = AbilityConfiguration( - location=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.ability.builtins.QueryLanguageModel", - ), - language_model_required=LanguageModelConfiguration( - model_name=OpenAIModelName.GPT3, - provider_name=ModelProviderName.OPENAI, - temperature=0.9, - ), - ) - - def __init__( - self, - logger: logging.Logger, - configuration: AbilityConfiguration, - language_model_provider: ChatModelProvider, - ): - self._logger = logger - self._configuration = configuration - self._language_model_provider = language_model_provider - - description: ClassVar[str] = ( - "Query a language model." - " A query should be a question and any relevant context." - ) - - parameters: ClassVar[dict[str, JSONSchema]] = { - "query": JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "A query for a language model. " - "A query should contain a question and any relevant context." - ), - ) - } - - async def __call__(self, query: str) -> AbilityResult: - model_response = await self._language_model_provider.create_chat_completion( - model_prompt=[ChatMessage.user(query)], - functions=[], - model_name=self._configuration.language_model_required.model_name, - ) - return AbilityResult( - ability_name=self.name(), - ability_args={"query": query}, - success=True, - message=model_response.response.content or "", - ) diff --git a/autogpts/autogpt/autogpt/core/ability/schema.py b/autogpts/autogpt/autogpt/core/ability/schema.py deleted file mode 100644 index 3d20a7b929..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/schema.py +++ /dev/null @@ -1,30 +0,0 @@ -import enum -from typing import Any - -from pydantic import BaseModel - - -class ContentType(str, enum.Enum): - # TBD what these actually are. - TEXT = "text" - CODE = "code" - - -class Knowledge(BaseModel): - content: str - content_type: ContentType - content_metadata: dict[str, Any] - - -class AbilityResult(BaseModel): - """The AbilityResult is a standard response struct for an ability.""" - - ability_name: str - ability_args: dict[str, str] - success: bool - message: str - new_knowledge: Knowledge = None - - def summary(self) -> str: - kwargs = ", ".join(f"{k}={v}" for k, v in self.ability_args.items()) - return f"{self.ability_name}({kwargs}): {self.message}" diff --git a/autogpts/autogpt/autogpt/core/ability/simple.py b/autogpts/autogpt/autogpt/core/ability/simple.py deleted file mode 100644 index fad09ca69d..0000000000 --- a/autogpts/autogpt/autogpt/core/ability/simple.py +++ /dev/null @@ -1,98 +0,0 @@ -import logging - -from forge.llm.providers import ( - ChatModelProvider, - CompletionModelFunction, - ModelProviderName, -) -from forge.models.config import Configurable, SystemConfiguration, SystemSettings - -from autogpt.core.ability.base import Ability, AbilityConfiguration, AbilityRegistry -from autogpt.core.ability.builtins import BUILTIN_ABILITIES -from autogpt.core.ability.schema import AbilityResult -from autogpt.core.memory.base import Memory -from autogpt.core.plugin.simple import SimplePluginService -from autogpt.core.workspace.base import Workspace - - -class AbilityRegistryConfiguration(SystemConfiguration): - """Configuration for the AbilityRegistry subsystem.""" - - abilities: dict[str, AbilityConfiguration] - - -class AbilityRegistrySettings(SystemSettings): - configuration: AbilityRegistryConfiguration - - -class SimpleAbilityRegistry(AbilityRegistry, Configurable): - default_settings = AbilityRegistrySettings( - name="simple_ability_registry", - description="A simple ability registry.", - configuration=AbilityRegistryConfiguration( - abilities={ - ability_name: ability.default_configuration - for ability_name, ability in BUILTIN_ABILITIES.items() - }, - ), - ) - - def __init__( - self, - settings: AbilityRegistrySettings, - logger: logging.Logger, - memory: Memory, - workspace: Workspace, - model_providers: dict[ModelProviderName, ChatModelProvider], - ): - self._configuration = settings.configuration - self._logger = logger - self._memory = memory - self._workspace = workspace - self._model_providers = model_providers - self._abilities: list[Ability] = [] - for ( - ability_name, - ability_configuration, - ) in self._configuration.abilities.items(): - self.register_ability(ability_name, ability_configuration) - - def register_ability( - self, ability_name: str, ability_configuration: AbilityConfiguration - ) -> None: - ability_class = SimplePluginService.get_plugin(ability_configuration.location) - ability_args = { - "logger": self._logger.getChild(ability_name), - "configuration": ability_configuration, - } - if ability_configuration.packages_required: - # TODO: Check packages are installed and maybe install them. - pass - if ability_configuration.memory_provider_required: - ability_args["memory"] = self._memory - if ability_configuration.workspace_required: - ability_args["workspace"] = self._workspace - if ability_configuration.language_model_required: - ability_args["language_model_provider"] = self._model_providers[ - ability_configuration.language_model_required.provider_name - ] - ability = ability_class(**ability_args) - self._abilities.append(ability) - - def list_abilities(self) -> list[str]: - return [ - f"{ability.name()}: {ability.description}" for ability in self._abilities - ] - - def dump_abilities(self) -> list[CompletionModelFunction]: - return [ability.spec for ability in self._abilities] - - def get_ability(self, ability_name: str) -> Ability: - for ability in self._abilities: - if ability.name() == ability_name: - return ability - raise ValueError(f"Ability '{ability_name}' not found.") - - async def perform(self, ability_name: str, **kwargs) -> AbilityResult: - ability = self.get_ability(ability_name) - return await ability(**kwargs) diff --git a/autogpts/autogpt/autogpt/core/agent/__init__.py b/autogpts/autogpt/autogpt/core/agent/__init__.py deleted file mode 100644 index f4e7a5a733..0000000000 --- a/autogpts/autogpt/autogpt/core/agent/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""The Agent is an autonomouos entity guided by a LLM provider.""" -from autogpt.core.agent.base import Agent -from autogpt.core.agent.simple import AgentSettings, SimpleAgent - -__all__ = [ - "Agent", - "AgentSettings", - "SimpleAgent", -] diff --git a/autogpts/autogpt/autogpt/core/agent/base.py b/autogpts/autogpt/autogpt/core/agent/base.py deleted file mode 100644 index c574dcea28..0000000000 --- a/autogpts/autogpt/autogpt/core/agent/base.py +++ /dev/null @@ -1,26 +0,0 @@ -import abc -import logging -from pathlib import Path - - -class Agent(abc.ABC): - @abc.abstractmethod - def __init__(self, *args, **kwargs): - ... - - @classmethod - @abc.abstractmethod - def from_workspace( - cls, - workspace_path: Path, - logger: logging.Logger, - ) -> "Agent": - ... - - @abc.abstractmethod - async def determine_next_ability(self, *args, **kwargs): - ... - - @abc.abstractmethod - def __repr__(self): - ... diff --git a/autogpts/autogpt/autogpt/core/agent/simple.py b/autogpts/autogpt/autogpt/core/agent/simple.py deleted file mode 100644 index 4b2783182f..0000000000 --- a/autogpts/autogpt/autogpt/core/agent/simple.py +++ /dev/null @@ -1,398 +0,0 @@ -import logging -from datetime import datetime -from pathlib import Path -from typing import Any - -from forge.llm.providers import CompletionModelFunction, OpenAIProvider, OpenAISettings -from forge.models.config import Configurable, SystemConfiguration, SystemSettings -from pydantic import BaseModel - -from autogpt.core.ability import ( - AbilityRegistrySettings, - AbilityResult, - SimpleAbilityRegistry, -) -from autogpt.core.agent.base import Agent -from autogpt.core.memory import MemorySettings, SimpleMemory -from autogpt.core.planning import PlannerSettings, SimplePlanner, Task, TaskStatus -from autogpt.core.plugin.simple import ( - PluginLocation, - PluginStorageFormat, - SimplePluginService, -) -from autogpt.core.workspace.simple import SimpleWorkspace, WorkspaceSettings - - -class AgentSystems(SystemConfiguration): - ability_registry: PluginLocation - memory: PluginLocation - openai_provider: PluginLocation - planning: PluginLocation - workspace: PluginLocation - - -class AgentConfiguration(SystemConfiguration): - cycle_count: int - max_task_cycle_count: int - creation_time: str - name: str - role: str - goals: list[str] - systems: AgentSystems - - -class AgentSystemSettings(SystemSettings): - configuration: AgentConfiguration - - -class AgentSettings(BaseModel): - agent: AgentSystemSettings - ability_registry: AbilityRegistrySettings - memory: MemorySettings - openai_provider: OpenAISettings - planning: PlannerSettings - workspace: WorkspaceSettings - - def update_agent_name_and_goals(self, agent_goals: dict) -> None: - self.agent.configuration.name = agent_goals["agent_name"] - self.agent.configuration.role = agent_goals["agent_role"] - self.agent.configuration.goals = agent_goals["agent_goals"] - - -class SimpleAgent(Agent, Configurable): - default_settings = AgentSystemSettings( - name="simple_agent", - description="A simple agent.", - configuration=AgentConfiguration( - name="Entrepreneur-GPT", - role=( - "An AI designed to autonomously develop and run businesses with " - "the sole goal of increasing your net worth." - ), - goals=[ - "Increase net worth", - "Grow Twitter Account", - "Develop and manage multiple businesses autonomously", - ], - cycle_count=0, - max_task_cycle_count=3, - creation_time="", - systems=AgentSystems( - ability_registry=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.ability.SimpleAbilityRegistry", - ), - memory=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.memory.SimpleMemory", - ), - openai_provider=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route=("forge.llm.model_providers.OpenAIProvider"), - ), - planning=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.planning.SimplePlanner", - ), - workspace=PluginLocation( - storage_format=PluginStorageFormat.INSTALLED_PACKAGE, - storage_route="autogpt.core.workspace.SimpleWorkspace", - ), - ), - ), - ) - - def __init__( - self, - settings: AgentSystemSettings, - logger: logging.Logger, - ability_registry: SimpleAbilityRegistry, - memory: SimpleMemory, - openai_provider: OpenAIProvider, - planning: SimplePlanner, - workspace: SimpleWorkspace, - ): - self._configuration = settings.configuration - self._logger = logger - self._ability_registry = ability_registry - self._memory = memory - # FIXME: Need some work to make this work as a dict of providers - # Getting the construction of the config to work is a bit tricky - self._openai_provider = openai_provider - self._planning = planning - self._workspace = workspace - self._task_queue = [] - self._completed_tasks = [] - self._current_task = None - self._next_ability = None - - @classmethod - def from_workspace( - cls, - workspace_path: Path, - logger: logging.Logger, - ) -> "SimpleAgent": - agent_settings = SimpleWorkspace.load_agent_settings(workspace_path) - agent_args = {} - - agent_args["settings"] = agent_settings.agent - agent_args["logger"] = logger - agent_args["workspace"] = cls._get_system_instance( - "workspace", - agent_settings, - logger, - ) - agent_args["openai_provider"] = cls._get_system_instance( - "openai_provider", - agent_settings, - logger, - ) - agent_args["planning"] = cls._get_system_instance( - "planning", - agent_settings, - logger, - model_providers={"openai": agent_args["openai_provider"]}, - ) - agent_args["memory"] = cls._get_system_instance( - "memory", - agent_settings, - logger, - workspace=agent_args["workspace"], - ) - - agent_args["ability_registry"] = cls._get_system_instance( - "ability_registry", - agent_settings, - logger, - workspace=agent_args["workspace"], - memory=agent_args["memory"], - model_providers={"openai": agent_args["openai_provider"]}, - ) - - return cls(**agent_args) - - async def build_initial_plan(self) -> dict: - plan = await self._planning.make_initial_plan( - agent_name=self._configuration.name, - agent_role=self._configuration.role, - agent_goals=self._configuration.goals, - abilities=self._ability_registry.list_abilities(), - ) - tasks = [Task.parse_obj(task) for task in plan.parsed_result["task_list"]] - - # TODO: Should probably do a step to evaluate the quality of the generated tasks - # and ensure that they have actionable ready and acceptance criteria - - self._task_queue.extend(tasks) - self._task_queue.sort(key=lambda t: t.priority, reverse=True) - self._task_queue[-1].context.status = TaskStatus.READY - return plan.parsed_result - - async def determine_next_ability(self, *args, **kwargs): - if not self._task_queue: - return {"response": "I don't have any tasks to work on right now."} - - self._configuration.cycle_count += 1 - task = self._task_queue.pop() - self._logger.info(f"Working on task: {task}") - - task = await self._evaluate_task_and_add_context(task) - next_ability = await self._choose_next_ability( - task, - self._ability_registry.dump_abilities(), - ) - self._current_task = task - self._next_ability = next_ability.parsed_result - return self._current_task, self._next_ability - - async def execute_next_ability(self, user_input: str, *args, **kwargs): - if user_input == "y": - ability = self._ability_registry.get_ability( - self._next_ability["next_ability"] - ) - ability_response = await ability(**self._next_ability["ability_arguments"]) - await self._update_tasks_and_memory(ability_response) - if self._current_task.context.status == TaskStatus.DONE: - self._completed_tasks.append(self._current_task) - else: - self._task_queue.append(self._current_task) - self._current_task = None - self._next_ability = None - - return ability_response.dict() - else: - raise NotImplementedError - - async def _evaluate_task_and_add_context(self, task: Task) -> Task: - """Evaluate the task and add context to it.""" - if task.context.status == TaskStatus.IN_PROGRESS: - # Nothing to do here - return task - else: - self._logger.debug(f"Evaluating task {task} and adding relevant context.") - # TODO: Look up relevant memories (need working memory system) - # TODO: Eval whether there is enough information to start the task (w/ LLM). - task.context.enough_info = True - task.context.status = TaskStatus.IN_PROGRESS - return task - - async def _choose_next_ability( - self, - task: Task, - ability_specs: list[CompletionModelFunction], - ): - """Choose the next ability to use for the task.""" - self._logger.debug(f"Choosing next ability for task {task}.") - if task.context.cycle_count > self._configuration.max_task_cycle_count: - # Don't hit the LLM, just set the next action as "breakdown_task" - # with an appropriate reason - raise NotImplementedError - elif not task.context.enough_info: - # Don't ask the LLM, just set the next action as "breakdown_task" - # with an appropriate reason - raise NotImplementedError - else: - next_ability = await self._planning.determine_next_ability( - task, ability_specs - ) - return next_ability - - async def _update_tasks_and_memory(self, ability_result: AbilityResult): - self._current_task.context.cycle_count += 1 - self._current_task.context.prior_actions.append(ability_result) - # TODO: Summarize new knowledge - # TODO: store knowledge and summaries in memory and in relevant tasks - # TODO: evaluate whether the task is complete - - def __repr__(self): - return "SimpleAgent()" - - ################################################################ - # Factory interface for agent bootstrapping and initialization # - ################################################################ - - @classmethod - def build_user_configuration(cls) -> dict[str, Any]: - """Build the user's configuration.""" - configuration_dict = { - "agent": cls.get_user_config(), - } - - system_locations = configuration_dict["agent"]["configuration"]["systems"] - for system_name, system_location in system_locations.items(): - system_class = SimplePluginService.get_plugin(system_location) - configuration_dict[system_name] = system_class.get_user_config() - configuration_dict = _prune_empty_dicts(configuration_dict) - return configuration_dict - - @classmethod - def compile_settings( - cls, logger: logging.Logger, user_configuration: dict - ) -> AgentSettings: - """Compile the user's configuration with the defaults.""" - logger.debug("Processing agent system configuration.") - configuration_dict = { - "agent": cls.build_agent_configuration( - user_configuration.get("agent", {}) - ).dict(), - } - - system_locations = configuration_dict["agent"]["configuration"]["systems"] - - # Build up default configuration - for system_name, system_location in system_locations.items(): - logger.debug(f"Compiling configuration for system {system_name}") - system_class = SimplePluginService.get_plugin(system_location) - configuration_dict[system_name] = system_class.build_agent_configuration( - user_configuration.get(system_name, {}) - ).dict() - - return AgentSettings.parse_obj(configuration_dict) - - @classmethod - async def determine_agent_name_and_goals( - cls, - user_objective: str, - agent_settings: AgentSettings, - logger: logging.Logger, - ) -> dict: - logger.debug("Loading OpenAI provider.") - provider: OpenAIProvider = cls._get_system_instance( - "openai_provider", - agent_settings, - logger=logger, - ) - logger.debug("Loading agent planner.") - agent_planner: SimplePlanner = cls._get_system_instance( - "planning", - agent_settings, - logger=logger, - model_providers={"openai": provider}, - ) - logger.debug("determining agent name and goals.") - model_response = await agent_planner.decide_name_and_goals( - user_objective, - ) - - return model_response.parsed_result - - @classmethod - def provision_agent( - cls, - agent_settings: AgentSettings, - logger: logging.Logger, - ): - agent_settings.agent.configuration.creation_time = datetime.now().strftime( - "%Y%m%d_%H%M%S" - ) - workspace: SimpleWorkspace = cls._get_system_instance( - "workspace", - agent_settings, - logger=logger, - ) - return workspace.setup_workspace(agent_settings, logger) - - @classmethod - def _get_system_instance( - cls, - system_name: str, - agent_settings: AgentSettings, - logger: logging.Logger, - *args, - **kwargs, - ): - system_locations = agent_settings.agent.configuration.systems.dict() - - system_settings = getattr(agent_settings, system_name) - system_class = SimplePluginService.get_plugin(system_locations[system_name]) - system_instance = system_class( - system_settings, - *args, - logger=logger.getChild(system_name), - **kwargs, - ) - return system_instance - - -def _prune_empty_dicts(d: dict) -> dict: - """ - Prune branches from a nested dictionary if the branch only contains empty - dictionaries at the leaves. - - Args: - d: The dictionary to prune. - - Returns: - The pruned dictionary. - """ - pruned = {} - for key, value in d.items(): - if isinstance(value, dict): - pruned_value = _prune_empty_dicts(value) - if ( - pruned_value - ): # if the pruned dictionary is not empty, add it to the result - pruned[key] = pruned_value - else: - pruned[key] = value - return pruned diff --git a/autogpts/autogpt/autogpt/core/memory/__init__.py b/autogpts/autogpt/autogpt/core/memory/__init__.py deleted file mode 100644 index f77b61039b..0000000000 --- a/autogpts/autogpt/autogpt/core/memory/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""The memory subsystem manages the Agent's long-term memory.""" -from autogpt.core.memory.base import Memory -from autogpt.core.memory.simple import MemorySettings, SimpleMemory - -__all__ = [ - "Memory", - "MemorySettings", - "SimpleMemory", -] diff --git a/autogpts/autogpt/autogpt/core/memory/base.py b/autogpts/autogpt/autogpt/core/memory/base.py deleted file mode 100644 index 74a4284061..0000000000 --- a/autogpts/autogpt/autogpt/core/memory/base.py +++ /dev/null @@ -1,13 +0,0 @@ -import abc - - -class Memory(abc.ABC): - pass - - -class MemoryItem(abc.ABC): - pass - - -class MessageHistory(abc.ABC): - pass diff --git a/autogpts/autogpt/autogpt/core/memory/simple.py b/autogpts/autogpt/autogpt/core/memory/simple.py deleted file mode 100644 index 9a062d704b..0000000000 --- a/autogpts/autogpt/autogpt/core/memory/simple.py +++ /dev/null @@ -1,48 +0,0 @@ -import json -import logging - -from forge.models.config import Configurable, SystemConfiguration, SystemSettings - -from autogpt.core.memory.base import Memory -from autogpt.core.workspace import Workspace - - -class MemoryConfiguration(SystemConfiguration): - pass - - -class MemorySettings(SystemSettings): - configuration: MemoryConfiguration - - -class MessageHistory: - def __init__(self, previous_message_history: list[str]): - self._message_history = previous_message_history - - -class SimpleMemory(Memory, Configurable): - default_settings = MemorySettings( - name="simple_memory", - description="A simple memory.", - configuration=MemoryConfiguration(), - ) - - def __init__( - self, - settings: MemorySettings, - logger: logging.Logger, - workspace: Workspace, - ): - self._configuration = settings.configuration - self._logger = logger - self._message_history = self._load_message_history(workspace) - - @staticmethod - def _load_message_history(workspace: Workspace): - message_history_path = workspace.get_path("message_history.json") - if message_history_path.exists(): - with message_history_path.open("r") as f: - message_history = json.load(f) - else: - message_history = [] - return MessageHistory(message_history) diff --git a/autogpts/autogpt/autogpt/core/planning/__init__.py b/autogpts/autogpt/autogpt/core/planning/__init__.py deleted file mode 100644 index 99ab573f86..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""The planning system organizes the Agent's activities.""" -from autogpt.core.planning.schema import Task, TaskStatus, TaskType -from autogpt.core.planning.simple import PlannerSettings, SimplePlanner - -__all__ = [ - "PlannerSettings", - "SimplePlanner", - "Task", - "TaskStatus", - "TaskType", -] diff --git a/autogpts/autogpt/autogpt/core/planning/base.py b/autogpts/autogpt/autogpt/core/planning/base.py deleted file mode 100644 index 7993c490be..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/base.py +++ /dev/null @@ -1,54 +0,0 @@ -# class Planner(abc.ABC): -# """ -# Manages the agent's planning and goal-setting -# by constructing language model prompts. -# """ -# -# @staticmethod -# @abc.abstractmethod -# async def decide_name_and_goals( -# user_objective: str, -# ) -> LanguageModelResponse: -# """Decide the name and goals of an Agent from a user-defined objective. -# -# Args: -# user_objective: The user-defined objective for the agent. -# -# Returns: -# The agent name and goals as a response from the language model. -# -# """ -# ... -# -# @abc.abstractmethod -# async def plan(self, context: PlanningContext) -> LanguageModelResponse: -# """Plan the next ability for the Agent. -# -# Args: -# context: A context object containing information about the agent's -# progress, result, memories, and feedback. -# -# -# Returns: -# The next ability the agent should take along with thoughts and reasoning. -# -# """ -# ... -# -# @abc.abstractmethod -# def reflect( -# self, -# context: ReflectionContext, -# ) -> LanguageModelResponse: -# """Reflect on a planned ability and provide self-criticism. -# -# -# Args: -# context: A context object containing information about the agent's -# reasoning, plan, thoughts, and criticism. -# -# Returns: -# Self-criticism about the agent's plan. -# -# """ -# ... diff --git a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/__init__.py b/autogpts/autogpt/autogpt/core/planning/prompt_strategies/__init__.py deleted file mode 100644 index 7b62279a7d..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .initial_plan import InitialPlan, InitialPlanConfiguration -from .name_and_goals import NameAndGoals, NameAndGoalsConfiguration -from .next_ability import NextAbility, NextAbilityConfiguration - -__all__ = [ - "InitialPlan", - "InitialPlanConfiguration", - "NameAndGoals", - "NameAndGoalsConfiguration", - "NextAbility", - "NextAbilityConfiguration", -] diff --git a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/initial_plan.py b/autogpts/autogpt/autogpt/core/planning/prompt_strategies/initial_plan.py deleted file mode 100644 index 83f495e407..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/initial_plan.py +++ /dev/null @@ -1,204 +0,0 @@ -import logging - -from forge.llm.prompting import ChatPrompt, LanguageModelClassification, PromptStrategy -from forge.llm.prompting.utils import to_numbered_list -from forge.llm.providers import ( - AssistantChatMessage, - ChatMessage, - CompletionModelFunction, -) -from forge.models.config import SystemConfiguration, UserConfigurable -from forge.models.json_schema import JSONSchema - -from autogpt.core.planning.schema import Task, TaskType - -logger = logging.getLogger(__name__) - - -class InitialPlanConfiguration(SystemConfiguration): - model_classification: LanguageModelClassification = UserConfigurable() - system_prompt_template: str = UserConfigurable() - system_info: list[str] = UserConfigurable() - user_prompt_template: str = UserConfigurable() - create_plan_function: dict = UserConfigurable() - - -class InitialPlan(PromptStrategy): - DEFAULT_SYSTEM_PROMPT_TEMPLATE = ( - "You are an expert project planner. " - "Your responsibility is to create work plans for autonomous agents. " - "You will be given a name, a role, set of goals for the agent to accomplish. " - "Your job is to break down those goals into a set of tasks that the agent can" - " accomplish to achieve those goals. " - "Agents are resourceful, but require clear instructions." - " Each task you create should have clearly defined `ready_criteria` that the" - " agent can check to see if the task is ready to be started." - " Each task should also have clearly defined `acceptance_criteria` that the" - " agent can check to evaluate if the task is complete. " - "You should create as many tasks as you think is necessary to accomplish" - " the goals.\n\n" - "System Info:\n{system_info}" - ) - - DEFAULT_SYSTEM_INFO = [ - "The OS you are running on is: {os_info}", - "It takes money to let you run. Your API budget is ${api_budget:.3f}", - "The current time and date is {current_time}", - ] - - DEFAULT_USER_PROMPT_TEMPLATE = ( - "You are {agent_name}, {agent_role}\n" "Your goals are:\n" "{agent_goals}" - ) - - DEFAULT_CREATE_PLAN_FUNCTION = CompletionModelFunction( - name="create_initial_agent_plan", - description=( - "Creates a set of tasks that forms the initial plan of an autonomous agent." - ), - parameters={ - "task_list": JSONSchema( - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - type=JSONSchema.Type.OBJECT, - properties={ - "objective": JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "An imperative verb phrase that succinctly describes " - "the task." - ), - ), - "type": JSONSchema( - type=JSONSchema.Type.STRING, - description="A categorization for the task.", - enum=[t.value for t in TaskType], - ), - "acceptance_criteria": JSONSchema( - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "A list of measurable and testable criteria that " - "must be met for the task to be considered " - "complete." - ), - ), - ), - "priority": JSONSchema( - type=JSONSchema.Type.INTEGER, - description=( - "A number between 1 and 10 indicating the priority of " - "the task relative to other generated tasks." - ), - minimum=1, - maximum=10, - ), - "ready_criteria": JSONSchema( - type=JSONSchema.Type.ARRAY, - items=JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "A list of measurable and testable criteria that " - "must be met before the task can be started." - ), - ), - ), - }, - ), - ), - }, - ) - - default_configuration: InitialPlanConfiguration = InitialPlanConfiguration( - model_classification=LanguageModelClassification.SMART_MODEL, - system_prompt_template=DEFAULT_SYSTEM_PROMPT_TEMPLATE, - system_info=DEFAULT_SYSTEM_INFO, - user_prompt_template=DEFAULT_USER_PROMPT_TEMPLATE, - create_plan_function=DEFAULT_CREATE_PLAN_FUNCTION.schema, - ) - - def __init__( - self, - model_classification: LanguageModelClassification, - system_prompt_template: str, - system_info: list[str], - user_prompt_template: str, - create_plan_function: dict, - ): - self._model_classification = model_classification - self._system_prompt_template = system_prompt_template - self._system_info = system_info - self._user_prompt_template = user_prompt_template - self._create_plan_function = CompletionModelFunction.parse(create_plan_function) - - @property - def model_classification(self) -> LanguageModelClassification: - return self._model_classification - - def build_prompt( - self, - agent_name: str, - agent_role: str, - agent_goals: list[str], - abilities: list[str], - os_info: str, - api_budget: float, - current_time: str, - **kwargs, - ) -> ChatPrompt: - template_kwargs = { - "agent_name": agent_name, - "agent_role": agent_role, - "os_info": os_info, - "api_budget": api_budget, - "current_time": current_time, - **kwargs, - } - template_kwargs["agent_goals"] = to_numbered_list( - agent_goals, **template_kwargs - ) - template_kwargs["abilities"] = to_numbered_list(abilities, **template_kwargs) - template_kwargs["system_info"] = to_numbered_list( - self._system_info, **template_kwargs - ) - - system_prompt = ChatMessage.system( - self._system_prompt_template.format(**template_kwargs), - ) - user_prompt = ChatMessage.user( - self._user_prompt_template.format(**template_kwargs), - ) - - return ChatPrompt( - messages=[system_prompt, user_prompt], - functions=[self._create_plan_function], - # TODO: - tokens_used=0, - ) - - 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_plan_function.name} function; " - "plan creation failed" - ) - parsed_response: object = response_content.tool_calls[0].function.arguments - parsed_response["task_list"] = [ - Task.parse_obj(task) for task in parsed_response["task_list"] - ] - except KeyError: - logger.debug(f"Failed to parse this response content: {response_content}") - raise - return parsed_response 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 deleted file mode 100644 index f4864e2a8d..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/name_and_goals.py +++ /dev/null @@ -1,146 +0,0 @@ -import logging - -from forge.llm.prompting import ChatPrompt, LanguageModelClassification, PromptStrategy -from forge.llm.providers import ( - AssistantChatMessage, - ChatMessage, - CompletionModelFunction, -) -from forge.models.config import SystemConfiguration, UserConfigurable -from forge.models.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 = response_content.tool_calls[0].function.arguments - except KeyError: - logger.debug(f"Failed to parse this response content: {response_content}") - raise - return parsed_response diff --git a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/next_ability.py b/autogpts/autogpt/autogpt/core/planning/prompt_strategies/next_ability.py deleted file mode 100644 index b397923d95..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/prompt_strategies/next_ability.py +++ /dev/null @@ -1,201 +0,0 @@ -import logging - -from forge.llm.prompting import ChatPrompt, LanguageModelClassification, PromptStrategy -from forge.llm.prompting.utils import to_numbered_list -from forge.llm.providers import ( - AssistantChatMessage, - ChatMessage, - CompletionModelFunction, -) -from forge.models.config import SystemConfiguration, UserConfigurable -from forge.models.json_schema import JSONSchema - -from autogpt.core.planning.schema import Task - -logger = logging.getLogger(__name__) - - -class NextAbilityConfiguration(SystemConfiguration): - model_classification: LanguageModelClassification = UserConfigurable() - system_prompt_template: str = UserConfigurable() - system_info: list[str] = UserConfigurable() - user_prompt_template: str = UserConfigurable() - additional_ability_arguments: dict = UserConfigurable() - - -class NextAbility(PromptStrategy): - DEFAULT_SYSTEM_PROMPT_TEMPLATE = "System Info:\n{system_info}" - - DEFAULT_SYSTEM_INFO = [ - "The OS you are running on is: {os_info}", - "It takes money to let you run. Your API budget is ${api_budget:.3f}", - "The current time and date is {current_time}", - ] - - DEFAULT_USER_PROMPT_TEMPLATE = ( - "Your current task is is {task_objective}.\n" - "You have taken {cycle_count} actions on this task already. " - "Here is the actions you have taken and their results:\n" - "{action_history}\n\n" - "Here is additional information that may be useful to you:\n" - "{additional_info}\n\n" - "Additionally, you should consider the following:\n" - "{user_input}\n\n" - "Your task of {task_objective} is complete when the following acceptance" - " criteria have been met:\n" - "{acceptance_criteria}\n\n" - "Please choose one of the provided functions to accomplish this task. " - "Some tasks may require multiple functions to accomplish. If that is the case," - " choose the function that you think is most appropriate for the current" - " situation given your progress so far." - ) - - DEFAULT_ADDITIONAL_ABILITY_ARGUMENTS = { - "motivation": JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "Your justification for choosing choosing this function instead of a " - "different one." - ), - ), - "self_criticism": JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "Thoughtful self-criticism that explains why this function may not be " - "the best choice." - ), - ), - "reasoning": JSONSchema( - type=JSONSchema.Type.STRING, - description=( - "Your reasoning for choosing this function taking into account the " - "`motivation` and weighing the `self_criticism`." - ), - ), - } - - default_configuration: NextAbilityConfiguration = NextAbilityConfiguration( - model_classification=LanguageModelClassification.SMART_MODEL, - system_prompt_template=DEFAULT_SYSTEM_PROMPT_TEMPLATE, - system_info=DEFAULT_SYSTEM_INFO, - user_prompt_template=DEFAULT_USER_PROMPT_TEMPLATE, - additional_ability_arguments={ - k: v.to_dict() for k, v in DEFAULT_ADDITIONAL_ABILITY_ARGUMENTS.items() - }, - ) - - def __init__( - self, - model_classification: LanguageModelClassification, - system_prompt_template: str, - system_info: list[str], - user_prompt_template: str, - additional_ability_arguments: dict, - ): - self._model_classification = model_classification - self._system_prompt_template = system_prompt_template - self._system_info = system_info - self._user_prompt_template = user_prompt_template - self._additional_ability_arguments = JSONSchema.parse_properties( - additional_ability_arguments - ) - for p in self._additional_ability_arguments.values(): - p.required = True - - @property - def model_classification(self) -> LanguageModelClassification: - return self._model_classification - - def build_prompt( - self, - task: Task, - ability_specs: list[CompletionModelFunction], - os_info: str, - api_budget: float, - current_time: str, - **kwargs, - ) -> ChatPrompt: - template_kwargs = { - "os_info": os_info, - "api_budget": api_budget, - "current_time": current_time, - **kwargs, - } - - for ability in ability_specs: - ability.parameters.update(self._additional_ability_arguments) - - template_kwargs["task_objective"] = task.objective - template_kwargs["cycle_count"] = task.context.cycle_count - template_kwargs["action_history"] = to_numbered_list( - [action.summary() for action in task.context.prior_actions], - no_items_response="You have not taken any actions yet.", - **template_kwargs, - ) - template_kwargs["additional_info"] = to_numbered_list( - [memory.summary() for memory in task.context.memories] - + [info for info in task.context.supplementary_info], - no_items_response=( - "There is no additional information available at this time." - ), - **template_kwargs, - ) - template_kwargs["user_input"] = to_numbered_list( - [user_input for user_input in task.context.user_input], - no_items_response="There are no additional considerations at this time.", - **template_kwargs, - ) - template_kwargs["acceptance_criteria"] = to_numbered_list( - [acceptance_criteria for acceptance_criteria in task.acceptance_criteria], - **template_kwargs, - ) - - template_kwargs["system_info"] = to_numbered_list( - self._system_info, - **template_kwargs, - ) - - system_prompt = ChatMessage.system( - self._system_prompt_template.format(**template_kwargs) - ) - user_prompt = ChatMessage.user( - self._user_prompt_template.format(**template_kwargs) - ) - - return ChatPrompt( - messages=[system_prompt, user_prompt], - functions=ability_specs, - # TODO: - tokens_used=0, - ) - - 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("LLM did not call any function") - - function_name = response_content.tool_calls[0].function.name - function_arguments = response_content.tool_calls[0].function.arguments - parsed_response = { - "motivation": function_arguments.pop("motivation"), - "self_criticism": function_arguments.pop("self_criticism"), - "reasoning": function_arguments.pop("reasoning"), - "next_ability": function_name, - "ability_arguments": function_arguments, - } - except KeyError: - logger.debug(f"Failed to parse this response content: {response_content}") - raise - return parsed_response diff --git a/autogpts/autogpt/autogpt/core/planning/schema.py b/autogpts/autogpt/autogpt/core/planning/schema.py deleted file mode 100644 index b9ba818275..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/schema.py +++ /dev/null @@ -1,48 +0,0 @@ -import enum -from typing import Optional - -from pydantic import BaseModel, Field - -from autogpt.core.ability.schema import AbilityResult - - -class TaskType(str, enum.Enum): - RESEARCH = "research" - WRITE = "write" - EDIT = "edit" - CODE = "code" - DESIGN = "design" - TEST = "test" - PLAN = "plan" - - -class TaskStatus(str, enum.Enum): - BACKLOG = "backlog" - READY = "ready" - IN_PROGRESS = "in_progress" - DONE = "done" - - -class TaskContext(BaseModel): - cycle_count: int = 0 - status: TaskStatus = TaskStatus.BACKLOG - parent: Optional["Task"] = None - prior_actions: list[AbilityResult] = Field(default_factory=list) - memories: list = Field(default_factory=list) - user_input: list[str] = Field(default_factory=list) - supplementary_info: list[str] = Field(default_factory=list) - enough_info: bool = False - - -class Task(BaseModel): - objective: str - type: str # TaskType FIXME: gpt does not obey the enum parameter in its schema - priority: int - ready_criteria: list[str] - acceptance_criteria: list[str] - context: TaskContext = Field(default_factory=TaskContext) - - -# Need to resolve the circular dependency between Task and TaskContext -# once both models are defined. -TaskContext.update_forward_refs() diff --git a/autogpts/autogpt/autogpt/core/planning/simple.py b/autogpts/autogpt/autogpt/core/planning/simple.py deleted file mode 100644 index 6a10198210..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/simple.py +++ /dev/null @@ -1,188 +0,0 @@ -import logging -import platform -import time - -import distro -from forge.llm.prompting import PromptStrategy -from forge.llm.prompting.schema import LanguageModelClassification -from forge.llm.providers import ( - ChatModelProvider, - ChatModelResponse, - CompletionModelFunction, - ModelProviderName, - OpenAIModelName, -) -from forge.models.config import ( - Configurable, - SystemConfiguration, - SystemSettings, - UserConfigurable, -) - -from autogpt.core.planning import prompt_strategies -from autogpt.core.planning.schema import Task -from autogpt.core.runner.client_lib.logging.helpers import dump_prompt -from autogpt.core.workspace import Workspace - - -class LanguageModelConfiguration(SystemConfiguration): - """Struct for model configuration.""" - - model_name: str = UserConfigurable() - provider_name: ModelProviderName = UserConfigurable() - temperature: float = UserConfigurable() - - -class PromptStrategiesConfiguration(SystemConfiguration): - name_and_goals: prompt_strategies.NameAndGoalsConfiguration - initial_plan: prompt_strategies.InitialPlanConfiguration - next_ability: prompt_strategies.NextAbilityConfiguration - - -class PlannerConfiguration(SystemConfiguration): - """Configuration for the Planner subsystem.""" - - models: dict[LanguageModelClassification, LanguageModelConfiguration] - prompt_strategies: PromptStrategiesConfiguration - - -class PlannerSettings(SystemSettings): - """Settings for the Planner subsystem.""" - - configuration: PlannerConfiguration - - -class SimplePlanner(Configurable): - """ - Manages the agent's planning and goal-setting - by constructing language model prompts. - """ - - default_settings = PlannerSettings( - name="planner", - description=( - "Manages the agent's planning and goal-setting " - "by constructing language model prompts." - ), - configuration=PlannerConfiguration( - models={ - LanguageModelClassification.FAST_MODEL: LanguageModelConfiguration( - model_name=OpenAIModelName.GPT3, - provider_name=ModelProviderName.OPENAI, - temperature=0.9, - ), - LanguageModelClassification.SMART_MODEL: LanguageModelConfiguration( - model_name=OpenAIModelName.GPT4, - provider_name=ModelProviderName.OPENAI, - temperature=0.9, - ), - }, - prompt_strategies=PromptStrategiesConfiguration( - name_and_goals=prompt_strategies.NameAndGoals.default_configuration, - initial_plan=prompt_strategies.InitialPlan.default_configuration, - next_ability=prompt_strategies.NextAbility.default_configuration, - ), - ), - ) - - def __init__( - self, - settings: PlannerSettings, - logger: logging.Logger, - model_providers: dict[ModelProviderName, ChatModelProvider], - workspace: Workspace = None, # Workspace is not available during bootstrapping. - ) -> None: - self._configuration = settings.configuration - self._logger = logger - self._workspace = workspace - - self._providers: dict[LanguageModelClassification, ChatModelProvider] = {} - for model, model_config in self._configuration.models.items(): - self._providers[model] = model_providers[model_config.provider_name] - - self._prompt_strategies = { - "name_and_goals": prompt_strategies.NameAndGoals( - **self._configuration.prompt_strategies.name_and_goals.dict() - ), - "initial_plan": prompt_strategies.InitialPlan( - **self._configuration.prompt_strategies.initial_plan.dict() - ), - "next_ability": prompt_strategies.NextAbility( - **self._configuration.prompt_strategies.next_ability.dict() - ), - } - - async def decide_name_and_goals(self, user_objective: str) -> ChatModelResponse: - return await self.chat_with_model( - self._prompt_strategies["name_and_goals"], - user_objective=user_objective, - ) - - async def make_initial_plan( - self, - agent_name: str, - agent_role: str, - agent_goals: list[str], - abilities: list[str], - ) -> ChatModelResponse: - return await self.chat_with_model( - self._prompt_strategies["initial_plan"], - agent_name=agent_name, - agent_role=agent_role, - agent_goals=agent_goals, - abilities=abilities, - ) - - async def determine_next_ability( - self, - task: Task, - ability_specs: list[CompletionModelFunction], - ): - return await self.chat_with_model( - self._prompt_strategies["next_ability"], - task=task, - ability_specs=ability_specs, - ) - - async def chat_with_model( - self, - prompt_strategy: PromptStrategy, - **kwargs, - ) -> ChatModelResponse: - model_classification = prompt_strategy.model_classification - model_configuration = self._configuration.models[model_classification].dict() - self._logger.debug(f"Using model configuration: {model_configuration}") - del model_configuration["provider_name"] - provider = self._providers[model_classification] - - template_kwargs = self._make_template_kwargs_for_strategy(prompt_strategy) - template_kwargs.update(kwargs) - prompt = prompt_strategy.build_prompt(**template_kwargs) - - self._logger.debug(f"Using prompt:\n{dump_prompt(prompt)}\n") - response = await provider.create_chat_completion( - model_prompt=prompt.messages, - functions=prompt.functions, - **model_configuration, - completion_parser=prompt_strategy.parse_response_content, - ) - return response - - def _make_template_kwargs_for_strategy(self, strategy: PromptStrategy): - provider = self._providers[strategy.model_classification] - template_kwargs = { - "os_info": get_os_info(), - "api_budget": provider.get_remaining_budget(), - "current_time": time.strftime("%c"), - } - return template_kwargs - - -def get_os_info() -> str: - os_name = platform.system() - os_info = ( - platform.platform(terse=True) - if os_name != "Linux" - else distro.name(pretty=True) - ) - return os_info diff --git a/autogpts/autogpt/autogpt/core/planning/templates.py b/autogpts/autogpt/autogpt/core/planning/templates.py deleted file mode 100644 index 6464c8b8ad..0000000000 --- a/autogpts/autogpt/autogpt/core/planning/templates.py +++ /dev/null @@ -1,84 +0,0 @@ -# Rules of thumb: -# - Templates don't add new lines at the end of the string. This is the -# responsibility of the or a consuming template. - -#################### -# Planner defaults # -#################### - - -USER_OBJECTIVE = ( - "Write a wikipedia style article about the project: " - "https://github.com/significant-gravitas/AutoGPT" -) - - -# Plan Prompt -# ----------- - - -PLAN_PROMPT_CONSTRAINTS = ( - "~4000 word limit for short term memory. Your short term memory is short, so " - "immediately save important information to files.", - "If you are unsure how you previously did something or want to recall past " - "events, thinking about similar events will help you remember.", - "No user assistance", - "Exclusively use the commands listed below e.g. command_name", -) - -PLAN_PROMPT_RESOURCES = ( - "Internet access for searches and information gathering.", - "Long-term memory management.", - "File output.", -) - -PLAN_PROMPT_PERFORMANCE_EVALUATIONS = ( - "Continuously review and analyze your actions to ensure you are performing to" - " the best of your abilities.", - "Constructively self-criticize your big-picture behavior constantly.", - "Reflect on past decisions and strategies to refine your approach.", - "Every command has a cost, so be smart and efficient. Aim to complete tasks in" - " the least number of steps.", - "Write all code to a file", -) - - -PLAN_PROMPT_RESPONSE_DICT = { - "thoughts": { - "text": "thought", - "reasoning": "reasoning", - "plan": "- short bulleted\n- list that conveys\n- long-term plan", - "criticism": "constructive self-criticism", - "speak": "thoughts summary to say to user", - }, - "command": {"name": "command name", "args": {"arg name": "value"}}, -} - -PLAN_PROMPT_RESPONSE_FORMAT = ( - "You should only respond in JSON format as described below\n" - "Response Format:\n" - "{response_json_structure}\n" - "Ensure the response can be parsed by Python json.loads" -) - -PLAN_TRIGGERING_PROMPT = ( - "Determine which next command to use, and respond using the format specified above:" -) - -PLAN_PROMPT_MAIN = ( - "{header}\n\n" - "GOALS:\n\n{goals}\n\n" - "Info:\n{info}\n\n" - "Constraints:\n{constraints}\n\n" - "Commands:\n{commands}\n\n" - "Resources:\n{resources}\n\n" - "Performance Evaluations:\n{performance_evaluations}\n\n" - "You should only respond in JSON format as described below\n" - "Response Format:\n{response_json_structure}\n" - "Ensure the response can be parsed by Python json.loads" -) - - -########################### -# Parameterized templates # -########################### diff --git a/autogpts/autogpt/autogpt/core/plugin/__init__.py b/autogpts/autogpt/autogpt/core/plugin/__init__.py deleted file mode 100644 index b850114b39..0000000000 --- a/autogpts/autogpt/autogpt/core/plugin/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""The plugin system allows the Agent to be extended with new functionality.""" -from autogpt.core.plugin.base import PluginService - -__all__ = [ - "PluginService", -] diff --git a/autogpts/autogpt/autogpt/core/plugin/base.py b/autogpts/autogpt/autogpt/core/plugin/base.py deleted file mode 100644 index 8eb1dce659..0000000000 --- a/autogpts/autogpt/autogpt/core/plugin/base.py +++ /dev/null @@ -1,159 +0,0 @@ -import abc -import enum -from typing import TYPE_CHECKING, Type - -from forge.models.config import SystemConfiguration, UserConfigurable -from pydantic import BaseModel - -if TYPE_CHECKING: - from forge.llm.providers import ChatModelProvider, EmbeddingModelProvider - - from autogpt.core.ability import Ability, AbilityRegistry - from autogpt.core.memory import Memory - - # Expand to other types as needed - PluginType = ( - Type[Ability] # Swappable now - | Type[AbilityRegistry] # Swappable maybe never - | Type[ChatModelProvider] # Swappable soon - | Type[EmbeddingModelProvider] # Swappable soon - | Type[Memory] # Swappable now - # | Type[Planner] # Swappable soon - ) - - -class PluginStorageFormat(str, enum.Enum): - """Supported plugin storage formats. - - Plugins can be stored at one of these supported locations. - - """ - - INSTALLED_PACKAGE = "installed_package" # Required now, loads system defaults - WORKSPACE = "workspace" # Required now - - # Soon (requires some tooling we don't have yet). - # OPENAPI_URL = "open_api_url" - - # OTHER_FILE_PATH = "other_file_path" # Maybe later (maybe now) - # GIT = "git" # Maybe later (or soon) - # PYPI = "pypi" # Maybe later - - # Long term solution, requires design - # AUTOGPT_PLUGIN_SERVICE = "autogpt_plugin_service" - - # Feature for later maybe, automatically find plugin. - # AUTO = "auto" - - -# Installed package example -# PluginLocation( -# storage_format='installed_package', -# storage_route='autogpt_plugins.twitter.SendTwitterMessage' -# ) -# Workspace example -# PluginLocation( -# storage_format='workspace', -# storage_route='relative/path/to/plugin.pkl' -# OR -# storage_route='relative/path/to/plugin.py' -# ) -# Git -# PluginLocation( -# storage_format='git', -# Exact format TBD. -# storage_route='https://github.com/gravelBridge/AutoGPT-WolframAlpha/blob/main/autogpt-wolframalpha/wolfram_alpha.py' -# ) -# PyPI -# PluginLocation( -# storage_format='pypi', -# storage_route='package_name' -# ) - - -# PluginLocation( -# storage_format='installed_package', -# storage_route='autogpt_plugins.twitter.SendTwitterMessage' -# ) - - -# A plugin storage route. -# -# This is a string that specifies where to load a plugin from -# (e.g. an import path or file path). -PluginStorageRoute = str - - -class PluginLocation(SystemConfiguration): - """A plugin location. - - This is a combination of a plugin storage format and a plugin storage route. - It is used by the PluginService to load plugins. - - """ - - storage_format: PluginStorageFormat = UserConfigurable() - storage_route: PluginStorageRoute = UserConfigurable() - - -class PluginMetadata(BaseModel): - """Metadata about a plugin.""" - - name: str - description: str - location: PluginLocation - - -class PluginService(abc.ABC): - """Base class for plugin service. - - The plugin service should be stateless. This defines the interface for - loading plugins from various storage formats. - - """ - - @staticmethod - @abc.abstractmethod - def get_plugin(plugin_location: PluginLocation) -> "PluginType": - """Get a plugin from a plugin location.""" - ... - - #################################### - # Low-level storage format loaders # - #################################### - @staticmethod - @abc.abstractmethod - def load_from_file_path(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from a file path.""" - - ... - - @staticmethod - @abc.abstractmethod - def load_from_import_path(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from an import path.""" - ... - - @staticmethod - @abc.abstractmethod - def resolve_name_to_path( - plugin_route: PluginStorageRoute, path_type: str - ) -> PluginStorageRoute: - """Resolve a plugin name to a plugin path.""" - ... - - ##################################### - # High-level storage format loaders # - ##################################### - - @staticmethod - @abc.abstractmethod - def load_from_workspace(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from the workspace.""" - ... - - @staticmethod - @abc.abstractmethod - def load_from_installed_package(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from an installed package.""" - ... diff --git a/autogpts/autogpt/autogpt/core/plugin/simple.py b/autogpts/autogpt/autogpt/core/plugin/simple.py deleted file mode 100644 index 7f0e60608d..0000000000 --- a/autogpts/autogpt/autogpt/core/plugin/simple.py +++ /dev/null @@ -1,75 +0,0 @@ -from importlib import import_module -from typing import TYPE_CHECKING - -from autogpt.core.plugin.base import ( - PluginLocation, - PluginService, - PluginStorageFormat, - PluginStorageRoute, -) - -if TYPE_CHECKING: - from autogpt.core.plugin.base import PluginType - - -class SimplePluginService(PluginService): - @staticmethod - def get_plugin(plugin_location: dict | PluginLocation) -> "PluginType": - """Get a plugin from a plugin location.""" - if isinstance(plugin_location, dict): - plugin_location = PluginLocation.parse_obj(plugin_location) - if plugin_location.storage_format == PluginStorageFormat.WORKSPACE: - return SimplePluginService.load_from_workspace( - plugin_location.storage_route - ) - elif plugin_location.storage_format == PluginStorageFormat.INSTALLED_PACKAGE: - return SimplePluginService.load_from_installed_package( - plugin_location.storage_route - ) - else: - raise NotImplementedError( - "Plugin storage format %s is not implemented." - % plugin_location.storage_format - ) - - #################################### - # Low-level storage format loaders # - #################################### - @staticmethod - def load_from_file_path(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from a file path.""" - # TODO: Define an on disk storage format and implement this. - # Can pull from existing zip file loading implementation - raise NotImplementedError("Loading from file path is not implemented.") - - @staticmethod - def load_from_import_path(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from an import path.""" - module_path, _, class_name = plugin_route.rpartition(".") - return getattr(import_module(module_path), class_name) - - @staticmethod - def resolve_name_to_path( - plugin_route: PluginStorageRoute, path_type: str - ) -> PluginStorageRoute: - """Resolve a plugin name to a plugin path.""" - # TODO: Implement a discovery system for finding plugins by name from known - # storage locations. E.g. if we know that path_type is a file path, we can - # search the workspace for it. If it's an import path, we can check the core - # system and the auto_gpt_plugins package. - raise NotImplementedError("Resolving plugin name to path is not implemented.") - - ##################################### - # High-level storage format loaders # - ##################################### - - @staticmethod - def load_from_workspace(plugin_route: PluginStorageRoute) -> "PluginType": - """Load a plugin from the workspace.""" - plugin = SimplePluginService.load_from_file_path(plugin_route) - return plugin - - @staticmethod - def load_from_installed_package(plugin_route: PluginStorageRoute) -> "PluginType": - plugin = SimplePluginService.load_from_import_path(plugin_route) - return plugin diff --git a/autogpts/autogpt/autogpt/core/poetry.lock b/autogpts/autogpt/autogpt/core/poetry.lock deleted file mode 100644 index 9b3a0ccd17..0000000000 --- a/autogpts/autogpt/autogpt/core/poetry.lock +++ /dev/null @@ -1,1345 +0,0 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. - -[[package]] -name = "agent-protocol" -version = "0.3.0" -description = "API for interacting with Agent" -optional = false -python-versions = ">=3.7,<4.0.0" -files = [ - {file = "agent_protocol-0.3.0-py3-none-any.whl", hash = "sha256:717d0fdad2e105968120fa0a99f0b29e08890951e9cbd74740dd10abf4cfe6dc"}, - {file = "agent_protocol-0.3.0.tar.gz", hash = "sha256:6239820753246bbc69f7f531293b32c69f23284158d58873ee55fe9916cd6028"}, -] - -[package.dependencies] -aiofiles = ">=23.1.0,<24.0.0" -click = ">=8.1.6,<9.0.0" -fastapi = ">=0.100.0,<0.101.0" -hypercorn = ">=0.14.4,<0.15.0" -pydantic = ">=1.10.5,<2.0.0" -pytest = ">=7.0.0,<8.0.0" -python-multipart = ">=0.0.6,<0.0.7" -requests = ">=2.31.0,<3.0.0" - -[[package]] -name = "aiofiles" -version = "23.2.1" -description = "File support for asyncio." -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, - {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, -] - -[[package]] -name = "aiohttp" -version = "3.8.5" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "anyio" -version = "4.0.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "certifi" -version = "2023.7.22" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.2.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "distro" -version = "1.8.0" -description = "Distro - an OS platform information API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, - {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastapi" -version = "0.100.1" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, - {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, -] - -[package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" - -[package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] - -[[package]] -name = "frozenlist" -version = "1.4.0" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.8" -files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "hypercorn" -version = "0.14.4" -description = "A ASGI Server based on Hyper libraries and inspired by Gunicorn" -optional = false -python-versions = ">=3.7" -files = [ - {file = "hypercorn-0.14.4-py3-none-any.whl", hash = "sha256:f956200dbf8677684e6e976219ffa6691d6cf795281184b41dbb0b135ab37b8d"}, - {file = "hypercorn-0.14.4.tar.gz", hash = "sha256:3fa504efc46a271640023c9b88c3184fd64993f47a282e8ae1a13ccb285c2f67"}, -] - -[package.dependencies] -h11 = "*" -h2 = ">=3.1.0" -priority = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} -wsproto = ">=0.14.0" - -[package.extras] -docs = ["pydata_sphinx_theme"] -h3 = ["aioquic (>=0.9.0,<1.0)"] -trio = ["exceptiongroup (>=1.1.0)", "trio (>=0.22.0)"] -uvloop = ["uvloop"] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "inflection" -version = "0.5.1" -description = "A port of Ruby on Rails inflector to Python" -optional = false -python-versions = ">=3.5" -files = [ - {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, - {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "jsonschema" -version = "4.19.1" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, - {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.7.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, -] - -[package.dependencies] -referencing = ">=0.28.0" - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "openai" -version = "0.28.0" -description = "Python client library for the OpenAI API" -optional = false -python-versions = ">=3.7.1" -files = [ - {file = "openai-0.28.0-py3-none-any.whl", hash = "sha256:d207ece78469be5648eb87b825753282225155a29d0eec6e02013ddbf8c31c0c"}, - {file = "openai-0.28.0.tar.gz", hash = "sha256:417b78c4c2864ba696aedaf1ccff77be1f04a581ab1739f0a56e0aae19e5a794"}, -] - -[package.dependencies] -aiohttp = "*" -requests = ">=2.20" -tqdm = "*" - -[package.extras] -datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] -embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] -wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "priority" -version = "2.0.0" -description = "A pure-Python implementation of the HTTP/2 priority tree" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa"}, - {file = "priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0"}, -] - -[[package]] -name = "pydantic" -version = "1.10.12" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pytest" -version = "7.4.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "python-multipart" -version = "0.0.6" -description = "A streaming multipart parser for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, -] - -[package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, -] - -[[package]] -name = "referencing" -version = "0.30.2" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, - {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - -[[package]] -name = "regex" -version = "2023.8.8" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.6" -files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rpds-py" -version = "0.10.3" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.10.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e"}, - {file = "rpds_py-0.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff"}, - {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec"}, - {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e"}, - {file = "rpds_py-0.10.3-cp310-none-win32.whl", hash = "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391"}, - {file = "rpds_py-0.10.3-cp310-none-win_amd64.whl", hash = "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453"}, - {file = "rpds_py-0.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f"}, - {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8"}, - {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff"}, - {file = "rpds_py-0.10.3-cp311-none-win32.whl", hash = "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48"}, - {file = "rpds_py-0.10.3-cp311-none-win_amd64.whl", hash = "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b"}, - {file = "rpds_py-0.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6"}, - {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2"}, - {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3"}, - {file = "rpds_py-0.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a"}, - {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496"}, - {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b"}, - {file = "rpds_py-0.10.3-cp38-none-win32.whl", hash = "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1"}, - {file = "rpds_py-0.10.3-cp38-none-win_amd64.whl", hash = "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623"}, - {file = "rpds_py-0.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9"}, - {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc"}, - {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1"}, - {file = "rpds_py-0.10.3-cp39-none-win32.whl", hash = "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065"}, - {file = "rpds_py-0.10.3-cp39-none-win_amd64.whl", hash = "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557"}, - {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac"}, - {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97"}, - {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599"}, - {file = "rpds_py-0.10.3.tar.gz", hash = "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "starlette" -version = "0.27.0" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "tiktoken" -version = "0.5.1" -description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tiktoken-0.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2b0bae3fd56de1c0a5874fb6577667a3c75bf231a6cef599338820210c16e40a"}, - {file = "tiktoken-0.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e529578d017045e2f0ed12d2e00e7e99f780f477234da4aae799ec4afca89f37"}, - {file = "tiktoken-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edd2ffbb789712d83fee19ab009949f998a35c51ad9f9beb39109357416344ff"}, - {file = "tiktoken-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c73d47bdc1a3f1f66ffa019af0386c48effdc6e8797e5e76875f6388ff72e9"}, - {file = "tiktoken-0.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46b8554b9f351561b1989157c6bb54462056f3d44e43aa4e671367c5d62535fc"}, - {file = "tiktoken-0.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92ed3bbf71a175a6a4e5fbfcdb2c422bdd72d9b20407e00f435cf22a68b4ea9b"}, - {file = "tiktoken-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:714efb2f4a082635d9f5afe0bf7e62989b72b65ac52f004eb7ac939f506c03a4"}, - {file = "tiktoken-0.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a10488d1d1a5f9c9d2b2052fdb4cf807bba545818cb1ef724a7f5d44d9f7c3d4"}, - {file = "tiktoken-0.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8079ac065572fe0e7c696dbd63e1fdc12ce4cdca9933935d038689d4732451df"}, - {file = "tiktoken-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ef730db4097f5b13df8d960f7fdda2744fe21d203ea2bb80c120bb58661b155"}, - {file = "tiktoken-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:426e7def5f3f23645dada816be119fa61e587dfb4755de250e136b47a045c365"}, - {file = "tiktoken-0.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:323cec0031358bc09aa965c2c5c1f9f59baf76e5b17e62dcc06d1bb9bc3a3c7c"}, - {file = "tiktoken-0.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5abd9436f02e2c8eda5cce2ff8015ce91f33e782a7423de2a1859f772928f714"}, - {file = "tiktoken-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:1fe99953b63aabc0c9536fbc91c3c9000d78e4755edc28cc2e10825372046a2d"}, - {file = "tiktoken-0.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dcdc630461927718b317e6f8be7707bd0fc768cee1fdc78ddaa1e93f4dc6b2b1"}, - {file = "tiktoken-0.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1f2b3b253e22322b7f53a111e1f6d7ecfa199b4f08f3efdeb0480f4033b5cdc6"}, - {file = "tiktoken-0.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43ce0199f315776dec3ea7bf86f35df86d24b6fcde1babd3e53c38f17352442f"}, - {file = "tiktoken-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a84657c083d458593c0235926b5c993eec0b586a2508d6a2020556e5347c2f0d"}, - {file = "tiktoken-0.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c008375c0f3d97c36e81725308699116cd5804fdac0f9b7afc732056329d2790"}, - {file = "tiktoken-0.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:779c4dea5edd1d3178734d144d32231e0b814976bec1ec09636d1003ffe4725f"}, - {file = "tiktoken-0.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:b5dcfcf9bfb798e86fbce76d40a1d5d9e3f92131aecfa3d1e5c9ea1a20f1ef1a"}, - {file = "tiktoken-0.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b180a22db0bbcc447f691ffc3cf7a580e9e0587d87379e35e58b826ebf5bc7b"}, - {file = "tiktoken-0.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b756a65d98b7cf760617a6b68762a23ab8b6ef79922be5afdb00f5e8a9f4e76"}, - {file = "tiktoken-0.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba9873c253ca1f670e662192a0afcb72b41e0ba3e730f16c665099e12f4dac2d"}, - {file = "tiktoken-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c90d2be0b4c1a2b3f7dde95cd976757817d4df080d6af0ee8d461568c2e2ad"}, - {file = "tiktoken-0.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:709a5220891f2b56caad8327fab86281787704931ed484d9548f65598dea9ce4"}, - {file = "tiktoken-0.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d5a187ff9c786fae6aadd49f47f019ff19e99071dc5b0fe91bfecc94d37c686"}, - {file = "tiktoken-0.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:e21840043dbe2e280e99ad41951c00eff8ee3b63daf57cd4c1508a3fd8583ea2"}, - {file = "tiktoken-0.5.1.tar.gz", hash = "sha256:27e773564232004f4f810fd1f85236673ec3a56ed7f1206fc9ed8670ebedb97a"}, -] - -[package.dependencies] -regex = ">=2022.1.18" -requests = ">=2.26.0" - -[package.extras] -blobfile = ["blobfile (>=2)"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tqdm" -version = "4.66.1" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "urllib3" -version = "2.0.5" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.5-py3-none-any.whl", hash = "sha256:ef16afa8ba34a1f989db38e1dbbe0c302e4289a47856990d0682e374563ce35e"}, - {file = "urllib3-2.0.5.tar.gz", hash = "sha256:13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wsproto" -version = "1.2.0" -description = "WebSockets state-machine based protocol implementation" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, - {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, -] - -[package.dependencies] -h11 = ">=0.9.0,<1" - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[metadata] -lock-version = "2.0" -python-versions = "^3.10" -content-hash = "e5acc4decd67692ad0f08e38d380e1a474ef480449b78dd14321dccf1ad3ca5a" diff --git a/autogpts/autogpt/autogpt/core/pyproject.toml b/autogpts/autogpt/autogpt/core/pyproject.toml deleted file mode 100644 index 059a6bc760..0000000000 --- a/autogpts/autogpt/autogpt/core/pyproject.toml +++ /dev/null @@ -1,77 +0,0 @@ -[tool.poetry] -name = "agpt" -version = "1.0.0" -authors = ["Significant Gravitas "] -maintainers = ["Reinier van der Leer "] -description = "An open-source attempt at an autonomous generalist agent" -readme = "README.md" -repository = "https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpts/agpt" -# documentation = "https://docs.agpt.co/autogpts/agpt" # TODO -classifiers = [ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", -] -packages = [{ include = "autogpt/core", from = "../.." }] - -[tool.poetry.scripts] -cli = "autogpt.core.runner.cli_app.cli:autogpt" -cli-web = "autogpt.core.runner.cli_web_app.cli:autogpt" - -[tool.poetry.dependencies] -python = "^3.10" -agent-protocol = "^0.3.0" -click = "^8.1.7" -colorama = "^0.4.6" -distro = "^1.8.0" -inflection = "^0.5.1" -jsonschema = "^4.19.1" -openai = "^0.28.0" -pydantic = "^1.10.12" -pyyaml = "^6.0.0" -tiktoken = "^0.5.1" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - - -[tool.black] -line-length = 88 -target-version = ['py310'] -include = '\.pyi?$' -packages = ["autogpt"] -extend-exclude = '.+/(dist|.venv|venv|build)/.+' - -[tool.isort] -profile = "black" -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -ensure_newline_before_comments = true -line_length = 88 -sections = [ - "FUTURE", - "STDLIB", - "THIRDPARTY", - "FIRSTPARTY", - "LOCALFOLDER" -] -skip = ''' - .tox - __pycache__ - *.pyc - .env - venv*/* - .venv/* - reports/* - dist/* - -''' - -[tool.pytest.ini_options] -markers = [ - "requires_openai_api_key", - "requires_huggingface_api_key" -] diff --git a/autogpts/autogpt/autogpt/core/runner/__init__.py b/autogpts/autogpt/autogpt/core/runner/__init__.py deleted file mode 100644 index 25c7b65088..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -This module contains the runner for the v2 agent server and client. -""" diff --git a/autogpts/autogpt/autogpt/core/runner/cli_app/__init__.py b/autogpts/autogpt/autogpt/core/runner/cli_app/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/autogpt/core/runner/cli_app/cli.py b/autogpts/autogpt/autogpt/core/runner/cli_app/cli.py deleted file mode 100644 index d54acf53b2..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/cli_app/cli.py +++ /dev/null @@ -1,47 +0,0 @@ -from pathlib import Path - -import click -import yaml - -from autogpt.core.runner.cli_app.main import run_auto_gpt -from autogpt.core.runner.client_lib.shared_click_commands import ( - DEFAULT_SETTINGS_FILE, - make_settings, -) -from autogpt.core.runner.client_lib.utils import coroutine, handle_exceptions - - -@click.group() -def autogpt(): - """Temporary command group for v2 commands.""" - pass - - -autogpt.add_command(make_settings) - - -@autogpt.command() -@click.option( - "--settings-file", - type=click.Path(), - default=DEFAULT_SETTINGS_FILE, -) -@click.option( - "--pdb", - is_flag=True, - help="Drop into a debugger if an error is raised.", -) -@coroutine -async def run(settings_file: str, pdb: bool) -> None: - """Run the AutoGPT agent.""" - click.echo("Running AutoGPT agent...") - settings_file: Path = Path(settings_file) - settings = {} - if settings_file.exists(): - settings = yaml.safe_load(settings_file.read_text()) - main = handle_exceptions(run_auto_gpt, with_debugger=pdb) - await main(settings) - - -if __name__ == "__main__": - autogpt() diff --git a/autogpts/autogpt/autogpt/core/runner/cli_app/main.py b/autogpts/autogpt/autogpt/core/runner/cli_app/main.py deleted file mode 100644 index d6bb5c4f02..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/cli_app/main.py +++ /dev/null @@ -1,74 +0,0 @@ -import click - -from autogpt.core.agent import AgentSettings, SimpleAgent -from autogpt.core.runner.client_lib.logging import ( - configure_root_logger, - get_client_logger, -) -from autogpt.core.runner.client_lib.parser import ( - parse_ability_result, - parse_agent_name_and_goals, - parse_agent_plan, - parse_next_ability, -) - - -async def run_auto_gpt(user_configuration: dict): - """Run the AutoGPT CLI client.""" - - configure_root_logger() - - client_logger = get_client_logger() - client_logger.debug("Getting agent settings") - - agent_workspace = ( - user_configuration.get("workspace", {}).get("configuration", {}).get("root", "") - ) - - if not agent_workspace: # We don't have an agent yet. - ################# - # Bootstrapping # - ################# - # Step 1. Collate the user's settings with the default system settings. - agent_settings: AgentSettings = SimpleAgent.compile_settings( - client_logger, - user_configuration, - ) - - # Step 2. Get a name and goals for the agent. - # First we need to figure out what the user wants to do with the agent. - # We'll do this by asking the user for a prompt. - user_objective = click.prompt("What do you want AutoGPT to do?") - # Ask a language model to determine a name and goals for a suitable agent. - name_and_goals = await SimpleAgent.determine_agent_name_and_goals( - user_objective, - agent_settings, - client_logger, - ) - print("\n" + parse_agent_name_and_goals(name_and_goals)) - # Finally, update the agent settings with the name and goals. - agent_settings.update_agent_name_and_goals(name_and_goals) - - # Step 3. Provision the agent. - agent_workspace = SimpleAgent.provision_agent(agent_settings, client_logger) - client_logger.info("Agent is provisioned") - - # launch agent interaction loop - agent = SimpleAgent.from_workspace( - agent_workspace, - client_logger, - ) - client_logger.info("Agent is loaded") - - plan = await agent.build_initial_plan() - print(parse_agent_plan(plan)) - - while True: - current_task, next_ability = await agent.determine_next_ability(plan) - print(parse_next_ability(current_task, next_ability)) - user_input = click.prompt( - "Should the agent proceed with this ability?", - default="y", - ) - ability_result = await agent.execute_next_ability(user_input) - print(parse_ability_result(ability_result)) diff --git a/autogpts/autogpt/autogpt/core/runner/cli_web_app/__init__.py b/autogpts/autogpt/autogpt/core/runner/cli_web_app/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/autogpt/core/runner/cli_web_app/cli.py b/autogpts/autogpt/autogpt/core/runner/cli_web_app/cli.py deleted file mode 100644 index e00bb33b73..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/cli_web_app/cli.py +++ /dev/null @@ -1,58 +0,0 @@ -import pathlib - -import click -import yaml -from agent_protocol import Agent as AgentProtocol - -from autogpt.core.runner.cli_web_app.server.api import task_handler -from autogpt.core.runner.client_lib.shared_click_commands import ( - DEFAULT_SETTINGS_FILE, - make_settings, -) -from autogpt.core.runner.client_lib.utils import coroutine - - -@click.group() -def autogpt(): - """Temporary command group for v2 commands.""" - pass - - -autogpt.add_command(make_settings) - - -@autogpt.command() -@click.option( - "port", - "--port", - default=8080, - help="The port of the webserver.", - type=click.INT, -) -def server(port: int) -> None: - """Run the AutoGPT runner httpserver.""" - click.echo("Running AutoGPT runner httpserver...") - AgentProtocol.handle_task(task_handler).start(port) - - -@autogpt.command() -@click.option( - "--settings-file", - type=click.Path(), - default=DEFAULT_SETTINGS_FILE, -) -@coroutine -async def client(settings_file) -> None: - """Run the AutoGPT runner client.""" - settings_file = pathlib.Path(settings_file) - settings = {} - if settings_file.exists(): - settings = yaml.safe_load(settings_file.read_text()) - - settings - # TODO: Call the API server with the settings and task, - # using the Python API client for agent protocol. - - -if __name__ == "__main__": - autogpt() diff --git a/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/__init__.py b/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/api.py b/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/api.py deleted file mode 100644 index 76c68a7e80..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/cli_web_app/server/api.py +++ /dev/null @@ -1,96 +0,0 @@ -import logging - -from agent_protocol import StepHandler, StepResult -from forge.config.ai_profile import AIProfile -from forge.config.config import ConfigBuilder -from forge.llm.prompting.prompt import DEFAULT_TRIGGERING_PROMPT -from forge.logging.helpers import user_friendly_output - -from autogpt.agents import Agent -from autogpt.app.main import UserFeedback - - -async def task_handler(task_input) -> StepHandler: - task = task_input.__root__ if task_input else {} - agent = bootstrap_agent(task.get("user_input"), False) - - next_command_name: str | None = None - next_command_args: dict[str, str] | None = None - - async def step_handler(step_input) -> StepResult: - step = step_input.__root__ if step_input else {} - - nonlocal next_command_name, next_command_args - - result = await interaction_step( - agent, - step.get("user_input"), - step.get("user_feedback"), - next_command_name, - next_command_args, - ) - - next_command_name = result["next_step_command_name"] if result else None - next_command_args = result["next_step_command_args"] if result else None - - if not result: - return StepResult(output=None, is_last=True) - return StepResult(output=result) - - return step_handler - - -async def interaction_step( - agent: Agent, - user_input, - user_feedback: UserFeedback | None, - command_name: str | None, - command_args: dict[str, str] | None, -): - """Run one step of the interaction loop.""" - if user_feedback == UserFeedback.EXIT: - return - if user_feedback == UserFeedback.TEXT: - command_name = "human_feedback" - - result: str | None = None - - if command_name is not None: - result = agent.execute(command_name, command_args, user_input) - if result is None: - user_friendly_output( - title="SYSTEM:", message="Unable to execute command", level=logging.WARN - ) - return - - next_command_name, next_command_args, assistant_reply_dict = agent.propose_action() - - return { - "config": agent.config, - "ai_profile": agent.ai_profile, - "result": result, - "assistant_reply_dict": assistant_reply_dict, - "next_step_command_name": next_command_name, - "next_step_command_args": next_command_args, - } - - -def bootstrap_agent(task, continuous_mode) -> Agent: - config = ConfigBuilder.build_config_from_env() - config.logging.level = logging.DEBUG - config.logging.plain_console_output = True - config.continuous_mode = continuous_mode - config.temperature = 0 - config.memory_backend = "no_memory" - ai_profile = AIProfile( - ai_name="AutoGPT", - ai_role="a multi-purpose AI assistant.", - ai_goals=[task], - ) - # FIXME this won't work - ai_profile and triggering_prompt is not a valid argument, - # lacks file_storage, settings and llm_provider - return Agent( - ai_profile=ai_profile, - legacy_config=config, - triggering_prompt=DEFAULT_TRIGGERING_PROMPT, - ) diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/__init__.py b/autogpts/autogpt/autogpt/core/runner/client_lib/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/__init__.py b/autogpts/autogpt/autogpt/core/runner/client_lib/logging/__init__.py deleted file mode 100644 index 6d263b6ad1..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -import logging - -from .config import BelowLevelFilter, FancyConsoleFormatter, configure_root_logger -from .helpers import dump_prompt - - -def get_client_logger(): - # Configure logging before we do anything else. - # Application logs need a place to live. - client_logger = logging.getLogger("autogpt_client_application") - client_logger.setLevel(logging.DEBUG) - - return client_logger - - -__all__ = [ - "configure_root_logger", - "get_client_logger", - "FancyConsoleFormatter", - "BelowLevelFilter", - "dump_prompt", -] diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/config.py b/autogpts/autogpt/autogpt/core/runner/client_lib/logging/config.py deleted file mode 100644 index 912b0751f0..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/config.py +++ /dev/null @@ -1,27 +0,0 @@ -import logging -import sys - -from forge.logging import BelowLevelFilter, FancyConsoleFormatter -from openai._base_client import log as openai_logger - -SIMPLE_LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s" -DEBUG_LOG_FORMAT = ( - "%(asctime)s.%(msecs)03d %(levelname)s %(filename)s:%(lineno)d %(message)s" -) - - -def configure_root_logger(): - console_formatter = FancyConsoleFormatter(SIMPLE_LOG_FORMAT) - - stdout = logging.StreamHandler(stream=sys.stdout) - stdout.setLevel(logging.DEBUG) - stdout.addFilter(BelowLevelFilter(logging.WARNING)) - stdout.setFormatter(console_formatter) - stderr = logging.StreamHandler() - stderr.setLevel(logging.WARNING) - stderr.setFormatter(console_formatter) - - logging.basicConfig(level=logging.DEBUG, handlers=[stdout, stderr]) - - # Disable debug logging from OpenAI library - openai_logger.setLevel(logging.WARNING) diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/helpers.py b/autogpts/autogpt/autogpt/core/runner/client_lib/logging/helpers.py deleted file mode 100644 index 4aa908afa5..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/logging/helpers.py +++ /dev/null @@ -1,28 +0,0 @@ -from math import ceil, floor -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from forge.llm.prompting import ChatPrompt - from forge.llm.providers.schema import ChatMessage - - -SEPARATOR_LENGTH = 42 - - -def dump_prompt(prompt: "ChatPrompt | list[ChatMessage]") -> str: - def separator(text: str): - half_sep_len = (SEPARATOR_LENGTH - 2 - len(text)) / 2 - return f"{floor(half_sep_len)*'-'} {text.upper()} {ceil(half_sep_len)*'-'}" - - if not isinstance(prompt, list): - prompt = prompt.messages - - formatted_messages = "\n".join( - [f"{separator(m.role)}\n{m.content}" for m in prompt] - ) - return f""" -============== {prompt.__class__.__name__} ============== -Length: {len(prompt)} messages -{formatted_messages} -========================================== -""" diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/parser.py b/autogpts/autogpt/autogpt/core/runner/client_lib/parser.py deleted file mode 100755 index 54af17403e..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/parser.py +++ /dev/null @@ -1,45 +0,0 @@ -def parse_agent_name_and_goals(name_and_goals: dict) -> str: - parsed_response = f"Agent Name: {name_and_goals['agent_name']}\n" - parsed_response += f"Agent Role: {name_and_goals['agent_role']}\n" - parsed_response += "Agent Goals:\n" - for i, goal in enumerate(name_and_goals["agent_goals"]): - parsed_response += f"{i+1}. {goal}\n" - return parsed_response - - -def parse_agent_plan(plan: dict) -> str: - parsed_response = "Agent Plan:\n" - for i, task in enumerate(plan["task_list"]): - parsed_response += f"{i+1}. {task['objective']}\n" - parsed_response += f"Task type: {task['type']} " - parsed_response += f"Priority: {task['priority']}\n" - parsed_response += "Ready Criteria:\n" - for j, criteria in enumerate(task["ready_criteria"]): - parsed_response += f" {j+1}. {criteria}\n" - parsed_response += "Acceptance Criteria:\n" - for j, criteria in enumerate(task["acceptance_criteria"]): - parsed_response += f" {j+1}. {criteria}\n" - parsed_response += "\n" - - return parsed_response - - -def parse_next_ability(current_task, next_ability: dict) -> str: - parsed_response = f"Current Task: {current_task.objective}\n" - ability_args = ", ".join( - f"{k}={v}" for k, v in next_ability["ability_arguments"].items() - ) - parsed_response += f"Next Ability: {next_ability['next_ability']}({ability_args})\n" - parsed_response += f"Motivation: {next_ability['motivation']}\n" - parsed_response += f"Self-criticism: {next_ability['self_criticism']}\n" - parsed_response += f"Reasoning: {next_ability['reasoning']}\n" - return parsed_response - - -def parse_ability_result(ability_result) -> str: - parsed_response = f"Ability: {ability_result['ability_name']}\n" - parsed_response += f"Ability Arguments: {ability_result['ability_args']}\n" - parsed_response += f"Ability Result: {ability_result['success']}\n" - parsed_response += f"Message: {ability_result['message']}\n" - parsed_response += f"Data: {ability_result['new_knowledge']}\n" - return parsed_response diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/settings.py b/autogpts/autogpt/autogpt/core/runner/client_lib/settings.py deleted file mode 100644 index 9c99830240..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/settings.py +++ /dev/null @@ -1,14 +0,0 @@ -from pathlib import Path - -import yaml - -from autogpt.core.agent import SimpleAgent - - -def make_user_configuration(settings_file_path: Path): - user_configuration = SimpleAgent.build_user_configuration() - - settings_file_path.parent.mkdir(parents=True, exist_ok=True) - print("Writing settings to", settings_file_path) - with settings_file_path.open("w") as f: - yaml.safe_dump(user_configuration, f) diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/shared_click_commands.py b/autogpts/autogpt/autogpt/core/runner/client_lib/shared_click_commands.py deleted file mode 100644 index 5be52acb83..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/shared_click_commands.py +++ /dev/null @@ -1,19 +0,0 @@ -import pathlib - -import click - -DEFAULT_SETTINGS_FILE = str( - pathlib.Path("~/auto-gpt/default_agent_settings.yml").expanduser() -) - - -@click.command() -@click.option( - "--settings-file", - type=click.Path(), - default=DEFAULT_SETTINGS_FILE, -) -def make_settings(settings_file: str) -> None: - from autogpt.core.runner.client_lib.settings import make_user_configuration - - make_user_configuration(pathlib.Path(settings_file)) diff --git a/autogpts/autogpt/autogpt/core/runner/client_lib/utils.py b/autogpts/autogpt/autogpt/core/runner/client_lib/utils.py deleted file mode 100644 index 887683df7c..0000000000 --- a/autogpts/autogpt/autogpt/core/runner/client_lib/utils.py +++ /dev/null @@ -1,62 +0,0 @@ -import asyncio -import functools -from bdb import BdbQuit -from typing import Any, Callable, Coroutine, ParamSpec, TypeVar - -import click - -P = ParamSpec("P") -T = TypeVar("T") - - -def handle_exceptions( - application_main: Callable[P, T], - with_debugger: bool, -) -> Callable[P, T]: - """Wraps a function so that it drops a user into a debugger if it raises an error. - - This is intended to be used as a wrapper for the main function of a CLI application. - It will catch all errors and drop a user into a debugger if the error is not a - `KeyboardInterrupt`. If the error is a `KeyboardInterrupt`, it will raise the error. - If the error is not a `KeyboardInterrupt`, it will log the error and drop a user - into a debugger if `with_debugger` is `True`. - If `with_debugger` is `False`, it will raise the error. - - Parameters - ---------- - application_main - The function to wrap. - with_debugger - Whether to drop a user into a debugger if an error is raised. - - Returns - ------- - Callable - The wrapped function. - - """ - - @functools.wraps(application_main) - async def wrapped(*args: P.args, **kwargs: P.kwargs) -> T: - try: - return await application_main(*args, **kwargs) - except (BdbQuit, KeyboardInterrupt, click.Abort): - raise - except Exception as e: - if with_debugger: - print(f"Uncaught exception {e}") - import pdb - - pdb.post_mortem() - else: - raise - - return wrapped - - -def coroutine(f: Callable[P, Coroutine[Any, Any, T]]) -> Callable[P, T]: - @functools.wraps(f) - def wrapper(*args: P.args, **kwargs: P.kwargs): - return asyncio.run(f(*args, **kwargs)) - - return wrapper diff --git a/autogpts/autogpt/autogpt/core/workspace/__init__.py b/autogpts/autogpt/autogpt/core/workspace/__init__.py deleted file mode 100644 index ae1877dee0..0000000000 --- a/autogpts/autogpt/autogpt/core/workspace/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -"""The workspace is the central hub for the Agent's on disk resources.""" -from autogpt.core.workspace.base import Workspace -from autogpt.core.workspace.simple import SimpleWorkspace, WorkspaceSettings - -__all__ = [ - "SimpleWorkspace", - "Workspace", - "WorkspaceSettings", -] diff --git a/autogpts/autogpt/autogpt/core/workspace/base.py b/autogpts/autogpt/autogpt/core/workspace/base.py deleted file mode 100644 index b3f1a9fc82..0000000000 --- a/autogpts/autogpt/autogpt/core/workspace/base.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import annotations - -import abc -import logging -import typing -from pathlib import Path - -if typing.TYPE_CHECKING: - from autogpt.core.agent.simple import AgentConfiguration - - -class Workspace(abc.ABC): - """The workspace is the root directory for all generated files. - - The workspace is responsible for creating the root directory and - providing a method for getting the full path to an item in the - workspace. - - """ - - @property - @abc.abstractmethod - def root(self) -> Path: - """The root directory of the workspace.""" - ... - - @property - @abc.abstractmethod - def restrict_to_workspace(self) -> bool: - """Whether to restrict generated paths to the workspace.""" - ... - - @staticmethod - @abc.abstractmethod - def setup_workspace( - configuration: AgentConfiguration, logger: logging.Logger - ) -> Path: - """Create the workspace root directory and set up all initial content. - - Parameters - ---------- - configuration - The Agent's configuration. - logger - The Agent's logger. - - Returns - ------- - Path - The path to the workspace root directory. - - """ - ... - - @abc.abstractmethod - def get_path(self, relative_path: str | Path) -> Path: - """Get the full path for an item in the workspace. - - Parameters - ---------- - relative_path - The path to the item relative to the workspace root. - - Returns - ------- - Path - The full path to the item. - - """ - ... diff --git a/autogpts/autogpt/autogpt/core/workspace/simple.py b/autogpts/autogpt/autogpt/core/workspace/simple.py deleted file mode 100644 index de1eb9364c..0000000000 --- a/autogpts/autogpt/autogpt/core/workspace/simple.py +++ /dev/null @@ -1,194 +0,0 @@ -import json -import logging -import typing -from pathlib import Path - -from forge.models.config import ( - Configurable, - SystemConfiguration, - SystemSettings, - UserConfigurable, -) -from pydantic import SecretField - -from autogpt.core.workspace.base import Workspace - -if typing.TYPE_CHECKING: - # Cyclic import - from autogpt.core.agent.simple import AgentSettings - - -class WorkspaceConfiguration(SystemConfiguration): - root: str - parent: str = UserConfigurable() - restrict_to_workspace: bool = UserConfigurable() - - -class WorkspaceSettings(SystemSettings): - configuration: WorkspaceConfiguration - - -class SimpleWorkspace(Configurable, Workspace): - default_settings = WorkspaceSettings( - name="workspace", - description="The workspace is the root directory for all agent activity.", - configuration=WorkspaceConfiguration( - root="", - parent="~/auto-gpt/agents", - restrict_to_workspace=True, - ), - ) - - NULL_BYTES = ["\0", "\000", "\x00", "\u0000", "%00"] - - def __init__( - self, - settings: WorkspaceSettings, - logger: logging.Logger, - ): - self._configuration = settings.configuration - self._logger = logger.getChild("workspace") - - @property - def root(self) -> Path: - return Path(self._configuration.root) - - @property - def debug_log_path(self) -> Path: - return self.root / "logs" / "debug.log" - - @property - def cycle_log_path(self) -> Path: - return self.root / "logs" / "cycle.log" - - @property - def configuration_path(self) -> Path: - return self.root / "configuration.yml" - - @property - def restrict_to_workspace(self) -> bool: - return self._configuration.restrict_to_workspace - - def get_path(self, relative_path: str | Path) -> Path: - """Get the full path for an item in the workspace. - - Parameters - ---------- - relative_path - The relative path to resolve in the workspace. - - Returns - ------- - Path - The resolved path relative to the workspace. - - """ - return self._sanitize_path( - relative_path, - root=self.root, - restrict_to_root=self.restrict_to_workspace, - ) - - def _sanitize_path( - self, - relative_path: str | Path, - root: str | Path = None, - restrict_to_root: bool = True, - ) -> Path: - """Resolve the relative path within the given root if possible. - - Parameters - ---------- - relative_path - The relative path to resolve. - root - The root path to resolve the relative path within. - restrict_to_root - Whether to restrict the path to the root. - - Returns - ------- - Path - The resolved path. - - Raises - ------ - ValueError - If the path is absolute and a root is provided. - ValueError - If the path is outside the root and the root is restricted. - - """ - - # Posix systems disallow null bytes in paths. Windows is agnostic about it. - # Do an explicit check here for all sorts of null byte representations. - - for null_byte in self.NULL_BYTES: - if null_byte in str(relative_path) or null_byte in str(root): - raise ValueError("embedded null byte") - - if root is None: - return Path(relative_path).resolve() - - self._logger.debug(f"Resolving path '{relative_path}' in workspace '{root}'") - root, relative_path = Path(root).resolve(), Path(relative_path) - self._logger.debug(f"Resolved root as '{root}'") - - if relative_path.is_absolute(): - raise ValueError( - f"Attempted to access absolute path '{relative_path}' " - f"in workspace '{root}'." - ) - full_path = root.joinpath(relative_path).resolve() - - self._logger.debug(f"Joined paths as '{full_path}'") - - if restrict_to_root and not full_path.is_relative_to(root): - raise ValueError( - f"Attempted to access path '{full_path}' outside of workspace '{root}'." - ) - - return full_path - - ################################### - # Factory methods for agent setup # - ################################### - - @staticmethod - def setup_workspace(settings: "AgentSettings", logger: logging.Logger) -> Path: - workspace_parent = settings.workspace.configuration.parent - workspace_parent = Path(workspace_parent).expanduser().resolve() - workspace_parent.mkdir(parents=True, exist_ok=True) - - agent_name = settings.agent.name - - workspace_root = workspace_parent / agent_name - workspace_root.mkdir(parents=True, exist_ok=True) - - settings.workspace.configuration.root = str(workspace_root) - - with (workspace_root / "agent_settings.json").open("w") as f: - settings_json = settings.json( - encoder=lambda x: x.get_secret_value() - if isinstance(x, SecretField) - else x, - ) - f.write(settings_json) - - # TODO: What are all the kinds of logs we want here? - log_path = workspace_root / "logs" - log_path.mkdir(parents=True, exist_ok=True) - (log_path / "debug.log").touch() - (log_path / "cycle.log").touch() - - return workspace_root - - @staticmethod - def load_agent_settings(workspace_root: Path) -> "AgentSettings": - # Cyclic import - from autogpt.core.agent.simple import AgentSettings - - with (workspace_root / "agent_settings.json").open("r") as f: - agent_settings = json.load(f) - - return AgentSettings.parse_obj(agent_settings) diff --git a/autogpts/autogpt/autogpt/memory/vector/__init__.py b/autogpts/autogpt/autogpt/memory/vector/__init__.py deleted file mode 100644 index 2f9e121ac6..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/__init__.py +++ /dev/null @@ -1,156 +0,0 @@ -from forge.config.config import Config - -from .memory_item import MemoryItem, MemoryItemFactory, MemoryItemRelevance -from .providers.base import VectorMemoryProvider as VectorMemory -from .providers.json_file import JSONFileMemory -from .providers.no_memory import NoMemory - -# List of supported memory backends -# Add a backend to this list if the import attempt is successful -supported_memory = ["json_file", "no_memory"] - -# try: -# from .providers.redis import RedisMemory - -# supported_memory.append("redis") -# except ImportError: -# RedisMemory = None - -# try: -# from .providers.pinecone import PineconeMemory - -# supported_memory.append("pinecone") -# except ImportError: -# PineconeMemory = None - -# try: -# from .providers.weaviate import WeaviateMemory - -# supported_memory.append("weaviate") -# except ImportError: -# WeaviateMemory = None - -# try: -# from .providers.milvus import MilvusMemory - -# supported_memory.append("milvus") -# except ImportError: -# MilvusMemory = None - - -def get_memory(config: Config) -> VectorMemory: - """ - Returns a memory object corresponding to the memory backend specified in the config. - - The type of memory object returned depends on the value of the `memory_backend` - attribute in the configuration. E.g. if `memory_backend` is set to "pinecone", a - `PineconeMemory` object is returned. If it is set to "redis", a `RedisMemory` - object is returned. - By default, a `JSONFileMemory` object is returned. - - Params: - config: A configuration object that contains information about the memory - backend to be used and other relevant parameters. - - Returns: - VectorMemory: an instance of a memory object based on the configuration provided - """ - memory = None - - match config.memory_backend: - case "json_file": - memory = JSONFileMemory(config) - - case "pinecone": - raise NotImplementedError( - "The Pinecone memory backend has been rendered incompatible by work on " - "the memory system, and was removed. Whether support will be added " - "back in the future is subject to discussion, feel free to pitch in: " - "https://github.com/Significant-Gravitas/AutoGPT/discussions/4280" - ) - # if not PineconeMemory: - # logger.warning( - # "Error: Pinecone is not installed. Please install pinecone" - # " to use Pinecone as a memory backend." - # ) - # else: - # memory = PineconeMemory(config) - # if clear: - # memory.clear() - - case "redis": - raise NotImplementedError( - "The Redis memory backend has been rendered incompatible by work on " - "the memory system, and has been removed temporarily." - ) - # if not RedisMemory: - # logger.warning( - # "Error: Redis is not installed. Please install redis-py to" - # " use Redis as a memory backend." - # ) - # else: - # memory = RedisMemory(config) - - case "weaviate": - raise NotImplementedError( - "The Weaviate memory backend has been rendered incompatible by work on " - "the memory system, and was removed. Whether support will be added " - "back in the future is subject to discussion, feel free to pitch in: " - "https://github.com/Significant-Gravitas/AutoGPT/discussions/4280" - ) - # if not WeaviateMemory: - # logger.warning( - # "Error: Weaviate is not installed. Please install weaviate-client" - # " to use Weaviate as a memory backend." - # ) - # else: - # memory = WeaviateMemory(config) - - case "milvus": - raise NotImplementedError( - "The Milvus memory backend has been rendered incompatible by work on " - "the memory system, and was removed. Whether support will be added " - "back in the future is subject to discussion, feel free to pitch in: " - "https://github.com/Significant-Gravitas/AutoGPT/discussions/4280" - ) - # if not MilvusMemory: - # logger.warning( - # "Error: pymilvus sdk is not installed, but required " - # "to use Milvus or Zilliz as memory backend. " - # "Please install pymilvus." - # ) - # else: - # memory = MilvusMemory(config) - - case "no_memory": - memory = NoMemory() - - case _: - raise ValueError( - f"Unknown memory backend '{config.memory_backend}'." - " Please check your config." - ) - - if memory is None: - memory = JSONFileMemory(config) - - return memory - - -def get_supported_memory_backends(): - return supported_memory - - -__all__ = [ - "get_memory", - "MemoryItem", - "MemoryItemFactory", - "MemoryItemRelevance", - "JSONFileMemory", - "NoMemory", - "VectorMemory", - # "RedisMemory", - # "PineconeMemory", - # "MilvusMemory", - # "WeaviateMemory", -] diff --git a/autogpts/autogpt/autogpt/memory/vector/memory_item.py b/autogpts/autogpt/autogpt/memory/vector/memory_item.py deleted file mode 100644 index 3de65fe257..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/memory_item.py +++ /dev/null @@ -1,280 +0,0 @@ -from __future__ import annotations - -import json -import logging -from typing import Literal - -import ftfy -import numpy as np -from forge.config.config import Config -from forge.content_processing.text import chunk_content, split_text, summarize_text -from forge.llm.providers import ChatMessage, ChatModelProvider, EmbeddingModelProvider -from pydantic import BaseModel - -from .utils import Embedding, get_embedding - -logger = logging.getLogger(__name__) - -MemoryDocType = Literal["webpage", "text_file", "code_file", "agent_history"] - - -class MemoryItem(BaseModel, arbitrary_types_allowed=True): - """Memory object containing raw content as well as embeddings""" - - raw_content: str - summary: str - chunks: list[str] - chunk_summaries: list[str] - e_summary: Embedding - e_chunks: list[Embedding] - metadata: dict - - def relevance_for(self, query: str, e_query: Embedding | None = None): - return MemoryItemRelevance.of(self, query, e_query) - - def dump(self, calculate_length=False) -> str: - n_chunks = len(self.e_chunks) - return f""" -=============== MemoryItem =============== -Size: {n_chunks} chunks -Metadata: {json.dumps(self.metadata, indent=2)} ----------------- SUMMARY ----------------- -{self.summary} ------------------- RAW ------------------- -{self.raw_content} -========================================== -""" - - def __eq__(self, other: MemoryItem): - return ( - self.raw_content == other.raw_content - and self.chunks == other.chunks - and self.chunk_summaries == other.chunk_summaries - # Embeddings can either be list[float] or np.ndarray[float32], - # and for comparison they must be of the same type - and np.array_equal( - self.e_summary - if isinstance(self.e_summary, np.ndarray) - else np.array(self.e_summary, dtype=np.float32), - other.e_summary - if isinstance(other.e_summary, np.ndarray) - else np.array(other.e_summary, dtype=np.float32), - ) - and np.array_equal( - self.e_chunks - if isinstance(self.e_chunks[0], np.ndarray) - else [np.array(c, dtype=np.float32) for c in self.e_chunks], - other.e_chunks - if isinstance(other.e_chunks[0], np.ndarray) - else [np.array(c, dtype=np.float32) for c in other.e_chunks], - ) - ) - - -class MemoryItemFactory: - def __init__( - self, - llm_provider: ChatModelProvider, - embedding_provider: EmbeddingModelProvider, - ): - self.llm_provider = llm_provider - self.embedding_provider = embedding_provider - - async def from_text( - self, - text: str, - source_type: MemoryDocType, - config: Config, - metadata: dict = {}, - how_to_summarize: str | None = None, - question_for_summary: str | None = None, - ): - logger.debug(f"Memorizing text:\n{'-'*32}\n{text}\n{'-'*32}\n") - - # Fix encoding, e.g. removing unicode surrogates (see issue #778) - text = ftfy.fix_text(text) - - # FIXME: needs ModelProvider - chunks = [ - chunk - for chunk, _ in ( - split_text( - text=text, - config=config, - max_chunk_length=1000, # arbitrary, but shorter ~= better - tokenizer=self.llm_provider.get_tokenizer(config.fast_llm), - ) - if source_type != "code_file" - # TODO: chunk code based on structure/outline - else chunk_content( - content=text, - max_chunk_length=1000, - tokenizer=self.llm_provider.get_tokenizer(config.fast_llm), - ) - ) - ] - logger.debug("Chunks: " + str(chunks)) - - chunk_summaries = [ - summary - for summary, _ in [ - await summarize_text( - text=text_chunk, - instruction=how_to_summarize, - question=question_for_summary, - llm_provider=self.llm_provider, - config=config, - ) - for text_chunk in chunks - ] - ] - logger.debug("Chunk summaries: " + str(chunk_summaries)) - - e_chunks = get_embedding(chunks, config, self.embedding_provider) - - summary = ( - chunk_summaries[0] - if len(chunks) == 1 - else ( - await summarize_text( - text="\n\n".join(chunk_summaries), - instruction=how_to_summarize, - question=question_for_summary, - llm_provider=self.llm_provider, - config=config, - ) - )[0] - ) - logger.debug("Total summary: " + summary) - - # TODO: investigate search performance of weighted average vs summary - # e_average = np.average(e_chunks, axis=0, weights=[len(c) for c in chunks]) - e_summary = get_embedding(summary, config, self.embedding_provider) - - metadata["source_type"] = source_type - - return MemoryItem( - raw_content=text, - summary=summary, - chunks=chunks, - chunk_summaries=chunk_summaries, - e_summary=e_summary, - e_chunks=e_chunks, - metadata=metadata, - ) - - def from_text_file(self, content: str, path: str, config: Config): - return self.from_text(content, "text_file", config, {"location": path}) - - def from_code_file(self, content: str, path: str): - # TODO: implement tailored code memories - return self.from_text(content, "code_file", {"location": path}) - - def from_ai_action(self, ai_message: ChatMessage, result_message: ChatMessage): - # The result_message contains either user feedback - # or the result of the command specified in ai_message - - if ai_message.role != "assistant": - raise ValueError(f"Invalid role on 'ai_message': {ai_message.role}") - - result = ( - result_message.content - if result_message.content.startswith("Command") - else "None" - ) - user_input = ( - result_message.content - if result_message.content.startswith("Human feedback") - else "None" - ) - memory_content = ( - f"Assistant Reply: {ai_message.content}" - "\n\n" - f"Result: {result}" - "\n\n" - f"Human Feedback: {user_input}" - ) - - return self.from_text( - text=memory_content, - source_type="agent_history", - how_to_summarize=( - "if possible, also make clear the link between the command in the" - " assistant's response and the command result. " - "Do not mention the human feedback if there is none.", - ), - ) - - def from_webpage( - self, content: str, url: str, config: Config, question: str | None = None - ): - return self.from_text( - text=content, - source_type="webpage", - config=config, - metadata={"location": url}, - question_for_summary=question, - ) - - -class MemoryItemRelevance(BaseModel): - """ - Class that encapsulates memory relevance search functionality and data. - Instances contain a MemoryItem and its relevance scores for a given query. - """ - - memory_item: MemoryItem - for_query: str - summary_relevance_score: float - chunk_relevance_scores: list[float] - - @staticmethod - def of( - memory_item: MemoryItem, for_query: str, e_query: Embedding | None = None - ) -> MemoryItemRelevance: - e_query = e_query if e_query is not None else get_embedding(for_query) - _, srs, crs = MemoryItemRelevance.calculate_scores(memory_item, e_query) - return MemoryItemRelevance( - for_query=for_query, - memory_item=memory_item, - summary_relevance_score=srs, - chunk_relevance_scores=crs, - ) - - @staticmethod - def calculate_scores( - memory: MemoryItem, compare_to: Embedding - ) -> tuple[float, float, list[float]]: - """ - Calculates similarity between given embedding and all embeddings of the memory - - Returns: - float: the aggregate (max) relevance score of the memory - float: the relevance score of the memory summary - list: the relevance scores of the memory chunks - """ - summary_relevance_score = np.dot(memory.e_summary, compare_to) - chunk_relevance_scores = np.dot(memory.e_chunks, compare_to).tolist() - logger.debug(f"Relevance of summary: {summary_relevance_score}") - logger.debug(f"Relevance of chunks: {chunk_relevance_scores}") - - relevance_scores = [summary_relevance_score, *chunk_relevance_scores] - logger.debug(f"Relevance scores: {relevance_scores}") - return max(relevance_scores), summary_relevance_score, chunk_relevance_scores - - @property - def score(self) -> float: - """The aggregate relevance score of the memory item for the given query""" - return max([self.summary_relevance_score, *self.chunk_relevance_scores]) - - @property - def most_relevant_chunk(self) -> tuple[str, float]: - """The most relevant chunk of the memory item + its score for the given query""" - i_relmax = np.argmax(self.chunk_relevance_scores) - return self.memory_item.chunks[i_relmax], self.chunk_relevance_scores[i_relmax] - - def __str__(self): - return ( - f"{self.memory_item.summary} ({self.summary_relevance_score}) " - f"{self.chunk_relevance_scores}" - ) diff --git a/autogpts/autogpt/autogpt/memory/vector/providers/__init__.py b/autogpts/autogpt/autogpt/memory/vector/providers/__init__.py deleted file mode 100644 index 12a23b6000..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/providers/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .json_file import JSONFileMemory -from .no_memory import NoMemory - -__all__ = [ - "JSONFileMemory", - "NoMemory", -] diff --git a/autogpts/autogpt/autogpt/memory/vector/providers/base.py b/autogpts/autogpt/autogpt/memory/vector/providers/base.py deleted file mode 100644 index b227840f19..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/providers/base.py +++ /dev/null @@ -1,78 +0,0 @@ -import abc -import functools -import logging -from typing import MutableSet, Sequence - -import numpy as np -from forge.config.config import Config - -from .. import MemoryItem, MemoryItemRelevance -from ..utils import Embedding, get_embedding - -logger = logging.getLogger(__name__) - - -class VectorMemoryProvider(MutableSet[MemoryItem]): - @abc.abstractmethod - def __init__(self, config: Config): - pass - - def get(self, query: str, config: Config) -> MemoryItemRelevance | None: - """ - Gets the data from the memory that is most relevant to the given query. - - Args: - query: The query used to retrieve information. - config: The config Object. - - Returns: The most relevant Memory - """ - result = self.get_relevant(query, 1, config) - return result[0] if result else None - - def get_relevant( - self, query: str, k: int, config: Config - ) -> Sequence[MemoryItemRelevance]: - """ - Returns the top-k most relevant memories for the given query - - Args: - query: the query to compare stored memories to - k: the number of relevant memories to fetch - config: The config Object. - - Returns: - list[MemoryItemRelevance] containing the top [k] relevant memories - """ - if len(self) < 1: - return [] - - logger.debug( - f"Searching for {k} relevant memories for query '{query}'; " - f"{len(self)} memories in index" - ) - - relevances = self.score_memories_for_relevance(query, config) - logger.debug(f"Memory relevance scores: {[str(r) for r in relevances]}") - - # take last k items and reverse - top_k_indices = np.argsort([r.score for r in relevances])[-k:][::-1] - - return [relevances[i] for i in top_k_indices] - - def score_memories_for_relevance( - self, for_query: str, config: Config - ) -> Sequence[MemoryItemRelevance]: - """ - Returns MemoryItemRelevance for every memory in the index. - Implementations may override this function for performance purposes. - """ - e_query: Embedding = get_embedding(for_query, config) - return [m.relevance_for(for_query, e_query) for m in self] - - def get_stats(self) -> tuple[int, int]: - """ - Returns: - tuple (n_memories: int, n_chunks: int): the stats of the memory index - """ - return len(self), functools.reduce(lambda t, m: t + len(m.e_chunks), self, 0) diff --git a/autogpts/autogpt/autogpt/memory/vector/providers/json_file.py b/autogpts/autogpt/autogpt/memory/vector/providers/json_file.py deleted file mode 100644 index 7fe6d5fb89..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/providers/json_file.py +++ /dev/null @@ -1,91 +0,0 @@ -from __future__ import annotations - -import logging -from pathlib import Path -from typing import Iterator - -import orjson -from forge.config.config import Config - -from ..memory_item import MemoryItem -from .base import VectorMemoryProvider - -logger = logging.getLogger(__name__) - - -class JSONFileMemory(VectorMemoryProvider): - """Memory backend that stores memories in a JSON file""" - - SAVE_OPTIONS = orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_SERIALIZE_DATACLASS - - file_path: Path - memories: list[MemoryItem] - - def __init__(self, config: Config) -> None: - """Initialize a class instance - - Args: - config: Config object - - Returns: - None - """ - self.file_path = config.workspace_path / f"{config.memory_index}.json" - self.file_path.touch() - logger.debug( - f"Initialized {__class__.__name__} with index path {self.file_path}" - ) - - self.memories = [] - try: - self.load_index() - logger.debug(f"Loaded {len(self.memories)} MemoryItems from file") - except Exception as e: - logger.warning(f"Could not load MemoryItems from file: {e}") - self.save_index() - - def __iter__(self) -> Iterator[MemoryItem]: - return iter(self.memories) - - def __contains__(self, x: MemoryItem) -> bool: - return x in self.memories - - def __len__(self) -> int: - return len(self.memories) - - def add(self, item: MemoryItem): - self.memories.append(item) - logger.debug(f"Adding item to memory: {item.dump()}") - self.save_index() - return len(self.memories) - - def discard(self, item: MemoryItem): - try: - self.remove(item) - except ValueError: # item not in memory - pass - - def clear(self): - """Clears the data in memory.""" - self.memories.clear() - self.save_index() - - def load_index(self): - """Loads all memories from the index file""" - if not self.file_path.is_file(): - logger.debug(f"Index file '{self.file_path}' does not exist") - return - with self.file_path.open("r") as f: - logger.debug(f"Loading memories from index file '{self.file_path}'") - json_index = orjson.loads(f.read()) - for memory_item_dict in json_index: - self.memories.append(MemoryItem.parse_obj(memory_item_dict)) - - def save_index(self): - logger.debug(f"Saving memory index to file {self.file_path}") - with self.file_path.open("wb") as f: - return f.write( - orjson.dumps( - [m.dict() for m in self.memories], option=self.SAVE_OPTIONS - ) - ) diff --git a/autogpts/autogpt/autogpt/memory/vector/providers/no_memory.py b/autogpts/autogpt/autogpt/memory/vector/providers/no_memory.py deleted file mode 100644 index 9b9e92d915..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/providers/no_memory.py +++ /dev/null @@ -1,36 +0,0 @@ -"""A class that does not store any data. This is the default memory provider.""" -from __future__ import annotations - -from typing import Iterator, Optional - -from forge.config.config import Config - -from .. import MemoryItem -from .base import VectorMemoryProvider - - -class NoMemory(VectorMemoryProvider): - """ - A class that does not store any data. This is the default memory provider. - """ - - def __init__(self, config: Optional[Config] = None): - pass - - def __iter__(self) -> Iterator[MemoryItem]: - return iter([]) - - def __contains__(self, x: MemoryItem) -> bool: - return False - - def __len__(self) -> int: - return 0 - - def add(self, item: MemoryItem): - pass - - def discard(self, item: MemoryItem): - pass - - def clear(self): - pass diff --git a/autogpts/autogpt/autogpt/memory/vector/utils.py b/autogpts/autogpt/autogpt/memory/vector/utils.py deleted file mode 100644 index 05ebf51d40..0000000000 --- a/autogpts/autogpt/autogpt/memory/vector/utils.py +++ /dev/null @@ -1,79 +0,0 @@ -import logging -from typing import Any, Sequence, overload - -import numpy as np -from forge.config.config import Config -from forge.llm.providers import EmbeddingModelProvider - -logger = logging.getLogger(__name__) - -Embedding = list[float] | list[np.float32] | np.ndarray[Any, np.dtype[np.float32]] -"""Embedding vector""" - -TText = Sequence[int] -"""Tokenized text""" - - -@overload -async def get_embedding( - input: str | TText, config: Config, embedding_provider: EmbeddingModelProvider -) -> Embedding: - ... - - -@overload -async def get_embedding( - input: list[str] | list[TText], - config: Config, - embedding_provider: EmbeddingModelProvider, -) -> list[Embedding]: - ... - - -async def get_embedding( - input: str | TText | list[str] | list[TText], - config: Config, - embedding_provider: EmbeddingModelProvider, -) -> Embedding | list[Embedding]: - """Get an embedding from the ada model. - - Args: - input: Input text to get embeddings for, encoded as a string or array of tokens. - Multiple inputs may be given as a list of strings or token arrays. - embedding_provider: The provider to create embeddings. - - Returns: - List[float]: The embedding. - """ - multiple = isinstance(input, list) and all(not isinstance(i, int) for i in input) - - if isinstance(input, str): - input = input.replace("\n", " ") - elif multiple and isinstance(input[0], str): - input = [text.replace("\n", " ") for text in input] - - model = config.embedding_model - - logger.debug( - f"Getting embedding{f's for {len(input)} inputs' if multiple else ''}" - f" with model '{model}'" - ) - - if not multiple: - return ( - await embedding_provider.create_embedding( - text=input, - model_name=model, - embedding_parser=lambda e: e, - ) - ).embedding - else: - embeddings = [] - for text in input: - result = await embedding_provider.create_embedding( - text=text, - model_name=model, - embedding_parser=lambda e: e, - ) - embeddings.append(result.embedding) - return embeddings diff --git a/autogpts/autogpt/scripts/git_log_to_release_notes.py b/autogpts/autogpt/scripts/git_log_to_release_notes.py index ba121e406f..bf69a65842 100755 --- a/autogpts/autogpt/scripts/git_log_to_release_notes.py +++ b/autogpts/autogpt/scripts/git_log_to_release_notes.py @@ -9,7 +9,7 @@ from forge.llm.providers import ChatMessage, MultiProvider from forge.llm.providers.anthropic import AnthropicModelName from git import Repo, TagReference -from autogpt.core.runner.client_lib.utils import coroutine +from autogpt.app.utils import coroutine @click.command() diff --git a/autogpts/autogpt/tests/memory/__init__.py b/autogpts/autogpt/tests/memory/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/autogpts/autogpt/tests/memory/_test_json_file_memory.py b/autogpts/autogpt/tests/memory/_test_json_file_memory.py deleted file mode 100644 index f0420205ac..0000000000 --- a/autogpts/autogpt/tests/memory/_test_json_file_memory.py +++ /dev/null @@ -1,126 +0,0 @@ -# sourcery skip: snake-case-functions -"""Tests for JSONFileMemory class""" -import orjson -import pytest -from forge.config.config import Config -from forge.file_storage import FileStorage - -from autogpt.memory.vector import JSONFileMemory, MemoryItem - - -def test_json_memory_init_without_backing_file(config: Config, storage: FileStorage): - index_file = storage.root / f"{config.memory_index}.json" - - assert not index_file.exists() - JSONFileMemory(config) - assert index_file.exists() - assert index_file.read_text() == "[]" - - -def test_json_memory_init_with_backing_empty_file(config: Config, storage: FileStorage): - index_file = storage.root / f"{config.memory_index}.json" - index_file.touch() - - assert index_file.exists() - JSONFileMemory(config) - assert index_file.exists() - assert index_file.read_text() == "[]" - - -def test_json_memory_init_with_backing_invalid_file( - config: Config, storage: FileStorage -): - index_file = storage.root / f"{config.memory_index}.json" - index_file.touch() - - raw_data = {"texts": ["test"]} - data = orjson.dumps(raw_data, option=JSONFileMemory.SAVE_OPTIONS) - with index_file.open("wb") as f: - f.write(data) - - assert index_file.exists() - JSONFileMemory(config) - assert index_file.exists() - assert index_file.read_text() == "[]" - - -def test_json_memory_add(config: Config, memory_item: MemoryItem): - index = JSONFileMemory(config) - index.add(memory_item) - assert index.memories[0] == memory_item - - -def test_json_memory_clear(config: Config, memory_item: MemoryItem): - index = JSONFileMemory(config) - assert index.memories == [] - - index.add(memory_item) - assert index.memories[0] == memory_item, "Cannot test clear() because add() fails" - - index.clear() - assert index.memories == [] - - -def test_json_memory_get(config: Config, memory_item: MemoryItem, mock_get_embedding): - index = JSONFileMemory(config) - assert ( - index.get("test", config) is None - ), "Cannot test get() because initial index is not empty" - - index.add(memory_item) - retrieved = index.get("test", config) - assert retrieved is not None - assert retrieved.memory_item == memory_item - - -def test_json_memory_load_index(config: Config, memory_item: MemoryItem): - index = JSONFileMemory(config) - index.add(memory_item) - - try: - assert index.file_path.exists(), "index was not saved to file" - assert len(index) == 1, f"index contains {len(index)} items instead of 1" - assert index.memories[0] == memory_item, "item in index != added mock item" - except AssertionError as e: - raise ValueError(f"Setting up for load_index test failed: {e}") - - index.memories = [] - index.load_index() - - assert len(index) == 1 - assert index.memories[0] == memory_item - - -@pytest.mark.vcr -@pytest.mark.requires_openai_api_key -def test_json_memory_get_relevant(config: Config, cached_openai_client: None) -> None: - index = JSONFileMemory(config) - mem1 = MemoryItem.from_text_file("Sample text", "sample.txt", config) - mem2 = MemoryItem.from_text_file( - "Grocery list:\n- Pancake mix", "groceries.txt", config - ) - mem3 = MemoryItem.from_text_file( - "What is your favorite color?", "color.txt", config - ) - lipsum = "Lorem ipsum dolor sit amet" - mem4 = MemoryItem.from_text_file(" ".join([lipsum] * 100), "lipsum.txt", config) - index.add(mem1) - index.add(mem2) - index.add(mem3) - index.add(mem4) - - assert index.get_relevant(mem1.raw_content, 1, config)[0].memory_item == mem1 - assert index.get_relevant(mem2.raw_content, 1, config)[0].memory_item == mem2 - assert index.get_relevant(mem3.raw_content, 1, config)[0].memory_item == mem3 - assert [mr.memory_item for mr in index.get_relevant(lipsum, 2, config)] == [ - mem4, - mem1, - ] - - -def test_json_memory_get_stats(config: Config, memory_item: MemoryItem) -> None: - index = JSONFileMemory(config) - index.add(memory_item) - n_memories, n_chunks = index.get_stats() - assert n_memories == 1 - assert n_chunks == 1 diff --git a/autogpts/autogpt/tests/memory/conftest.py b/autogpts/autogpt/tests/memory/conftest.py deleted file mode 100644 index 64ac651dee..0000000000 --- a/autogpts/autogpt/tests/memory/conftest.py +++ /dev/null @@ -1,17 +0,0 @@ -import pytest - -from autogpt.memory.vector.memory_item import MemoryItem -from autogpt.memory.vector.utils import Embedding - - -@pytest.fixture -def memory_item(mock_embedding: Embedding): - return MemoryItem( - raw_content="test content", - summary="test content summary", - chunks=["test content"], - chunk_summaries=["test content summary"], - e_summary=mock_embedding, - e_chunks=[mock_embedding], - metadata={}, - ) diff --git a/autogpts/autogpt/tests/memory/utils.py b/autogpts/autogpt/tests/memory/utils.py deleted file mode 100644 index ca97a7e3fb..0000000000 --- a/autogpts/autogpt/tests/memory/utils.py +++ /dev/null @@ -1,44 +0,0 @@ -import numpy -import pytest -from forge.config.config import Config -from forge.llm.providers import OPEN_AI_EMBEDDING_MODELS -from pytest_mock import MockerFixture - -import autogpt.memory.vector.memory_item as vector_memory_item -import autogpt.memory.vector.providers.base as memory_provider_base -from autogpt.memory.vector import get_memory -from autogpt.memory.vector.utils import Embedding - - -@pytest.fixture -def embedding_dimension(config: Config): - return OPEN_AI_EMBEDDING_MODELS[config.embedding_model].embedding_dimensions - - -@pytest.fixture -def mock_embedding(embedding_dimension: int) -> Embedding: - return numpy.full((1, embedding_dimension), 0.0255, numpy.float32)[0] - - -@pytest.fixture -def mock_get_embedding(mocker: MockerFixture, mock_embedding: Embedding): - mocker.patch.object( - vector_memory_item, - "get_embedding", - return_value=mock_embedding, - ) - mocker.patch.object( - memory_provider_base, - "get_embedding", - return_value=mock_embedding, - ) - - -@pytest.fixture -def memory_none(agent_test_config: Config, mock_get_embedding): - was_memory_backend = agent_test_config.memory_backend - - agent_test_config.memory_backend = "no_memory" - yield get_memory(agent_test_config) - - agent_test_config.memory_backend = was_memory_backend diff --git a/autogpts/forge/forge/__main__.py b/autogpts/forge/forge/__main__.py index a2cd6b73d4..6658f58f3c 100644 --- a/autogpts/forge/forge/__main__.py +++ b/autogpts/forge/forge/__main__.py @@ -8,7 +8,6 @@ from forge.logging.config import configure_logging logger = logging.getLogger(__name__) - logo = """\n\n d8888 888 .d8888b. 8888888b. 88888888888 d88888 888 d88P Y88b 888 Y88b 888 diff --git a/autogpts/forge/forge/config/config.py b/autogpts/forge/forge/config/config.py index b88f00afbf..8423e3df55 100644 --- a/autogpts/forge/forge/config/config.py +++ b/autogpts/forge/forge/config/config.py @@ -79,19 +79,6 @@ class Config(SystemSettings, arbitrary_types_allowed=True): continuous_mode: bool = False continuous_limit: int = 0 - ########## - # Memory # - ########## - memory_backend: str = UserConfigurable("json_file", from_env="MEMORY_BACKEND") - memory_index: str = UserConfigurable("auto-gpt-memory", from_env="MEMORY_INDEX") - redis_host: str = UserConfigurable("localhost", from_env="REDIS_HOST") - redis_port: int = UserConfigurable(default=6379, from_env="REDIS_PORT") - redis_password: str = UserConfigurable("", from_env="REDIS_PASSWORD") - wipe_redis_on_start: bool = UserConfigurable( - default=True, - from_env=lambda: os.getenv("WIPE_REDIS_ON_START", "True") == "True", - ) - ############ # Commands # ############ diff --git a/autogpts/forge/forge/llm/prompting/utils.py b/autogpts/forge/forge/llm/prompting/utils.py index 4d45dec3f7..89fdef4d26 100644 --- a/autogpts/forge/forge/llm/prompting/utils.py +++ b/autogpts/forge/forge/llm/prompting/utils.py @@ -1,5 +1,26 @@ +from math import ceil, floor from typing import Any +from forge.llm.prompting.schema import ChatPrompt + +SEPARATOR_LENGTH = 42 + + +def dump_prompt(prompt: ChatPrompt) -> str: + def separator(text: str): + half_sep_len = (SEPARATOR_LENGTH - 2 - len(text)) / 2 + return f"{floor(half_sep_len)*'-'} {text.upper()} {ceil(half_sep_len)*'-'}" + + formatted_messages = "\n".join( + [f"{separator(m.role)}\n{m.content}" for m in prompt.messages] + ) + return f""" +============== {prompt.__class__.__name__} ============== +Length: {len(prompt.messages)} messages +{formatted_messages} +========================================== +""" + def format_numbered_list(items: list[Any], start_at: int = 1) -> str: return "\n".join(f"{i}. {str(item)}" for i, item in enumerate(items, start_at)) diff --git a/autogpts/forge/forge/logging/config.py b/autogpts/forge/forge/logging/config.py index e338e1c5dd..9ea4c252c8 100644 --- a/autogpts/forge/forge/logging/config.py +++ b/autogpts/forge/forge/logging/config.py @@ -8,6 +8,7 @@ import sys from pathlib import Path from typing import TYPE_CHECKING, Optional +from colorama import Fore, Style from openai._base_client import log as openai_logger from forge.models.config import SystemConfiguration, UserConfigurable diff --git a/docs/content/AutoGPT/configuration/options.md b/docs/content/AutoGPT/configuration/options.md index 54c3c4a281..6d4a8a164f 100644 --- a/docs/content/AutoGPT/configuration/options.md +++ b/docs/content/AutoGPT/configuration/options.md @@ -28,14 +28,9 @@ Configuration is controlled through the `Config` object. You can set configurati - `HUGGINGFACE_IMAGE_MODEL`: HuggingFace model to use for image generation. Default: CompVis/stable-diffusion-v1-4 - `IMAGE_PROVIDER`: Image provider. Options are `dalle`, `huggingface`, and `sdwebui`. Default: dalle - `IMAGE_SIZE`: Default size of image to generate. Default: 256 -- `MEMORY_BACKEND`: Memory back-end to use. Currently `json_file` is the only supported and enabled backend. Default: json_file -- `MEMORY_INDEX`: Value used in the Memory backend for scoping, naming, or indexing. Default: auto-gpt - `OPENAI_API_KEY`: *REQUIRED*- Your [OpenAI API Key](https://platform.openai.com/account/api-keys). - `OPENAI_ORGANIZATION`: Organization ID in OpenAI. Optional. - `PLAIN_OUTPUT`: Plain output, which disables the spinner. Default: False -- `REDIS_HOST`: Redis Host. Default: localhost -- `REDIS_PASSWORD`: Redis Password. Optional. Default: -- `REDIS_PORT`: Redis Port. Default: 6379 - `RESTRICT_TO_WORKSPACE`: The restrict file reading and writing to the workspace directory. Default: True - `SD_WEBUI_AUTH`: Stable Diffusion Web UI username:password pair. Optional. - `SD_WEBUI_URL`: Stable Diffusion Web UI URL. Default: http://localhost:7860 diff --git a/docs/content/challenges/building_challenges.md b/docs/content/challenges/building_challenges.md index 74b11323fd..e1631c6010 100644 --- a/docs/content/challenges/building_challenges.md +++ b/docs/content/challenges/building_challenges.md @@ -33,7 +33,7 @@ Create your agent fixture. ```python def kubernetes_agent( - agent_test_config, memory_json_file, workspace: Workspace + agent_test_config, workspace: Workspace ): # Please choose the commands your agent will need to beat the challenges, the full list is available in the main.py # (we 're working on a better way to design this, for now you have to look at main.py) @@ -54,7 +54,6 @@ def kubernetes_agent( system_prompt = ai_profile.construct_full_prompt() agent_test_config.set_continuous_mode(False) agent = Agent( - memory=memory_json_file, command_registry=command_registry, config=ai_profile, next_action_count=0,