diff options
author | Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> | 2024-01-30 10:57:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-30 09:57:01 +0000 |
commit | 7a07970fc8bd4b03ea459cb0d892005ff5130ffe (patch) | |
tree | 0dc1c5704271ad6890c020f0eb205c397a8fd346 | |
parent | e21721ca3932b20cac04de1b02ad26aaf8efa3fd (diff) |
Remove Ultima provider (#6012)
20 files changed, 8 insertions, 2298 deletions
diff --git a/openbb_platform/PROVIDERS.md b/openbb_platform/PROVIDERS.md index 6116ef0893c..d6ea4587f68 100644 --- a/openbb_platform/PROVIDERS.md +++ b/openbb_platform/PROVIDERS.md @@ -2,10 +2,9 @@ | Provider | URL | Package name | Description | Maintainer | | --- | --- | --- | --- | --- | -| [FMP](./providers/fmp/README.md) | https://financialmodelingprep.com/ | `openbb-fmp` | Access all stocks discounted cash flow statements, market price, stock markets news, and learn more about Financial Modeling. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | -| [Polygon](./providers/polygon/README.md) | https://polygon.io/ | `openbb-polygon` | Free stock data APIs. Real time and historical data, unlimited usage, tick level and aggregate granularity, in standardized JSON and CSV formats. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | -| [Benzinga](./providers/benzinga/README.md) | https://www.benzinga.com/ | `openbb-benzinga` | Stock Market Quotes, Business News, Financial News, Trading Ideas, and Stock Research by Professionals. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | -| [FRED](./providers/fred/README.md) | https://fred.stlouisfed.org/ | `openbb-fred` | Download, graph, and track 823000 economic time series from 114 sources. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | -| [Ultima](./providers/ultima/README.md) | https://ultimainsights.ai | `openbb-ultima` | Ultima Insights harnesses the power of LLMs + GPT to present relevant news to investors, often before it appears on platforms like Bloomberg. Ultima aims to provide timely and significant information for its users. | [@Ultima-Insights](https://github.com/Ultima-Insights) +| [FMP](./providers/fmp/README.md) | <https://financialmodelingprep.com/> | `openbb-fmp` | Access all stocks discounted cash flow statements, market price, stock markets news, and learn more about Financial Modeling. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | +| [Polygon](./providers/polygon/README.md) | <https://polygon.io/> | `openbb-polygon` | Free stock data APIs. Real time and historical data, unlimited usage, tick level and aggregate granularity, in standardized JSON and CSV formats. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | +| [Benzinga](./providers/benzinga/README.md) | <https://www.benzinga.com/> | `openbb-benzinga` | Stock Market Quotes, Business News, Financial News, Trading Ideas, and Stock Research by Professionals. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | +| [FRED](./providers/fred/README.md) | <https://fred.stlouisfed.org/> | `openbb-fred` | Download, graph, and track 823000 economic time series from 114 sources. | [@OpenBB-Finance](https://github.com/OpenBB-finance) | <!-- Add your Data Provider integration above this line --> diff --git a/openbb_platform/README.md b/openbb_platform/README.md index d37133ff382..23c0a5acb96 100644 --- a/openbb_platform/README.md +++ b/openbb_platform/README.md @@ -37,8 +37,6 @@ This will install the following data providers: | openbb-sec | [SEC](https://www.sec.gov/edgar/sec-api-documentation) data connector | pip install openbb-sec | Free | | openbb-tiingo | [Tiingo](https://www.tiingo.com/about/pricing) data connector | pip install openbb-tiingo | Free | | openbb-tradingeconomics | [TradingEconomics](https://tradingeconomics.com/api) data connector | pip install openbb-tradingeconomics | Paid | -| openbb-ultima | [Ultima Insights](https://ultimainsights.ai/openbb) data connector | pip install openbb-ultima | Paid | - To install extensions that expand the core functionalities specify the extension name or use `all` to install all. @@ -48,9 +46,10 @@ pip install openbb[charting] pip install openbb-yfinance ``` -Alternatively, you can install all extensions at once. +Alternatively, you can install all extensions at once. + ```bash -pip install openbb[all] +pip install openbb[all] ``` > Note: These instruction are specific to v4. For installation instructions and documentation for v3 go to our [website](https://docs.openbb.co/sdk). @@ -83,7 +82,7 @@ To fully leverage the OpenBB Platform you need to get some API keys to connect w ### 1. OpenBB Hub -Set your keys at [OpenBB Hub](https://my.openbb.co/app/sdk/api-keys) and get your personal access token from https://my.openbb.co/app/sdk/pat to connect with your account. +Set your keys at [OpenBB Hub](https://my.openbb.co/app/sdk/api-keys) and get your personal access token from <https://my.openbb.co/app/sdk/pat> to connect with your account. ```python >>> from openbb import obb diff --git a/openbb_platform/core/openbb_core/app/service/hub_service.py b/openbb_platform/core/openbb_core/app/service/hub_service.py index 08e5d3655de..22e6330bd76 100644 --- a/openbb_platform/core/openbb_core/app/service/hub_service.py +++ b/openbb_platform/core/openbb_core/app/service/hub_service.py @@ -229,7 +229,6 @@ class HubService: intrinio_api_key=settings.features_keys.API_INTRINIO_KEY, polygon_api_key=settings.features_keys.API_POLYGON_KEY, nasdaq_api_key=settings.features_keys.API_KEY_QUANDL, - ultima_api_key=settings.features_keys.API_ULTIMA_KEY, ) return credentials @@ -249,7 +248,6 @@ class HubService: API_KEY_FINANCIALMODELINGPREP=get_cred("fmp_api_key"), API_POLYGON_KEY=get_cred("polygon_api_key"), API_KEY_QUANDL=get_cred("nasdaq_api_key"), - API_ULTIMA_KEY=get_cred("ultima_api_key"), ) hub_user_settings = HubUserSettings(features_keys=features_keys) return hub_user_settings diff --git a/openbb_platform/extensions/news/integration/test_news_api.py b/openbb_platform/extensions/news/integration/test_news_api.py index 746c62933f7..fd120956a67 100644 --- a/openbb_platform/extensions/news/integration/test_news_api.py +++ b/openbb_platform/extensions/news/integration/test_news_api.py @@ -147,12 +147,6 @@ def test_news_world(params, headers): "source": "bloomberg.com", } ), - # ( - # { - # "provider": "ultima", - # "sectors": "Real Estate", - # } - # ), ], ) @pytest.mark.integration @@ -164,26 +158,3 @@ def test_news_company(params, headers): result = requests.get(url, headers=headers, timeout=10) assert isinstance(result, requests.Response) assert result.status_code == 200 - - -@pytest.mark.skip("openbb-ultima is not installed on the CI.") -@parametrize( - "params", - [ - ( - { - "provider": "ultima", - "sectors": "Real Estate", - } - ), - ], -) -@pytest.mark.integration -def test_news_sector(params, headers): - params = {p: v for p, v in params.items() if v} - - query_str = get_querystring(params, []) - url = f"http://0.0.0.0:8000/api/v1/news/sector?{query_str}" - result = requests.get(url, headers=headers, timeout=10) - assert isinstance(result, requests.Response) - assert result.status_code == 200 diff --git a/openbb_platform/extensions/news/integration/test_news_python.py b/openbb_platform/extensions/news/integration/test_news_python.py index 574e4f7cf5b..dcfa212c08c 100644 --- a/openbb_platform/extensions/news/integration/test_news_python.py +++ b/openbb_platform/extensions/news/integration/test_news_python.py @@ -141,12 +141,6 @@ def test_news_world(params, obb): "source": "bloomberg.com", } ), - # ( - # { - # "provider": "ultima", - # "symbols": "AAPL,MSFT", - # } - # ), ], ) @pytest.mark.integration @@ -157,25 +151,3 @@ def test_news_company(params, obb): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 - - -@pytest.mark.skip("openbb-ultima is not installed on the CI.") -@parametrize( - "params", - [ - ( - { - "provider": "ultima", - "sectors": "Real Estate", - } - ), - ], -) -@pytest.mark.integration -def test_news_sector(params, obb): - params = {p: v for p, v in params.items() if v} - - result = obb.news.sector(**params) - assert result - assert isinstance(result, OBBject) - assert len(result.results) > 0 diff --git a/openbb_platform/providers/ultima/README.md b/openbb_platform/providers/ultima/README.md deleted file mode 100644 index 7e974ee297b..00000000000 --- a/openbb_platform/providers/ultima/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# OpenBB Ultima Provider - -This extension integrates the [Ultima Insights](https://www.ultimainsights.ai/) data provider into the OpenBB Platform. - -## Installation - -To install the extension: - -```bash -pip install openbb-ultima -``` - -For development please check [Contribution Guidelines](https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/CONTRIBUTING.md). - -Documentation available [here](https://docs.openbb.co/platform). diff --git a/openbb_platform/providers/ultima/__init__.py b/openbb_platform/providers/ultima/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 --- a/openbb_platform/providers/ultima/__init__.py +++ /dev/null diff --git a/openbb_platform/providers/ultima/openbb_ultima/__init__.py b/openbb_platform/providers/ultima/openbb_ultima/__init__.py deleted file mode 100644 index 1d7b285740b..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Ultima provider module.""" - -import warnings -from typing import Union - -from openbb_core.provider.abstract.provider import Provider - -ultima_provider: Union[Provider, None] = None - -try: - from openbb_ultima.models.company_news import UltimaCompanyNewsFetcher - from openbb_ultima.models.sector_news import UltimaSectorNewsFetcher - - ultima_provider = Provider( - name="ultima", - website="https://www.ultimainsights.ai/openbb", - description="""Ultima harnesses the power of LLMs to deliver news before it hits the frontpage of Bloomberg.""", - credentials=["api_key"], - fetcher_dict={ - "CompanyNews": UltimaCompanyNewsFetcher, - "SectorNews": UltimaSectorNewsFetcher, - }, - ) -except ImportError: - warnings.warn( - "openbb-ultima is not installed. Please install openbb-ultima to use the Ultima provider." - ) diff --git a/openbb_platform/providers/ultima/openbb_ultima/models/__init__.py b/openbb_platform/providers/ultima/openbb_ultima/models/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/models/__init__.py +++ /dev/null diff --git a/openbb_platform/providers/ultima/openbb_ultima/models/company_news.py b/openbb_platform/providers/ultima/openbb_ultima/models/company_news.py deleted file mode 100644 index 8d28d65cdae..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/models/company_news.py +++ /dev/null @@ -1,95 +0,0 @@ -"""Ultima Company News Model.""" - -from datetime import datetime -from typing import Any, Dict, List, Optional - -from openbb_core.provider.abstract.fetcher import Fetcher -from openbb_core.provider.standard_models.company_news import ( - CompanyNewsData, - CompanyNewsQueryParams, -) -from openbb_ultima.utils.helpers import get_data -from pydantic import Field - - -class UltimaCompanyNewsQueryParams(CompanyNewsQueryParams): - """Ultima Company News Query. - - Source: https://api.ultimainsights.ai/v1/api-docs#/default/get_v1_getOpenBBProInsights__tickers_ - """ - - __alias_dict__ = { - "symbols": "tickers", - } - - -class UltimaCompanyNewsData(CompanyNewsData): - """Ultima Company News Data.""" - - __alias_dict__ = { - "symbols": "ticker", - "date": "publishedDate", - "text": "summary", - "title": "headline", - } - - publisher: str = Field(description="Publisher of the news.") - risk_category: str = Field(description="Risk category of the news.") - - -class UltimaCompanyNewsFetcher( - Fetcher[ - UltimaCompanyNewsQueryParams, - List[UltimaCompanyNewsData], - ] -): - """Transform the query, extract and transform the data from the Ultima endpoints.""" - - @staticmethod - def transform_query(params: Dict[str, Any]) -> UltimaCompanyNewsQueryParams: - """Transform query.""" - return UltimaCompanyNewsQueryParams(**params) - - @staticmethod - def extract_data( - query: UltimaCompanyNewsQueryParams, - credentials: Optional[Dict[str, str]], - **kwargs: Any, - ) -> List[Dict]: - """Extract data from Ultima Insights API.""" - token = credentials.get("ultima_api_key") if credentials else "" - kwargs["auth"] = token - - base_url = "https://api.ultimainsights.ai/v1/getOpenBBProInsights" - - querystring = str(query).split("=")[1].split("'")[1].replace(" ", "") - - data = [] - url = f"{base_url}/{querystring}" - response = get_data(url, **kwargs) - data.extend(response) - - return data - - @staticmethod - def transform_data( - query: UltimaCompanyNewsQueryParams, - data: List[Dict], - **kwargs: Any, - ) -> List[UltimaCompanyNewsData]: - """Transform data.""" - results = [] - for ele in data: - for key in ["8k_filings", "articles", "industry_summary"]: - for item in ele[key]: - # manual assignment required for Pydantic to work - item["symbols"] = ele["ticker"] - item["date"] = datetime.strptime( - item["publishedDate"], "%Y-%m-%d %H:%M:%S" - ) - item["title"] = item["headline"] - item["url"] = item["url"] - item["publisher"] = item["publisher"] - item["risk_category"] = item["riskCategory"] - results.append(UltimaCompanyNewsData.model_validate(item)) - return results diff --git a/openbb_platform/providers/ultima/openbb_ultima/models/sector_news.py b/openbb_platform/providers/ultima/openbb_ultima/models/sector_news.py deleted file mode 100644 index 78c5c23b248..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/models/sector_news.py +++ /dev/null @@ -1,103 +0,0 @@ -"""Ultima Sector News Model.""" - -from datetime import datetime -from typing import Any, Dict, List, Optional - -from openbb_core.provider.abstract.fetcher import Fetcher -from openbb_core.provider.standard_models.sector_news import ( - SectorNewsData, - SectorNewsQueryParams, -) -from openbb_ultima.utils.helpers import get_data -from pydantic import Field - - -class UltimaSectorNewsQueryParams(SectorNewsQueryParams): - """Ultima Sector News Query. - - Source: https://api.ultimainsights.ai/v1/api-docs#/default/get_v1_getOpenBBProInsights__tickers_ - """ - - __alias_dict__ = { - "symbols": "sectors", - } - - -class UltimaSectorNewsData(SectorNewsData): - """Ultima Sector News Data.""" - - __alias_dict__ = { - "symbols": "ticker", - "date": "publishedDate", - "text": "summary", - "title": "headline", - } - - publisher: str = Field(description="Publisher of the news.") - risk_category: str = Field(description="Risk category of the news.") - - -class UltimaSectorNewsFetcher( - Fetcher[ - UltimaSectorNewsQueryParams, - List[UltimaSectorNewsData], - ] -): - """Transform the query, extract and transform the data from the Ultima endpoints.""" - - @staticmethod - def transform_query(params: Dict[str, Any]) -> UltimaSectorNewsQueryParams: - """Transform query.""" - return UltimaSectorNewsQueryParams(**params) - - @staticmethod - def extract_data( - query: UltimaSectorNewsQueryParams, - credentials: Optional[Dict[str, str]], - **kwargs: Any, - ) -> List[Dict]: - """Extract data from Ultima Insights API.""" - token = credentials.get("ultima_api_key") if credentials else "" - kwargs["auth"] = token - - base_url = "https://api.ultimainsights.ai/v1/getCompaniesForSectors" - pro_base_url = "https://api.ultimainsights.ai/v1/getOpenBBProInsights" - - querystring = str(query).split("=")[1].split("'")[1] - - tickers = [] - url = f"{base_url}/{querystring}" - response = get_data(url, **kwargs) - tickers.extend(response) - - querystring = ",".join(tickers) - - data = [] - url = f"{pro_base_url}/{querystring}" - response = get_data(url, **kwargs) - data.extend(response) - - return data - - @staticmethod - def transform_data( - query: UltimaSectorNewsQueryParams, - data: List[Dict], - **kwargs: Any, - ) -> List[UltimaSectorNewsData]: - """Transform data.""" - results = [] - for ele in data: - for key in ["8k_filings", "articles", "industry_summary"]: - for item in ele[key]: - # manual assignment required for Pydantic to work - item["symbols"] = ele["ticker"] - item["date"] = datetime.strptime( - item["publishedDate"], "%Y-%m-%d %H:%M:%S" - ) - item["title"] = item["headline"] - item["url"] = item["url"] - item["publisher"] = item["publisher"] - item["risk_category"] = item["riskCategory"] - results.append(UltimaSectorNewsData.model_validate(item)) - return results diff --git a/openbb_platform/providers/ultima/openbb_ultima/py.typed b/openbb_platform/providers/ultima/openbb_ultima/py.typed deleted file mode 100644 index e69de29bb2d..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/py.typed +++ /dev/null diff --git a/openbb_platform/providers/ultima/openbb_ultima/utils/__init__.py b/openbb_platform/providers/ultima/openbb_ultima/utils/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/utils/__init__.py +++ /dev/null diff --git a/openbb_platform/providers/ultima/openbb_ultima/utils/helpers.py b/openbb_platform/providers/ultima/openbb_ultima/utils/helpers.py deleted file mode 100644 index 1fe2c3dc64e..00000000000 --- a/openbb_platform/providers/ultima/openbb_ultima/utils/helpers.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Ultima Helpers.""" - -from typing import Any, Dict - -from openbb_core.provider import helpers - - -def get_data(url: str, **kwargs: Any) -> Dict: - """Do an API request to Ultima and return the data.""" - auth = kwargs.pop("auth", "") - if auth is None or len(auth) == 0: - raise RuntimeError("Ultima API key is required.") - if "Bearer" not in auth: - auth = f"Bearer {auth}" - result = helpers.make_request( - url, - timeout=10, - headers={"accept": "application/json", "Authorization": auth}, - **kwargs, - ) - if result.status_code != 200: - data = result.json() - message = data.get("message") - raise RuntimeError(f"Error in Ultima request -> {message}") - - return result.json() diff --git a/openbb_platform/providers/ultima/poetry.lock b/openbb_platform/providers/ultima/poetry.lock deleted file mode 100644 index 085721f79a1..00000000000 --- a/openbb_platform/providers/ultima/poetry.lock +++ /dev/null @@ -1,1393 +0,0 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.9.1" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, - {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, - {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, - {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, - {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd1 |