diff --git a/pages/guides/agent-courses/agents-for-ai.mdx b/pages/guides/agent-courses/agents-for-ai.mdx index d4b0f8671..a29d2dfe2 100644 --- a/pages/guides/agent-courses/agents-for-ai.mdx +++ b/pages/guides/agent-courses/agents-for-ai.mdx @@ -17,7 +17,7 @@ At any stage, if you encounter issues or have questions about specific terms or Current version of the AI Engine package is - + ## Quick overview of Fetch.ai Fetch.ai is developing a platform to help build an AI-enabled decentralized digital economy. Agents are @@ -363,7 +363,6 @@ Let's take a look. class SummaryRequest(Model): url: str - SEED_PHRASE = "" AGENT_MAILBOX_KEY = "" OPENAI_API_KEY = "" @@ -379,7 +378,6 @@ Let's take a look. print(summaryAgent.address) print(OPENAI_API_KEY) - @summary_protocol.on_message(model=SummaryRequest, replies={UAgentResponse}) async def summarise(ctx: Context, sender: str, msg: SummaryRequest): @@ -415,7 +413,6 @@ Let's take a look. UAgentResponse(message=(result["output_text"]), type=UAgentResponseType.FINAL), ) - summaryAgent.include(summary_protocol, publish_manifest=True) summaryAgent.run() ``` diff --git a/pages/guides/agent-courses/introductory-course.mdx b/pages/guides/agent-courses/introductory-course.mdx index cb51a878a..6bd637b79 100644 --- a/pages/guides/agent-courses/introductory-course.mdx +++ b/pages/guides/agent-courses/introductory-course.mdx @@ -870,7 +870,7 @@ Let's then define the message handlers for the `query_proto` protocol: We define a protocol `query_proto` using the `Protocol` class of `uagents`. It is defined with a `name` and a `version`. The `handle_query_request()` function is the message handler function defined using the `on_message()` decorator. It handles the `QueryTableRequest` messages and replies with a `QueryTableResponse` message. The handler processes the table availability query based on the provided parameters, checks the table status stored in the agent's storage, and sends the available table numbers as a response to the querying agent. - + Additionally, the handler tracks the total number of queries made and increments the count in storage. On the other hand, `handle_get_total_queries()` is the message handler function defined using the `on_query()` decorator. It handles the `GetTotalQueries` query and replies with a `TotalQueries` message containing the total number of queries made to the system. The handler retrieves the total query count from the agent's storage and responds with the count. The overall script should look as follows: @@ -1220,7 +1220,6 @@ The overall script would be: if not completed: await ctx.send(RESTAURANT_ADDRESS, table_query) - @user.on_message(QueryTableResponse, replies={BookTableRequest}) async def handle_query_response(ctx: Context, sender: str, msg: QueryTableResponse): if len(msg.tables) > 0: @@ -1236,7 +1235,6 @@ The overall script would be: ctx.logger.info("No free tables - nothing more to do") ctx.storage.set("completed", True) - @user.on_message(BookTableResponse, replies=set()) async def handle_book_response(ctx: Context, _sender: str, msg: BookTableResponse): if msg.success: @@ -1246,7 +1244,6 @@ The overall script would be: ctx.storage.set("completed", True) - if __name__ == "__main__": user.run() ``` diff --git a/pages/guides/agents/advanced/agents-async-loops.mdx b/pages/guides/agents/advanced/agents-async-loops.mdx index 1c0250d8d..1ad977595 100644 --- a/pages/guides/agents/advanced/agents-async-loops.mdx +++ b/pages/guides/agents/advanced/agents-async-loops.mdx @@ -55,7 +55,6 @@ Now, paste the below code into it: loop = asyncio.get_event_loop() - agent = Agent( name="looper", seed="", @@ -65,23 +64,19 @@ Now, paste the below code into it: agents=[agent], ) - @agent.on_event("startup") async def startup(ctx: Context): ctx.logger.info(">>> Looper is starting up.") - @agent.on_event("shutdown") async def shutdown(ctx: Context): ctx.logger.info(">>> Looper is shutting down.") - async def coro(): while True: print("doing hard work...") await asyncio.sleep(1) - if __name__ == "__main__": print("Attaching the agent or bureau to the external loop...") loop.create_task(coro()) diff --git a/pages/guides/agents/advanced/dialogues.mdx b/pages/guides/agents/advanced/dialogues.mdx index e47724ce0..6a987ee7f 100644 --- a/pages/guides/agents/advanced/dialogues.mdx +++ b/pages/guides/agents/advanced/dialogues.mdx @@ -76,7 +76,7 @@ class ChitChatDialogue(Dialogue): nodes=[ node1, node2, node3], edges=[ init_session, start_dialogue, cont_dialogue, end_session], ) - + def on_continue_dialogue(self): return super()._on_state_transition( cont_dialogue.name, diff --git a/pages/guides/agents/advanced/localwallet.mdx b/pages/guides/agents/advanced/localwallet.mdx index ac1843951..76bc4bbb3 100644 --- a/pages/guides/agents/advanced/localwallet.mdx +++ b/pages/guides/agents/advanced/localwallet.mdx @@ -44,7 +44,6 @@ from cosmpy.crypto.keypairs import PrivateKey private_key = PrivateKey() ``` - ## Recover an existing private key Let's start by extracting the private key and convert it into a base64 encoded string. You can do this on macOS or Linux for the Fetch.ai network using the FetchD CL. @@ -88,49 +87,44 @@ You can also use an account's mnemonic phrase to get the associated private key. wallet = LocalWallet.from_mnemonic(mnemonic) ``` - ## An Agent that checks for a transaction, and sends funds A simple agent that creates, or loads in a wallet, then validates a transaction has been received. ```python copy filename="local_wallet_agent.py" - + from cosmpy.aerial.wallet import LocalWallet from cosmpy.aerial.client import LedgerClient, NetworkConfig from cosmpy.crypto.keypairs import PrivateKey from uagents import Agent, Context, Model from uagents.network import get_faucet, wait_for_tx_to_complete - + mainnet_ledger = LedgerClient(NetworkConfig.fetchai_mainnet()) - - + class RequestWithTX(Model): message: str tx_hash: str - - + class DataResponse(Model): message: str - - + class PaymentError(Model): message: str tx_hash: str - - + DataSellingAgent = Agent( name="DataSellingAgent", seed="dwefwegferdwdwedgko4o430490349jf340-jffjweiopfnw", port=8001, endpoint=["http://localhost:8001/submit"], ) - + print (DataSellingAgent.address) - + AMOUNT = 1 DENOM = "afet" DATA_TO_SELL = "..." - + ## at first you may want to generate a wallet my_wallet = LocalWallet.generate() ## or open one from a seed you've set @@ -138,16 +132,16 @@ A simple agent that creates, or loads in a wallet, then validates a transaction # pk = my_wallet._private_key ## or from a pk you already have # wallet = LocalWallet(PrivateKey("T7w1yHq1QIcQiSqV27YSwk+i1i+Y4JMKhkpawCQIh6s=")) - + ... - + @DataSellingAgent.on_message(model=RequestWithTX) async def message_handler(ctx: Context, sender: str, msg: RequestWithTX): ctx.logger.info(f"Received message from {sender}: {msg.message}") - + mainnet_ledger.query_tx(msg.tx_hash) tx_resp = await wait_for_tx_to_complete(msg.tx_hash, mainnet_ledger) - + coin_received = tx_resp.events["coin_received"] if ( coin_received["receiver"] == str(my_wallet.address) @@ -155,14 +149,13 @@ A simple agent that creates, or loads in a wallet, then validates a transaction ): ctx.logger.info(f"Transaction was successful: {coin_received}") await ctx.send(sender, DataResponse(message=DATA_TO_SELL)) - + else: await ctx.send(sender, PaymentError(message="Incorrect tx", tx_hash=msg.tx_hash)) - + if __name__ == "__main__": DataSellingAgent.run() - - + ``` Validating a transaction with Cosmpy and uAgents is really easy, and to test the above agent you just need to replicate the `Models` and send a `RequestWithTX` in any function in another agent: diff --git a/pages/guides/agents/advanced/message-verification.mdx b/pages/guides/agents/advanced/message-verification.mdx index 4c1b1fa47..bfe20863c 100644 --- a/pages/guides/agents/advanced/message-verification.mdx +++ b/pages/guides/agents/advanced/message-verification.mdx @@ -38,15 +38,15 @@ Make sure you have read the following resources before going on with this guide: echo. > message_verification.py ``` - + ```py copy filename="ubuntu" touch message_verification.py ``` - + - + 3. We now need to import the necessary classes from `uagents` (`Agent`, `Bureau`, `Context`, and `Model`), `uagents.crypto` (`Identity`) and `hashlib`. Then we would need to define the messages format using the `Message` class as a subclass of `Model`: ```py copy diff --git a/pages/guides/agents/advanced/name-service.mdx b/pages/guides/agents/advanced/name-service.mdx index d1d4b539f..253d373a1 100644 --- a/pages/guides/agents/advanced/name-service.mdx +++ b/pages/guides/agents/advanced/name-service.mdx @@ -29,17 +29,17 @@ First of all, we need to create 2 Python scripts for our two agents using the fo echo. > bob.py ``` - + ```py copy filename="ubuntu" touch bob.py ``` - + Alice: - + ```py copy filename="mac" @@ -149,11 +149,9 @@ from uagents.network import get_faucet, get_name_service_contract # NOTE: Run agent1.py before running agent2.py - class Message(Model): message: str - bob = Agent( name="bob-0", seed="agent bob-0 secret phrase", @@ -161,7 +159,6 @@ bob = Agent( endpoint=["http://localhost:8001/submit"], ) - my_wallet = LocalWallet.from_unsafe_seed("registration test wallet") name_service_contract = get_name_service_contract(test=True) faucet = get_faucet() @@ -170,19 +167,16 @@ DOMAIN = "example.agent" faucet.get_wealth(my_wallet.address()) - @bob.on_event("startup") async def register_agent_name(ctx: Context): await name_service_contract.register( bob.ledger, my_wallet, bob.address, bob.name, DOMAIN ) - @bob.on_message(model=Message) async def message_handler(ctx: Context, sender: str, msg: Message): ctx.logger.info(f"Received message from {sender}: {msg.message}") - if __name__ == "__main__": bob.run() ``` @@ -263,7 +257,6 @@ async def alice_interval_handler(ctx: Context): ctx.logger.info(f"Sending message to {bob_name}...") await ctx.send(bob_name, Message(message="Hello there bob.")) - if __name__ == "__main__": alice.run() ``` diff --git a/pages/guides/agents/advanced/register-in-almanac.mdx b/pages/guides/agents/advanced/register-in-almanac.mdx index 358b80f32..69aa316b8 100644 --- a/pages/guides/agents/advanced/register-in-almanac.mdx +++ b/pages/guides/agents/advanced/register-in-almanac.mdx @@ -36,15 +36,15 @@ Make sure you have read the following resources before going on with this guide: echo. > registration.py ``` - + ```py copy filename="ubuntu" touch registration.py ``` - + - + 2. Then, import the `Agent` class from the `uagents` library to create our agent, and the `fund_agent_if_low` class from the `uagents.setup` module. This function will check if you have enough tokens to register in the Almanac contract, if not it will add testnet tokens to your `Fetch Network address`. Then, create an agent, `alice`, you need to provide the `name`, `seed`, `port` and `endpoint` parameters to correctly run it! The code will look similar to the following: ```py copy filename="registration.py" diff --git a/pages/guides/agents/advanced/utilizing-api-to-build-network-of-task-and-subtask.mdx b/pages/guides/agents/advanced/utilizing-api-to-build-network-of-task-and-subtask.mdx index 77814df4d..9bc86972e 100644 --- a/pages/guides/agents/advanced/utilizing-api-to-build-network-of-task-and-subtask.mdx +++ b/pages/guides/agents/advanced/utilizing-api-to-build-network-of-task-and-subtask.mdx @@ -57,7 +57,7 @@ This agent helps users to read news according to their willingness. This agent t ```python copy filename="news_reading_url_system_agent.py" # Here we demonstrate how we can create a news reading system agent that is compatible with DeltaV - + # After running this agent, it can be registered to DeltaV on Agentverse. For registration you will have to use the agent's address # Import required libraries @@ -80,7 +80,6 @@ This agent helps users to read news according to their willingness. This agent t message = f"YOUR NEWS CONTENT" await ctx.send(sender, UAgentResponse(message = message, type = UAgentResponseType.FINAL)) - # Include the Generate News protocol in your agent agent.include(news_protocol) ``` @@ -112,7 +111,7 @@ This agent asks users for the type and subtype of news they want to read today f # Define a handler for the News generation protocol @generate_news_protocol.on_message(model=GetNewsDetails, replies=UAgentResponse) async def news_details_agent(ctx: Context, sender: str, msg: GetNewsDetails): - + # Logging user request ctx.logger.info(f"Received ticket request from {sender} with prompt: {msg.news_type} and {msg.news_subtype}")#and {msg.news_subtype} # Defining dictionary for country codes @@ -132,7 +131,6 @@ This agent asks users for the type and subtype of news they want to read today f "ukraine": "ua", "united states": "us", "venezuela": "ve", "south africa": "za" } - try: # Generate news based on the requested category. ctx.logger.info('Getting News URL') @@ -161,7 +159,7 @@ This agent asks users for the type and subtype of news they want to read today f news_url = article['url'] ctx.logger.info(f'Regional news {news_url}') await ctx.send(sender, UAgentResponse(message = str(news_url), type = UAgentResponseType.FINAL)) - + elif msg.news_type.lower() == 'keyword': # For Keyword news type main_url = f"https://newsapi.org/v2/top-headlines?q={msg.news_subtype}&apiKey={api_key}" response = requests.get(main_url).json() @@ -179,7 +177,7 @@ This agent asks users for the type and subtype of news they want to read today f # Handle any exceptions that occur during news generation. except Exception as exc: ctx.logger.error(f"Error in generating news: {exc}") - + # Send an error response with details of the encountered error. await ctx.send( sender, @@ -237,7 +235,7 @@ This subtask is triggered if the user wants to read categorical news and it prov ctx.logger.info(news_titles) # Send a successful response with the generated news await ctx.send(sender, UAgentResponse(message = str(news_titles), type = UAgentResponseType.FINAL)) - + # Handle any exceptions that occur during news generation except Exception as exc: ctx.logger.error(f"Error in generating News: {exc}") @@ -250,7 +248,6 @@ This subtask is triggered if the user wants to read categorical news and it prov ) ) - # Include the Generate News protocol in your agent agent.include(generate_cat_news_protocol) ``` @@ -325,7 +322,6 @@ This subtask is triggered if the user wants to read regional or country specific type=UAgentResponseType.ERROR ) ) - # Include the Generate Regional News protocol in your agent agent.include(generate_news_protocol) @@ -349,7 +345,7 @@ This subtask is triggered if the user wants to read keyword specific news, it ge # Define protocol for keyword news generation generate_news_keyw_protocol = Protocol("Generate Keyword News") - + # Define function to generate news according to keyword async def get_keyword_news(keyword): @@ -445,7 +441,7 @@ Click **Save** button after filling out the form. - **'categorical': One from list [business, entertainment, general, health, science, sports, technology].** - **'regional' : What is the country you want to get news for?,** - **'keyword' : What is the keyword you want to read news for?** - + - news_type - **This is type of news user wants to read from options from Categorical, Regional or Keyword. After this ask user for field news_subtype.** - news_url_content - **Trigger corresponding secondary function according to 'news_type' given by user to get this field:** diff --git a/pages/guides/agents/getting-started/create-a-uagent.mdx b/pages/guides/agents/getting-started/create-a-uagent.mdx index cf5b21ddf..cb89cd65a 100644 --- a/pages/guides/agents/getting-started/create-a-uagent.mdx +++ b/pages/guides/agents/getting-started/create-a-uagent.mdx @@ -1,5 +1,4 @@ -import { CodeGroup } from "../../../../components/code"; -import { DocsCode } from "../../../../components/code"; +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; # Creating your first agent @@ -32,13 +31,13 @@ Make sure you have read the following resources before going on with this guide: touch first_agent.py ``` - + ```py copy filename="windows" echo. > first_agent.py ``` - + ```py copy filename="ubuntu" touch first_agent.py @@ -48,23 +47,60 @@ Make sure you have read the following resources before going on with this guide: 2. We then need to import the `Agent` and `Context` classes from the `uagents` library, and then create an agent using the class `Agent`: - ```py copy - from uagents import Agent, Context - agent = Agent(name="alice", seed="secret_seed_phrase") - ``` + + + + + + + ```py copy filename="first_agent.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="secret_seed_phrase") + +``` + + + + + It is optional but useful to include a `seed` parameter when creating an agent to set fixed [addresses ↗️](/guides/agents/getting-uagent-address). Otherwise, random addresses will be generated every time you run the agent. Your address is kind of important, as this is how other agents will identify you. 3. Let's define a `say_hello()` function for our agent to print a message periodically saying `hello, my name is ...`: - ```py copy - @agent.on_event("startup") - async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + + + + + + ```py copy filename="first_agent.py" + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + if __name__ == "__main__": + agent.run() + +``` + + + + - if __name__ == "__main__": - agent.run() - ``` The `.on_event("startup")` decorator defines a behavior for this agent when it is run. In this case, the agent will execute the `say_hello()` function when the agent starts. The `Context` object is a collection of data and functions related to the agent. In this case, we just use the agent's `name`, `alice`. The agent executes the function and uses the `ctx.logger.info()` method to print the message. @@ -72,18 +108,36 @@ Make sure you have read the following resources before going on with this guide: The overall script should look as follows: -```py copy filename="first_agent.py" -from uagents import Agent, Context + + + + + + + ```py copy filename="first_agent.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="secret_seed_phrase") + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + if __name__ == "__main__": + agent.run() + +``` + -agent = Agent(name="alice", seed="secret_seed_phrase") + -@agent.on_event("startup") -async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") -if __name__ == "__main__": - agent.run() -``` ### Run your agent diff --git a/pages/guides/agents/getting-started/getting-uagent-address.mdx b/pages/guides/agents/getting-started/getting-uagent-address.mdx index 39074452e..534ce32a2 100644 --- a/pages/guides/agents/getting-started/getting-uagent-address.mdx +++ b/pages/guides/agents/getting-started/getting-uagent-address.mdx @@ -1,4 +1,4 @@ -import { CodeGroup, DocsCode } from "../../../../components/code"; +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; # Agents address @@ -39,32 +39,51 @@ You can print the `uAgent address` related to your agent in the following way: touch uagent_address.py ``` - + ```py copy filename="windows" echo. > uagent_address.py ``` - + ```py copy filename="ubuntu" touch uagent_address.py ``` - + 2. We then need to import the `Agent` class from the `uagents` library to create an agent, `alice`. Then, using the `print()` function, we will print the related `uAgent address`. Importantly, remember that the `seed` parameter is used, when creating an agent, to set fixed addresses, otherwise a random address will be generated every time you run the agent: - ```py copy filename="uagent_address.py" - from uagents import Agent + + + + + + + ```py copy filename="uagent_address.py" + + from uagents import Agent + + agent = Agent(name="alice", seed="alice recovery phrase") + + print("uAgent address: ", agent.address) + + if __name__ == "__main__": + agent.run() + +``` + - agent = Agent(name="alice", seed="alice recovery phrase") + - print("uAgent address: ", agent.address) - if __name__ == "__main__": - agent.run() - ``` 3. Save the script. @@ -87,32 +106,51 @@ You can print the `Fetch network address` related to your agent in the following touch fetch_address.py ``` - + ```py copy filename="windows" echo. > fetch_address.py ``` - + ```py copy filename="ubuntu" touch fetch_address.py ``` - + 2. As before, we first need to import the `Agent` class from the `uagents` library to create an Agent, `alice`. Then, using the `print()` function, we will print the related `Fetch Network address`: - ```py copy filename="fetch_address.py" - from uagents import Agent + + + + + + + ```py copy filename="fetch_address.py" + + from uagents import Agent + + agent = Agent(name="alice", seed="alice recovery phrase") + + print("Fetch network address: ", agent.wallet.address()) + + if __name__ == "__main__": + agent.run() + +``` + - agent = Agent(name="alice", seed="alice recovery phrase") + - print("Fetch network address: ", agent.wallet.address()) - if __name__ == "__main__": - agent.run() - ``` 3. Save the script. @@ -143,13 +181,13 @@ In this guide, we aim at showing how to create an agent being able to say hello touch my_agent.py ``` - + ```py copy filename="windows" echo. > my_agent.py ``` - + ```py copy filename="ubuntu" touch my_agent.py @@ -159,22 +197,60 @@ In this guide, we aim at showing how to create an agent being able to say hello 2. We then need to import the necessary classes `Agent` and `Context` from the `uagents` library, and then create an instance of the `Agent` class, `alice`. Below you can see the `agent` object being initialized: - ```py copy - from uagents import Agent, Context + + + + + + + ```py copy filename="my_agent.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="alice recovery phrase") + +``` + + + + - agent = Agent(name="alice", seed="alice recovery phrase") - ``` 3. We would then need to assign the agent the behavior to be executed. In this case, `agent` could send a message when it is being run saying hello and printing its `name` and `address` using the `agent` object: - ```py copy - @agent.on_event("startup") - async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + + + + + + ```py copy filename="my_agent.py" + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + if __name__ == "__main__": + agent.run() + +``` + + + + - if __name__ == "__main__": - agent.run() - ``` This `introduce_agent()` function takes a single argument `ctx` of type `Context`. The message is printed out using the `ctx.logger.info()` method, and includes the agent's name obtained from attribute `name` and retrieved using `agent.name()` method. The same for the agent's address, which is obtained from attribute `address` and retrieved using `agent.address()` method. @@ -182,18 +258,37 @@ In this guide, we aim at showing how to create an agent being able to say hello The overall script should look as follows: -```py copy filename="my_agent.py" -from uagents import Agent, Context + + + + + + + ```py copy filename="my_agent.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="alice recovery phrase") + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + if __name__ == "__main__": + agent.run() -agent = Agent(name="alice", seed="alice recovery phrase") +``` + + + -@agent.on_event("startup") -async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") -if __name__ == "__main__": - agent.run() -``` ### Run the script diff --git a/pages/guides/agents/intermediate/agent-functions.mdx b/pages/guides/agents/intermediate/agent-functions.mdx index cadae8a44..3c585e55b 100644 --- a/pages/guides/agents/intermediate/agent-functions.mdx +++ b/pages/guides/agents/intermediate/agent-functions.mdx @@ -1,5 +1,6 @@ import { Callout } from 'nextra/components' import PackageVersion from 'components/package-version' +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; # Agent Functions @@ -43,45 +44,63 @@ This system is pretty simple and makes you get started as quickly as possible. Y ### The agent - ```py copy filename="simple_function.py" - from uagents.setup import fund_agent_if_low - from uagents import Agent, Context, Protocol, Model - import random - from uagents import Field - from ai_engine import UAgentResponse, UAgentResponseType - import sys + + + + + + + ```py copy filename="simple_function.py" + + from uagents.setup import fund_agent_if_low + from uagents import Agent, Context, Protocol, Model + import random + from uagents import Field + from ai_engine import UAgentResponse, UAgentResponseType + import sys + + dungeons = Agent( + name="dungeonsanddragonsdiceroll", + port=6145, + seed="RANDOM STRINGS", + endpoint=["http://YOUR_IP:6145/submit"], + ) + + fund_agent_if_low(dungeons.wallet.address()) + + @dungeons.on_event("startup") + async def hi(ctx: Context): + ctx.logger.info(dungeons.address) + + class Request(Model): + dice_sides: int = Field(description="How many sides does your dice need?") + + + dice_roll_protocol = Protocol("DungeonsAndDragonsDiceRoll") + + @dice_roll_protocol.on_message(model=Request, replies={UAgentResponse}) + async def roll_dice(ctx: Context, sender: str, msg: Request): + result = str(random.randint(1, msg.dice_sides)) + message = f"Dice roll result: {result}" + await ctx.send( + sender, UAgentResponse(message=message, type=UAgentResponseType.FINAL) + ) + + dungeons.include(dice_roll_protocol, publish_manifest=True) + + dungeons.run() + +``` + + + - dungeons = Agent( - name="dungeonsanddragonsdiceroll", - port=6145, - seed="RANDOM STRINGS", - endpoint=["http://YOUR_IP:6145/submit"], - ) - fund_agent_if_low(dungeons.wallet.address()) - - @dungeons.on_event("startup") - async def hi(ctx: Context): - ctx.logger.info(dungeons.address) - - class Request(Model): - dice_sides: int = Field(description="How many sides does your dice need?") - - dice_roll_protocol = Protocol("DungeonsAndDragonsDiceRoll") - - @dice_roll_protocol.on_message(model=Request, replies={UAgentResponse}) - async def roll_dice(ctx: Context, sender: str, msg: Request): - result = str(random.randint(1, msg.dice_sides)) - message = f"Dice roll result: {result}" - await ctx.send( - sender, UAgentResponse(message=message, type=UAgentResponseType.FINAL) - ) - - - dungeons.include(dice_roll_protocol, publish_manifest=True) - - dungeons.run() - ``` It is important that you provide the `name`, `port`, `seed` and `endpoint` for your agent to correctly run this code. diff --git a/pages/guides/agents/intermediate/agent-types.mdx b/pages/guides/agents/intermediate/agent-types.mdx index d2d873871..f5f27dd1a 100644 --- a/pages/guides/agents/intermediate/agent-types.mdx +++ b/pages/guides/agents/intermediate/agent-types.mdx @@ -1,3 +1,5 @@ +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; + # Hosted, Local, and Mailbox Agents Agents can operate in multiple environments based on how they are created and deployed within the network. Understanding the difference between **Hosted**, **Local**, and **Mailbox Agents** is helpful for developers to correctly choose the right setup for their use cases and applications. @@ -47,27 +49,48 @@ Local agents can use a Mailbox to ensure that no messages are lost when they are In order to set up a mailbox for a local agent, you first need to create and configure a local agent. The agent's address is used to register it on the Agentverse, and then to generate a **Mailbox API key** for your agent. For instance, consider the following basic agent: - ```py copy filename="mailbox_agent.py" - from uagents import Agent, Context, Model - - class Message(Model): - message: str - - AGENT_MAILBOX_KEY = "put_your_AGENT_MAILBOX_KEY_here" - SEED_PHRASE = "put_your_seed_phrase_here" - - agent = Agent( - name="alice", - seed=SEED_PHRASE, - mailbox=f"{AGENT_MAILBOX_KEY}@https://agentverse.ai", - ) - - # Copy the address shown below and paste it in Agentverse - print(f"Your agent's address is: {agent.address}") - - if __name__ == "__main__": - agent.run() - ``` + + + + + + + ```py copy filename="mailbox_agent.py" + + from uagents import Agent, Context, Model + + + class Message(Model): + message: str + + + AGENT_MAILBOX_KEY = "put_your_AGENT_MAILBOX_KEY_here" + SEED_PHRASE = "put_your_seed_phrase_here" + + # Now your agent is ready to join the agentverse! + agent = Agent( + name="alice", + seed=SEED_PHRASE, + mailbox=f"{AGENT_MAILBOX_KEY}@https://agentverse.ai", + ) + + # Copy the address shown below + print(f"Your agent's address is: {agent.address}") + + if __name__ == "__main__": + agent.run() + +``` + + + + + Then, head over to the [Agentverse ↗️](https://agentverse.ai/) and navigate to the **My Agents** tab. Here, select **Local Agents** and click on **Connect Local Agent**. Paste your agent's address retrieved from running your local agent and follow the steps until you get a **Mailbox API Key**, which you will use to update your agent's configuration above. To test your Mailbox setup, you can create another agent (on Agentverse for instance) that sends messages to the Mailbox while the first agent is offline. When the first agent comes back online, it will retrieve and process the stored messages. For a complete example, check out this [guide ↗️](/guides/agentverse/agentverse-mailbox/utilising-the-mailbox). diff --git a/pages/guides/agents/intermediate/ai-engine-compatible-agent.mdx b/pages/guides/agents/intermediate/ai-engine-compatible-agent.mdx index 15df97c3a..c7f11718f 100644 --- a/pages/guides/agents/intermediate/ai-engine-compatible-agent.mdx +++ b/pages/guides/agents/intermediate/ai-engine-compatible-agent.mdx @@ -43,7 +43,6 @@ To enable communication from agents to the AI Engine, we import **3 objects** th `UAgentResponseType.FINAL` tells us that the message has no other responses. - - We can use `ERROR` to signify the agent has encountered an error: ```python diff --git a/pages/guides/agents/intermediate/communicating-with-other-agents.mdx b/pages/guides/agents/intermediate/communicating-with-other-agents.mdx index 78430d969..9de5d6219 100644 --- a/pages/guides/agents/intermediate/communicating-with-other-agents.mdx +++ b/pages/guides/agents/intermediate/communicating-with-other-agents.mdx @@ -1,5 +1,5 @@ import {Callout} from 'nextra/components' -import { CodeGroup, DocsCode } from "../../../../components/code"; +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; # Communicating with other agents @@ -46,121 +46,264 @@ The first step to better understand how agents communicate is to introduce how 2 touch agents_communication.py ``` - + ```py copy filename="windows" echo. > agents_communication.py ``` - + ```py copy filename="ubuntu" touch agents_communication.py ``` - + 2. Then, we import `Agent`, `Context`, `Bureau`, and `Model` from the uagents library and we then define the message structure for messages to be exchanged between the agents using the class `Model`: - ```py copy - from uagents import Agent, Bureau, Context, Model + + + + + + + ```py copy filename="agent_communication.py" + + from uagents import Agent, Bureau, Context, Model + + class Message(Model): + message: str + +``` + + + + - class Message(Model): - message: str - ``` The `Message` class defines the structure of message we can receive. In this example it's just a string, but it could be a simple integer, or a complex object too. 3. Now we create two agent instances, `sigmar` and `slaanesh`, with `name` and `seed` parameters: - ```py copy - sigmar = Agent(name="sigmar", seed="sigmar recovery phrase") - slaanesh = Agent(name="slaanesh", seed="slaanesh recovery phrase") - ``` + + + + + + + ```py copy filename="agent_communication.py" + + sigmar = Agent(name="sigmar", seed="sigmar recovery phrase") + slaanesh = Agent(name="slaanesh", seed="slaanesh recovery phrase") + +``` + + + + + In this example we're running multiple agents from one file. 4. Let's now define `sigmar`'s behaviors. We need to define a function for `sigmar` to send messages to `slaanesh` periodically: - ```py copy - @sigmar.on_interval(period=3.0) - async def send_message(ctx: Context): - await ctx.send(slaanesh.address, Message(message="hello there slaanesh")) - ``` + + + + + + + ```py copy filename="agent_communication.py" + + @sigmar.on_interval(period=3.0) + async def send_message(ctx: Context): + await ctx.send(slaanesh.address, Message(message="hello there slaanesh")) + +``` + + + + + We can use the `.on_interval()` decorator to define a coroutine `send_message()` function that will be called every 3 seconds. The coroutine function sends a message to `slaanesh` using the `ctx.send()` method of the `Context` object. 5. We then need to define a `sigmar_message_handler()` function for `sigmar` to manage incoming messages: - ```py copy - @sigmar.on_message(model=Message) - async def sigmar_message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") - ``` + + + + + + + ```py copy filename="agent_communication.py" + + @sigmar.on_message(model=Message) + async def sigmar_message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + +``` + + + + + This defines the coroutine function `sigmar_message_handler()` that serves as a message handler for `sigmar`. It is triggered whenever `sigmar` receives a message of type `Message`. 6. Let's now define the behavior of our second agent, `slaanesh`: - ```py copy - @slaanesh.on_message(model=Message) - async def slaanesh_message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") - await ctx.send(sigmar.address, Message(message="hello there sigmar")) - ``` + + + + + + + ```py copy filename="agent_communication.py" + + @slaanesh.on_message(model=Message) + async def slaanesh_message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + +``` + + + + + Same as `sigmar` however, we make `slaanesh` compose a response message to be sent back using the `ctx.send()` method with `sigmar.address` as the recipient address and an instance of the `Message` model as the message payload. It would also be valid to respond to the sender: - ```py copy - await ctx.send(sender.address, Message(message="hello there sigmar")) - ``` + + + + -7. Let's then use the `Bureau` class to create a `Bureau` object. This will allow us to run agents together in the same script: + + ```py copy filename="agent_communication.py" - ```py copy - bureau = Bureau() - bureau.add(sigmar) - bureau.add(slaanesh) + await ctx.send(sigmar.address, Message(message="hello there sigmar")) - if __name__ == "__main__": - bureau.run() - ``` +``` + -8. Save the script. + -The complete script should be looking as follows: -```py copy filename="agents_communication.py" -from uagents import Agent, Bureau, Context, Model -class Message(Model): - message: str +7. Let's then use the `Bureau` class to create a `Bureau` object. This will allow us to run agents together in the same script: -sigmar = Agent(name="sigmar", seed="sigmar recovery phrase") -slaanesh = Agent(name="slaanesh", seed="slaanesh recovery phrase") + + + + + + + ```py copy filename="agent_communication.py" + + bureau = Bureau() + bureau.add(sigmar) + bureau.add(slaanesh) + + if __name__ == "__main__": + bureau.run() -@sigmar.on_interval(period=3.0) -async def send_message(ctx: Context): - await ctx.send(slaanesh.address, Message(message="hello there slaanesh")) +``` + -@sigmar.on_message(model=Message) -async def sigmar_message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") + -@slaanesh.on_message(model=Message) -async def slaanesh_message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") - await ctx.send(sigmar.address, Message(message="hello there sigmar")) -bureau = Bureau() -bureau.add(sigmar) -bureau.add(slaanesh) -if __name__ == "__main__": - bureau.run() +8. Save the script. + +The complete script should be looking as follows: + + + + + + + + ```py copy filename="agent_communication.py" + + from uagents import Agent, Bureau, Context, Model + + class Message(Model): + message: str + + sigmar = Agent(name="sigmar", seed="sigmar recovery phrase") + slaanesh = Agent(name="slaanesh", seed="slaanesh recovery phrase") + + @sigmar.on_interval(period=3.0) + async def send_message(ctx: Context): + await ctx.send(slaanesh.address, Message(message="hello there slaanesh")) + + @sigmar.on_message(model=Message) + async def sigmar_message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + + @slaanesh.on_message(model=Message) + async def slaanesh_message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + await ctx.send(sigmar.address, Message(message="hello there sigmar")) + + bureau = Bureau() + bureau.add(sigmar) + bureau.add(slaanesh) + + if __name__ == "__main__": + bureau.run() + ``` + + + + + We are now ready to run the script: `python agents_communication.py` @@ -195,13 +338,13 @@ The first step would be to create two different Python scripts for this task, ea touch remote_agents_slaanesh.py ``` - + ```py copy filename="windows" echo. > remote_agents_slaanesh.py ``` - + ```py copy filename="ubuntu" touch remote_agents_slaanesh.py @@ -217,13 +360,13 @@ The first step would be to create two different Python scripts for this task, ea touch remote_agents_sigmar.py ``` - + ```py copy filename="windows" echo. > remote_agents_sigmar.py ``` - + ```py copy filename="ubuntu" touch remote_agents_sigmar.py @@ -237,51 +380,123 @@ Let's start by defining the script for **sigmar**. 1. In `remote_agents_sigmar.py` script, we would need to import the necessary classes from the `uagents` (`Agent`, `Context`, and `Model`) and from `uagents.setup` (`fund_agent_if_low`). We then need to define the message structure for messages to be exchanged between agents using the class `Model`, as well as the `RECIPIENT_ADDRESS` (slaanesh's address). Note that if you don't know slaanesh's address yet, you can use `print(slaanesh.address)` after defining agent `slaanesh` to get this information. This is the address towards which `sigmar` will send messages: - ```py copy - from uagents import Agent, Context, Model - from uagents.setup import fund_agent_if_low + + + + + + + ```py copy filename="remote_agents_sigmar.py" + + from uagents import Agent, Context, Model + from uagents.setup import fund_agent_if_low + + class Message(Model): + message: str + + RECIPIENT_ADDRESS = "agent1qvm7v76zs6w2x90xvq99yc5xh7c2thjtm44zc09me556zxnra627gkf4zum" + +``` + + + - class Message(Model): - message: str - RECIPIENT_ADDRESS="agent1qvm7v76zs6w2x90xvq99yc5xh7c2thjtm44zc09me556zxnra627gkf4zum" - ``` 2. Let's now create our agent, `sigmar`, by providing `name`, `seed`, `port`, and `endpoint`. Also, make sure it has enough funds to register in the Almanac contract: - ```py copy - sigmar = Agent( - name="sigmar", - port=8000, - seed="sigmar secret phrase", - endpoint=["http://127.0.0.1:8000/submit"], - ) + + + + + + + ```py copy filename="remote_agents_sigmar.py" + + sigmar = Agent( + name="sigmar", + port=8000, + seed="sigmar secret phrase", + endpoint=["http://127.0.0.1:8000/submit"], + ) + + fund_agent_if_low(sigmar.wallet.address()) + +``` + + + + - fund_agent_if_low(sigmar.wallet.address()) - ``` On the Fetch.ai testnet, you can use the `fund_agent_if_low` function. This checks if the balance of the agent's wallet is below a certain threshold, and if so, sends a transaction to fund the wallet with a specified amount of cryptocurrency. In this case, it checks if the balance of `sigmar`'s wallet is low and funds it if necessary. 3. We are ready to define `sigmar`'s behaviors. Let's start with a function for `sigmar` to send messages: - ```py copy - @sigmar.on_interval(period=2.0) - async def send_message(ctx: Context): - await ctx.send(RECIPIENT_ADDRESS, Message(message="hello there slaanesh") - ``` + + + + + + + ```py copy filename="remote_agents_sigmar.py" + + @sigmar.on_interval(period=2.0) + async def send_message(ctx: Context): + await ctx.send(RECIPIENT_ADDRESS, Message(message="hello there slaanesh")) + +``` + + + + + Here, the `.on_interval()` decorator schedules the `send_message()` function to be run every 2 seconds. Inside the function, there is an asynchronous call indicated by the `ctx.send()` method. This call sends a message with the content `"hello there slaanesh"` to the `RECIPIENT_ADDRESS`. 4. We then need to define a function for `sigmar` to handle incoming messages from other agents: - ```py copy - @sigmar.on_message(model=Message) - async def message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") + + + + + + + ```py copy filename="remote_agents_sigmar.py" + + @sigmar.on_message(model=Message) + async def message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + + if __name__ == "__main__": + sigmar.run() + +``` + + + + - if __name__ == "__main__": - sigmar.run() - ``` Here, we have used the `.on_message()` decorator to register the `message_handler()` coroutine function as a handler for incoming messages of type `Message`. @@ -291,35 +506,53 @@ Let's start by defining the script for **sigmar**. The overall script for sigmar agent should be looking as follows: -```py copy filename="remote_agents_sigmar.py" -from uagents import Agent, Context, Model -from uagents.setup import fund_agent_if_low - -class Message(Model): - message: str + + + + + + + ```py copy filename="remote_agents_sigmar.py" + + from uagents import Agent, Context, Model + from uagents.setup import fund_agent_if_low + + class Message(Model): + message: str + + RECIPIENT_ADDRESS = "agent1qvm7v76zs6w2x90xvq99yc5xh7c2thjtm44zc09me556zxnra627gkf4zum" + + sigmar = Agent( + name="sigmar", + port=8000, + seed="sigmar secret phrase", + endpoint=["http://127.0.0.1:8000/submit"], + ) + + fund_agent_if_low(sigmar.wallet.address()) + + @sigmar.on_interval(period=2.0) + async def send_message(ctx: Context): + await ctx.send(RECIPIENT_ADDRESS, Message(message="hello there slaanesh")) + + @sigmar.on_message(model=Message) + async def message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + + if __name__ == "__main__": + sigmar.run() -RECIPIENT_ADDRESS="agent1qvm7v76zs6w2x90xvq99yc5xh7c2thjtm44zc09me556zxnra627gkf4zum" - -sigmar = Agent( - name="sigmar", - port=8000, - seed="sigmar secret phrase", - endpoint=["http://127.0.0.1:8000/submit"], -) - -fund_agent_if_low(sigmar.wallet.address()) +``` + -@sigmar.on_interval(period=2.0) -async def send_message(ctx: Context): - await ctx.send(RECIPIENT_ADDRESS, Message(message="hello there slaanesh")) + -@sigmar.on_message(model=Message) -async def message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") -if __name__ == "__main__": - sigmar.run() -``` Remember that you need to provide the `name`, `seed`, `port`, `endpoint` and `RECIPIENT_ADDRESS` parameters to correctly run this code. @@ -329,35 +562,71 @@ We can now proceed by writing the script for agent `slaanesh`. 1. In `remote_agents_slaanesh.py` script, import the necessary classes from the `uagents` and `uagents.setup`. Then, define the message structure for messages to be exchanged between the agents using the `Model` class, as well as our second uAgent, `slaanesh`, by providing `name`, `seed`, `port`, and `endpoint`. Make sure it has enough funds to register in the Almanac contract: - ```py copy - from uagents import Agent, Context, Model - from uagents.setup import fund_agent_if_low + + + + + + + ```py copy filename="remote_agents_slaanesh.py" + + from uagents.setup import fund_agent_if_low + from uagents import Agent, Context, Model + + class Message(Model): + message: str + + slaanesh = Agent( + name="slaanesh", + port=8001, + seed="slaanesh secret phrase", + endpoint=["http://127.0.0.1:8001/submit"], + ) + + fund_agent_if_low(slaanesh.wallet.address()) - class Message(Model): - message: str +``` + + + - slaanesh = Agent( - name="slaanesh", - port=8001, - seed="slaanesh secret phrase", - endpoint=["http://127.0.0.1:8001/submit"], - ) - fund_agent_if_low(slaanesh.wallet.address()) - ``` 2. Let's now define a function for `slaanesh` to handle incoming messages and answering back to the sender: - ```py copy - @slaanesh.on_message(model=Message) - async def message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") + + + + + + + ```py copy filename="remote_agents_slaanesh.py" + + @slaanesh.on_message(model=Message) + async def message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + + await ctx.send(sender, Message(message="hello there sigmar")) + + if __name__ == "__main__": + slaanesh.run() + +``` + + + - await ctx.send(sender, Message(message="hello there sigmar")) - if __name__ == "__main__": - slaanesh.run() - ``` Here, we have defined an asynchronous `message_handler()` function for slaanesh to handle incoming messages from other uAgents. The function is decorated with `.on_message()`, and it is triggered whenever a message of type `Message` is received by `slaanesh`. When a message is received, the handler function logs the sender's address and the content of the message. It then sends a response back to the sender using the `ctx.send()` with a new message. The response message contains the `Message` data model with a `"hello there sigmar"` message. @@ -365,31 +634,49 @@ We can now proceed by writing the script for agent `slaanesh`. The overall script for `slaanesh` should be looking as follows: -```py copy filename="remote_agents_slaanesh.py" -from uagents.setup import fund_agent_if_low -from uagents import Agent, Context, Model - -class Message(Model): - message: str + + + + + + + ```py copy filename="remote_agents_slaanesh.py" + + from uagents.setup import fund_agent_if_low + from uagents import Agent, Context, Model + + class Message(Model): + message: str + + slaanesh = Agent( + name="slaanesh", + port=8001, + seed="slaanesh secret phrase", + endpoint=["http://127.0.0.1:8001/submit"], + ) + + fund_agent_if_low(slaanesh.wallet.address()) + + @slaanesh.on_message(model=Message) + async def message_handler(ctx: Context, sender: str, msg: Message): + ctx.logger.info(f"Received message from {sender}: {msg.message}") + + await ctx.send(sender, Message(message="hello there sigmar")) + + if __name__ == "__main__": + slaanesh.run() -slaanesh = Agent( - name="slaanesh", - port=8001, - seed="slaanesh secret phrase", - endpoint=["http://127.0.0.1:8001/submit"], -) - -fund_agent_if_low(slaanesh.wallet.address()) +``` + -@slaanesh.on_message(model=Message) -async def message_handler(ctx: Context, sender: str, msg: Message): - ctx.logger.info(f"Received message from {sender}: {msg.message}") + - await ctx.send(sender, Message(message="hello there sigmar")) -if __name__ == "__main__": - slaanesh.run() -``` Remember that you need to provide the `name`, `seed`, `port` and `endpoint` parameters to correctly run this code. diff --git a/pages/guides/agents/intermediate/handlers.mdx b/pages/guides/agents/intermediate/handlers.mdx index 440c3694a..e97f110f0 100644 --- a/pages/guides/agents/intermediate/handlers.mdx +++ b/pages/guides/agents/intermediate/handlers.mdx @@ -1,5 +1,5 @@ import { Callout } from 'nextra/components' -import { CodeGroup, DocsCode } from "../../../../components/code"; +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; # Agent Handlers @@ -40,50 +40,104 @@ Make sure you have read the following resources before going on with this guide: - ```py copy filename="mac" - touch interval_task.py - ``` + ```py copy filename="mac" + touch interval_task.py + ``` - + ```py copy filename="windows" echo. > interval_task.py ``` - + ```py copy filename="ubuntu" touch interval_task.py ``` - + 2. Then import the necessary classes from `uagents` library, `Agent` and `Context`, and create our agent: - ```py copy - from uagents import Agent, Context + + + + + + + ```py copy filename="interval-task.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="alice recovery phrase") + +``` + + + + - agent = Agent(name="alice", seed="alice recovery phrase") - ``` 3. Create a function to handle the startup event, which will introduce the agent: - ```py copy - @agent.on_event("startup") - async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") - ``` + + + + + + + ```py copy filename="interval-task.py" + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + +``` + + + + + 4. We can now define our agent's interval behavior. We want our agent to log a message every 2 seconds using the `on_interval` decorator: - ```py copy - @agent.on_interval(period=2.0) - async def say_hello(ctx: Context): - ctx.logger.info("Hello!") + + + + + + + ```py copy filename="interval-task.py" + + @agent.on_interval(period=2.0) + async def say_hello(ctx: Context): + ctx.logger.info("Hello!") + + if __name__ == "__main__": + agent.run() + +``` + + + + - if __name__ == "__main__": - agent.run() - ``` The output will be printed out using the `ctx.logger.info()` method. @@ -91,22 +145,40 @@ Make sure you have read the following resources before going on with this guide: The overall script should look as follows: -```py copy filename="interval_task.py" -from uagents import Agent, Context + + + + + + + ```py copy filename="interval-task.py" + + from uagents import Agent, Context + + agent = Agent(name="alice", seed="alice recovery phrase") + + @agent.on_event("startup") + async def introduce_agent(ctx: Context): + ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + + @agent.on_interval(period=2.0) + async def say_hello(ctx: Context): + ctx.logger.info("Hello!") + + if __name__ == "__main__": + agent.run() -agent = Agent(name="alice", seed="alice recovery phrase") +``` + -@agent.on_event("startup") -async def introduce_agent(ctx: Context): - ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") + -@agent.on_interval(period=2.0) -async def say_hello(ctx: Context): - ctx.logger.info("Hello!") -if __name__ == "__main__": - agent.run() -``` ### Run the script @@ -138,67 +210,140 @@ We now showcase a scenario where three agents, named `alice`, `bob`, and `charle touch broadcast.py ``` - + ```py copy filename="windows" echo. > broadcast.py ``` - + ```py copy filename="ubuntu" touch broadcast.py ``` - -2. We then need to import the `Agent`, `Bureau`, `Context`, `Model`, and `Protocol` classes from the `uagents` library, and the `fund_agent_if_low` from `uagents.setup`. Then, let's create the 3 different agents using the class `Agent`. Each agent is initialized with a unique name and a seed phrase for wallet recovery. Additionally, if an agent's wallet balance is low, the `fund_agent_if_low()` function is called to add funds to their wallet: - ```py copy - from uagents import Agent, Bureau, Context, Model, Protocol - from uagents.setup import fund_agent_if_low +2. We then need to import the `Agent`, `Bureau`, `Context`, `Model`, and `Protocol` classes from the `uagents` library. Then, let's create the 3 different agents using the class `Agent`. Each agent is initialized with a unique name and a seed phrase for wallet recovery. + + + + + + + + ```py copy filename="broadcast.py" + + from uagents import Agent, Bureau, Context, Model, Protocol + + # create agents + # alice and bob will support the protocol + # charles will try to reach all agents supporting the protocol + alice = Agent(name="alice", seed="alice recovery phrase") + bob = Agent(name="bob", seed="bob recovery phrase") + charles = Agent(name="charles", seed="charles recovery phrase") + +``` + + + - alice = Agent(name="alice", seed="alice recovery phrase") - bob = Agent(name="bob", seed="bob recovery phrase") - charles = Agent(name="charles", seed="charles recovery phrase") - fund_agent_if_low(alice.wallet.address()) - fund_agent_if_low(bob.wallet.address()) - fund_agent_if_low(charles.wallet.address()) - ``` It is optional but useful to include a `seed` parameter when creating an agent to set fixed [addresses ↗️](/guides/agents/getting-uagent-address). Otherwise, random addresses will be generated every time you run the agent. 3. Let's then define the message data models to specify the type of messages being handled and exchanged by the agents. We define a `BroadcastExampleRequest` and a `BroadcastExampleResponse` data models. Finally, create a `protocol` named `proto` with version `1.0`: - ```py copy - class BroadcastExampleRequest(Model): - pass + + + + + + + ```py copy filename="broadcast.py" + + class BroadcastExampleRequest(Model): + pass + + + class BroadcastExampleResponse(Model): + text: str + + + # define protocol + proto = Protocol(name="proto", version="1.0") + +``` + + + - class BroadcastExampleResponse(Model): - text: str - proto = Protocol(name="proto", version="1.0") - ``` 4. Let's now define a message handler function for incoming messages of type `BroadcastExampleRequest` in the protocol: - ```py copy - @proto.on_message(model=BroadcastExampleRequest, replies=BroadcastExampleResponse) - async def handle_request(ctx: Context, sender: str, _msg: BroadcastExampleRequest): - await ctx.send( - sender, BroadcastExampleResponse(text=f"Hello from {ctx.agent.name}") - ) - ``` + + + + + + + ```py copy filename="broadcast.py" + + @proto.on_message(model=BroadcastExampleRequest, replies=BroadcastExampleResponse) + async def handle_request(ctx: Context, sender: str, _msg: BroadcastExampleRequest): + await ctx.send( + sender, BroadcastExampleResponse(text=f"Hello from {ctx.agent.name}") + ) + +``` + + + + + Here we defined a `handle_request()` function which is used whenever a request is received. This sends a response back to the sender. This function is decorated with the `.on_message()` decorator indicating that this function is triggered whenever a message of type `BroadcastExampleRequest` is received. The function sends a response containing a greeting message with the name of the agent that sent the request in the first place. 5. Now, we need to include the `protocol` into the agents. Specifically, the protocol is included in both `alice` and `bob` agents. This means they will follow the rules defined in the protocol when communicating: - ```py copy - alice.include(proto) - bob.include(proto) - ``` + + + + + + + ```py copy filename="broadcast.py" + + alice.include(proto) + bob.include(proto) + +``` + + + + + After the first registration in the [Almanac ↗️](/references/contracts/uagents-almanac/almanac-overview) smart contract, it will take about 5 minutes before the agents can be found through the protocol. @@ -206,16 +351,35 @@ We now showcase a scenario where three agents, named `alice`, `bob`, and `charle 6. It is now time to define the behavior and function of `charles` agent: - ```py copy - @charles.on_interval(period=5) - async def say_hello(ctx: Context): - status_list = await ctx.broadcast(proto.digest, message=BroadcastExampleRequest()) - ctx.logger.info(f"Trying to contact {len(status_list)} agents.") + + + + + + + ```py copy filename="broadcast.py" + + @charles.on_interval(period=5) + async def say_hello(ctx: Context): + status_list = await ctx.broadcast(proto.digest, message=BroadcastExampleRequest()) + ctx.logger.info(f"Trying to contact {len(status_list)} agents.") + + + @charles.on_message(model=BroadcastExampleResponse) + async def handle_response(ctx: Context, sender: str, msg: BroadcastExampleResponse): + ctx.logger.info(f"Received response from {sender}: {msg.text}") + +``` + + + + - @charles.on_message(model=BroadcastExampleResponse) - async def handle_response(ctx: Context, sender: str, msg: BroadcastExampleResponse): - ctx.logger.info(f"Received response from {sender}: {msg.text}") - ``` In the first part, we use the `.on_interval()` decorator to define an interval behavior for this agent when the script is being run. In this case, the agent will execute the `say_hello()` function every 5 seconds. The `Context` object is a collection of data and functions related to the agent. Inside the `say_hello()` function, the agent uses the `ctx.broadcast()` method to send a broadcast message. The message is of type `BroadcastExampleRequest()` and it is being sent using the protocol's digest (`proto.digest`). @@ -223,15 +387,33 @@ We now showcase a scenario where three agents, named `alice`, `bob`, and `charle 7. We are now ready to set up a `Bureau` object for agents to be run together at the same time, and we add `alice`, `bob`, and `charles` to it using the `bureau.add()` method: - ```py copy - bureau = Bureau(port=8000, endpoint="http://localhost:8000/submit") - bureau.add(alice) - bureau.add(bob) - bureau.add(charles) + + + + + + + ```py copy filename="broadcast.py" + + bureau = Bureau(port=8000, endpoint="http://localhost:8000/submit") + bureau.add(alice) + bureau.add(bob) + bureau.add(charles) + + if __name__ == "__main__": + bureau.run() + +``` + + + + - if __name__ == "__main__": - bureau.run() - ``` The bureau is assigned to listen on `port=8000` and specifies an `endpoint` at `"http://localhost:8000/submit"` for submitting data. @@ -239,55 +421,81 @@ We now showcase a scenario where three agents, named `alice`, `bob`, and `charle The overall script should look as follows: -```py copy filename="broadcast.py" -from uagents import Agent, Bureau, Context, Model, Protocol - -# create agents -# alice and bob will support the protocol -# charles will try to reach all agents supporting the protocol -alice = Agent(name="alice", seed="alice recovery phrase") -bob = Agent(name="bob", seed="bob recovery phrase") -charles = Agent(name="charles", seed="charles recovery phrase") - -class BroadcastExampleRequest(Model): - pass - -class BroadcastExampleResponse(Model): - text: str - -# define protocol -proto = Protocol(name="proto", version="1.0") - -@proto.on_message(model=BroadcastExampleRequest, replies=BroadcastExampleResponse) -async def handle_request(ctx: Context, sender: str, _msg: BroadcastExampleRequest): - await ctx.send( - sender, BroadcastExampleResponse(text=f"Hello from {ctx.agent.name}") - ) - -# include protocol -# Note: after the first registration on the almanac smart contract, it will -# take about 5 minutes before the agents can be found through the protocol -alice.include(proto) -bob.include(proto) - -# let charles send the message to all agents supporting the protocol -@charles.on_interval(period=5) -async def say_hello(ctx: Context): - status_list = await ctx.broadcast(proto.digest, message=BroadcastExampleRequest()) - ctx.logger.info(f"Trying to contact {len(status_list)} agents.") - -@charles.on_message(model=BroadcastExampleResponse) -async def handle_response(ctx: Context, sender: str, msg: BroadcastExampleResponse): - ctx.logger.info(f"Received response from {sender}: {msg.text}") - -bureau = Bureau(port=8000, endpoint="http://localhost:8000/submit") -bureau.add(alice) -bureau.add(bob) -bureau.add(charles) - -if __name__ == "__main__": - bureau.run() + + + + + + + ```py copy filename="broadcast.py" + + from uagents import Agent, Bureau, Context, Model, Protocol + + # create agents + # alice and bob will support the protocol + # charles will try to reach all agents supporting the protocol + alice = Agent(name="alice", seed="alice recovery phrase") + bob = Agent(name="bob", seed="bob recovery phrase") + charles = Agent(name="charles", seed="charles recovery phrase") + + + class BroadcastExampleRequest(Model): + pass + + + class BroadcastExampleResponse(Model): + text: str + + + # define protocol + proto = Protocol(name="proto", version="1.0") + + + @proto.on_message(model=BroadcastExampleRequest, replies=BroadcastExampleResponse) + async def handle_request(ctx: Context, sender: str, _msg: BroadcastExampleRequest): + await ctx.send( + sender, BroadcastExampleResponse(text=f"Hello from {ctx.agent.name}") + ) + + + # include protocol + # Note: after the first registration on the almanac smart contract, it will + # take about 5 minutes before the agents can be found through the protocol + alice.include(proto) + bob.include(proto) + + + # let charles send the message to all agents supporting the protocol + @charles.on_interval(period=5) + async def say_hello(ctx: Context): + status_list = await ctx.broadcast(proto.digest, message=BroadcastExampleRequest()) + ctx.logger.info(f"Trying to contact {len(status_list)} agents.") + + + @charles.on_message(model=BroadcastExampleResponse) + async def handle_response(ctx: Context, sender: str, msg: BroadcastExampleResponse): + ctx.logger.info(f"Received response from {sender}: {msg.text}") + + + bureau = Bureau(port=8000, endpoint="http://localhost:8000/submit") + bureau.add(alice) + bureau.add(bob) + bureau.add(charles) + + if __name__ == "__main__": + bureau.run() + ``` + + + + + ### Run the script @@ -313,44 +521,60 @@ The `on_query()` handler is used to register a [Function ↗️](/guides/agents/ For the agent, the script sets up an agent to handle incoming queries. It defines two models: `TestRequest` and `Response`. Upon startup, it logs the agent's details. The core functionality lies in the `query_handler`, decorated with `@agent.on_query()`, which processes received queries and sends back a predefined response. This demonstrates creating responsive agents within the `uagents` Framework, showcasing how they can interact with other agents or functions in an asynchronous, event-driven architecture. - ```py copy filename="agent.py" - from uagents import Agent, Context, Model - - class TestRequest(Model): - message: str + + + + + + + ```py copy filename="agent.py" + + from uagents import Agent, Context, Model + + class TestRequest(Model): + message: str + + class Response(Model): + text: str + + # Initialize the agent with its configuration. + agent = Agent( + name="your_agent_name_here", + seed="your_agent_seed_here", + port=8001, + endpoint="http://localhost:8001/submit", + ) + + @agent.on_event("startup") + async def startup(ctx: Context): + ctx.logger.info(f"Starting up {agent.name}") + ctx.logger.info(f"With address: {agent.address}") + ctx.logger.info(f"And wallet address: {agent.wallet.address()}") + + # Decorator to handle incoming queries. + @agent.on_query(model=TestRequest, replies={Response}) + async def query_handler(ctx: Context, sender: str, _query: TestRequest): + ctx.logger.info("Query received") + try: + # do something here + await ctx.send(sender, Response(text="success")) + except Exception: + await ctx.send(sender, Response(text="fail")) + + # Main execution block to run the agent. + if __name__ == "__main__": + agent.run() - class Response(Model): - text: str +``` + - # Initialize the agent with its configuration. - agent = Agent( - name="your_agent_name_here", - seed="your_agent_seed_here", - port=8001, - endpoint="http://localhost:8001/submit", - ) + - @agent.on_event("startup") - async def startup(ctx: Context): - ctx.logger.info(f"Starting up {agent.name}") - ctx.logger.info(f"With address: {agent.address}") - ctx.logger.info(f"And wallet address: {agent.wallet.address()}") - - # Decorator to handle incoming queries. - @agent.on_query(model=TestRequest, replies={Response}) - async def query_handler(ctx: Context, sender: str, _query: TestRequest): - ctx.logger.info("Query received") - try: - # do something here - await ctx.send(sender, Response(text="success")) - except Exception: - await ctx.send(sender, Response(text="fail")) - - - # Main execution block to run the agent. - if __name__ == "__main__": - agent.run() - ``` The agent is created using the `Agent` class from `uagents` library. You can initialise it by providing it with a `name`, `seed`, `port`, and `endpoint`. It defines an `on_event()` handler for the `startup` event, where it logs information about the agent's initialisation. It defines an `on_query()` handler for handling queries of type `TestRequest`. Upon receiving a query, it processes it and sends back a `Response`. The agent is then set to run. @@ -370,113 +594,222 @@ Let's explore the Proxy code script step-by-step: touch on_query.py ``` - + ```py copy filename="windows" echo. > on_query.py ``` - + ```py copy filename="ubuntu" touch on_query.py ``` - + 3. We need to import `json`, `fastapi`, `uagent`'s `Model` and `query`. Then we would need to define the query format using the `TestRequest` class as a subclass of `Model`: - ```py copy - import json + + + + + + + ```py copy filename="on_query.py" + + import json + + from fastapi import FastAPI, Request + from uagents import Model + from uagents.query import query + from uagents.envelope import Envelope + + AGENT_ADDRESS = "agent1qt6ehs6kqdgtrsduuzslqnrzwkrcn3z0cfvwsdj22s27kvatrxu8sy3vag0" + + class TestRequest(Model): + message: str - from fastapi import FastAPI, Request - from uagents import Model - from uagents.query import query - from uagents.envelope import Envelope +``` + + + - AGENT_ADDRESS = "agent1qt6ehs6kqdgtrsduuzslqnrzwkrcn3z0cfvwsdj22s27kvatrxu8sy3vag0" - class TestRequest(Model): - message: str - ``` 4. Create `agent_query()` function to send query to agent and decode the response received. - ```py copy - async def agent_query(req): - response = await query(destination=AGENT_ADDRESS, message=req, timeout=15) - if isinstance(response, Envelope): - data = json.loads(response.decode_payload()) - return data["text"] - return response - ``` + + + + + + + ```py copy filename="on_query.py" + + async def agent_query(req): + response = await query(destination=AGENT_ADDRESS, message=req, timeout=15) + if isinstance(response, Envelope): + data = json.loads(response.decode_payload()) + return data["text"] + return response + +``` + + + + + 5. Initialize a `FastAPI` app: - ```py copy - app = FastAPI() - ``` + + + + + + + ```py copy filename="on_query.py" + + app = FastAPI() + +``` + + + + + 6. Define a root endpoint to test the server: - ```py copy - @app.get("/") - def read_root(): - return "Hello from the Agent controller" - ``` + + + + -7. Define an endpoint to make agent calls: + + ```py copy filename="on_query.py" - ```py copy - @app.post("/endpoint") - async def make_agent_call(req: Request): - model = TestRequest.parse_obj(await req.json()) - try: - res = await agent_query(model) - return f"successful call - agent response: {res}" - except Exception: - return "unsuccessful agent call" - ``` + @app.get("/") + def read_root(): + return "Hello from the Agent controller" -8. Save the script. Remember that you need to provide the `AGENT_ADDRESS` parameter to correctly run this code. +``` + -The overall script should look as follows: + -```py copy filename="on_query.py" -import json -from fastapi import FastAPI, Request -from uagents import Model -from uagents.query import query -from uagents.envelope import Envelope -AGENT_ADDRESS = "agent1qt6ehs6kqdgtrsduuzslqnrzwkrcn3z0cfvwsdj22s27kvatrxu8sy3vag0" +7. Define an endpoint to make agent calls: + + + + + + + + ```py copy filename="on_query.py" + + @app.post("/endpoint") + async def make_agent_call(req: Request): + model = TestRequest.parse_obj(await req.json()) + try: + res = await agent_query(model) + return f"successful call - agent response: {res}" + except Exception: + return "unsuccessful agent call" + +``` + -class TestRequest(Model): - message: str + -async def agent_query(req): - response = await query(destination=AGENT_ADDRESS, message=req, timeout=15) - if isinstance(response, Envelope): - data = json.loads(response.decode_payload()) - return data["text"] - return response -app = FastAPI() -@app.get("/") -def read_root(): - return "Hello from the Agent controller" +8. Save the script. Remember that you need to provide the `AGENT_ADDRESS` parameter to correctly run this code. + +The overall script should look as follows: + + + + + + + + ```py copy filename="on_query.py" + + import json + + from fastapi import FastAPI, Request + from uagents import Model + from uagents.query import query + from uagents.envelope import Envelope + + AGENT_ADDRESS = "agent1qt6ehs6kqdgtrsduuzslqnrzwkrcn3z0cfvwsdj22s27kvatrxu8sy3vag0" + + class TestRequest(Model): + message: str + + async def agent_query(req): + response = await query(destination=AGENT_ADDRESS, message=req, timeout=15) + if isinstance(response, Envelope): + data = json.loads(response.decode_payload()) + return data["text"] + return response + + + app = FastAPI() + + @app.get("/") + def read_root(): + return "Hello from the Agent controller" + + @app.post("/endpoint") + async def make_agent_call(req: Request): + model = TestRequest.parse_obj(await req.json()) + try: + res = await agent_query(model) + return f"successful call - agent response: {res}" + except Exception: + return "unsuccessful agent call" -@app.post("/endpoint") -async def make_agent_call(req: Request): - model = TestRequest.parse_obj(await req.json()) - try: - res = await agent_query(model) - return f"successful call - agent response: {res}" - except Exception: - return "unsuccessful agent call" ``` + + + + + #### Run the example @@ -501,7 +834,7 @@ Here's an example: async def introduce_agent(ctx: Context): ctx.logger.info(f"Hello, I'm agent {agent.name} and my address is {agent.address}.") ... - + ``` ### on_event("shutdown") @@ -511,7 +844,6 @@ Here's an example: async def introduce_agent(ctx: Context): ctx.logger.info(f"Hello, I'm agent {agent.name} and I am shutting down") ... - -``` +``` diff --git a/pages/guides/agents/intermediate/hosted-agent.mdx b/pages/guides/agents/intermediate/hosted-agent.mdx index 9555148f9..c2a1386be 100644 --- a/pages/guides/agents/intermediate/hosted-agent.mdx +++ b/pages/guides/agents/intermediate/hosted-agent.mdx @@ -1,4 +1,5 @@ import { Callout } from 'nextra/components' +import { CodeGroup, CodeSegment, DocsCode, GithubCodeSegment } from "../../../../components/code"; This article is a work-in-progress. It will be expanded rapidly. @@ -12,34 +13,49 @@ However, you should be aware of how state works in a hosted agent. A global vari Let's show this with an example: - ```python copy filename="storage_agent_example.py" - from uagents import Agent, Context + + + + + + + ```py copy filename="storage_agent_example.py" + + from uagents import Agent, Context + + agent = Agent() + + global_counter = 0 + + @agent.on_interval(period=1.0) + async def on_interval(ctx: Context): + global global_counter + + # increment the global counter - bad! + global_counter += 1 + + current_count = int(ctx.storage.get("count") or 0) + current_count += 1 + + ctx.logger.info(f"My count is: {current_count}") + ctx.logger.info(f"My global is: {global_counter}") + + ctx.storage.set("count", current_count) + + if __name__ == "__main__": + agent.run() + +``` + + + - agent = Agent() - global_counter = 0 - - @agent.on_interval(period=1.0) - async def on_interval(ctx: Context): - global global_counter - - - # increment the global counter - bad! - global_counter += 1 - - - current_count = int(ctx.storage.get("count") or 0) - current_count += 1 - - ctx.logger.info(f"My count is: {current_count}") - ctx.logger.info(f"My global is: {global_counter}") - - ctx.storage.set("count", current_count) - - - if __name__ == "__main__": - agent.run() - ``` Output in Agentverse would be: @@ -56,4 +72,3 @@ You can see from this output, **global is never updated**. To learn more about Agents storage and how it works in Agentverse, take a look at [Storage Functions ↗️](/guides/agents/intermediate/storage-function). - diff --git a/pages/guides/agents/intermediate/langchain-rag-agent.mdx b/pages/guides/agents/intermediate/langchain-rag-agent.mdx index e188d16ee..6a4c7f457 100644 --- a/pages/guides/agents/intermediate/langchain-rag-agent.mdx +++ b/pages/guides/agents/intermediate/langchain-rag-agent.mdx @@ -127,13 +127,13 @@ We now need to define the `requests.py` file under the `messages` folder in the touch requests.py ``` - + ```py copy filename="windows" echo. > requests.py ``` - + ```py copy filename="ubuntu" touch requests.py @@ -141,7 +141,6 @@ We now need to define the `requests.py` file under the `messages` folder in the - Here, the `RagRequest` message data model represents the request to retrieve an answer to an user's question from a specified document URL. The script includes an optional parameter, `deep_read`, to determine if nested pages should also be read to retrieve the answer. This parameter is set to `no` as `default`. The script look like the following: @@ -150,7 +149,6 @@ The script look like the following: from typing import Optional from uagents import Model, Field - class RagRequest(Model): question: str = Field( description="The question that the user wants to have an answer for." @@ -221,7 +219,6 @@ The script for this agent looks as follows: nltk.download("punkt") nltk.download("averaged_perceptron_tagger") - LANGCHAIN_RAG_SEED = "YOUR_LANGCHAIN_RAG_SEED" AGENT_MAILBOX_KEY = "YOUR_MAILBOX_KEY" @@ -235,7 +232,6 @@ The script for this agent looks as follows: docs_bot_protocol = Protocol("DocsBot") - PROMPT_TEMPLATE = """ Answer the question based only on the following context: @@ -246,7 +242,6 @@ The script for this agent looks as follows: Answer the question based on the above context: {question} """ - def create_retriever( ctx: Context, url: str, deep_read: bool ) -> ContextualCompressionRetriever: @@ -294,7 +289,6 @@ The script for this agent looks as follows: ctx.logger.error(f"Error happened: {exc}") traceback.format_exception(exc) - @docs_bot_protocol.on_message(model=RagRequest, replies={UAgentResponse}) async def answer_question(ctx: Context, sender: str, msg: RagRequest): ctx.logger.info(f"Received message from {sender}, session: {ctx.session}") @@ -330,10 +324,8 @@ The script for this agent looks as follows: sender, UAgentResponse(message=response, type=UAgentResponseType.FINAL) ) - agent.include(docs_bot_protocol, publish_manifest=True) - if __name__ == "__main__": agent.run() ``` diff --git a/pages/guides/agents/intermediate/mailbox.mdx b/pages/guides/agents/intermediate/mailbox.mdx index 031f0e61b..5d63b6af8 100644 --- a/pages/guides/agents/intermediate/mailbox.mdx +++ b/pages/guides/agents/intermediate/mailbox.mdx @@ -35,23 +35,23 @@ Make sure you have read the following resources before going on with this guide: ```py copy filename="mailbox_agent.py" from uagents import Agent, Context, Model - + class Message(Model): message: str - + AGENT_MAILBOX_KEY = "put_your_AGENT_MAILBOX_KEY_here" SEED_PHRASE = "put_your_seed_phrase_here" - + # Now your agent is ready to join the agentverse! agent = Agent( name="alice", seed=SEED_PHRASE, mailbox=f"{AGENT_MAILBOX_KEY}@https://agentverse.ai", ) - + # Copy the address shown below print(f"Your agent's address is: {agent.address}") - + if __name__ == "__main__": agent.run() ``` @@ -90,24 +90,24 @@ Let's update `alice` agent; `alice` will now print to console any message it rec ```py copy filename="mailbox_agent_updated.py" from uagents import Agent, Context, Model - + class Message(Model): message: str - + AGENT_MAILBOX_KEY = "put_your_AGENT_MAILBOX_KEY_here" SEED_PHRASE = "put_your_seed_phrase_here" - + # Now your agent is ready to join the agentverse! agent = Agent( name="alice", seed=SEED_PHRASE, mailbox=f"{AGENT_MAILBOX_KEY}@https://agentverse.ai", ) - + @agent.on_message(model=Message, replies={Message}) async def handle_message(ctx: Context, sender: str, msg: Message): ctx.logger.info(f"Received message from {sender}: {msg.message}") - + if __name__ == "__main__": agent.run() ``` @@ -117,24 +117,24 @@ Let's update `alice` agent; `alice` will now print to console any message it rec Let's create and run a second agent to message Alice every 3 seconds. You need to provide the `ALICE_ADDRESS`, `name` and `seed` parameters to correctly run this code: ```py copy filename="test_agent.py" - + from uagents import Agent, Bureau, Context, Model from datetime import datetime - + class Message(Model): message: str - + agent_2 = Agent(name="agent_2", seed="agent_2 recovery phrase", port=8001, endpoint="http://localhost:8001/submit") - + ALICE_ADDRESS = "add_address_of_alice_agent" - + @agent_2.on_interval(period=3.0) async def send_message(ctx: Context): await ctx.send(ALICE_ADDRESS, Message(message=f"hello {datetime.today().date()}")) - + if __name__ == "__main__": agent.run() - + ``` ## Testing diff --git a/pages/guides/agents/intermediate/options-for-running-local-agents.mdx b/pages/guides/agents/intermediate/options-for-running-local-agents.mdx index f10a91bdb..cfc7de934 100644 --- a/pages/guides/agents/intermediate/options-for-running-local-agents.mdx +++ b/pages/guides/agents/intermediate/options-for-running-local-agents.mdx @@ -110,31 +110,31 @@ Let's start by creating a local agent named `alice` with a `handle_message()` fu ```py copy filename="agent_mailbox" from uagents import Agent, Context, Model - + class Message(Model): message: str - + # First generate a secure seed phrase (e.g. https://pypi.org/project/mnemonic/) SEED_PHRASE = "put_your_seed_phrase_here" - + # Copy the address shown below print(f"Your agent's address is: {agent.address}") - + # Now go to https://agentverse.ai, register your agent in the Mailroom by providing the address you just copied. # Then, copy the agent's mailbox key and insert it here below inline AGENT_MAILBOX_KEY = "put_your_AGENT_MAILBOX_KEY_here" - + # Now your agent is ready to join the agentverse! agent = Agent( name="alice", seed=SEED_PHRASE, mailbox=f"{AGENT_MAILBOX_KEY}@https://agentverse.ai", ) - + @agent.on_message(model=Message, replies={Message}) async def handle_message(ctx: Context, sender: str, msg: Message): ctx.logger.info(f"Received message from {sender}: {msg.message}") - + if __name__ == "__main__": agent.run() ``` diff --git a/pages/guides/agents/intermediate/primary-secondary-functions.mdx b/pages/guides/agents/intermediate/primary-secondary-functions.mdx index 66f70e69f..6b660d465 100644 --- a/pages/guides/agents/intermediate/primary-secondary-functions.mdx +++ b/pages/guides/agents/intermediate/primary-secondary-functions.mdx @@ -65,7 +65,7 @@ This Agent helps users with their queries for a text-classification model of the # Define a handler for the Hugging face protocol @hf_protocol.on_message(model=HF, replies = UAgentResponse) async def on_hf_request(ctx: Context, sender: str, msg: HF): - + # Log the receipt of a response, including the sender and the message prompt ctx.logger.info(f"Received hugging face request from {sender} with prompt: {msg.response}") @@ -73,7 +73,7 @@ This Agent helps users with their queries for a text-classification model of the message = f'Response to your query from model is \n {msg.response}' # Asynchronously send a response back to the sender with the processed message await ctx.send(sender, UAgentResponse(message = message, type = UAgentResponseType.FINAL)) - + # Include the Hugging Face protocol in your agent agent.include(hf_protocol) ``` @@ -168,11 +168,11 @@ This agent helps user to look for specific model with search keyword. The agent # Make the GET request response = requests.get(url, params = params) - + # Append models in list for model in response.json(): models.append(model['id']) - + return models # Define a handler for the Model list protocol diff --git a/pages/guides/agents/intermediate/public-private-agents.mdx b/pages/guides/agents/intermediate/public-private-agents.mdx index feaba65de..aa3ff530c 100644 --- a/pages/guides/agents/intermediate/public-private-agents.mdx +++ b/pages/guides/agents/intermediate/public-private-agents.mdx @@ -12,7 +12,6 @@ This allows users to provide greater flexibility to Agents, creating a balance b ## Defining public and private agents - There are two ways in which an agent can be classified as public, they define an endpoint and or, they publish their manifests: ```python diff --git a/pages/guides/agents/intermediate/rest-endpoints.mdx b/pages/guides/agents/intermediate/rest-endpoints.mdx index 5bf15a70b..35fcbc191 100644 --- a/pages/guides/agents/intermediate/rest-endpoints.mdx +++ b/pages/guides/agents/intermediate/rest-endpoints.mdx @@ -2,7 +2,6 @@ import {Callout} from 'nextra/components' # How to add custom REST endpoints to your Agent - ## Introduction uAgents now support custom REST endpoints using the `on_rest_get()` and `on_rest_post()` decorators, enabling them to handle HTTP GET and POST requests directly. With this addition, agents can define specific routes, create request and response models, and interact seamlessly with REST clients. This feature enhances the flexibility of agents, allowing them to communicate with external systems using standard web protocols while ensuring that all responses conform to predefined models. @@ -70,25 +69,20 @@ from typing import Any, Dict from uagents import Agent, Context, Model - class Request(Model): text: str - class Response(Model): timestamp: int text: str agent_address: str - # You can also use empty models to represent empty request/response bodies class EmptyMessage(Model): pass - agent = Agent(name="Rest API") - @agent.on_rest_get("/rest/get", Response) async def handle_get(ctx: Context) -> Dict[str, Any]: ctx.logger.info("Received GET request") @@ -98,7 +92,6 @@ async def handle_get(ctx: Context) -> Dict[str, Any]: "agent_address": ctx.agent.address, } - @agent.on_rest_post("/rest/post", Request, Response) async def handle_post(ctx: Context, req: Request) -> Response: ctx.logger.info("Received POST request") @@ -108,7 +101,6 @@ async def handle_post(ctx: Context, req: Request) -> Response: timestamp=int(time.time()), ) - if __name__ == "__main__": agent.run() ``` @@ -138,6 +130,3 @@ if __name__ == "__main__": INFO: [Rest API]: Received POST request ``` - - - diff --git a/pages/guides/agents/intermediate/send-tokens.mdx b/pages/guides/agents/intermediate/send-tokens.mdx index 717a8dedd..4406d06a4 100644 --- a/pages/guides/agents/intermediate/send-tokens.mdx +++ b/pages/guides/agents/intermediate/send-tokens.mdx @@ -1,7 +1,6 @@ import { Callout } from 'nextra/components' import { CodeGroup, DocsCode } from "../../../../components/code"; - # How to use agents to send tokens ## Introduction @@ -34,20 +33,20 @@ Make sure you have read the following resources before going on with this guide: touch sending_tokens.py ``` - + ```py copy filename="windows" echo. > sending_tokens.py ``` - + ```py copy filename="ubuntu" touch sending_tokens.py ``` - + 2. Then, import the necessary modules from `uagents`, `uagents.network`, and `uagents.setup`. Let's then define two data models: `PaymentRequest` and `TransactionInfo`. We then need to set up the values for the `AMOUNT` and `DENOM` variables, which define the default amount and denomination for the payment requests: ```py copy diff --git a/pages/guides/agents/intermediate/storage-function.mdx b/pages/guides/agents/intermediate/storage-function.mdx index 1c70c6b1f..39ba28b0d 100644 --- a/pages/guides/agents/intermediate/storage-function.mdx +++ b/pages/guides/agents/intermediate/storage-function.mdx @@ -27,20 +27,20 @@ Make sure you have read the following resources before going on with this guide: touch storage.py ``` - + ```py copy filename="windows" echo. > storage.py ``` - + ```py copy filename="ubuntu" touch storage.py ``` - + 2. Then, we need to open the script in the text editor of choice and import the necessary classes, `Agent` and `Context`, from the `uagents` library. 3. Let's then create an agent named `alice` which logs a message every second using the `.on_interval()` decorator, indicating the current count. The `on_interval()` function takes a `Context` object as a parameter: the `Context` object contains a `storage` attribute, which is used to store and retrieve data between method calls: diff --git a/pages/guides/agents/quickstart.mdx b/pages/guides/agents/quickstart.mdx index 34ec7fc8c..1fdfad22c 100644 --- a/pages/guides/agents/quickstart.mdx +++ b/pages/guides/agents/quickstart.mdx @@ -79,9 +79,10 @@ Create a new Python script: + Open `interval_task.py` in your text editor and add the following code: - + - - + ```py copy filename="interval_task.py" @@ -185,7 +185,7 @@ Create 2 new Python scripts: Open `SenderAgent.py` in your text editor and add the following code: - + - - + ```py copy filename="SenderAgent.py" @@ -243,7 +242,7 @@ Open `SenderAgent.py` in your text editor and add the following code: Then, open `ReceiverAgent.py` in your text editor and add the following code into it: - + - - + ```py copy filename="ReceiverAgent.py" diff --git a/pages/guides/agentverse/agentverse-functions/registering-agent-coin-toss.mdx b/pages/guides/agentverse/agentverse-functions/registering-agent-coin-toss.mdx index a8cf8cbfe..fc4143961 100644 --- a/pages/guides/agentverse/agentverse-functions/registering-agent-coin-toss.mdx +++ b/pages/guides/agentverse/agentverse-functions/registering-agent-coin-toss.mdx @@ -58,13 +58,11 @@ After clicking on the row of your newly created agent, you should be able to see from uagents import Field from ai_engine import UAgentResponse, UAgentResponseType - class CoinToss(Model): choice: str = Field(description="The choice. Must be heads or tails.") coin_toss_protocol = Protocol("CoinToss") - @coin_toss_protocol.on_message(model=CoinToss, replies={UAgentResponse}) async def toss_coin(ctx: Context, sender: str, msg: CoinToss): random_number = random.randint(0, 1) diff --git a/pages/guides/agentverse/avctl/avctl-hosting.mdx b/pages/guides/agentverse/avctl/avctl-hosting.mdx index f5c76e9b8..192974adb 100644 --- a/pages/guides/agentverse/avctl/avctl-hosting.mdx +++ b/pages/guides/agentverse/avctl/avctl-hosting.mdx @@ -142,7 +142,7 @@ name Agent successfully deleted ``` - + Note: for hosting **push** and **sync** commands the agent should be always in stopped state. diff --git a/pages/guides/agentverse/creating-agentverse-agents/creating-a-hosted-agent.mdx b/pages/guides/agentverse/creating-agentverse-agents/creating-a-hosted-agent.mdx index 9f5c41320..853919284 100644 --- a/pages/guides/agentverse/creating-agentverse-agents/creating-a-hosted-agent.mdx +++ b/pages/guides/agentverse/creating-agentverse-agents/creating-a-hosted-agent.mdx @@ -114,7 +114,6 @@ There are different categories you can choose from: - _MongoDB Atlas integration_: this use case shows how to use MongoDB Atlas as a backend for agent storage with a restaurant booking example. - _PlanetScale integration_: this use case shows how to use PlanetScale as a backend for agent storage with a restaurant booking example. - 4. **DeltaV Integration**: this category allows you to develop Agents offering different Agent Functions which are then made available through the [DeltaV ↗️](/concepts/ai-engine/deltav) chat based on a given template. These agents and related Functions need to register within the [Agentverse ↗️](/concepts/agent-services/services) first so for them to be available for queries from users operating and interacting with DeltaV Agent. Checkout our dedicated guide for Agent Functions available [here ↗️](/guides/agents/intermediate/agent-functions). You can choose to: @@ -153,7 +152,7 @@ Additionally, you can now use `agent.run()` method, but this is also not require Check out the [AVCTL - Agentverse Command Line Interface ↗️](/guides/avctl/avctl) to better understand how to possibly interact with the Agentverse. AVCTL provides multiple features (e.g., authorization and hosting management) allowing developers to log in, set up projects, and deploy Agents on the Agentverse. - + ## Register Domain Name You can also provide a **Web3 Agent Name** to your agent. To do so, just click on **+ Register Web3 Name** and fill in the dedicated field for this. This way, your agent will be given a unique name, making it easier for other agents to find and communicate with it. The only requirement is _the name being in lowercase with no web3 in between_. diff --git a/pages/guides/agentverse/creating-agentverse-agents/simple-dice-roll-agent.mdx b/pages/guides/agentverse/creating-agentverse-agents/simple-dice-roll-agent.mdx index 530787b27..6766b09cb 100644 --- a/pages/guides/agentverse/creating-agentverse-agents/simple-dice-roll-agent.mdx +++ b/pages/guides/agentverse/creating-agentverse-agents/simple-dice-roll-agent.mdx @@ -46,7 +46,6 @@ After clicking on the row of your newly created agent, you should be able to see dice_roll_protocol = Protocol("DiceRoll") - @dice_roll_protocol.on_message(model=DiceRoll, replies={UAgentResponse}) async def roll_dice(ctx: Context, sender: str, msg: DiceRoll): result = ", ".join([str(random.randint(1, 6)) for _ in range(msg.num_rolls)]) diff --git a/pages/guides/ai-engine-sdk/javascript.mdx b/pages/guides/ai-engine-sdk/javascript.mdx index f543f95f2..8f73f380c 100644 --- a/pages/guides/ai-engine-sdk/javascript.mdx +++ b/pages/guides/ai-engine-sdk/javascript.mdx @@ -1,6 +1,5 @@ import { Callout } from 'nextra/components' - # AI-Engine Javascript SDk ## Introduction @@ -34,7 +33,6 @@ yarn add @fetchai/ai-engine-sdk - [DeltaV ↗️](/concepts/ai-engine/deltav) - ## SDK overview ### Creating the AI Engine client object @@ -83,12 +81,10 @@ const messages = await session.getMessages(); ## Handling Different Types of Messages - #### Task Selection Message (`isTaskSelectionMessage`) This message is generated when the AI engine suggests functions based on the initial objective or provides multiple options for a function. - #### Agent Message (`isAgentMessage`) This is a regular question from the AI Engine that the user needs to reply to with a string. @@ -105,12 +101,10 @@ This message is sent when the AI Engine has gathered all necessary inputs for th This message is sent when the session has ended, and the AI Engine no longer expects any replies from the user. - All message types (except for the AI engine message and stop message) expect a response from the user. - ## SDK Methods for Replying ### Task Selection Message @@ -125,8 +119,6 @@ Use `session.submitResponse`. Use either `session.submitConfirmation` to confirm, or `session.rejectConfirmation` to reject the context generated by the AI engine. - - ## Deleting session After finishing a conversation with the AI Engine, you can delete the session by using the following command. diff --git a/pages/guides/ai-engine-sdk/python.mdx b/pages/guides/ai-engine-sdk/python.mdx index 6eff3b210..ae20ca8af 100644 --- a/pages/guides/ai-engine-sdk/python.mdx +++ b/pages/guides/ai-engine-sdk/python.mdx @@ -1,6 +1,5 @@ import { Callout } from 'nextra/components' - # AI-Engine Python SDk ## Introduction @@ -34,7 +33,6 @@ pip install ai-engine-sdk - [DeltaV ↗️](/concepts/ai-engine/deltav) - ## SDK overview ### Creating the AI Engine client object @@ -132,12 +130,10 @@ while True: ## Handling Different Types of Messages - #### Task Selection Message (`is_task_selection_message`) This message is generated when the AI engine suggests functions based on the initial objective or provides multiple options for a function. - #### Agent Message (`is_agent_message`) This is a regular question from the AI Engine that the user needs to reply to with a string. @@ -154,12 +150,10 @@ This message is sent when the AI Engine has gathered all necessary inputs for th This message is sent when the session has ended, and the AI Engine no longer expects any replies from the user. - All message types (expect for the AI engine message and stop message) expects a response from the user. - ## SDK Methods for Replying ### Task Selection Message @@ -174,8 +168,6 @@ Use `session.submit_response`. Use either `session.submit_confirmation` to confirm, or `session.reject_confirmation` to reject the context generated by the AI engine. - - ## Deleting session After finishing a conversation with the AI Engine, you can delete the session by using the following command. @@ -184,7 +176,6 @@ After finishing a conversation with the AI Engine, you can delete the session by await session.delete() ``` - ## Example Usage of the SDK The following example demonstrates how to use the AI Engine SDK to interact with the AI Engine. The script sets up the client, queries function groups, creates a session, and handles different types of messages in a loop. @@ -210,7 +201,6 @@ logger = logging.getLogger(__name__) api_key = os.getenv("AV_API_KEY", "") interaction_user_prompt_header = f"\n\n🤖 Interaction time" - async def main(): logger.debug("🚀 Starting example execution") ai_engine = AiEngine(api_key) @@ -302,7 +292,6 @@ async def main(): # clean up the session await session.delete() - if __name__ == "__main__": logging.basicConfig( stream=sys.stdout, diff --git a/pages/guides/apis/agent-function-creation-apis.mdx b/pages/guides/apis/agent-function-creation-apis.mdx index de4cd4ecd..39888cb14 100644 --- a/pages/guides/apis/agent-function-creation-apis.mdx +++ b/pages/guides/apis/agent-function-creation-apis.mdx @@ -44,7 +44,6 @@ touch agent.py - ```py copy filename="mac" @@ -65,7 +64,6 @@ touch agent_create.py - 3. Fill in the scripts with the code presented here below for each one of them: ### Script 1: `agent.py` diff --git a/pages/guides/apis/secret-management-apis.mdx b/pages/guides/apis/secret-management-apis.mdx index 6b11b2c1b..7beaa4e92 100644 --- a/pages/guides/apis/secret-management-apis.mdx +++ b/pages/guides/apis/secret-management-apis.mdx @@ -32,13 +32,13 @@ This guide provides details on how to use the [Agentverse hosting APIs ↗️](/ touch agent_secret.py ``` - + ```py copy filename="windows" echo. > agent_secret.py ``` - + ```py copy filename="ubuntu" touch agent_secret.py @@ -121,7 +121,6 @@ data = { # Post request to add secret to agent response_agent = requests.post("https://agentverse.ai/v1/hosting/secrets", json=data, headers={"Authorization": token}) - # Check if the response code is 200 if response_agent.status_code == 200: print("Secret added successfully.") diff --git a/pages/guides/fetch-network/cosmpy/use-cases/liquidity-pool.mdx b/pages/guides/fetch-network/cosmpy/use-cases/liquidity-pool.mdx index 1791cdaec..f50f0fadb 100644 --- a/pages/guides/fetch-network/cosmpy/use-cases/liquidity-pool.mdx +++ b/pages/guides/fetch-network/cosmpy/use-cases/liquidity-pool.mdx @@ -16,20 +16,20 @@ This Liquidity pool interaction guide provides a practical demonstration of inte touch aerial_liquidity_pool.py ``` - + ```py copy filename="windows" echo. > aerial_liquidity_pool.py ``` - + ```py copy filename="ubuntu" touch aerial_liquidity_pool.py ``` - + 2. Let's then import the needed modules: ```py copy diff --git a/pages/guides/fetch-network/cosmpy/use-cases/oracles.mdx b/pages/guides/fetch-network/cosmpy/use-cases/oracles.mdx index f142b5834..e72f35974 100644 --- a/pages/guides/fetch-network/cosmpy/use-cases/oracles.mdx +++ b/pages/guides/fetch-network/cosmpy/use-cases/oracles.mdx @@ -40,7 +40,7 @@ touch aerial_oracle.py ``` - + 2. We would then also require the following imports: ```py copy @@ -132,7 +132,6 @@ touch aerial_oracle.py print(f"Next update in {UPDATE_INTERVAL_SECONDS} seconds...") sleep(UPDATE_INTERVAL_SECONDS) - if __name__ == "__main__": main() ``` @@ -163,7 +162,6 @@ from cosmpy.aerial.faucet import FaucetApi from cosmpy.aerial.wallet import LocalWallet from cosmpy.crypto.address import Address - COIN_PRICE_URL = ( "https://api.coingecko.com/api/v3/simple/price?ids=fetch-ai&vs_currencies=usd" ) @@ -171,7 +169,6 @@ UPDATE_INTERVAL_SECONDS = 10 ORACLE_VALUE_DECIMALS = 5 DEFAULT_TIMEOUT = 60.0 - def _parse_commandline(): parser = argparse.ArgumentParser() parser.add_argument( diff --git a/pages/guides/fetch-network/cosmpy/use-cases/stake-auto-compounder.mdx b/pages/guides/fetch-network/cosmpy/use-cases/stake-auto-compounder.mdx index 96572676a..8dfbb3291 100644 --- a/pages/guides/fetch-network/cosmpy/use-cases/stake-auto-compounder.mdx +++ b/pages/guides/fetch-network/cosmpy/use-cases/stake-auto-compounder.mdx @@ -229,7 +229,6 @@ touch aerial_compounder.py time.sleep(period - (end - begin)) time_check = time.monotonic() - start_time - if __name__ == "__main__": main() ``` @@ -256,7 +255,6 @@ from cosmpy.aerial.config import NetworkConfig from cosmpy.aerial.faucet import FaucetApi from cosmpy.aerial.wallet import LocalWallet - def _parse_commandline(): parser = argparse.ArgumentParser() parser.add_argument( @@ -283,7 +281,6 @@ def _parse_commandline(): return parser.parse_args() - def main(): """Run main.""" args = _parse_commandline() @@ -353,7 +350,6 @@ def main(): time.sleep(period - (end - begin)) time_check = time.monotonic() - start_time - if __name__ == "__main__": main() ``` diff --git a/pages/guides/fetch-network/cosmpy/use-cases/swap_automation.mdx b/pages/guides/fetch-network/cosmpy/use-cases/swap_automation.mdx index a528170ab..cbef52946 100644 --- a/pages/guides/fetch-network/cosmpy/use-cases/swap_automation.mdx +++ b/pages/guides/fetch-network/cosmpy/use-cases/swap_automation.mdx @@ -276,7 +276,6 @@ touch aerial_swap_automation.py sleep(interval) - if __name__ == "__main__": main() ``` diff --git a/pages/guides/fetch-network/cosmpy/use-cases/wallet-top-up.mdx b/pages/guides/fetch-network/cosmpy/use-cases/wallet-top-up.mdx index aa755e945..48669e155 100644 --- a/pages/guides/fetch-network/cosmpy/use-cases/wallet-top-up.mdx +++ b/pages/guides/fetch-network/cosmpy/use-cases/wallet-top-up.mdx @@ -137,7 +137,6 @@ touch aerial_authz.py tx = prepare_and_broadcast_basic_transaction(ledger, tx, wallet) tx.wait_to_complete() - if __name__ == "__main__": main() ``` @@ -168,7 +167,6 @@ from cosmpy.protos.cosmos.authz.v1beta1.tx_pb2 import MsgGrant from cosmpy.protos.cosmos.bank.v1beta1.authz_pb2 import SendAuthorization from cosmpy.protos.cosmos.base.v1beta1.coin_pb2 import Coin - def _parse_commandline(): parser = argparse.ArgumentParser() parser.add_argument( @@ -192,7 +190,6 @@ def _parse_commandline(): return parser.parse_args() - def main(): """Run main.""" args = _parse_commandline() @@ -239,7 +236,6 @@ def main(): tx = prepare_and_broadcast_basic_transaction(ledger, tx, wallet) tx.wait_to_complete() - if __name__ == "__main__": main() ``` @@ -391,7 +387,6 @@ touch aerial_topup.py time.sleep(interval_time) - if __name__ == "__main__": main() ``` diff --git a/pages/guides/fetch-network/fetch-wallet/web-wallet/activity.mdx b/pages/guides/fetch-network/fetch-wallet/web-wallet/activity.mdx index ad3894ee7..2249956fa 100644 --- a/pages/guides/fetch-network/fetch-wallet/web-wallet/activity.mdx +++ b/pages/guides/fetch-network/fetch-wallet/web-wallet/activity.mdx @@ -8,7 +8,7 @@ This page allows users to delve into activity undertaken with the wallet, encomp - Navigate to the **Activity** tab. ![](src/images/guides/wallet/activity-web-wallet_00.png) - + - Here you will be able to check all of the activity you undertook within the wallet - Here you will have 2 tabs **Transactions** and **Governance Proposals**. diff --git a/pages/guides/fetch-network/fetch-wallet/web-wallet/get-started.mdx b/pages/guides/fetch-network/fetch-wallet/web-wallet/get-started.mdx index 18e0e7e68..46e8e0e2a 100644 --- a/pages/guides/fetch-network/fetch-wallet/web-wallet/get-started.mdx +++ b/pages/guides/fetch-network/fetch-wallet/web-wallet/get-started.mdx @@ -90,7 +90,7 @@ If you already have a Metamask account, you can import an existing wallet follo ![](src/images/guides/wallet/getting-started-web-wallet_11.png) 3. You will be taken to the main import screen, where you can provide the **Account Name**, the **Ethereum Address** you are migrating from (i.e., in this case, your Metamask ETH address). This is used to ensure that the private key matches. Finally, copy the **Private Key** from your Metamask account. - + ![](src/images/guides/wallet/getting-started-web-wallet_12.png) 4. If this is your first key in the wallet, you will be prompted to create a **global password** for your wallet. The password will be required the next time you use the wallet or make changes to your account. diff --git a/pages/guides/fetch-network/fetch-wallet/web-wallet/stake.mdx b/pages/guides/fetch-network/fetch-wallet/web-wallet/stake.mdx index c9bf9d412..b29d6c4be 100644 --- a/pages/guides/fetch-network/fetch-wallet/web-wallet/stake.mdx +++ b/pages/guides/fetch-network/fetch-wallet/web-wallet/stake.mdx @@ -60,7 +60,7 @@ Redelegating involves moving funds from one validator to another. Follow these s 4. Select the new validator where you want to stake the balance. 5. Fill in the necessary information and proceed with the transaction. - + ![](src/images/guides/wallet/stake-web-wallet_11.png) ### Claim Rewards @@ -85,4 +85,3 @@ Redelegating involves moving funds from one validator to another. Follow these s After successfully withdrawing rewards, they will be displayed on the staking dashboard. - diff --git a/pages/guides/fetch-network/jenesis/contracts/contracts-interaction.mdx b/pages/guides/fetch-network/jenesis/contracts/contracts-interaction.mdx index 6321cec53..c4ec5a12f 100644 --- a/pages/guides/fetch-network/jenesis/contracts/contracts-interaction.mdx +++ b/pages/guides/fetch-network/jenesis/contracts/contracts-interaction.mdx @@ -53,7 +53,7 @@ You will observe the following text indicating the available contracts in your p In this case, we can see that `deployment_1` and `token_1` deployments are available for this project. If these contracts have been already deployed, you can directly interact with them by performing contract queries and executions, such as: - + ```py copy >>> deployment_1.query(args = {'msg_name': {...}} >>> deployment_1.execute(args = {'msg_name': {...}} diff --git a/pages/guides/fetch-network/ledger/snapshots.mdx b/pages/guides/fetch-network/ledger/snapshots.mdx index 77fb6db81..9e62f74fe 100644 --- a/pages/guides/fetch-network/ledger/snapshots.mdx +++ b/pages/guides/fetch-network/ledger/snapshots.mdx @@ -12,7 +12,6 @@ Snapshots are available for both mainnet and the most recent testnet. The URLs f Our aim is to update snapshots on a daily basis! - The example below uses the _pruned mainnet snapshot_, but can be adapted as required for full or archive nodes. ## Example: using a snapshot diff --git a/pages/guides/quickstart-with/CrewAI/creating-an-agent-with-crewai.mdx b/pages/guides/quickstart-with/CrewAI/creating-an-agent-with-crewai.mdx index 6d27ceecd..5107d783e 100644 --- a/pages/guides/quickstart-with/CrewAI/creating-an-agent-with-crewai.mdx +++ b/pages/guides/quickstart-with/CrewAI/creating-an-agent-with-crewai.mdx @@ -14,12 +14,12 @@ Let's use a shortened example that CrewAI provides; in this example we define an fimport os from crewai import Agent, Task, Crew, Process from crewai_tools import SerperDevTool - + os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY" os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API key - + search_tool = SerperDevTool() - + # Define your agents with roles and goals researcher = Agent( role='Senior Research Analyst', @@ -31,7 +31,7 @@ Let's use a shortened example that CrewAI provides; in this example we define an allow_delegation=False, tools=[search_tool] ) - + # Create tasks for your agents task1 = Task( description="""Conduct a comprehensive analysis of the latest advancements in AI in 2024. @@ -39,7 +39,7 @@ Let's use a shortened example that CrewAI provides; in this example we define an expected_output="Full analysis report in bullet points", agent=researcher ) - + # Instantiate your crew with a sequential process crew = Crew( agents=[researcher,], @@ -47,10 +47,10 @@ Let's use a shortened example that CrewAI provides; in this example we define an verbose=True, process = Process.sequential ) - + # Get your crew to work! result = crew.kickoff() - + print("######################") print(result) ``` @@ -67,7 +67,7 @@ Fetch.ai has the concept of an agent where this is an agent that is the componen You can read more about agents communication in our [guides ↗️](/guides/agents/intermediate/communicating-with-other-agents) Let's install what we need: - + ```bash copy poetry init poetry add uagents @@ -82,32 +82,32 @@ Our first agent is simple; it sends a message every two seconds to a static addr ```python copy filename="sender_agent.py" from uagents import Agent, Context, Model from uagents.setup import fund_agent_if_low - + class Message(Model): message: str - + RECIPIENT_ADDRESS = "agent1qf4au6rzaauxhy2jze6v85rspgvredx9m42p0e0cukz0hv4dh2sqjuhujpp" - + agent = Agent( name="agent", port=8000, seed="", endpoint=["http://127.0.0.1:8000/submit"], ) - + fund_agent_if_low(agent.wallet.address()) - + @agent.on_interval(period=2.0) async def send_message(ctx: Context): await ctx.send(RECIPIENT_ADDRESS, Message(message="hello there")) - + @agent.on_message(model=Message) async def message_handler(ctx: Context, sender: str, msg: Message): ctx.logger.info(f"Received message from {sender}: {msg.message}") - + if __name__ == "__main__": agent.run() - + ``` This first agent introduces a few core concepts you will need to be aware of when creating any agent. @@ -163,33 +163,32 @@ Agent two doesn't do anything different to agent one; it has different args for ```python copy filename="receiver_agent.py" from uagents.setup import fund_agent_if_low from uagents import Agent, Context, Model - - + class Message(Model): message: str - + agent = Agent( name="agent 2", port=8001, seed="", endpoint=["http://127.0.0.1:8001/submit"], ) - + fund_agent_if_low(agent.wallet.address()) - + @agent.on_event("startup") async def start(ctx: Context): ctx.logger.info(f"agent address is {agent.address}") - + @agent.on_message(model=Message) async def message_handler(ctx: Context, sender: str, msg: Message): ctx.logger.info(f"Received message from {sender}: {msg.message}") - + await ctx.send(sender, Message(message="hello there")) - + if __name__ == "__main__": agent.run() - + ``` Okay, let's now run these agents. @@ -205,12 +204,12 @@ Updated `agent1.py` script sample: ```python copy filename="agent1.py" from uagents import Agent, Context, Model from uagents.setup import fund_agent_if_low - + class Message(Model): message: bool - + RECIPIENT_ADDRESS="agent...." - + agent = Agent( ... ``` @@ -264,34 +263,30 @@ When a request is received with a city name, the agent logs the request, conduct import os from crewai import Agent as CrewAIAgent, Task, Crew, Process from crewai_tools import SerperDevTool - + senior_research_analyst_agent = Agent( name="senior_research_analyst_agent", seed="senior_research_analyst_agent_seed", port=8001, endpoint=["http://127.0.0.1:8001/submit"], ) - - + class CityRequestModel(Model): city: str - - + class ResearchReportModel(Model): report: str - - + os.environ["OPENAI_API_KEY"] = "" os.environ["SERPER_API_KEY"] = "" - - + class SeniorResearchAnalyst: def __init__(self): """ Initializes the Senior Research Analyst agent with a search tool. """ self.search_tool = SerperDevTool() - + self.researcher = CrewAIAgent( role="Senior Research Analyst", goal="Uncover cutting-edge developments in AI and provide weather updates.", @@ -301,14 +296,14 @@ When a request is received with a city name, the agent logs the request, conduct allow_delegation=False, tools=[self.search_tool], ) - + def create_task(self, city: str) -> Task: """ Creates a task for conducting research on AI advancements and retrieving weather updates. - + Parameters: - city: str, the city for which the weather update is requested. - + Returns: - Task: The created task with the specified description and expected output. """ @@ -316,20 +311,20 @@ When a request is received with a city name, the agent logs the request, conduct f"Conduct a comprehensive analysis of the latest advancements in AI in 2024. " f"Also, use the search tool to provide the current weather update for {city}." ) - + return Task( description=task_description, expected_output="Full analysis report with weather data", agent=self.researcher, ) - + def run_process(self, city: str): """ Runs the process for the created task and retrieves the result. - + Parameters: - city: str, the city for which the task is run. - + Returns: - result: The output from the CrewAI process after executing the task. """ @@ -342,22 +337,21 @@ When a request is received with a city name, the agent logs the request, conduct ) result = crew.kickoff() return result - - + @senior_research_analyst_agent.on_message(model=CityRequestModel, replies=ResearchReportModel) async def handle_city_request(ctx: Context, sender: str, msg: CityRequestModel): """ Handles incoming messages requesting city information. - + What it does: - Logs the received city name. - Runs the research process for the specified city and sends the report back to the sender. - + Parameters: - ctx: Context, provides the execution context for logging and messaging. - sender: str, the address of the sender agent. - msg: CityRequestModel, the received message containing the city name. - + Returns: - None: Sends the research report to the sender agent. """ @@ -365,20 +359,19 @@ When a request is received with a city name, the agent logs the request, conduct research_analyst = SeniorResearchAnalyst() gather_task_result = research_analyst.run_process(msg.city) await ctx.send(sender, ResearchReportModel(report=str(gather_task_result))) - - + if __name__ == "__main__": """ Starts the communication agent and begins listening for messages. - + What it does: - Runs the agent, enabling it to send/receive messages and handle events. - + Returns: - None: Runs the agent loop indefinitely. """ senior_research_analyst_agent.run() - + ``` ### Agent two: Research Asking Agent @@ -395,82 +388,76 @@ This agent operates continuously, enabling effective communication and retrieval ```python copy filename="crewai_agent_2.py" from uagents import Agent, Context, Model - - + class CityRequestModel(Model): city: str - - + class ResearchReportModel(Model): report: str - - + research_asking_agent = Agent( name="research_asking_agent", seed="research_asking_agent_seed", port=8000, endpoint=["http://127.0.0.1:8000/submit"], ) - + TARGET_AGENT_ADDRESS = ( "agent1qgxfhzy78m2qfdsg726gtj4vnd0hkqx96xwprng2e4rmn0xfq7p35u6dz8q" ) DEFAULT_CITY = "London" - - + @research_asking_agent.on_event("startup") async def on_startup(ctx: Context): """ Triggered when the agent starts up. - + What it does: - Logs the agent's name and address. - Sends a message to the target agent with the default city (e.g., 'London'). - + Parameters: - ctx: Context, provides the execution context for logging and messaging. - + Returns: - None: Sends the message to the target agent asynchronously. """ ctx.logger.info( f"Hello, I'm {research_asking_agent.name}, and my address is {research_asking_agent.address}." ) - + await ctx.send(TARGET_AGENT_ADDRESS, CityRequestModel(city=DEFAULT_CITY)) - - + @research_asking_agent.on_message(model=ResearchReportModel) async def handle_research_report(ctx: Context, sender: str, msg: ResearchReportModel): """ Triggered when a message of type ResearchReportModel is received. - + What it does: - Logs the sender's address and the research report received. - + Parameters: - ctx: Context, provides the execution context for logging and messaging. - sender: str, the address of the sender agent. - msg: ResearchReportModel, the received research report. - + Returns: - None: Processes the message and logs it. """ ctx.logger.info(f"Received research report from {sender}: {msg.report}") - - + if __name__ == "__main__": """ Starts the research analyst agent and begins listening for events. - + What it does: - Runs the agent, enabling it to send/receive messages and handle events. - + Returns: - None: Runs the agent loop indefinitely. """ research_asking_agent.run() - + ``` ### Output diff --git a/pages/guides/quickstart-with/CrewAI/startup-idea-analyser.mdx b/pages/guides/quickstart-with/CrewAI/startup-idea-analyser.mdx index ebdf00cb8..e4e06c808 100644 --- a/pages/guides/quickstart-with/CrewAI/startup-idea-analyser.mdx +++ b/pages/guides/quickstart-with/CrewAI/startup-idea-analyser.mdx @@ -139,7 +139,7 @@ This system defines an Agent called **startup idea analyzer** that interacts wit ### CrewAI System The following script defines a `MarketResearchProcess` class that sets up a market research workflow using three specialized agents: a `Market Research Analyst`, a `Technology Expert`, and a `Business Development Consultant`. The script creates and assigns tasks to these agents, such as analyzing market demand, assessing technological needs, and developing a business plan. It then uses the `Crew` class to execute these tasks sequentially, passing the results from one agent to the next one, to then return the final outcome. - + ```python copy filename="crew_ai.py" import os diff --git a/pages/guides/quickstart-with/langchain/creating-an-agent-with-langchain.mdx b/pages/guides/quickstart-with/langchain/creating-an-agent-with-langchain.mdx index a2184e894..0486fee64 100644 --- a/pages/guides/quickstart-with/langchain/creating-an-agent-with-langchain.mdx +++ b/pages/guides/quickstart-with/langchain/creating-an-agent-with-langchain.mdx @@ -133,7 +133,6 @@ Agent two doesn't do anything different to agent one; it has different args for from uagents.setup import fund_agent_if_low from uagents import Agent, Context, Model - class Message(Model): message: str @@ -174,12 +173,12 @@ Updated `first_agent.py` script sample: ```python copy filename="agent_one.py" from uagents import Agent, Context, Model from uagents.setup import fund_agent_if_low - + class Message(Model): message: bool - + RECIPIENT_ADDRESS="agent...." - + agent = Agent( ... ``` diff --git a/pages/guides/quickstart-with/langchain/multiple-agent-workflows.mdx b/pages/guides/quickstart-with/langchain/multiple-agent-workflows.mdx index 026413ab1..61709ef09 100644 --- a/pages/guides/quickstart-with/langchain/multiple-agent-workflows.mdx +++ b/pages/guides/quickstart-with/langchain/multiple-agent-workflows.mdx @@ -60,7 +60,6 @@ Versions used for this example are: ### Agent 1 - RequestAgent: provides a question and a source - This is our simplest agent; this agent provides a link to a PDF and question to be answered from the document. ```python copy filename="request_agent.py" @@ -96,11 +95,9 @@ async def on_startup(ctx: Context): async def document_load(ctx: Context, sender: str, msg: DocumentsResponse): ctx.logger.info(msg.learnings) - agent.include(summary_protocol, publish_manifest=True) agent.run() - ``` ### Agent 2 - PDFQuestionAgent: takes a request and returns a result diff --git a/poetry.lock b/poetry.lock index 83c047890..7b4736f76 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,49 +13,44 @@ files = [ [[package]] name = "blis" -version = "0.7.11" +version = "1.0.1" description = "The Blis BLAS-like linear algebra library, as a self-contained C-extension." optional = false python-versions = "*" files = [ - {file = "blis-0.7.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd5fba34c5775e4c440d80e4dea8acb40e2d3855b546e07c4e21fad8f972404c"}, - {file = "blis-0.7.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31273d9086cab9c56986d478e3ed6da6752fa4cdd0f7b5e8e5db30827912d90d"}, - {file = "blis-0.7.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d06883f83d4c8de8264154f7c4a420b4af323050ed07398c1ff201c34c25c0d2"}, - {file = "blis-0.7.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee493683e3043650d4413d531e79e580d28a3c7bdd184f1b9cfa565497bda1e7"}, - {file = "blis-0.7.11-cp310-cp310-win_amd64.whl", hash = "sha256:a73945a9d635eea528bccfdfcaa59dd35bd5f82a4a40d5ca31f08f507f3a6f81"}, - {file = "blis-0.7.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b68df4d01d62f9adaef3dad6f96418787265a6878891fc4e0fabafd6d02afba"}, - {file = "blis-0.7.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:162e60d941a8151418d558a94ee5547cb1bbeed9f26b3b6f89ec9243f111a201"}, - {file = "blis-0.7.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:686a7d0111d5ba727cd62f374748952fd6eb74701b18177f525b16209a253c01"}, - {file = "blis-0.7.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0421d6e44cda202b113a34761f9a062b53f8c2ae8e4ec8325a76e709fca93b6e"}, - {file = "blis-0.7.11-cp311-cp311-win_amd64.whl", hash = "sha256:0dc9dcb3843045b6b8b00432409fd5ee96b8344a324e031bfec7303838c41a1a"}, - {file = "blis-0.7.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dadf8713ea51d91444d14ad4104a5493fa7ecc401bbb5f4a203ff6448fadb113"}, - {file = "blis-0.7.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcdaf370f03adaf4171d6405a89fa66cb3c09399d75fc02e1230a78cd2759e4"}, - {file = "blis-0.7.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7de19264b1d49a178bf8035406d0ae77831f3bfaa3ce02942964a81a202abb03"}, - {file = "blis-0.7.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea55c6a4a60fcbf6a0fdce40df6e254451ce636988323a34b9c94b583fc11e5"}, - {file = "blis-0.7.11-cp312-cp312-win_amd64.whl", hash = "sha256:5a305dbfc96d202a20d0edd6edf74a406b7e1404f4fa4397d24c68454e60b1b4"}, - {file = "blis-0.7.11-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:68544a1cbc3564db7ba54d2bf8988356b8c7acd025966e8e9313561b19f0fe2e"}, - {file = "blis-0.7.11-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:075431b13b9dd7b411894d4afbd4212acf4d0f56c5a20628f4b34902e90225f1"}, - {file = "blis-0.7.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:324fdf62af9075831aa62b51481960e8465674b7723f977684e32af708bb7448"}, - {file = "blis-0.7.11-cp36-cp36m-win_amd64.whl", hash = "sha256:afebdb02d2dcf9059f23ce1244585d3ce7e95c02a77fd45a500e4a55b7b23583"}, - {file = "blis-0.7.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2e62cd14b20e960f21547fee01f3a0b2ac201034d819842865a667c969c355d1"}, - {file = "blis-0.7.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b01c05a5754edc0b9a3b69be52cbee03f645b2ec69651d12216ea83b8122f0"}, - {file = "blis-0.7.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfee5ec52ba1e9002311d9191f7129d7b0ecdff211e88536fb24c865d102b50d"}, - {file = "blis-0.7.11-cp37-cp37m-win_amd64.whl", hash = "sha256:844b6377e3e7f3a2e92e7333cc644095386548ad5a027fdc150122703c009956"}, - {file = "blis-0.7.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6df00c24128e323174cde5d80ebe3657df39615322098ce06613845433057614"}, - {file = "blis-0.7.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:809d1da1331108935bf06e22f3cf07ef73a41a572ecd81575bdedb67defe3465"}, - {file = "blis-0.7.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfabd5272bbbe504702b8dfe30093653d278057656126716ff500d9c184b35a6"}, - {file = "blis-0.7.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca684f5c2f05269f17aefe7812360286e9a1cee3afb96d416485efd825dbcf19"}, - {file = "blis-0.7.11-cp38-cp38-win_amd64.whl", hash = "sha256:688a8b21d2521c2124ee8dfcbaf2c385981ccc27e313e052113d5db113e27d3b"}, - {file = "blis-0.7.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2ff7abd784033836b284ff9f4d0d7cb0737b7684daebb01a4c9fe145ffa5a31e"}, - {file = "blis-0.7.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9caffcd14795bfe52add95a0dd8426d44e737b55fcb69e2b797816f4da0b1d2"}, - {file = "blis-0.7.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fb36989ed61233cfd48915896802ee6d3d87882190000f8cfe0cf4a3819f9a8"}, - {file = "blis-0.7.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ea09f961871f880d5dc622dce6c370e4859559f0ead897ae9b20ddafd6b07a2"}, - {file = "blis-0.7.11-cp39-cp39-win_amd64.whl", hash = "sha256:5bb38adabbb22f69f22c74bad025a010ae3b14de711bf5c715353980869d491d"}, - {file = "blis-0.7.11.tar.gz", hash = "sha256:cec6d48f75f7ac328ae1b6fbb372dde8c8a57c89559172277f66e01ff08d4d42"}, + {file = "blis-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:232f68f78fd9ab2f8bf01424cd6a265edd97e14e26186ef48eca1b6f212e928f"}, + {file = "blis-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90a796d8311b6439d63c91ed09163be995173a1ca5bedc510c1b45cbdbb7886c"}, + {file = "blis-1.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:388b0b0c55df884eb5853292d53c7c3daaa009b3d991e7a95413e46e82e88058"}, + {file = "blis-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c89149eed90c3b76f50c88d8d68661ca07d8b4bfaa517eedf5b77ddf640bb1"}, + {file = "blis-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f23cff163c0a256b580c33364f1598a4f49f532074c673a734d9b02a101adce1"}, + {file = "blis-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d4d403d4b4979d5b1e6f12637ed25fb3bd4e260440997d9ba9e752f9e9c91cb"}, + {file = "blis-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6440bed28f405ab81d1d57b3fb96b7ea8b5b1f3d3a0d29860b0a814fe4ece27"}, + {file = "blis-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5076b33c04b864709d0d22c40e9f57dc06ee9c2bd2f7ab72b10ffa74a470d9e6"}, + {file = "blis-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6b1f791fa3eeb267b97f5877a6bdcc09c868603b84422acf7fd138ec9b96c3c"}, + {file = "blis-1.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c249649c0f7c06b2368a9d5c6b12209255981e96304c6140a3beffaff6cae62"}, + {file = "blis-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:632580f1d3ff44fb36e8a21a9457f23aeaff5d35d108bd2ef0393b9f6d85de93"}, + {file = "blis-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:64393297304712818020734fa75735f4543243eefc44858ef3c99375d5bb029a"}, + {file = "blis-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d3b3293c795007dbf4ba8ceaf3184a6bf510ca3252d0229607792f52e8702bb2"}, + {file = "blis-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:60e1b03663bee7a37b4b3131b4179d283868ccb10a3260fed01dd980866bc49f"}, + {file = "blis-1.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e031b6cf0dcc026d697a860bf53bc02b5f26ddb5a3ecd23933c51cf22803825b"}, + {file = "blis-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f860c1723928c40d4920a05130d21a600dcb5fbf07aa1fe8f4bdff2c4a5238a5"}, + {file = "blis-1.0.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:399196506829c278836028511f351f32f2c992263e91ef876c6bc41dc2483d3d"}, + {file = "blis-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce20590af2c6ff02d66ffed4148ea8ea1e3f772febb8471e3e58614e71d428c1"}, + {file = "blis-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6ad60d9cd81523429f46109b31e3c4bbdd0dc28a328d6dbdcdff8447a53a61e"}, + {file = "blis-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb553b233fc815957c5bbb5d2fc2f6d2b199c123ec15c5000db935662849e543"}, + {file = "blis-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:376188493f590c4310ca534b687ef96c21c8224eb1ef4a0420703eebe175d6fa"}, + {file = "blis-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:136eae35dd9fd6c1923b95d5623aa174abd43d5b764bed79fd37bf6ad40282e7"}, + {file = "blis-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:16b5a418c55825d0d7912f63befee865da7522ce8f388b8ef76224050c5f8386"}, + {file = "blis-1.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:806ab0838efa5e434e6fcdce86542601d0263256d483623bc86e91728a645de4"}, + {file = "blis-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ad60cde863a7cf8e69fcf0c3b965ab0f804f0332adb35552788bb76660c97f"}, + {file = "blis-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:40459f37f430de0c6059631cc9f7588c3bccb6ade074571015ea09856b91cb69"}, + {file = "blis-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f0977eaba2d3f64df649201aa281cf3216e7bec18929a7374c3f3f36100db029"}, + {file = "blis-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:5b4c8298c49b25058462731139b711e35e73623280cee03c3b0804cbdee50c0d"}, + {file = "blis-1.0.1.tar.gz", hash = "sha256:91739cd850ca8100dcddbd8ad66942cab20c9473cdea9a35b165b11d7b8d91e4"}, ] [package.dependencies] -numpy = {version = ">=1.19.0", markers = "python_version >= \"3.9\""} +numpy = ">=2.0.0,<3.0.0" [[package]] name = "catalogue" @@ -81,101 +76,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.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.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -310,13 +320,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "langcodes" -version = "3.4.0" +version = "3.4.1" description = "Tools for labeling human languages with IETF language tags" optional = false python-versions = ">=3.8" files = [ - {file = "langcodes-3.4.0-py3-none-any.whl", hash = "sha256:10a4cc078b8e8937d8485d3352312a0a89a3125190db9f2bb2074250eef654e9"}, - {file = "langcodes-3.4.0.tar.gz", hash = "sha256:ae5a77d1a01d0d1e91854a671890892b7ce9abb601ab7327fc5c874f899e1979"}, + {file = "langcodes-3.4.1-py3-none-any.whl", hash = "sha256:68f686fc3d358f222674ecf697ddcee3ace3c2fe325083ecad2543fd28a20e77"}, + {file = "langcodes-3.4.1.tar.gz", hash = "sha256:a24879fed238013ac3af2424b9d1124e38b4a38b2044fd297c8ff38e5912e718"}, ] [package.dependencies] @@ -346,99 +356,87 @@ test = ["pytest", "pytest-cov"] [[package]] name = "marisa-trie" -version = "1.2.0" +version = "1.2.1" description = "Static memory-efficient and fast Trie-like structures for Python." optional = false python-versions = ">=3.7" files = [ - {file = "marisa_trie-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:61fab91fef677f0af0e818e61595f2334f7e0b3e122b24ec65889aae69ba468d"}, - {file = "marisa_trie-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f5b3080316de735bd2b07265de5eea3ae176fa2fc60f9871aeaa9cdcddfc8f7"}, - {file = "marisa_trie-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77bfde3287314e91e28d3a882c7b87519ef0ee104c921df72c7819987d5e4863"}, - {file = "marisa_trie-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4fbb1ec1d9e891060a0aee9f9c243acec63de1e197097a14850ba38ec8a4013"}, - {file = "marisa_trie-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e04e9c86fe8908b61c2aebb8444217cacaed15b93d2dccaac3849e36a6dc660"}, - {file = "marisa_trie-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a7c75a508f44e40f7af8448d466045a97534adcbb026e63989407cefb9ebfa6"}, - {file = "marisa_trie-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5321211647609869907e81b0230ad2dfdfa7e19fe1ee469b46304a622391e6a1"}, - {file = "marisa_trie-1.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:88660e6ee0f821872aaf63ba4b9a7513428b9cab20c69cc013c368bd72c3a4fe"}, - {file = "marisa_trie-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e4535fc5458de2b59789e574cdd55923d63de5612dc159d33941af79cd62786"}, - {file = "marisa_trie-1.2.0-cp310-cp310-win32.whl", hash = "sha256:bdd1d4d430e33abbe558971d1bd57da2d44ca129fa8a86924c51437dba5cb345"}, - {file = "marisa_trie-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:c729e2b8f9699874b1372b5a01515b340eda1292f5e08a3fe4633b745f80ad7a"}, - {file = "marisa_trie-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d62985a0e6f2cfeb36cd6afa0460063bbe83ef4bfd9afe189a99103487547210"}, - {file = "marisa_trie-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1890cc993149db4aa8242973526589e8133c3f92949b0ac74c2c9a6596707ae3"}, - {file = "marisa_trie-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26177cd0dadb7b44f47c17c40e16ac157c4d22ac7ed83b5a47f44713239e10d1"}, - {file = "marisa_trie-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3425dc81d49a374be49e3a063cb6ccdf57973201b0a30127082acea50562a85e"}, - {file = "marisa_trie-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:525b8df41a1a7337ed7f982eb63b704d7d75f047e30970fcfbe9cf6fc22c5991"}, - {file = "marisa_trie-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c643c66bbde6a115e4ec8713c087a9fe9cb7b7c684e6af4cf448c120fa427ea4"}, - {file = "marisa_trie-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a83fe83e0eab9154a2dc7c556898c86584b7779ddf4214c606fce4ceff07c13"}, - {file = "marisa_trie-1.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:49701db6bb8f1ec0133abd95f0a4891cfd6f84f3bd019e343037e31a5a5b0210"}, - {file = "marisa_trie-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a3f0562863deaad58c5dc3a51f706da92582bc9084189148a45f7a12fe261a51"}, - {file = "marisa_trie-1.2.0-cp311-cp311-win32.whl", hash = "sha256:b08968ccad00f54f31e38516e4452fae59dd15a3fcee56aea3101ba2304680b3"}, - {file = "marisa_trie-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3ef375491e7dd71a0a7e7bf288c88750942bd1ee0c379dcd6ad43e31af67d00"}, - {file = "marisa_trie-1.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:39b88f126988ea83e8458259297d2b2f9391bfba8f4dc5d7a246813aae1c1def"}, - {file = "marisa_trie-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ec167b006884a90d130ee30518a9aa44cb40211f702bf07031b2d7d4d1db569b"}, - {file = "marisa_trie-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b855e6286faef5411386bf9d676dfb545c09f7d109f197f347c9366aeb12f07"}, - {file = "marisa_trie-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cd287ff323224d87c2b739cba39614aac3737c95a254e0ff70e77d9b8df226d"}, - {file = "marisa_trie-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d8a1c0361165231f4fb915237470afc8cc4803c535f535f4fc42ca72855b124"}, - {file = "marisa_trie-1.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3267f438d258d7d85ee3dde363c4f96c3196ca9cd9e63fe429a59543cc544b15"}, - {file = "marisa_trie-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c87a0c2cccce12b07bfcb70708637c0816970282d966a1531ecda1a24bd1cc8"}, - {file = "marisa_trie-1.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d3c0e38f0501951e2322f7274a39b8e2344bbd91ceaa9da439f46022570ddc9d"}, - {file = "marisa_trie-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd88a338c87e6dc130b6cea7b697580c21f0c83a8a8b46671cfecbb713d3fe24"}, - {file = "marisa_trie-1.2.0-cp312-cp312-win32.whl", hash = "sha256:5cea60975184f03fbcff51339df0eb44d2abe106a1693983cc64415eb87b897b"}, - {file = "marisa_trie-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b04a07b99b62b9bdf3eaf1d44571a3293ce249ce8971944e780c9c709593462f"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c11af35d9304de420b359741e12b885d04f11403697efcbbe8cb50f834261ebc"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2db8e74493c3bffb480c54afaa88890a39bf90063ff5b322acf64bf076e4b36e"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcc6613bc873136dc62609b66aaa27363e2bd46c03fdab62d638f7cf69d5f82"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5cb731581effb3e05258f3ddc2a155475de74bb00f61eb280f991e13b48f783"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:eba1061bbeaeec4149282beab2ae163631606f119f549a10246b014e13f9047b"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:015594427360c6ad0fa94d51ee3d50fb83b0f7278996497fd2d69f877c3de9bd"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:36d65bcbf22a70cdd0202bd8608c2feecc58bdb9e5dd9a2f5a723b651fcab287"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:bc138625b383998f5cd0cbf6cd38d66d414f3786ae6d7b4e4a6fc970140ef4e9"}, - {file = "marisa_trie-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:27d270a64eb655754dfb4e352c60a084b16ab999b3a97a0cdc7dbecbca3c0e35"}, - {file = "marisa_trie-1.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fa1fa7f67d317a921315a65e266b9e156ce5a956076ec2b6dbf72d67c7df8216"}, - {file = "marisa_trie-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dccef41d4af11a03558c1d101de58bd723b3039a5bc4e064250008c118037ec"}, - {file = "marisa_trie-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:873efd212dfef2b736ff2ff43e10b348c428d5dbac7b8cb8aa777004bc8c7b0e"}, - {file = "marisa_trie-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8af7a21ac2ba6dc23e4257fc3a40b3070e776275d3d0b5b2ef44473ad92caf3a"}, - {file = "marisa_trie-1.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7202ba0ca1db5245feaebbeb3d0c776b2da1fffb0abc3500dd505f679686aa1"}, - {file = "marisa_trie-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83d90be28c083323909d23ff8e9b4a2764b9e75520d1bae1a277e9fa7ca20d15"}, - {file = "marisa_trie-1.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40e2a374026492ac84232897f1f1d8f92a4a1f8bcf3f0ded1f2b8b708d1acfff"}, - {file = "marisa_trie-1.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7c6e6506bd24a5799b9b4b9cf1e8d6fa281f136396ba018a95d95d4d74715227"}, - {file = "marisa_trie-1.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:437bf6c0d7ba4cf17656a0e3bdd0b3c2c92c01fedfa670904177eef3116a4f45"}, - {file = "marisa_trie-1.2.0-cp38-cp38-win32.whl", hash = "sha256:6aeef7b364fb3b34dbba1cc57b79f1668fad0c3f039738d65a5b0d5ddce15f47"}, - {file = "marisa_trie-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:02f773e85cc566a24c0e0e28c744052db7691c4f13d02e4257bc657a49b9ab14"}, - {file = "marisa_trie-1.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ff705cb3b907bdeacb8c4b3bf0541691f52b101014d189a707ca41ebfacad59"}, - {file = "marisa_trie-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:006419c59866979188906babc42ae0918081c18cabc2bdabca027f68c081c127"}, - {file = "marisa_trie-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7196691681ecb8a12629fb6277c33bafdb27cf2b6c18c28bc48fa42a15eab8f"}, - {file = "marisa_trie-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaf052c0a1f4531ee12fd4c637212e77ad2af8c3b38a0d3096622abd01a22212"}, - {file = "marisa_trie-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb95f3ab95ba933f6a2fa2629185e9deb9da45ff2aa4ba8cc8f722528c038ef"}, - {file = "marisa_trie-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7459b1e1937e33daed65a6d55f8b95f9a8601f4f8749d01641cf548ecac03840"}, - {file = "marisa_trie-1.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902ea948677421093651ca98df62d255383f865f7c353f956ef666e92500e79f"}, - {file = "marisa_trie-1.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdf7a2d066907816726f3bf241b8cb05b698d6ffaa3c5ea2658d4ba69e87ec57"}, - {file = "marisa_trie-1.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3540bb85b38dfc17060263e061c95a0a435681b04543d1ae7e8d7441a9790593"}, - {file = "marisa_trie-1.2.0-cp39-cp39-win32.whl", hash = "sha256:fe1394e1f262e5b45d22d30bd1ef75174d1f2772e86716b5f93f9c29dfc1a779"}, - {file = "marisa_trie-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:84c44cb13803723f0f76aa2ba1a657f762a0bb9d8a9b80dfff249bb1c3218dd6"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:035c4c8f3b313b4d7b7451ddd539da811a11077a9e359c6a0345f816b1bdccb3"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d4f05c2ee218a5ab09d269b640d06f9708b0cf37c842344cbdffb0661c74c472"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ac63e1519598de946c7d9346df3bb52ed96968eb3021b4e89b51d79bc72a86"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:045f32eaeb5dcdb5beadb571ba616d7a34141764b616eebb4decce71b366f5fa"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb60c2f9897ce2bfc31a69ac25a040de4f8643ab2a339bb0ff1185e1a9dedaf8"}, - {file = "marisa_trie-1.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f19c5fcf23c02f1303deb69c67603ee37ed8f01de2d8b19f1716a6cf5afd5455"}, - {file = "marisa_trie-1.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a06a77075240eb83a47b780902322e66c968a06a2b6318cab06757c65ea64190"}, - {file = "marisa_trie-1.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:125016400449e46ec0e5fabd14c8314959c4dfa02ffc2861195c99efa2b5b011"}, - {file = "marisa_trie-1.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c57647dd9f9ba16fc5bb4679c915d7d48d5c0b25134fb10f095ccd839686a027"}, - {file = "marisa_trie-1.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6601e74338fb31e1b20674257706150113463182a01d3a1310df6b8840720b17"}, - {file = "marisa_trie-1.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce2f68e1000c4c72820c5b2c9d037f326fcf75f036453a5e629f225f99b92cfc"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:069ac10a133d96b3f3ed1cc071b973a3f28490345e7941c778a1d81cf176f04a"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:de9911480ce2a0513582cb84ee4484e5ee8791e692276c7f5cd7378e114d1988"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cfec001cf233e8853a29e1c2bb74031c217aa61e7bd19389007e04861855731"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd1f3ef8de89684fbdd6aaead09d53b82e718bad4375d2beb938cbd24b48c51a"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65f5d8c1ecc85283b5b03a1475a5da723b94b3beda752c895b2f748477d8f1b1"}, - {file = "marisa_trie-1.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2e7540f844c1de493a90ad7d0f5bffc6a2cba19fe312d6db7b97aceff11d97f8"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2fb9243f66563285677079c9dccc697d35985287bacb36c8e685305687b0e025"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:58e2b84cbb6394f9c567f1f4351fc2995a094e1b684da9b577d4139b145401d6"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b4a8d3ed1f1b8f551b52e11a1265eaf0718f06bb206654b2c529cecda0913dd"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97652c5fbc92f52100afe1c4583625015611000fa81606ad17f1b3bbb9f3bfa"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7183d84da20c89b2a366bf581f0d79d1e248909678f164e8536f291120432e8"}, - {file = "marisa_trie-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c7f4df4163202b0aa5dad3eeddf088ecb61e9101986c8b31f1e052ebd6df9292"}, - {file = "marisa_trie-1.2.0.tar.gz", hash = "sha256:fedfc67497f8aa2757756b5cf493759f245d321fb78914ce125b6d75daa89b5f"}, + {file = "marisa_trie-1.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2eb41d2f9114d8b7bd66772c237111e00d2bae2260824560eaa0a1e291ce9e8"}, + {file = "marisa_trie-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e956e6a46f604b17d570901e66f5214fb6f658c21e5e7665deace236793cef6"}, + {file = "marisa_trie-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd45142501300e7538b2e544905580918b67b1c82abed1275fe4c682c95635fa"}, + {file = "marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8443d116c612cfd1961fbf76769faf0561a46d8e317315dd13f9d9639ad500c"}, + {file = "marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875a6248e60fbb48d947b574ffa4170f34981f9e579bde960d0f9a49ea393ecc"}, + {file = "marisa_trie-1.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:746a7c60a17fccd3cfcfd4326926f02ea4fcdfc25d513411a0c4fc8e4a1ca51f"}, + {file = "marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e70869737cc0e5bd903f620667da6c330d6737048d1f44db792a6af68a1d35be"}, + {file = "marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06b099dd743676dbcd8abd8465ceac8f6d97d8bfaabe2c83b965495523b4cef2"}, + {file = "marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2a82eb21afdaf22b50d9b996472305c05ca67fc4ff5a026a220320c9c961db6"}, + {file = "marisa_trie-1.2.1-cp310-cp310-win32.whl", hash = "sha256:8951e7ce5d3167fbd085703b4cbb3f47948ed66826bef9a2173c379508776cf5"}, + {file = "marisa_trie-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:5685a14b3099b1422c4f59fa38b0bf4b5342ee6cc38ae57df9666a0b28eeaad3"}, + {file = "marisa_trie-1.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed3fb4ed7f2084597e862bcd56c56c5529e773729a426c083238682dba540e98"}, + {file = "marisa_trie-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe69fb9ffb2767746181f7b3b29bbd3454d1d24717b5958e030494f3d3cddf3"}, + {file = "marisa_trie-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4728ed3ae372d1ea2cdbd5eaa27b8f20a10e415d1f9d153314831e67d963f281"}, + {file = "marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cf4f25cf895692b232f49aa5397af6aba78bb679fb917a05fce8d3cb1ee446d"}, + {file = "marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cca7f96236ffdbf49be4b2e42c132e3df05968ac424544034767650913524de"}, + {file = "marisa_trie-1.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7eb20bf0e8b55a58d2a9b518aabc4c18278787bdba476c551dd1c1ed109e509"}, + {file = "marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b1ec93f0d1ee6d7ab680a6d8ea1a08bf264636358e92692072170032dda652ba"}, + {file = "marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e2699255d7ac610dee26d4ae7bda5951d05c7d9123a22e1f7c6a6f1964e0a4e4"}, + {file = "marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c484410911182457a8a1a0249d0c09c01e2071b78a0a8538cd5f7fa45589b13a"}, + {file = "marisa_trie-1.2.1-cp311-cp311-win32.whl", hash = "sha256:ad548117744b2bcf0e3d97374608be0a92d18c2af13d98b728d37cd06248e571"}, + {file = "marisa_trie-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:436f62d27714970b9cdd3b3c41bdad046f260e62ebb0daa38125ef70536fc73b"}, + {file = "marisa_trie-1.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:638506eacf20ca503fff72221a7e66a6eadbf28d6a4a6f949fcf5b1701bb05ec"}, + {file = "marisa_trie-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de1665eaafefa48a308e4753786519888021740501a15461c77bdfd57638e6b4"}, + {file = "marisa_trie-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f713af9b8aa66a34cd3a78c7d150a560a75734713abe818a69021fd269e927fa"}, + {file = "marisa_trie-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2a7d00f53f4945320b551bccb826b3fb26948bde1a10d50bb9802fabb611b10"}, + {file = "marisa_trie-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98042040d1d6085792e8d0f74004fc0f5f9ca6091c298f593dd81a22a4643854"}, + {file = "marisa_trie-1.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6532615111eec2c79e711965ece0bc95adac1ff547a7fff5ffca525463116deb"}, + {file = "marisa_trie-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:20948e40ab2038e62b7000ca6b4a913bc16c91a2c2e6da501bd1f917eeb28d51"}, + {file = "marisa_trie-1.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66b23e5b35dd547f85bf98db7c749bc0ffc57916ade2534a6bbc32db9a4abc44"}, + {file = "marisa_trie-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6704adf0247d2dda42e876b793be40775dff46624309ad99bc7537098bee106d"}, + {file = "marisa_trie-1.2.1-cp312-cp312-win32.whl", hash = "sha256:3ad356442c2fea4c2a6f514738ddf213d23930f942299a2b2c05df464a00848a"}, + {file = "marisa_trie-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2806f75817392cedcacb24ac5d80b0350dde8d3861d67d045c1d9b109764114"}, + {file = "marisa_trie-1.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b5ea16e69bfda0ac028c921b58de1a4aaf83d43934892977368579cd3c0a2554"}, + {file = "marisa_trie-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f627f4e41be710b6cb6ed54b0128b229ac9d50e2054d9cde3af0fef277c23cf"}, + {file = "marisa_trie-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5e649f3dc8ab5476732094f2828cc90cac3be7c79bc0c8318b6fda0c1d248db4"}, + {file = "marisa_trie-1.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46e528ee71808c961baf8c3ce1c46a8337ec7a96cc55389d11baafe5b632f8e9"}, + {file = "marisa_trie-1.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36aa4401a1180615f74d575571a6550081d84fc6461e9aefc0bb7b2427af098e"}, + {file = "marisa_trie-1.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce59bcd2cda9bb52b0e90cc7f36413cd86c3d0ce7224143447424aafb9f4aa48"}, + {file = "marisa_trie-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f4cd800704a5fc57e53c39c3a6b0c9b1519ebdbcb644ede3ee67a06eb542697d"}, + {file = "marisa_trie-1.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2428b495003c189695fb91ceeb499f9fcced3a2dce853e17fa475519433c67ff"}, + {file = "marisa_trie-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:735c363d9aaac82eaf516a28f7c6b95084c2e176d8231c87328dc80e112a9afa"}, + {file = "marisa_trie-1.2.1-cp313-cp313-win32.whl", hash = "sha256:eba6ca45500ca1a042466a0684aacc9838e7f20fe2605521ee19f2853062798f"}, + {file = "marisa_trie-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:aa7cd17e1c690ce96c538b2f4aae003d9a498e65067dd433c52dd069009951d4"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5e43891a37b0d7f618819fea14bd951289a0a8e3dd0da50c596139ca83ebb9b1"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6946100a43f933fad6bc458c502a59926d80b321d5ac1ed2ff9c56605360496f"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4177dc0bd1374e82be9b2ba4d0c2733b0a85b9d154ceeea83a5bee8c1e62fbf"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f35c2603a6be168088ed1db6ad1704b078aa8f39974c60888fbbced95dcadad4"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d659fda873d8dcb2c14c2c331de1dee21f5a902d7f2de7978b62c6431a8850ef"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:b0ef26733d3c836be79e812071e1a431ce1f807955a27a981ebb7993d95f842b"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:536ea19ce6a2ce61c57fed4123ecd10d18d77a0db45cd2741afff2b8b68f15b3"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-win32.whl", hash = "sha256:0ee6cf6a16d9c3d1c94e21c8e63c93d8b34bede170ca4e937e16e1c0700d399f"}, + {file = "marisa_trie-1.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7e7b1786e852e014d03e5f32dbd991f9a9eb223dd3fa9a2564108b807e4b7e1c"}, + {file = "marisa_trie-1.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:952af3a5859c3b20b15a00748c36e9eb8316eb2c70bd353ae1646da216322908"}, + {file = "marisa_trie-1.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24a81aa7566e4ec96fc4d934581fe26d62eac47fc02b35fa443a0bb718b471e8"}, + {file = "marisa_trie-1.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9c9b32b14651a6dcf9e8857d2df5d29d322a1ea8c0be5c8ffb88f9841c4ec62b"}, + {file = "marisa_trie-1.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ac170d20b97beb75059ba65d1ccad6b434d777c8992ab41ffabdade3b06dd74"}, + {file = "marisa_trie-1.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da4e4facb79614cc4653cfd859f398e4db4ca9ab26270ff12610e50ed7f1f6c6"}, + {file = "marisa_trie-1.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25688f34cac3bec01b4f655ffdd6c599a01f0bd596b4a79cf56c6f01a7df3560"}, + {file = "marisa_trie-1.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1db3213b451bf058d558f6e619bceff09d1d130214448a207c55e1526e2773a1"}, + {file = "marisa_trie-1.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d5648c6dcc5dc9200297fb779b1663b8a4467bda034a3c69bd9c32d8afb33b1d"}, + {file = "marisa_trie-1.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5bd39a4e1cc839a88acca2889d17ebc3f202a5039cd6059a13148ce75c8a6244"}, + {file = "marisa_trie-1.2.1-cp38-cp38-win32.whl", hash = "sha256:594f98491a96c7f1ffe13ce292cef1b4e63c028f0707effdea0f113364c1ae6c"}, + {file = "marisa_trie-1.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:5fe5a286f997848a410eebe1c28657506adaeb405220ee1e16cfcfd10deb37f2"}, + {file = "marisa_trie-1.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c0fe2ace0cb1806badbd1c551a8ec2f8d4cf97bf044313c082ef1acfe631ddca"}, + {file = "marisa_trie-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f0c2ec82c20a02c16fc9ba81dee2586ef20270127c470cb1054767aa8ba310"}, + {file = "marisa_trie-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a3c98613180cf1730e221933ff74b454008161b1a82597e41054127719964188"}, + {file = "marisa_trie-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:429858a0452a7bedcf67bc7bb34383d00f666c980cb75a31bcd31285fbdd4403"}, + {file = "marisa_trie-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2eacb84446543082ec50f2fb563f1a94c96804d4057b7da8ed815958d0cdfbe"}, + {file = "marisa_trie-1.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:852d7bcf14b0c63404de26e7c4c8d5d65ecaeca935e93794331bc4e2f213660b"}, + {file = "marisa_trie-1.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e58788004adda24c401d1751331618ed20c507ffc23bfd28d7c0661a1cf0ad16"}, + {file = "marisa_trie-1.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aefe0973cc4698e0907289dc0517ab0c7cdb13d588201932ff567d08a50b0e2e"}, + {file = "marisa_trie-1.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6c50c861faad0a5c091bd763e0729f958c316e678dfa065d3984fbb9e4eacbcd"}, + {file = "marisa_trie-1.2.1-cp39-cp39-win32.whl", hash = "sha256:b1ce340da608530500ab4f963f12d6bfc8d8680900919a60dbdc9b78c02060a4"}, + {file = "marisa_trie-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:ce37d8ca462bb64cc13f529b9ed92f7b21fe8d1f1679b62e29f9cb7d0e888b49"}, + {file = "marisa_trie-1.2.1.tar.gz", hash = "sha256:3a27c408e2aefc03e0f1d25b2ff2afb85aac3568f6fa2ae2a53b57a2e87ce29d"}, ] [package.dependencies] @@ -473,71 +471,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, + {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, ] [[package]] @@ -595,47 +594,56 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] @@ -867,13 +875,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "13.8.1" +version = "13.9.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, - {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, + {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, + {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, ] [package.dependencies] @@ -885,13 +893,13 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "setuptools" -version = "75.1.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] @@ -916,13 +924,13 @@ files = [ [[package]] name = "smart-open" -version = "7.0.4" +version = "7.0.5" description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "smart_open-7.0.4-py3-none-any.whl", hash = "sha256:4e98489932b3372595cddc075e6033194775165702887216b65eba760dfd8d47"}, - {file = "smart_open-7.0.4.tar.gz", hash = "sha256:62b65852bdd1d1d516839fcb1f6bc50cd0f16e05b4ec44b52f43d38bcb838524"}, + {file = "smart_open-7.0.5-py3-none-any.whl", hash = "sha256:8523ed805c12dff3eaa50e9c903a6cb0ae78800626631c5fe7ea073439847b89"}, + {file = "smart_open-7.0.5.tar.gz", hash = "sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18"}, ] [package.dependencies] @@ -935,34 +943,38 @@ gcs = ["google-cloud-storage (>=2.6.0)"] http = ["requests"] s3 = ["boto3"] ssh = ["paramiko"] -test = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "paramiko", "pytest", "pytest-rerunfailures", "requests", "responses", "zstandard"] +test = ["awscli", "azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "numpy", "paramiko", "pyopenssl", "pytest", "pytest-benchmark", "pytest-rerunfailures", "requests", "responses", "zstandard"] webhdfs = ["requests"] zst = ["zstandard"] [[package]] name = "spacy" -version = "3.7.6" +version = "3.8.2" description = "Industrial-strength Natural Language Processing (NLP) in Python" optional = false python-versions = ">=3.7" files = [ - {file = "spacy-3.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b0862280d10b063faffab597225f53873a790d02634dedfaffb70fb696b70a0"}, - {file = "spacy-3.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0d2c95e8f5199dde9d52b447f7422ee0f8584e9374e072305fd88372885b1b1"}, - {file = "spacy-3.7.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:daa97002da3762b620fcda0e71d43352b6e2b324c2cbaa389e88f4ba41d1c2a4"}, - {file = "spacy-3.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:f885e2d2619271754d52e3685ff3c75e171a192271a79d7e41a13f8106b48129"}, - {file = "spacy-3.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd1627b31088906527250cd713b0cdc3c0fa98f473952ae084bd6ce8465890ab"}, - {file = "spacy-3.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a400d49e9c2777144f0d2071dfdf4778d99577d47b3cc81cefe0b1360b10186"}, - {file = "spacy-3.7.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cc1bca41ee4d5c21a93f9e7a901dd54518d3bc52ca9c301c65341ac44323b552"}, - {file = "spacy-3.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:26fd3cb23dfb25e300398800685b04621d6ffabe4c1e09dd168fea13bb97e81d"}, - {file = "spacy-3.7.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0bd0cd697ca3982f8570c5cc6c736c6529d9989b9d554a05711f7035d2611da1"}, - {file = "spacy-3.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:199a1c10e4f86521a109b2b5b6daccced6a93f866d2ba2f1fd46bd49c37d8a2a"}, - {file = "spacy-3.7.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8ae014c1975892dd664a9c9ea8555141c84219b2fc8ff112f591f8581993ab"}, - {file = "spacy-3.7.6-cp312-cp312-win_amd64.whl", hash = "sha256:8bd03611b05f33d9500bb4244a6f6115e15907d643593468496348bb25fe8c3a"}, - {file = "spacy-3.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc31b4bc4af6469c8a5504410b9fe5d90d24bbab2a7f96d6f8d1a432a035c0f3"}, - {file = "spacy-3.7.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0816fccc72bb188bf75ea2acf9d60179a8b6393e3565bfdf0a30b5b66d03a521"}, - {file = "spacy-3.7.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5404bd109eb11c4e8bc7ee610aa40abb934b3dcd75f8309984d5667e2402b0e6"}, - {file = "spacy-3.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:1c4f994f799c2c56cad47ed5402585b826c4d420037c9bf782719f420b6022c8"}, - {file = "spacy-3.7.6.tar.gz", hash = "sha256:f4065c0aac5c48bbfb2ffe191d55ccb33bfb005376afbd4ccd6d5e9341514e34"}, + {file = "spacy-3.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:795e74493036dda0a576093b797a4fdc1aaa83d66f6c9af0e5b6b1c640dc2222"}, + {file = "spacy-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d432e78fe2a7424aba9a741db07ce58487d3b74fae4e20a779142828e61bc402"}, + {file = "spacy-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536a8ba17359540de502285934bf357805d978128d7bd5e84ba53d28b32a0ffb"}, + {file = "spacy-3.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6a0d0d39baa1cb9f5bb82874cbe1067bf494f76277a383f1f7b29f7a855d41a9"}, + {file = "spacy-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:9dcfcfda558b3e47946b2041c7a4203b78e542d0de20997a7c0a6d11b58b2522"}, + {file = "spacy-3.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5d48918028cff6d69d9915dad64f0e32ebd5f1e4f1fa81a2e17e56a6f61e05"}, + {file = "spacy-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:455f845b88ed795d7e595070ee84b65b3ea382357811e09fc744789a20b7b5f7"}, + {file = "spacy-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d8a4cbfdb90049053564790a0d12fa790c9471580cb6a1f8bdc2b6e74703dd"}, + {file = "spacy-3.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e3c3e67f786f1410d08420ffcaba0f80dc58387ab6172dcdac1a73353d3a85c7"}, + {file = "spacy-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cfe0c4558f635c67677e36d9a315f51d51f824870589c4846c95e880042a2ceb"}, + {file = "spacy-3.8.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0ce56f3c46dd4cebb5aaa3a40966e813b7fc6a540d547788a7d00cca10cd60a9"}, + {file = "spacy-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09faa873cf23d5136b1c1ce6378054a885f650fda96e1655a3ab49e2e7fdd15b"}, + {file = "spacy-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e992a11de9b727c61288541945c0ffc37ed998aca76bfd557937c2c195d7d4"}, + {file = "spacy-3.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be962a8188fb20d6c2065e1e865d1799ebbf544c1af67ab8c75cb279bf5448c7"}, + {file = "spacy-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:04546c5f5ed607387d4e9ecf57614e90c5784866a10a3c6dbe5b06e9b18a2f29"}, + {file = "spacy-3.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7c5fb8b804ebf1c2791b384d61391e9d0227bcfdecd6c861291690813b8a6eb1"}, + {file = "spacy-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3647233b2454e8e7bae94232563c9bff849db9e26bf61ef51122ef723de009fe"}, + {file = "spacy-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca20e2d9b4aeaedd7068d6419762d66cfad82bc8b1e63e36714601686d67f163"}, + {file = "spacy-3.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:be3aa3e7d456627acbcb7f585156ee463c01d006a07aeb20b43a8543a02cd047"}, + {file = "spacy-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:54c63d31ef410ebb5b0fd72729afaf50f876bf2bc29f73c6c5fc3676ae4158a1"}, + {file = "spacy-3.8.2.tar.gz", hash = "sha256:4b37ebd25ada4059b0dc9e0893e70dde5df83485329a068ef04580e70892a65d"}, ] [package.dependencies] @@ -980,14 +992,14 @@ setuptools = "*" spacy-legacy = ">=3.0.11,<3.1.0" spacy-loggers = ">=1.0.0,<2.0.0" srsly = ">=2.4.3,<3.0.0" -thinc = ">=8.2.2,<8.3.0" +thinc = ">=8.3.0,<8.4.0" tqdm = ">=4.38.0,<5.0.0" typer = ">=0.3.0,<1.0.0" wasabi = ">=0.9.1,<1.2.0" weasel = ">=0.1.0,<0.5.0" [package.extras] -apple = ["thinc-apple-ops (>=0.1.0.dev0,<1.0.0)"] +apple = ["thinc-apple-ops (>=1.0.0,<2.0.0)"] cuda = ["cupy (>=5.0.0b4,<13.0.0)"] cuda-autodetect = ["cupy-wheel (>=11.0.0,<13.0.0)"] cuda100 = ["cupy-cuda100 (>=5.0.0b4,<13.0.0)"] @@ -1083,41 +1095,41 @@ catalogue = ">=2.0.3,<2.1.0" [[package]] name = "thinc" -version = "8.2.5" +version = "8.3.2" description = "A refreshing functional take on deep learning, compatible with your favorite libraries" optional = false python-versions = ">=3.6" files = [ - {file = "thinc-8.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc267f6aad80a681a85f50383afe91da9e2bec56fefdda86bfa2e4f529bef191"}, - {file = "thinc-8.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d80f1e497971c9fa0938f5cc8fe607bbe87356b405fb7bbc3ff9f32fb4eed3bb"}, - {file = "thinc-8.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0933adbd3e65e30d3bef903e77a368bc8a41bed34b0d18df6d4fc0536908e21f"}, - {file = "thinc-8.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54bac2ba23b208fdaf267cd6113d26a5ecbb3b0e0c6015dff784ae6a9c5e78ca"}, - {file = "thinc-8.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:399260197ef3f8d9600315fc5b5a1d5940400fceb0361de642e9fe3506d82385"}, - {file = "thinc-8.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a75c0de3340afed594beda293661de145f3842873df56d9989bc338148f13fab"}, - {file = "thinc-8.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b166d1a22003ee03bc236370fff2884744c1fb758a6209a2512d305773d07d7"}, - {file = "thinc-8.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34db8a023b9f70645fdf06c510584ba6d8b97ec53c1e094f42d95652bf8c875f"}, - {file = "thinc-8.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8901b30db1071ea8d5e4437429c8632535bf5ed87938ce3bb5057bed9f15aed8"}, - {file = "thinc-8.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:8ef5d46d62e31f2450224ab22391a606cf427b13e20cfc570f70422e2f333872"}, - {file = "thinc-8.2.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9fc26697e2358c71a5fe243d52e98ae67ee1a3b314eead5031845b6d1c0d121c"}, - {file = "thinc-8.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e299d4dc41107385d6d14d8604a060825798a031cabe2b894b22f9d75d9eaad"}, - {file = "thinc-8.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8a8f2f249f2be9a5ce2a81a6efe7503b68be7b57e47ad54ab28204e1f0c723b"}, - {file = "thinc-8.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e729f33c76ec6df9b375989743252ab880d79f3a2b4175169b21dece90f102"}, - {file = "thinc-8.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:c5f750ea2dd32ca6d46947025dacfc0f6037340c4e5f7adb9af84c75f65aa7d8"}, - {file = "thinc-8.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb97e2f699a3df16112ef5460cbfb0c9189a5fbc0e76bcf170ed7d995bdce367"}, - {file = "thinc-8.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c78fb218273894168d1ca2dd3a20f28dba5a7fa698c4f2a2fc425eda2086cfc"}, - {file = "thinc-8.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc27da534807a2addd1c3d2a3d19f99e3eb67fdbce81c21f4e4c8bfa94ac15b"}, - {file = "thinc-8.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b884e56eaeb9e5c7bfeb1c8810a3cbad19a599b33b9f3152b90b67f468471ac"}, - {file = "thinc-8.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:df2138cf379061017ecb8bf609a8857e7904709ef0a9a2252783c16f67a2b749"}, - {file = "thinc-8.2.5.tar.gz", hash = "sha256:c2963791c934cc7fbd8f9b942d571cac79892ad11630bfca690a868c32752b75"}, + {file = "thinc-8.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6af5b1b57fb1874079f7e84cd99c983c3dcb234a55845d8585d7e066b09755fb"}, + {file = "thinc-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f8b753b63714d38f36e951241466c650afe3177b0c8b220e180ebf4888f09f5e"}, + {file = "thinc-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d471e1261e5e650f93cfae9880928c2ee68ad0426656f02da4490dd24716a93b"}, + {file = "thinc-8.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8b46786063787a60a0d732a5d43d0196f632d3d35780c8fe1232d1378b1b5980"}, + {file = "thinc-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:f96c274c4119c92fb8fd8a708381080d47ad92994ef3041c791ed6d4b5c27761"}, + {file = "thinc-8.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:12e998780f40d36d4d5f3b760ef60ac60637643f2965ebe1948801ba44261a03"}, + {file = "thinc-8.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:54a5411daaca1718a73982767b714c1d0a5e142de73c916367baf1c13d79e8f0"}, + {file = "thinc-8.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed88275031dcaadd85d3deeb8eb12d1ec0ee6b4679e24cc893c81a30409ac4ee"}, + {file = "thinc-8.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef0868e55108f05300f4508e6896ae4e9492f3415220e3da65579f693225816e"}, + {file = "thinc-8.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:813942d59881c4e4165ce95fef37ba30ce3366dac43289697d13a952a8208854"}, + {file = "thinc-8.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bce8ca6a62ab82f4595210ba7f18bbdb6e33561277c59060f2f04bdb93ac4fbc"}, + {file = "thinc-8.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b014a282e9ea6330a678b472d74f479c7a38168cbf570bdc740e50d960dd78a1"}, + {file = "thinc-8.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80384c228ac6bbaf4ab7f7c9ca4a53c6053f2fb37b2b50c4730b9057f07e9fd"}, + {file = "thinc-8.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae309b0788478984eafeac4e3c33a2de84a6ea251fd1e3528d8018d4b4347247"}, + {file = "thinc-8.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:fe8dac2749db23f8ebf09d7a7f29e1b99d67e7d7b183e106aa2b6c9b570f3015"}, + {file = "thinc-8.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e4b1e4149a3bfdeb308cee4b53b07d234e5b35495a7f35241b80acf7cb4a33d3"}, + {file = "thinc-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a6b507b1fecd1771fc448aa27dc42d024e5799d10f1ddad6abc6353ae72ef540"}, + {file = "thinc-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4edb20939c3a157beb386aee221a5e1bbfb7ffb90d63d22c80047ca0fa4d026d"}, + {file = "thinc-8.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d701de93d6d6bb029d24088d7f8cb8200f486658fd08dd859767b5eda6eba268"}, + {file = "thinc-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:2977c4811b7612984ded795dce182419b9f3058a1a55c191f75024ec2f4cb218"}, + {file = "thinc-8.3.2.tar.gz", hash = "sha256:3e8ef69eac89a601e11d47fc9e43d26ffe7ef682dcf667c94ff35ff690549aeb"}, ] [package.dependencies] -blis = ">=0.7.8,<0.8.0" +blis = ">=1.0.0,<1.1.0" catalogue = ">=2.0.4,<2.1.0" confection = ">=0.0.1,<1.0.0" cymem = ">=2.0.2,<2.1.0" murmurhash = ">=1.0.2,<1.1.0" -numpy = {version = ">=1.19.0,<2.0.0", markers = "python_version >= \"3.9\""} +numpy = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3.9\""} packaging = ">=20.0" preshed = ">=3.0.2,<3.1.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<3.0.0" @@ -1126,6 +1138,7 @@ srsly = ">=2.4.0,<3.0.0" wasabi = ">=0.8.1,<1.2.0" [package.extras] +apple = ["thinc-apple-ops (>=1.0.0,<2.0.0)"] cuda = ["cupy (>=5.0.0b4)"] cuda-autodetect = ["cupy-wheel (>=11.0.0)"] cuda100 = ["cupy-cuda100 (>=5.0.0b4)"] @@ -1333,4 +1346,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "0545c1c0eb8da719732de1c8b691b5647168bcbd54d5dcddccbe5986a4a9351b" +content-hash = "b3afee8fdfe6a31f03c1e476c58b6c9d8745f823a5ce4ede9b3059ff1fc76426" diff --git a/pyproject.toml b/pyproject.toml index de8ee92d9..496dc4ba5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.11" pyspellchecker = "^0.8.1" -spacy = "^3.7.6" +spacy = "^3.8.2" markdown-it-py = "^3.0.0"