From cfd4a2cd5a8d255a460f61a791732bdb77b41b1e Mon Sep 17 00:00:00 2001 From: Slater Podgorny Date: Thu, 15 Jan 2026 20:50:39 -0800 Subject: [PATCH 01/38] water rights migration from elm --- compass/extraction/water/__init__.py | 1 + compass/extraction/water/apply.py | 86 ++ compass/extraction/water/download.py | 143 +++ compass/extraction/water/graphs.py | 1154 +++++++++++++++++++++++++ compass/extraction/water/ordinance.py | 122 +++ compass/extraction/water/parse.py | 250 ++++++ 6 files changed, 1756 insertions(+) create mode 100644 compass/extraction/water/__init__.py create mode 100644 compass/extraction/water/apply.py create mode 100644 compass/extraction/water/download.py create mode 100644 compass/extraction/water/graphs.py create mode 100644 compass/extraction/water/ordinance.py create mode 100644 compass/extraction/water/parse.py diff --git a/compass/extraction/water/__init__.py b/compass/extraction/water/__init__.py new file mode 100644 index 000000000..61344ef06 --- /dev/null +++ b/compass/extraction/water/__init__.py @@ -0,0 +1 @@ +"""Water ordinance extraction utilities""" diff --git a/compass/extraction/water/apply.py b/compass/extraction/water/apply.py new file mode 100644 index 000000000..5549e5303 --- /dev/null +++ b/compass/extraction/water/apply.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +"""ELM Ordinance function to apply ordinance extraction on a document """ +import logging + +from elm.ords.llm import StructuredLLMCaller +from elm.ords.extraction.date import DateExtractor +from elm.water_rights.extraction.ordinance import OrdinanceValidator + +from elm.water_rights.extraction.parse import StructuredOrdinanceParser + + +logger = logging.getLogger(__name__) + + +async def check_for_ordinance_info(doc, text_splitter, **kwargs): + """Parse a single document for ordinance information. + + Parameters + ---------- + doc : elm.web.document.BaseDocument + A document potentially containing ordinance information. Note + that if the document's metadata contains the + ``"contains_ord_info"`` key, it will not be processed. To force + a document to be processed by this function, remove that key + from the documents metadata. + text_splitter : obj + Instance of an object that implements a `split_text` method. + The method should take text as input (str) and return a list + of text chunks. Langchain's text splitters should work for this + input. + **kwargs + Keyword-value pairs used to initialize an + `elm.ords.llm.LLMCaller` instance. + + Returns + ------- + elm.web.document.BaseDocument + Document that has been parsed for ordinance text. The results of + the parsing are stored in the documents metadata. In particular, + the metadata will contain a ``"contains_ord_info"`` key that + will be set to ``True`` if ordinance info was found in the text, + and ``False`` otherwise. If ``True``, the metadata will also + contain a ``"date"`` key containing the most recent date that + the ordinance was enacted (or a tuple of `None` if not found), + and an ``"ordinance_text"`` key containing the ordinance text + snippet. Note that the snippet may contain other info as well, + but should encapsulate all of the ordinance text. + """ + if "contains_ord_info" in doc.attrs: + return doc + + llm_caller = StructuredLLMCaller(**kwargs) + chunks = text_splitter.split_text(doc.text) + validator = OrdinanceValidator(llm_caller, chunks) + doc.attrs["contains_ord_info"] = await validator.parse() + if doc.attrs["contains_ord_info"]: + doc.attrs["date"] = await DateExtractor(llm_caller).parse(doc) + doc.attrs["ordinance_text"] = validator.ordinance_text + + return doc + + +async def extract_ordinance_values(wizard, location, **kwargs): + """Extract ordinance values from a temporary vector store. + + Parameters + ---------- + wizard : elm.wizard.EnergyWizard + Instance of the EnergyWizard class used for RAG. + location : str + Name of the groundwater conservation district or county. + **kwargs + Keyword-value pairs used to initialize an + `elm.ords.llm.LLMCaller` instance. + + Returns + ------- + values : dict + Dictionary of values extracted from the vector store. + """ + + parser = StructuredOrdinanceParser(wizard=wizard, location=location, + **kwargs) + values = await parser.parse(location=location) + + return values diff --git a/compass/extraction/water/download.py b/compass/extraction/water/download.py new file mode 100644 index 000000000..1dd2f1c6a --- /dev/null +++ b/compass/extraction/water/download.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +"""ELM Ordinance county file downloading logic""" +import logging + +from elm.ords.llm import StructuredLLMCaller +from elm.water_rights.extraction import check_for_ordinance_info +from elm.ords.services.threaded import TempFileCache +from elm.water_rights.validation.location import CountyValidator +from elm.web.search import web_search_links_as_docs +from elm.web.utilities import filter_documents + + +logger = logging.getLogger(__name__) + +QUESTION_TEMPLATES = [ + "{location} rules", + "{location} management plan", + "{location} well permits", + "{location} well permit requirements", + "requirements to drill a water well in {location}", + ] + +async def download_county_ordinance( + location, + text_splitter, + num_urls=5, + file_loader_kwargs=None, + browser_semaphore=None, + **kwargs +): + """Download ordinance documents for a single conservation district. + + Parameters + ---------- + location : :class:`elm.ords.utilities.location.Location` + Location objects representing the conservation district. + text_splitter : obj, optional + Instance of an object that implements a `split_text` method. + The method should take text as input (str) and return a list + of text chunks. Raw text from HTML pages will be passed through + this splitter to split the single wep page into multiple pages + for the output document. Langchain's text splitters should work + for this input. + num_urls : int, optional + Number of unique Google search result URL's to check for + ordinance document. By default, ``5``. + file_loader_kwargs : dict, optional + Dictionary of keyword-argument pairs to initialize + :class:`elm.web.file_loader.AsyncFileLoader` with. If found, the + "pw_launch_kwargs" key in these will also be used to initialize + the :class:`elm.web.google_search.PlaywrightGoogleLinkSearch` + used for the google URL search. By default, ``None``. + browser_semaphore : :class:`asyncio.Semaphore`, optional + Semaphore instance that can be used to limit the number of + playwright browsers open concurrently. If ``None``, no limits + are applied. By default, ``None``. + **kwargs + Keyword-value pairs used to initialize an + `elm.ords.llm.LLMCaller` instance. + + Returns + ------- + elm.web.document.BaseDocument | None + Document instance for the downloaded document, or ``None`` if no + document was found. + """ + docs = await _docs_from_google_search( + location, + text_splitter, + num_urls, + browser_semaphore, + **(file_loader_kwargs or {}) + ) + + docs = await _down_select_docs_correct_location( + docs, location=location, **kwargs + ) + + docs = await _down_select_docs_correct_content( + docs, location=location, text_splitter=text_splitter, **kwargs + ) + + logger.info( + "Found %d potential ordinance documents for %s", + len(docs), + location.full_name, + ) + + return docs + + +async def _docs_from_google_search( + location, text_splitter, num_urls, browser_semaphore, **file_loader_kwargs +): + """Download docs from google location queries. """ + queries = [ + question.format(location=location.name) + for question in QUESTION_TEMPLATES + ] + + file_loader_kwargs.update( + { + "html_read_kwargs": {"text_splitter": text_splitter}, + "file_cache_coroutine": TempFileCache.call, + } + ) + return await web_search_links_as_docs( + queries, + num_urls=num_urls, + browser_semaphore=browser_semaphore, + task_name=location.full_name, + **file_loader_kwargs, + ) + + +async def _down_select_docs_correct_location(docs, location, **kwargs): + """Remove all documents not pertaining to the location.""" + llm_caller = StructuredLLMCaller(**kwargs) + county_validator = CountyValidator(llm_caller, score_thresh=0.6) + return await filter_documents( + docs, + validation_coroutine=county_validator.check, + task_name=location.full_name, + county=location.name, + county_acronym=location.acronym, + state=location.state, + ) + + +async def _down_select_docs_correct_content(docs, location, **kwargs): + """Remove all documents that don't contain ordinance info.""" + return await filter_documents( + docs, + validation_coroutine=_contains_ords, + task_name=location.full_name, + **kwargs, + ) + + +async def _contains_ords(doc, **kwargs): + """Helper coroutine that checks for ordinance info. """ + doc = await check_for_ordinance_info(doc, **kwargs) + return doc.attrs.get("contains_ord_info", False) diff --git a/compass/extraction/water/graphs.py b/compass/extraction/water/graphs.py new file mode 100644 index 000000000..71e3d0adc --- /dev/null +++ b/compass/extraction/water/graphs.py @@ -0,0 +1,1154 @@ +"""Water rights decision tree graph setup functions""" + +from compass.common import ( + setup_graph_no_nodes, + llm_response_starts_with_yes, + llm_response_starts_with_no, +) + + +def setup_graph_permits(**kwargs): + """Setup graph to get permit requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Permit Requirements", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a requirement for water well " + "permits? Requirements should specify whether or not an " + "application is required in order to drill a groundwater well." + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=("Is an application or permit required to drill a " + "groundwater well in the {DISTRICT_NAME}?"), + ) + + G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) + + G.add_node( + "get_reqs", + prompt=( + "What are the requirements the text mentions? " + ), + ) + + G.add_edge("get_reqs", "get_exempt") + + G.add_node( + "get_exempt", + prompt=( + "Are any wells exempt from the permitting process? " + ), + ) + + G.add_edge("get_exempt", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly four keys. The keys are 'permit_required', " + "'requirements', 'exemptions', and 'explanation'. The value " + "of the 'permit_required' key should be either 'True' or 'False' " + "based on whether or not the conservation district requires water " + "well permits. The value 'requirements' should list the well " + "permitting requirements if applicable. The value of the " + "'exemptions' key should specify whether or not there are well " + "types that are not subject to the permitting process. The value " + "of the 'explanation' key should be a string containing a short " + "explanation for your choice." + ), + ) + + return G + + +def setup_graph_extraction(**kwargs): + """Setup graph to get water extraction requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Water Extraction Requirements", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a permit requirement to " + "extract or produce water from a well? " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=("Is an application or permit required to extract or " + "produce groundwater in the {DISTRICT_NAME}?"), + ) + + G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) + + G.add_node( + "get_reqs", + prompt=( + "What are the requirements the text mentions? " + ), + ) + + G.add_edge("get_reqs", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'permit_required' " + "and 'explanation'. The value of the 'permit_required' key " + "should be either 'True' or 'False' based on whether or not " + "the conservation district requires extraction permits. " + "The value of the 'explanation' key should be a string " + "containing a short explanation for your choice." + ), + ) + + return G + + +def setup_graph_geothermal(**kwargs): + """Setup graph to get geothermal specific policies. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Geothermal Policies", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention provisions that apply to " + "geothermal systems specifically? " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=("Does {DISTRICT_NAME} implement policies that are specific " + "to geothermal systems?"), + ) + + G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) + + G.add_node( + "get_reqs", + prompt=( + "Summarize the requirements for geothermal systems mentioned in " + "the text. " + ), + ) + + G.add_edge("get_reqs", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly three keys. The keys are " + "'geothermal_requirements', 'summary', and 'explanation'. The " + "value of the 'geothermal_requirements' key should be either " + "'True' or 'False' based on whether or not the conservation " + "district has specific requirements for geothermal systems. " + "The value of the 'summary' key should summarize the requirements " + "mentioned above, if applicable. The value of the 'explanation' " + "key should be a string containing a short explanation for " + "your choice." + ), + ) + + return G + + +def setup_graph_oil_and_gas(**kwargs): + """Setup graph to get oil and gas specific policies. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Oil and Gas Policies", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention provisions that apply to " + "oil and gas operations specifically? " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=("Does {DISTRICT_NAME} implement policies that are specific " + "to oil and gas operations?"), + ) + + G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) + + G.add_node( + "get_reqs", + prompt=( + "Summarize the requirements for oil and gas operations mentioned " + "in the text. " + ), + ) + + G.add_edge("get_reqs", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly three keys. The keys are " + "'oil_and_gas_requirements', 'summary', and 'explanation'. " + "The value of the 'oil_and_gas_requirements' key should be " + "either 'True' or 'False' based on whether or not the " + "conservation district has specific requirements for oil and " + "gas operations. The value 'summary' should summarize the " + "requirements mentioned above. The value of the 'explanation' " + "key should be a string containing a short explanation for " + "your choice." + ), + ) + + return G + + +def setup_graph_limits(**kwargs): + """Setup graph to get extraction limits. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Extraction Limits", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention {interval} water production, " + "extraction, or withdrawal limits for groundwater wells? Limits " + "may be defined as an acre-foot or a gallon limit. Ensure these " + "limits are specific to {interval} production and disregard " + "limits related to other time periods. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} have {interval} water well production, " + "extraction, or withdrawal limits? " + ), + ) + + G.add_edge("init", "get_permit", condition=llm_response_starts_with_yes) + + G.add_node( + "get_permit", + prompt=( + "Are the limits mentioned in text specific to a permit type (such " + "as limited production), well, or aquifer?" + ), + ) + + G.add_edge("get_permit", "get_type") + + G.add_node( + "get_type", + prompt=( + "Does the text mention an explicit, numerical limit such as a " + "gallons or acre-foot figure? {YES_NO_PROMPT} " + "Some limits maybe permit specific in which case your answer " + "should be 'No'." + ), + ) + + G.add_edge("get_type", "get_limit", + condition=llm_response_starts_with_yes) + G.add_edge("get_type", "permit_final", + condition=llm_response_starts_with_no) + + G.add_node( + "get_limit", + prompt=( + "What is the {interval} extraction limit mentioned in the text? " + "Include the units associated with the limit (example: gallons " + "or acre-feet)." + ), + ) + + G.add_node( + "permit_final", + prompt=( + "Summarize the production limit described in the text and " + "respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'limit_type' " + "and 'explanation'. Based on the conversation so far, the " + "value of the 'limit_type' key should be 'permit specific'. " + "The value of the 'explanation' key should be a string containing " + "a short explanation for your choice." + ), + ) + + G.add_edge("get_limit", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly five keys. The keys are 'limit_type', " + "'extraction_limit', 'units', 'application', and 'explanation'. " + "The value of the 'limit_type' key should be either 'explicit' " + "or 'permit specific'. The value of the 'extraction_limit' key " + "should be the numerical value(s) associated with the extraction " + "limit, if there are multiple values based on permit, well, or " + "aquifer, include all the values. The 'units' key should " + "describe the units associated with the extraction limit. The " + "'application' key should describe whether the limit is specific " + "to a permit type, well, or aquifer. The value of the " + "'explanation' key should be a string containing a short " + "explanation for your choice." + ), + ) + + return G + + +def setup_graph_well_spacing(**kwargs): + """Setup graph to get well spacing requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Well Spacing", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention how far a new well must be from " + "another well? Well spacing refers to how far apart two wells " + "must be and could prohibit an individual from drilling a well " + "within a certain distance of another well. Focus only on " + "spacing requirements between wells and ignore spacing that is " + "specific to other features such as property lines " + "or septic systems. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} have restrictions related to well spacing " + "or a required distance between wells? " + ) + ) + + G.add_edge("init", "get_spacing", condition=llm_response_starts_with_yes) + + G.add_node( + "get_spacing", + prompt=( + "What is the spacing limit mentioned in the text? Include the " + "units associated with the limit (example: feet or yards). " + ), + ) + + G.add_edge("get_spacing", "get_wells") + + G.add_node( + "get_wells", + prompt=( + "Do the spacing requirements mentioned apply specifically to " + "the required distance between two water wells? " + "{YES_NO_PROMPT}" + ), + ) + + G.add_edge("get_wells", "get_qualifier", + condition=llm_response_starts_with_yes) + + G.add_node( + "get_qualifier", + prompt=( + "Is the spacing limit dependent upon well characteristics " + "such as depth or production capacity? If so, include that " + "metric in the response (example: gallons per minute). " + ), + ) + + G.add_edge("get_qualifier", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly four keys. The keys are 'spacing', 'units', " + "'qualifier', and 'explanation'. The value of the 'spacing' key " + "should be the numerical value specifying the required distance " + "betweeen wells, focus on spacing between wells only and ignore " + "spacing requirements for other types of infrastructure. " + "The 'units' key should describe the units associated with the " + "spacing. The value of the 'qualifier' key should be the well " + "characteristic metric that determines the spacing, if " + "applicable. The value of the 'explanation' key should be a " + "string containing a short explanation for your choice." + ), + ) + + return G + + +def setup_graph_time(**kwargs): + """Setup graph to get drilling window restrictions. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Drilling Window", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a drilling window? " + "Such a value specifies how long after permit approval " + "that drilling must commence. For example, 'Drilling of a " + "permitted well must commence within 120 days of issuance of " + "the permit application.' represents a 120 day window. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "In {DISTRICT_NAME}, how long after permit approval " + "must drilling must commence on a water well?" + ), + ) + + G.add_edge("init", "get_time", condition=llm_response_starts_with_yes) + + G.add_node( + "get_time", + prompt=( + "What is the drilling window mentioned in the text? " + "Include the units associated with the limit (example: days " + "or months)." + ), + ) + + G.add_edge("get_time", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly three keys. The keys are 'time_period', 'units', " + "and 'explanation'. The value of the 'time_period' key should " + "be the numerical value associated with the drilling window the " + "'units' key should describe the units associated with " + "the drilling window. The value of the 'explanation' key should " + "be a string containing a short explanation for your choice." + ), + ) + + return G + + +def setup_graph_metering_device(**kwargs): + """Setup graph to get metering device requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Metering Device", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a requirement for a metering " + "device? Metering devices are typically utilized to monitor water " + "usage and might be required by the conservation district. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Is a metering device that monitors water usage required " + "in {DISTRICT_NAME}?" + ), + + ) + + G.add_edge("init", "get_device", condition=llm_response_starts_with_yes) + + G.add_node( + "get_device", + prompt=( + "What device is mentioned in the text? " + ), + ) + + G.add_edge("get_device", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'device' and " + "and 'explanation'. The value of the 'device' key should be " + "a boolean value with the the value 'True' if a device is " + "required and 'False' if a device is not required. The value " + "of the 'explanation' key should be a string containing a " + "short explanation for your choice." + ), + ) + + return G + + +def setup_graph_drought(**kwargs): + """Setup graph to get district drought management plan. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Drought Management Plan", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a drought management or " + "contingency plan? Drought management plans are plans set forth " + "by conservation district that specify actions or policies that " + "could be implemented in the event of a drought such as imposing " + "additional restrictions on well users. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} have a drought management or " + "contingency plan?" + ), + ) + + G.add_edge("init", "get_plan", condition=llm_response_starts_with_yes) + + G.add_node( + "get_plan", + prompt=( + "Summarize the drought management plan mentioned in the text? " + ), + ) + + G.add_edge("get_plan", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'drought_plan' and " + "and 'explanation'. The value of the 'drought_plan' key should " + "be a boolean value with the the value 'True' if a drought " + "management plan is in place and 'False' if not. The value " + "of the 'explanation' key should be a string containing a " + "short explanation for your choice." + ), + ) + + return G + + +def setup_graph_contingency(**kwargs): + """Setup graph to get permit holder drought management plan + requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Contingency Plan Requirements", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention a requirement for well owners " + "to develop a drought management or contingency plan? " + "Drought contingency plans might specify actions that well owners " + "and users should take in the event of a drought. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} require well owners, users, or applicants " + "to develop a drought management or contingency plan?" + ), + ) + + G.add_edge("init", "get_plan", condition=llm_response_starts_with_yes) + + G.add_node( + "get_plan", + prompt=( + "Summarize the drought management plan requirements mentioned in " + "the text?" + ), + ) + + G.add_edge("get_plan", "final") + G.add_edge("init", "final", condition=llm_response_starts_with_no) + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'drought_plan' " + "and 'explanation'. The value of the 'drought_plan' key should " + "be a boolean value with the the value 'True' if a well owner " + "is required to develop a drought management plan. The value " + "of the 'explanation' key should be a string containing a short " + "explanation for your choice." + ), + ) + + return G + + +def setup_graph_plugging_reqs(**kwargs): + """Setup graph to get water well plugging requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Plugging Requirements", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention plugging requirements specific " + "to water wells? Plugging requirements generally detail the " + "steps an individual needs to take when they no longer intend to " + "use the well. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} implement plugging requirements specific " + "to water wells?" + ) + ) + + G.add_edge("init", "get_plugging", condition=llm_response_starts_with_yes) + + G.add_node( + "get_plugging", + prompt=( + "What are the plugging requirements mentioned in the text? " + ), + ) + + G.add_edge("get_plugging", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'plugging_requirements' " + "and 'explanation'. The value of the 'plugging_requirements' key " + "should be a boolean value with the the value 'True' if the " + "conservation district implements plugging requirements. " + "The value of the 'explanation' key should be a string " + "containing a short explanation for your choice." + ), + ) + + return G + + +def setup_graph_external_transfer(**kwargs): + """Setup graph to get external transfer restrictions. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="External Transfer Restrictions", **kwargs) + + G.add_node( + "init", + prompt=( + "Does the following text mention restrictions or costs related to " + "the external transport or export of water? External transport " + "refers to cases in which well owners sell or transport water to " + "a location outside of the district boundaries. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} implement restrictions or costs related to " + "the external transport or export of water? External transport " + "refers to cases in which well owners sell or transport water to " + "a location outside of the district boundaries. " + ) + ) + + G.add_edge("init", "get_restrictions", + condition=llm_response_starts_with_yes) + + G.add_node( + "get_restrictions", + prompt=( + "What are the restrictions the text mentions?" + ), + ) + + G.add_edge("get_restrictions", "get_permit") + + G.add_node( + "get_permit", + prompt=( + "Is there a permit application fee for the external transfer " + "of water? " + ), + ) + + G.add_edge("get_permit", "get_cost") + + G.add_node( + "get_cost", + prompt=( + "Is there a cost a associated with the external transfer of " + "water? Focus on costs that are specific to the transfer itself " + "(dollars per gallon or acre-foot figures) rather than permit or " + "application costs. {YES_NO_PROMPT}" + ), + ) + + G.add_edge("get_cost", "get_cost_amount", + condition=llm_response_starts_with_yes) + + G.add_node( + "get_cost_amount", + prompt=( + "What is the dollar amount associated with the external transfer " + "of water? Include the units associated with the cost (example: " + "dollars per gallon). If the text does not mention a specific " + "cost, then respond 'Permit Specific' or with the rate structure " + "mentioned in the text." + ), + ) + + G.add_edge("get_cost", "final", condition=llm_response_starts_with_no) + G.add_edge("get_cost_amount", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include at least four keys. The keys are " + "'transfer_restrictions', 'requirements', 'cost', and " + "'explanation'. The value of the 'transfer_restrictions' key " + "should be either 'True' or 'False' based on whether or not the " + "conservation district restricts water transfer. The value " + "'restrictions' should list the water transfer restrictions if " + "applicable. The value of the 'cost' key should either be 'True' " + "or 'False' based on whether or not there are costs associated " + "with the external transfer of water. If there is a specific cost " + "mentioned the 'cost_amount' key should reflect the dollar amount " + "associated with the transfer of water. The value of the " + "'explanation' key should be a string containing a short " + "explanation for your choice." + ), + ) + + return G + + +def setup_graph_production_reporting(**kwargs): + """Setup graph to get production reporting requirements. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Water Well Production Reporting", **kwargs + ) + + G.add_node( + "init", + prompt=( + "Does the following text mention a requirement for production " + "reporting? Production reporting typically refers to the amount " + "of water extracted from a well and may be subject to specific " + "regulations. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} require production reporting for water " + "wells?" + ), + + ) + + G.add_edge("init", "get_reporting", condition=llm_response_starts_with_yes) + + G.add_node( + "get_reporting", + prompt=( + "What are the requirements mentioned in the text?" + ), + ) + + G.add_edge("get_reporting", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'production_reporting' " + "and 'explanation'. The value of the 'production_reporting' key " + "should be a boolean value with the the value 'True' if " + "production reporting is required. The value of the " + "'explanation' should be a string containing a short explanation " + "for your choice." + ), + ) + + return G + + +def setup_graph_production_cost(**kwargs): + """Setup graph to get production cost. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Water Well Production Cost", **kwargs + ) + + G.add_node( + "init", + prompt=( + "Does the following text mention costs related to the production " + "or extraction of water from wells? Such a cost would specify a " + "cost per unit volume of water extracted. Focus on costs that are " + "specific to the production or extraction itself (dollars per " + "gallon or acre-foot figures) rather than one-time permit costs." + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} charge well operators or owners to " + "produce or extract water from a groundwater well? " + "This is likely a dollar amount per gallon or acre-foot fee." + ) + ) + + G.add_edge("init", "get_type", condition=llm_response_starts_with_yes) + + G.add_node( + "get_type", + prompt=( + "Does the production cost apply broadly to all well users or " + "does it vary by permit type, user, or other factors?" + ), + ) + + G.add_edge("get_type", "get_cost_amount") + + G.add_node( + "get_cost_amount", + prompt=( + "What is the dollar amount associated with the external transfer " + "of water? Include the units associated with the cost (example: " + "dollars per gallon). If the text does not mention a specific " + "cost, then respond 'Permit Specific' or with the rate structure " + "mentioned in the text." + ), + ) + + G.add_edge("get_cost_amount", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly four keys. The keys are 'cost', " + "'production_cost', 'cost_units', and 'explanation'. The value " + "of the 'cost' key should be 'True' if there are costs " + "associated with the production of water. The value of the " + "'production_cost' key should reflect the dollar amount " + "associated with the production of water or 'Permit Specific' " + "if the cost varies. The value of the 'cost_units' key should " + "be a string containing the units associated with the cost " + "(example: dollars per gallon). The value of the 'explanation' " + "key should be a string containing a short explanation for your " + "choice." + ), + ) + + return G + + +def setup_graph_setback_features(**kwargs): + """Setup Graph to get setback restrictions. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Setback Features", **kwargs + ) + + G.add_node( + "init", + prompt=( + "Does the following text mention restrictions related to how " + "close a groundwater well can be located relative to property " + "lines, buildings, septic systems, or 'other sources of " + "contamination'? " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} restrict how close a groundwater well can " + "be located relative to property lines, buildings, septic " + "systems, or located relative to property lines, buildings, " + "septic systems, or other sources of contamination'?" + ), + + ) + + G.add_edge("init", "get_restrictions", + condition=llm_response_starts_with_yes) + + + G.add_node( + "get_restrictions", + prompt=( + "What are the restrictions mentioned in the text? " + ), + ) + + G.add_edge("get_restrictions", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'setback_restrictions' " + "and 'explanation'. The value of the 'setback_restrictions' key " + "should be a boolean value with the value 'True' if setback " + "restrictions are imposed. The value of the 'explanation' " + "key should be a string containing a short explanation for your " + "choice." + ), + ) + + return G + + +def setup_graph_redrilling(**kwargs): + """Setup Graph to get redrilling restrictions. + + Parameters + ---------- + **kwargs + Keyword-value pairs to add to graph. + + Returns + ------- + nx.DiGraph + Graph instance that can be used to initialize an + `elm.tree.DecisionTree`. + """ + G = setup_graph_no_nodes( # noqa: N806 + d_tree_name="Redrilling Restrictions", **kwargs + ) + + G.add_node( + "init", + prompt=( + "Does the following text mention restrictions related to " + "redrilling water wells? Redrilling refers to the process " + "of deepening or widening an existing well to improve access " + "to groundwater. " + "{YES_NO_PROMPT}" + '\n\n"""\n{text}\n"""' + ), + db_query=( + "Does {DISTRICT_NAME} implement restrictions related to " + "redrilling or deepening water wells?" + ) + ) + + G.add_edge("init", "get_redrilling", + condition=llm_response_starts_with_yes) + + G.add_node( + "get_redrilling", + prompt=( + "What are the redrilling restrictions mentioned in the text? " + ), + ) + + G.add_edge("get_redrilling", "final") + + G.add_node( + "final", + prompt=( + "Respond based on our entire conversation so far. Return your " + "answer in JSON format (not markdown). Your JSON file must " + "include exactly two keys. The keys are 'redrilling_restrictions' " + "and 'explanation'. The value of the 'redrilling_restrictions' " + "key should be a boolean value with the value 'True' if the " + "conservation district implements redrilling restrictions. The " + "value of the 'explanation' key should be a string containing a " + "short explanation for your choice." + ), + ) + + return G diff --git a/compass/extraction/water/ordinance.py b/compass/extraction/water/ordinance.py new file mode 100644 index 000000000..2190089dc --- /dev/null +++ b/compass/extraction/water/ordinance.py @@ -0,0 +1,122 @@ +"""Water ordinance document content collection and extraction + +These methods help filter down the document text to only the portions +relevant to utility-scale water ordinances. +""" +import logging + +from elm.ords.validation.content import ( + ValidationWithMemory, # compass equivalent = ParseChunksWithMemory? +) +from compass.validation.content import ParseChunksWithMemory +from compass.utilities.parsing import merge_overlapping_texts + + +logger = logging.getLogger(__name__) + + +class OrdinanceValidator(ParseChunksWithMemory): + """Check document text for water ordinances.""" + + WELL_PERMITS_PROMPT = ( + "You extract structured data from text. Return your answer in JSON " + "format (not markdown). Your JSON file must include exactly three " + "keys. The first key is 'district_rules' which is a string summarizes " + "the rules associated with the groundwater conservation district. " + "The second key is 'well_requirements', which is a string that " + "summarizes the requirements for drilling a groundwater well. The " + "last key is '{key}', which is a boolean that is set to True if the " + "text excerpt provides substantive information related to the " + "groundwater conservation district's rules or management plans. " + ) + + def __init__(self, structured_llm_caller, text_chunks, num_to_recall=2): + """ + + Parameters + ---------- + structured_llm_caller : elm.ords.llm.StructuredLLMCaller + StructuredLLMCaller instance. Used for structured validation + queries. + text_chunks : list of str + List of strings, each of which represent a chunk of text. + The order of the strings should be the order of the text + chunks. This validator may refer to previous text chunks to + answer validation questions. + num_to_recall : int, optional + Number of chunks to check for each validation call. This + includes the original chunk! For example, if + `num_to_recall=2`, the validator will first check the chunk + at the requested index, and then the previous chunk as well. + By default, ``2``. + """ + super().__init__( + structured_llm_caller=structured_llm_caller, + text_chunks=text_chunks, + num_to_recall=num_to_recall, + ) + # self._legal_text_mem = [] + # self._wind_mention_mem = [] + self._ordinance_chunks = [] + + @property + def ordinance_text(self): + """str: Combined ordinance text from the individual chunks.""" + inds_to_grab = set() + for info in self._ordinance_chunks: + inds_to_grab |= { + info["ind"] + x for x in range(1 - self.num_to_recall, 2) + } + + text = [ + self.text_chunks[ind] + for ind in sorted(inds_to_grab) + if 0 <= ind < len(self.text_chunks) + ] + return merge_overlapping_texts(text) + + async def parse(self, min_chunks_to_process=3): + """Parse text chunks and look for ordinance text. + + Parameters + ---------- + min_chunks_to_process : int, optional + Minimum number of chunks to process before checking if + document resembles legal text and ignoring chunks that don't + pass the wind heuristic. By default, ``3``. + + Returns + ------- + bool + ``True`` if any ordinance text was found in the chunks. + """ + for ind, text in enumerate(self.text_chunks): + # TODO: I got good results without a similar test for water + # but is it worth including for the sake of being thorough? + + # self._wind_mention_mem.append(possibly_mentions_wind(text)) + # if ind >= min_chunks_to_process: + # # fmt: off + # if not any(self._wind_mention_mem[-self.num_to_recall:]): + # continue + + logger.debug("Processing text at ind %d", ind) + logger.debug("Text:\n%s", text) + + contains_ord_info = await self.parse_from_ind( + ind, self.WELL_PERMITS_PROMPT, key="contains_ord_info" + ) + if not contains_ord_info: + logger.debug( + "Text at ind %d does not contain ordinance info", ind + ) + continue + + logger.debug("Text at ind %d does contain ordinance info", ind) + + self._ordinance_chunks.append({"text": text, "ind": ind}) + logger.debug("Added text at ind %d to ordinances", ind) + # mask, since we got a good result + # self._wind_mention_mem[-1] = False + + return bool(self._ordinance_chunks) diff --git a/compass/extraction/water/parse.py b/compass/extraction/water/parse.py new file mode 100644 index 000000000..7d20b392a --- /dev/null +++ b/compass/extraction/water/parse.py @@ -0,0 +1,250 @@ +"""Water ordinance structured parsing class""" + +import asyncio +import logging +from copy import deepcopy +from itertools import chain +from warnings import warn + +import pandas as pd + +from compass.llm.calling import BaseLLMCaller, ChatLLMCaller +from compass.common import ( + run_async_tree, + setup_async_decision_tree +) +from compass.extraction.water.graphs import ( + setup_graph_permits, + setup_graph_extraction, + setup_graph_geothermal, + setup_graph_oil_and_gas, + setup_graph_limits, + setup_graph_well_spacing, + setup_graph_time, + setup_graph_metering_device, + setup_graph_drought, + setup_graph_contingency, + setup_graph_plugging_reqs, + setup_graph_external_transfer, + setup_graph_production_reporting, + setup_graph_production_cost, + setup_graph_setback_features, + setup_graph_redrilling, +) + +logger = logging.getLogger(__name__) + + +DEFAULT_SYSTEM_MESSAGE = ( + "You are a legal expert explaining water rights ordinances to a " + "geothermal energy developer." +) + + +class StructuredWaterParser(BaseLLMCaller): + """LLM ordinance document structured data scraping utility.""" + + def _init_chat_llm_caller(self, system_message): + """Initialize a ChatLLMCaller instance for the DecisionTree""" + return ChatLLMCaller( + self.llm_service, + system_message=system_message, + usage_tracker=self.usage_tracker, + **self.kwargs, + ) + + def __init__(self, wizard, location, **kwargs): + """ + Parameters + ---------- + wizard : elm.wizard.EnergyWizard + Instance of the EnergyWizard class used for RAG. + location : str + Name of the groundwater conservation district or county. + """ + self.location = location + self.wizard = wizard + + super().__init__(**kwargs) + + async def parse(self, location): + """Parse text and extract structured ordinance data.""" + self.location = location + values = {"location": location} + + check_map = { + "requirements": self._check_reqs, + "extraction_requirements": self._check_extraction, + "well_spacing": self._check_spacing, + "drilling_window": self._check_time, + "metering_device": self._check_metering_device, + "district_drought_mgmt_plan": self._check_district_drought, + "well_drought_mgmt_plan": self._check_well_drought, + "plugging_requirements": self._check_plugging, + "transfer_requirements": self._check_transfer, + "production_reporting": self._check_production_reporting, + "production_cost": self._check_production_cost, + "setbacks": self._check_setbacks, + "redrilling": self._check_redrilling, + } + + tasks = {name: asyncio.create_task(func()) for name, func in + check_map.items()} + + limit_intervals = ["daily", "monthly", "annual"] + for interval in limit_intervals: + task_name = f"{interval}_limits" + tasks[task_name] = asyncio.create_task(self._check_limits(interval)) + + logger.debug("Starting value extraction with %d tasks.", len(tasks)) + + results = await asyncio.gather(*tasks.values(), return_exceptions=True) + + for key, result in zip(tasks.keys(), results): + if isinstance(result, Exception): + logger.warning("Task %s failed: %s", key, result) + values[key] = None + else: + values[key] = result + + logger.debug("Value extraction complete.") + + return values + + async def _check_with_graph(self, graph_setup_func, + limit=50, **format_kwargs): + """Generic method to check requirements using a graph setup + function. + + Parameters + ---------- + wizard : elm.wizard.EnergyWizard + Instance of the EnergyWizard class used for RAG. + graph_setup_func : callable + Function that returns a graph for the decision tree + limit : int, optional + Limit for vector DB query, by default 50 + **format_kwargs + Additional keyword arguments for prompt formatting + + Returns + ------- + dict + Extracted data as JSON dict + """ + graph = graph_setup_func() + prompt = graph.nodes["init"].get("db_query") + + format_dict = {"DISTRICT_NAME": self.location} + format_dict.update(format_kwargs) + prompt = prompt.format(**format_dict) + + response, _, _ = self.wizard.query_vector_db(prompt, limit=limit) + text = response.tolist() + all_text = "\n".join(text) + + tree = setup_async_decision_tree( + graph_setup_func, + text=all_text, + chat_llm_caller=self._init_chat_llm_caller(DEFAULT_SYSTEM_MESSAGE), + **(format_kwargs or {}) + ) + + return await run_async_tree(tree) + + async def _check_reqs(self): + """Get the requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_permits, + ) + + async def _check_extraction(self): + """Get the extraction requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_extraction, + ) + + async def _check_geothermal(self): + """Get the geothermal requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_geothermal, + ) + + async def _check_oil_and_gas(self): + """Get the oil and gas requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_oil_and_gas, + ) + + async def _check_limits(self, interval): + """Get the extraction limits mentioned in the text.""" + return await self._check_with_graph( + setup_graph_limits, + interval=interval + ) + + async def _check_spacing(self): + """Get the spacing requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_well_spacing, + ) + + async def _check_time(self): + """Get the time requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_time, + ) + + async def _check_metering_device(self): + """Get the metering device mentioned in the text.""" + return await self._check_with_graph( + setup_graph_metering_device, + ) + + async def _check_district_drought(self): + """Get the drought management plan mentioned in the text.""" + return await self._check_with_graph( + setup_graph_drought, + ) + + async def _check_well_drought(self): + """Get the well drought management plan mentioned in the text.""" + return await self._check_with_graph( + setup_graph_contingency, + ) + + async def _check_plugging(self): + """Get the plugging requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_plugging_reqs, + ) + + async def _check_transfer(self): + """Get the transfer requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_external_transfer, + ) + + async def _check_production_reporting(self): + """Get the reporting requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_production_reporting, + ) + + async def _check_production_cost(self): + """Get the production cost requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_production_cost, + ) + + async def _check_setbacks(self): + """Get the setback requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_setback_features, + ) + + async def _check_redrilling(self): + """Get the redrilling requirements mentioned in the text.""" + return await self._check_with_graph( + setup_graph_redrilling, + ) From 8b7f29dd3f0493a7ef780355db976055508e5dee Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Thu, 29 Jan 2026 15:49:22 -0700 Subject: [PATCH 02/38] Bump elm version --- pixi.lock | 673 ++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 326 insertions(+), 349 deletions(-) diff --git a/pixi.lock b/pixi.lock index 755cc99b5..c51e926c0 100644 --- a/pixi.lock +++ b/pixi.lock @@ -233,7 +233,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -248,7 +248,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -258,12 +258,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/df/e6/a170e6ae3492d8e334a6ce9e39668f2b8d0cb0a158804460b5d851315230/maxminddb-3.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/cb/e7cd2f6161e30a4009cf38dd00024b1303197afcd4297081b0ccd21016a8/patchright-1.51.3-py3-none-manylinux1_x86_64.whl @@ -271,7 +271,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/fd/bc60798803414ecab66456208eeff4308344d0c055ca0d294d2cdd692b60/playwright-1.51.0-py3-none-manylinux1_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d8/d3/82f366ccadbe8a250e1b810ffa4a33006f66ec287e382632765b63758835/pyjson5-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2a/21/f691fb2613100a62b3fa91e9988c991e9ca5b89ea31c0d3152a3210344f9/rank_bm25-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fb/cd/3708503fd7c6d99c3bf15ebf2dd03675c431ed0da54771d5c7c2e784e845/rebrowser_playwright-1.49.1-py3-none-manylinux1_x86_64.whl @@ -297,9 +297,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ @@ -567,7 +567,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -582,7 +582,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/6a/c2/fc6375d07ea3962df7afad7d863fe4bde18bb88530678c20d4c90c18de1d/h5py-3.15.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -592,12 +592,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/ec/3d/c22a117c1c6ca42a62be9473f12d113e2eab72ac28c032a290d0fbbd488e/maxminddb-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/09/e6126d32175f96ea963616debbb8e380e7c987ca913efeb59bf7e7f39438/patchright-1.51.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -605,7 +605,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0d/14/13db550d7b892aefe80f8581c6557a17cbfc2e084383cd09d25fdd488f6e/playwright-1.51.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/56/0b/a87556189da4de1fc6360ca1aa05e8335509633f836cdd06dd17f0743300/primp-0.15.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/ae/96/1d9cf5bf5ea863d61ab977f6e9842c8519ff430dbceb58580e06deb1dd4a/pyjson5-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/2a/21/f691fb2613100a62b3fa91e9988c991e9ca5b89ea31c0d3152a3210344f9/rank_bm25-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ea/3e/47088ffc9c33eeaee3e013c838bb1be8e307619faed12e245e16d74cefef/rebrowser_playwright-1.49.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -631,9 +631,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ @@ -851,7 +851,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl @@ -867,7 +867,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -877,12 +877,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/d6/c8/76b3c0ea1f180209496cb401892a4ad197ee23ac1f370da578fffa466418/maxminddb-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/55/d62c85fff36e9e9e515ee92407b02acb556e6832d4fbcc8624b638cf70bb/patchright-1.51.3-py3-none-macosx_11_0_universal2.whl @@ -890,7 +890,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/b1/061c322319072225beba45e8c6695b7c1429f83bb97bdb5ed51ea3a009fc/playwright-1.51.0-py3-none-macosx_11_0_universal2.whl - pypi: https://files.pythonhosted.org/packages/f5/5a/146ac964b99ea7657ad67eb66f770be6577dfe9200cb28f9a95baffd6c3f/primp-0.15.0-cp38-abi3-macosx_10_12_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e0/8c/402811e522cbed81f414056c1683c129127034a9f567fa707200c3c67cf7/pyjson5-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f4/d2/29e5e536adc07bc3d33dd09f3f7cf844bf7b4981820dc2a91dd810f3c782/pyobjc_core-12.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/ad/31/0c2e734165abb46215797bd830c4bdcb780b699854b15f2b6240515edcc6/pyobjc_framework_cocoa-12.1-cp313-cp313-macosx_10_13_universal2.whl @@ -918,9 +918,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ @@ -1138,7 +1138,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl @@ -1154,7 +1154,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1164,12 +1164,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/b6/96/b2d5ab37458ec892d7d52b6a9e6aa9992354d61df20b9978bae60e35d17a/maxminddb-3.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/20/4df3f817c28938e22ee7c7c4b28d8b3a212e5a111c3bd9633bc410267daa/patchright-1.51.3-py3-none-macosx_11_0_arm64.whl @@ -1177,7 +1177,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/32/4a/5f2ff6866bdf88e86147930b0be86b227f3691f4eb01daad5198302a8cbe/playwright-1.51.0-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bc/8a/cc2321e32db3ce64d6e32950d5bcbea01861db97bfb20b5394affc45b387/primp-0.15.0-cp38-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2f/00/f2392fe52b50aadf5037381a52f9eda0081be6c429d9d85b47f387ecda38/pyjson5-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f4/d2/29e5e536adc07bc3d33dd09f3f7cf844bf7b4981820dc2a91dd810f3c782/pyobjc_core-12.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/ad/31/0c2e734165abb46215797bd830c4bdcb780b699854b15f2b6240515edcc6/pyobjc_framework_cocoa-12.1-cp313-cp313-macosx_10_13_universal2.whl @@ -1205,9 +1205,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ @@ -1418,7 +1418,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -1433,7 +1433,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl @@ -1443,19 +1443,19 @@ environments: - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/4b/19/a498bf14a86e98475d4ca994988e8f072dccfd407d026403ad95725321de/maxminddb-3.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/fd/97e3e26893904bdeff36d54e6ea5fe5f81a245a96c1b73ebe37e956ce11d/patchright-1.51.3-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0f/098488de02e3d52fc77e8d55c1467f6703701b6ea6788f40409bb8c00dd4/playwright-1.51.0-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/0c/dd/f0183ed0145e58cf9d286c1b2c14f63ccee987a4ff79ac85acc31b5d86bd/primp-0.15.0-cp38-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e9/60/d28dcdc482ed36196ee7523f47b1869f92a998777d46c80cf84ec1c8c962/pyjson5-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2a/21/f691fb2613100a62b3fa91e9988c991e9ca5b89ea31c0d3152a3210344f9/rank_bm25-0.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/4a/ef8bb2b86988e7e45b8dfa75a9387fe346f5f52792bfdd0d530ef36c9afe/rebrowser_playwright-1.49.1-py3-none-win_amd64.whl @@ -1481,9 +1481,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl - pypi: ./ @@ -1760,7 +1760,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -1772,10 +1772,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/df/e6/a170e6ae3492d8e334a6ce9e39668f2b8d0cb0a158804460b5d851315230/maxminddb-3.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/cb/e7cd2f6161e30a4009cf38dd00024b1303197afcd4297081b0ccd21016a8/patchright-1.51.3-py3-none-manylinux1_x86_64.whl @@ -1798,9 +1798,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ linux-aarch64: @@ -2106,7 +2106,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -2118,10 +2118,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/3d/c22a117c1c6ca42a62be9473f12d113e2eab72ac28c032a290d0fbbd488e/maxminddb-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/09/e6126d32175f96ea963616debbb8e380e7c987ca913efeb59bf7e7f39438/patchright-1.51.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -2144,9 +2144,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ osx-64: @@ -2405,7 +2405,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -2418,10 +2418,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/c8/76b3c0ea1f180209496cb401892a4ad197ee23ac1f370da578fffa466418/maxminddb-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/55/d62c85fff36e9e9e515ee92407b02acb556e6832d4fbcc8624b638cf70bb/patchright-1.51.3-py3-none-macosx_11_0_universal2.whl @@ -2444,9 +2444,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -2705,7 +2705,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -2718,10 +2718,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/96/b2d5ab37458ec892d7d52b6a9e6aa9992354d61df20b9978bae60e35d17a/maxminddb-3.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/20/4df3f817c28938e22ee7c7c4b28d8b3a212e5a111c3bd9633bc410267daa/patchright-1.51.3-py3-none-macosx_11_0_arm64.whl @@ -2744,9 +2744,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -2996,7 +2996,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -3008,10 +3008,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/19/a498bf14a86e98475d4ca994988e8f072dccfd407d026403ad95725321de/maxminddb-3.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/fd/97e3e26893904bdeff36d54e6ea5fe5f81a245a96c1b73ebe37e956ce11d/patchright-1.51.3-py3-none-win_amd64.whl @@ -3033,9 +3033,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ pdev: @@ -3457,7 +3457,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -3469,10 +3469,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/df/e6/a170e6ae3492d8e334a6ce9e39668f2b8d0cb0a158804460b5d851315230/maxminddb-3.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/cb/e7cd2f6161e30a4009cf38dd00024b1303197afcd4297081b0ccd21016a8/patchright-1.51.3-py3-none-manylinux1_x86_64.whl @@ -3495,9 +3495,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ linux-aarch64: @@ -3949,7 +3949,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -3961,10 +3961,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/3d/c22a117c1c6ca42a62be9473f12d113e2eab72ac28c032a290d0fbbd488e/maxminddb-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/09/e6126d32175f96ea963616debbb8e380e7c987ca913efeb59bf7e7f39438/patchright-1.51.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -3987,9 +3987,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ osx-64: @@ -4394,7 +4394,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -4407,10 +4407,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/c8/76b3c0ea1f180209496cb401892a4ad197ee23ac1f370da578fffa466418/maxminddb-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/55/d62c85fff36e9e9e515ee92407b02acb556e6832d4fbcc8624b638cf70bb/patchright-1.51.3-py3-none-macosx_11_0_universal2.whl @@ -4433,9 +4433,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -4840,7 +4840,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -4853,10 +4853,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/96/b2d5ab37458ec892d7d52b6a9e6aa9992354d61df20b9978bae60e35d17a/maxminddb-3.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/20/4df3f817c28938e22ee7c7c4b28d8b3a212e5a111c3bd9633bc410267daa/patchright-1.51.3-py3-none-macosx_11_0_arm64.whl @@ -4879,9 +4879,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -5278,7 +5278,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -5290,10 +5290,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/19/a498bf14a86e98475d4ca994988e8f072dccfd407d026403ad95725321de/maxminddb-3.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/fd/97e3e26893904bdeff36d54e6ea5fe5f81a245a96c1b73ebe37e956ce11d/patchright-1.51.3-py3-none-win_amd64.whl @@ -5315,9 +5315,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ pdoc: @@ -5608,7 +5608,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -5620,10 +5620,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/df/e6/a170e6ae3492d8e334a6ce9e39668f2b8d0cb0a158804460b5d851315230/maxminddb-3.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/cb/e7cd2f6161e30a4009cf38dd00024b1303197afcd4297081b0ccd21016a8/patchright-1.51.3-py3-none-manylinux1_x86_64.whl @@ -5646,9 +5646,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ linux-aarch64: @@ -5970,7 +5970,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -5982,10 +5982,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/3d/c22a117c1c6ca42a62be9473f12d113e2eab72ac28c032a290d0fbbd488e/maxminddb-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/09/e6126d32175f96ea963616debbb8e380e7c987ca913efeb59bf7e7f39438/patchright-1.51.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -6008,9 +6008,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ osx-64: @@ -6284,7 +6284,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -6297,10 +6297,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/c8/76b3c0ea1f180209496cb401892a4ad197ee23ac1f370da578fffa466418/maxminddb-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/55/d62c85fff36e9e9e515ee92407b02acb556e6832d4fbcc8624b638cf70bb/patchright-1.51.3-py3-none-macosx_11_0_universal2.whl @@ -6323,9 +6323,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -6599,7 +6599,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -6612,10 +6612,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/96/b2d5ab37458ec892d7d52b6a9e6aa9992354d61df20b9978bae60e35d17a/maxminddb-3.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/20/4df3f817c28938e22ee7c7c4b28d8b3a212e5a111c3bd9633bc410267daa/patchright-1.51.3-py3-none-macosx_11_0_arm64.whl @@ -6638,9 +6638,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -6905,7 +6905,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -6917,10 +6917,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/19/a498bf14a86e98475d4ca994988e8f072dccfd407d026403ad95725321de/maxminddb-3.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/fd/97e3e26893904bdeff36d54e6ea5fe5f81a245a96c1b73ebe37e956ce11d/patchright-1.51.3-py3-none-win_amd64.whl @@ -6942,9 +6942,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ ptest: @@ -7238,7 +7238,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -7250,10 +7250,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/df/e6/a170e6ae3492d8e334a6ce9e39668f2b8d0cb0a158804460b5d851315230/maxminddb-3.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/70/cb/e7cd2f6161e30a4009cf38dd00024b1303197afcd4297081b0ccd21016a8/patchright-1.51.3-py3-none-manylinux1_x86_64.whl @@ -7276,9 +7276,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ linux-aarch64: @@ -7602,7 +7602,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -7614,10 +7614,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/3d/c22a117c1c6ca42a62be9473f12d113e2eab72ac28c032a290d0fbbd488e/maxminddb-3.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/09/e6126d32175f96ea963616debbb8e380e7c987ca913efeb59bf7e7f39438/patchright-1.51.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl @@ -7640,9 +7640,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ osx-64: @@ -7919,7 +7919,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -7932,10 +7932,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d6/c8/76b3c0ea1f180209496cb401892a4ad197ee23ac1f370da578fffa466418/maxminddb-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/55/d62c85fff36e9e9e515ee92407b02acb556e6832d4fbcc8624b638cf70bb/patchright-1.51.3-py3-none-macosx_11_0_universal2.whl @@ -7958,9 +7958,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -8237,7 +8237,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -8250,10 +8250,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b6/96/b2d5ab37458ec892d7d52b6a9e6aa9992354d61df20b9978bae60e35d17a/maxminddb-3.0.0-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/55/20/4df3f817c28938e22ee7c7c4b28d8b3a212e5a111c3bd9633bc410267daa/patchright-1.51.3-py3-none-macosx_11_0_arm64.whl @@ -8276,9 +8276,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -8546,7 +8546,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl @@ -8558,10 +8558,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/19/a498bf14a86e98475d4ca994988e8f072dccfd407d026403ad95725321de/maxminddb-3.0.0-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6e/fd/97e3e26893904bdeff36d54e6ea5fe5f81a245a96c1b73ebe37e956ce11d/patchright-1.51.3-py3-none-win_amd64.whl @@ -8583,9 +8583,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/b0/be/69fffc97b78f52a5d1372e5d56a0599291e96996a47089fb6312bc023d88/trimesh-4.11.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ rdev: @@ -8755,8 +8755,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -8787,7 +8787,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl @@ -8806,7 +8806,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/81/62c5cc980a3f5a7476792769616792e0df8ba9c8c4730195ec700a56a962/langsmith-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl @@ -8816,12 +8816,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/b3/dc0d3771f2e5d1f13368f56b339c6782f955c6a20b50465a91acb79fe961/orjson-3.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/87/e3/aa1b6d3ad3cd80f10394134f73ae92a1d11fdbe974c34aa199cc18bb5fcf/orjson-3.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -8833,8 +8833,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl @@ -8877,7 +8877,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl @@ -8898,10 +8898,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8a/27/84121c51ea72f013f0e03d0886bcdfa96b31c9b83c98300a7bd5cc4fa191/uuid_utils-0.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -9091,8 +9091,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -9123,7 +9123,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl @@ -9142,7 +9142,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/81/62c5cc980a3f5a7476792769616792e0df8ba9c8c4730195ec700a56a962/langsmith-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl @@ -9152,12 +9152,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/42/f1bf1549b432d4a78bfa95735b79b5dac75b65b5bb815bba86ad406ead0a/orjson-3.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/10/6d2b8a064c8d2411d3d0ea6ab43125fae70152aef6bea77bb50fa54d4097/orjson-3.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -9169,8 +9169,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/56/0b/a87556189da4de1fc6360ca1aa05e8335509633f836cdd06dd17f0743300/primp-0.15.0.tar.gz - pypi: https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl @@ -9213,7 +9213,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl @@ -9234,10 +9234,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/17/82/ea5f5e85560b08a1f30cdc65f75e76494dc7aba9773f679e7eaa27370229/uuid_utils-0.14.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -9367,8 +9367,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl @@ -9400,7 +9400,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl @@ -9419,7 +9419,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/81/62c5cc980a3f5a7476792769616792e0df8ba9c8c4730195ec700a56a962/langsmith-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl @@ -9429,12 +9429,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/43/61a77040ce59f1569edf38f0b9faadc90c8cf7e9bec2e0df51d0132c6bb7/orjson-3.11.5-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/45/d9c71c8c321277bc1ceebf599bc55ba826ae538b7c61f287e9a7e71bd589/orjson-3.11.6-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -9446,8 +9446,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/f5/5a/146ac964b99ea7657ad67eb66f770be6577dfe9200cb28f9a95baffd6c3f/primp-0.15.0-cp38-abi3-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl @@ -9492,7 +9492,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl @@ -9513,10 +9513,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/42/42d003f4a99ddc901eef2fd41acb3694163835e037fb6dde79ad68a72342/uuid_utils-0.14.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -9646,8 +9646,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl @@ -9679,7 +9679,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl @@ -9698,7 +9698,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/81/62c5cc980a3f5a7476792769616792e0df8ba9c8c4730195ec700a56a962/langsmith-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl @@ -9708,12 +9708,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/43/61a77040ce59f1569edf38f0b9faadc90c8cf7e9bec2e0df51d0132c6bb7/orjson-3.11.5-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ae/45/d9c71c8c321277bc1ceebf599bc55ba826ae538b7c61f287e9a7e71bd589/orjson-3.11.6-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -9725,8 +9725,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/bc/8a/cc2321e32db3ce64d6e32950d5bcbea01861db97bfb20b5394affc45b387/primp-0.15.0-cp38-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl @@ -9771,7 +9771,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl @@ -9792,10 +9792,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/42/42d003f4a99ddc901eef2fd41acb3694163835e037fb6dde79ad68a72342/uuid_utils-0.14.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -9923,8 +9923,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl @@ -9955,7 +9955,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl @@ -9974,7 +9974,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/81/62c5cc980a3f5a7476792769616792e0df8ba9c8c4730195ec700a56a962/langsmith-0.6.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b0/42/327554649ed2dd5ce59d3f5da176c7be20f9352c7c6c51597293660b7b08/language_tags-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl @@ -9984,12 +9984,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/95/fe/792cc06a84808dbdc20ac6eab6811c53091b42f8e51ecebf14b540e9cfe4/orjson-3.11.5-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/bc/9ffe7dfbf8454bc4e75bb8bf3a405ed9e0598df1d3535bb4adcd46be07d0/orjson-3.11.6-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl @@ -10000,8 +10000,8 @@ environments: - pypi: https://files.pythonhosted.org/packages/0c/dd/f0183ed0145e58cf9d286c1b2c14f63ccee987a4ff79ac85acc31b5d86bd/primp-0.15.0-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl @@ -10044,7 +10044,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl @@ -10065,10 +10065,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d3/28/2c7d417ea483b6ff7820c948678fdf2ac98899dc7e43bb15852faa95acaf/uuid_utils-0.14.0-cp39-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -13194,17 +13194,17 @@ packages: - sentence-transformers ; extra == 'all' - selenium ; extra == 'all' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl name: cryptography - version: 46.0.3 - sha256: 109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a + version: 46.0.4 + sha256: 01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa requires_dist: - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' - typing-extensions>=4.13.2 ; python_full_version < '3.11' - bcrypt>=3.1.5 ; extra == 'ssh' - nox[uv]>=2024.4.15 ; extra == 'nox' - - cryptography-vectors==46.0.3 ; extra == 'test' + - cryptography-vectors==46.0.4 ; extra == 'test' - pytest>=7.4.0 ; extra == 'test' - pytest-benchmark>=4.0 ; extra == 'test' - pytest-cov>=2.10.1 ; extra == 'test' @@ -13224,17 +13224,17 @@ packages: - check-sdist ; extra == 'pep8test' - click>=8.0.1 ; extra == 'pep8test' requires_python: '>=3.8,!=3.9.0,!=3.9.1' -- pypi: https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl +- pypi: https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl name: cryptography - version: 46.0.3 - sha256: 6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb + version: 46.0.4 + sha256: 0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255 requires_dist: - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' - typing-extensions>=4.13.2 ; python_full_version < '3.11' - bcrypt>=3.1.5 ; extra == 'ssh' - nox[uv]>=2024.4.15 ; extra == 'nox' - - cryptography-vectors==46.0.3 ; extra == 'test' + - cryptography-vectors==46.0.4 ; extra == 'test' - pytest>=7.4.0 ; extra == 'test' - pytest-benchmark>=4.0 ; extra == 'test' - pytest-cov>=2.10.1 ; extra == 'test' @@ -13254,17 +13254,17 @@ packages: - check-sdist ; extra == 'pep8test' - click>=8.0.1 ; extra == 'pep8test' requires_python: '>=3.8,!=3.9.0,!=3.9.1' -- pypi: https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl name: cryptography - version: 46.0.3 - sha256: a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb + version: 46.0.4 + sha256: 6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b requires_dist: - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' - typing-extensions>=4.13.2 ; python_full_version < '3.11' - bcrypt>=3.1.5 ; extra == 'ssh' - nox[uv]>=2024.4.15 ; extra == 'nox' - - cryptography-vectors==46.0.3 ; extra == 'test' + - cryptography-vectors==46.0.4 ; extra == 'test' - pytest>=7.4.0 ; extra == 'test' - pytest-benchmark>=4.0 ; extra == 'test' - pytest-cov>=2.10.1 ; extra == 'test' @@ -13284,17 +13284,17 @@ packages: - check-sdist ; extra == 'pep8test' - click>=8.0.1 ; extra == 'pep8test' requires_python: '>=3.8,!=3.9.0,!=3.9.1' -- pypi: https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl name: cryptography - version: 46.0.3 - sha256: a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec + version: 46.0.4 + sha256: 281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485 requires_dist: - cffi>=1.14 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' - cffi>=2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' - typing-extensions>=4.13.2 ; python_full_version < '3.11' - bcrypt>=3.1.5 ; extra == 'ssh' - nox[uv]>=2024.4.15 ; extra == 'nox' - - cryptography-vectors==46.0.3 ; extra == 'test' + - cryptography-vectors==46.0.4 ; extra == 'test' - pytest>=7.4.0 ; extra == 'test' - pytest-benchmark>=4.0 ; extra == 'test' - pytest-cov>=2.10.1 ; extra == 'test' @@ -13402,11 +13402,11 @@ packages: - pkg:pypi/cryptography?source=hash-mapping size: 1488294 timestamp: 1764805888325 -- pypi: https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl name: cssselect - version: 1.3.0 - sha256: 56d1bf3e198080cc1667e137bc51de9cadfca259f03c2d4e09037b3e01e30f0d - requires_python: '>=3.9' + version: 1.4.0 + sha256: c0ec5c0191c8ee39fcc8afc1540331d8b55b0183478c50e9c8a79d44dbceb1d8 + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 md5: 5da8c935dca9186673987f79cef0b2a5 @@ -16301,10 +16301,10 @@ packages: - pkg:pypi/httpx?source=hash-mapping size: 63082 timestamp: 1733663449209 -- pypi: https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl name: huggingface-hub - version: 1.3.4 - sha256: a0c526e76eb316e96a91e8a1a7a93cf66b0dd210be1a17bd5fc5ae53cba76bfd + version: 1.3.5 + sha256: fe332d7f86a8af874768452295c22cd3f37730fb2463cf6cc3295e26036f8ef9 requires_dist: - filelock - fsspec>=2023.5.0 @@ -16660,8 +16660,8 @@ packages: timestamp: 1736252433366 - pypi: ./ name: infra-compass - version: 0.13.1.dev0+g8a7602b.d20260127 - sha256: d4f4d1bf56c0dcf10181a08f62d1fbbd0d4e51f26563f93bdbb66ab61b1bd3a8 + version: 0.13.2.dev2+g0d6946c.d20260129 + sha256: 05313da525aab3c6bdcad20032f7c6d0bf821164504115c4c92198978b938742 requires_dist: - beautifulsoup4>=4.12.3,<5 - click>=8.1.7,<9 @@ -16669,7 +16669,7 @@ packages: - langchain-text-splitters>=1.0.0,<2 - networkx>=3.4.2,<4 - nltk>=3.9.1,<4 - - nlr-elm>=0.0.35,<1 + - nlr-elm>=0.0.36,<1 - numpy>=2.2.4,<3 - openai>=1.1.0 - pandas>=2.2.3,<3 @@ -22378,66 +22378,10 @@ packages: purls: [] size: 55476 timestamp: 1727963768015 -- pypi: https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl - name: litellm - version: 1.81.3 - sha256: 3f60fd8b727587952ad3dd18b68f5fed538d6f43d15bb0356f4c3a11bccb2b92 - requires_dist: - - pyjwt>=2.10.1,<3.0.0 ; python_full_version >= '3.9' and extra == 'proxy' - - a2a-sdk>=0.3.22,<0.4.0 ; python_full_version >= '3.10' and extra == 'extra-proxy' - - aiohttp>=3.10 - - apscheduler>=3.10.4,<4.0.0 ; extra == 'proxy' - - azure-identity>=1.15.0,<2.0.0 ; (python_full_version >= '3.9' and extra == 'extra-proxy') or (python_full_version >= '3.9' and extra == 'proxy') - - azure-keyvault-secrets>=4.8.0,<5.0.0 ; extra == 'extra-proxy' - - azure-storage-blob>=12.25.1,<13.0.0 ; extra == 'proxy' - - backoff ; extra == 'proxy' - - boto3==1.40.76 ; extra == 'proxy' - - click - - cryptography ; extra == 'proxy' - - diskcache>=5.6.1,<6.0.0 ; extra == 'caching' - - fastapi>=0.120.1 ; extra == 'proxy' - - fastapi-sso>=0.16.0,<0.17.0 ; extra == 'proxy' - - fastuuid>=0.13.0 - - google-cloud-aiplatform>=1.38.0 ; extra == 'google' - - google-cloud-iam>=2.19.1,<3.0.0 ; extra == 'extra-proxy' - - google-cloud-kms>=2.21.3,<3.0.0 ; extra == 'extra-proxy' - - grpcio>=1.62.3,!=1.68.*,!=1.69.*,!=1.70.*,!=1.71.0,!=1.71.1,!=1.72.0,!=1.72.1,!=1.73.0 ; python_full_version < '3.14' and extra == 'grpc' - - grpcio>=1.75.0 ; python_full_version >= '3.14' and extra == 'grpc' - - gunicorn>=23.0.0,<24.0.0 ; extra == 'proxy' - - httpx>=0.23.0 - - importlib-metadata>=6.8.0 - - jinja2>=3.1.2,<4.0.0 - - jsonschema>=4.23.0,<5.0.0 - - litellm-enterprise==0.1.27 ; extra == 'proxy' - - litellm-proxy-extras==0.4.27 ; extra == 'proxy' - - mcp>=1.25.0,<2.0.0 ; python_full_version >= '3.10' and extra == 'proxy' - - mlflow>3.1.4 ; python_full_version >= '3.10' and extra == 'mlflow' - - numpydoc ; extra == 'utils' - - openai>=2.8.0 - - orjson>=3.9.7,<4.0.0 ; extra == 'proxy' - - polars>=1.31.0,<2.0.0 ; python_full_version >= '3.10' and extra == 'proxy' - - prisma==0.11.0 ; extra == 'extra-proxy' - - pydantic>=2.5.0,<3.0.0 - - pynacl>=1.5.0,<2.0.0 ; extra == 'proxy' - - python-dotenv>=0.2.0 - - python-multipart>=0.0.18,<0.0.19 ; extra == 'proxy' - - pyyaml>=6.0.1,<7.0.0 ; extra == 'proxy' - - redisvl>=0.4.1,<0.5.0 ; python_full_version >= '3.9' and python_full_version < '3.14' and extra == 'extra-proxy' - - resend>=0.8.0 ; extra == 'extra-proxy' - - rich==13.7.1 ; extra == 'proxy' - - rq ; extra == 'proxy' - - semantic-router>=0.1.12 ; python_full_version >= '3.9' and python_full_version < '3.14' and extra == 'semantic-router' - - soundfile>=0.12.1,<0.13.0 ; extra == 'proxy' - - tiktoken>=0.7.0 - - tokenizers - - uvicorn>=0.31.1,<0.32.0 ; extra == 'proxy' - - uvloop>=0.21.0,<0.22.0 ; sys_platform != 'win32' and extra == 'proxy' - - websockets>=15.0.1,<16.0.0 ; extra == 'proxy' - requires_python: '>=3.9,<4.0' -- pypi: https://files.pythonhosted.org/packages/9c/98/3a29bf2381ffd6d67a7cab68ad668a43960e0eceadb785cb0f16127a27f7/litellm-1.81.4-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl name: litellm - version: 1.81.4 - sha256: be8ebc00ce08589a6851c88a2cb5fb399206844f31d107e37c9852013dd2333d + version: 1.81.5 + sha256: 206505c5a0c6503e465154b9c979772be3ede3f5bf746d15b37dca5ae54d239f requires_dist: - pyjwt>=2.10.1,<3.0.0 ; python_full_version >= '3.9' and extra == 'proxy' - a2a-sdk>=0.3.22,<0.4.0 ; python_full_version >= '3.10' and extra == 'extra-proxy' @@ -24036,10 +23980,10 @@ packages: - pkg:pypi/networkx?source=compressed-mapping size: 1587439 timestamp: 1765215107045 -- pypi: https://files.pythonhosted.org/packages/77/36/8ea6a9d20a295ef07809e569675f3afe38adf4d60609e65d61f48a6aa7e8/nlr_elm-0.0.35-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/1a/8d/4835465b88ff6aabfffe7993a72d2407423cb62ebfda4ee5cccc0963b10e/nlr_elm-0.0.36-py3-none-any.whl name: nlr-elm - version: 0.0.35 - sha256: 72fffae2f0a4f97c6f0d4506d92f155b73f60a55d657f5c22faa50c21684f461 + version: 0.0.36 + sha256: 98838225203b55bfb59ea8bf73b7d9ad983cb743338c7fc976bd01af73f23c7b requires_dist: - openai>=1.1.0 - aiohttp @@ -24497,10 +24441,10 @@ packages: - pkg:pypi/numpy?source=compressed-mapping size: 7251637 timestamp: 1768085589970 -- pypi: https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl name: openai - version: 2.15.0 - sha256: 6ae23b932cd7230f7244e52954daa6602716d6b9bf235401a107af731baea6c3 + version: 2.16.0 + sha256: 5f46643a8f42899a84e80c38838135d7038e7718333ce61396994f887b09a59b requires_dist: - anyio>=3.5.0,<5 - distro>=1.7.0,<2 @@ -24669,26 +24613,26 @@ packages: purls: [] size: 9440812 timestamp: 1762841722179 -- pypi: https://files.pythonhosted.org/packages/10/43/61a77040ce59f1569edf38f0b9faadc90c8cf7e9bec2e0df51d0132c6bb7/orjson-3.11.5-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl +- pypi: https://files.pythonhosted.org/packages/40/10/6d2b8a064c8d2411d3d0ea6ab43125fae70152aef6bea77bb50fa54d4097/orjson-3.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl name: orjson - version: 3.11.5 - sha256: 3b01799262081a4c47c035dd77c1301d40f568f77cc7ec1bb7db5d63b0a01629 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/77/42/f1bf1549b432d4a78bfa95735b79b5dac75b65b5bb815bba86ad406ead0a/orjson-3.11.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + version: 3.11.6 + sha256: 647d6d034e463764e86670644bdcaf8e68b076e6e74783383b01085ae9ab334f + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/87/e3/aa1b6d3ad3cd80f10394134f73ae92a1d11fdbe974c34aa199cc18bb5fcf/orjson-3.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: orjson - version: 3.11.5 - sha256: 894aea2e63d4f24a7f04a1908307c738d0dce992e9249e744b8f4e8dd9197f39 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/95/fe/792cc06a84808dbdc20ac6eab6811c53091b42f8e51ecebf14b540e9cfe4/orjson-3.11.5-cp313-cp313-win_amd64.whl + version: 3.11.6 + sha256: cded072b9f65fcfd188aead45efa5bd528ba552add619b3ad2a81f67400ec450 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/88/bc/9ffe7dfbf8454bc4e75bb8bf3a405ed9e0598df1d3535bb4adcd46be07d0/orjson-3.11.6-cp313-cp313-win_amd64.whl name: orjson - version: 3.11.5 - sha256: ff7877d376add4e16b274e35a3f58b7f37b362abf4aa31863dadacdd20e3a583 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/9a/b3/dc0d3771f2e5d1f13368f56b339c6782f955c6a20b50465a91acb79fe961/orjson-3.11.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + version: 3.11.6 + sha256: f0f6e9f8ff7905660bc3c8a54cd4a675aa98f7f175cf00a59815e2ff42c0d916 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ae/45/d9c71c8c321277bc1ceebf599bc55ba826ae538b7c61f287e9a7e71bd589/orjson-3.11.6-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl name: orjson - version: 3.11.5 - sha256: 75bc2e59e6a2ac1dd28901d07115abdebc4563b5b07dd612bf64260a201b1c7f - requires_python: '>=3.9' + version: 3.11.6 + sha256: e4ae1670caabb598a88d385798692ce2a1b2f078971b3329cfb85253c6097f5b + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.11.5-py313h541fbb8_0.conda sha256: 6bb36f180ea4ba4f13f5e6ef8ec0b2fdd010d73430af53a05986ffc312091e8f md5: 5dd1f02f38d71a29f3cfaf13c4cbf3dd @@ -26859,25 +26803,25 @@ packages: - pkg:pypi/proto-plus?source=hash-mapping size: 43122 timestamp: 1765906462817 -- pypi: https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl +- pypi: https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl name: protobuf - version: 6.33.4 - sha256: 757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e + version: 6.33.5 + sha256: 9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl name: protobuf - version: 6.33.4 - sha256: 8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc + version: 6.33.5 + sha256: 3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl +- pypi: https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl name: protobuf - version: 6.33.4 - sha256: 2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0 + version: 6.33.5 + sha256: cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl name: protobuf - version: 6.33.4 - sha256: 3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9 + version: 6.33.5 + sha256: a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5 requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.32.1-py313h50fafe1_2.conda sha256: 1592ef1bfa3d31b38d376cd5e9ba09967c6dd0055646019562d48ce64dbe2e32 @@ -26976,10 +26920,10 @@ packages: - pkg:pypi/protobuf?source=hash-mapping size: 494307 timestamp: 1760430837960 -- pypi: https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl +- pypi: https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl name: psutil - version: 7.2.1 - sha256: ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6 + version: 7.2.2 + sha256: b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -27006,16 +26950,24 @@ packages: - virtualenv ; extra == 'dev' - vulture ; extra == 'dev' - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl name: psutil - version: 7.2.1 - sha256: 5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8 + version: 7.2.2 + sha256: 1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979 requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -27042,25 +26994,30 @@ packages: - virtualenv ; extra == 'dev' - vulture ; extra == 'dev' - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl +- pypi: https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl name: psutil - version: 7.2.1 - sha256: b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17 + version: 7.2.2 + sha256: eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988 requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' - pytest-instafail ; extra == 'dev' - pytest-xdist ; extra == 'dev' - setuptools ; extra == 'dev' - - pywin32 ; extra == 'dev' - - wheel ; extra == 'dev' - - wmi ; extra == 'dev' - abi3audit ; extra == 'dev' - black ; extra == 'dev' - check-manifest ; extra == 'dev' @@ -27080,21 +27037,25 @@ packages: - validate-pyproject[all] ; extra == 'dev' - virtualenv ; extra == 'dev' - vulture ; extra == 'dev' - - colorama ; extra == 'dev' - - pyreadline3 ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' - - pywin32 ; extra == 'test' - - wheel ; extra == 'test' - - wmi ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl +- pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl name: psutil - version: 7.2.1 - sha256: 05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1 + version: 7.2.2 + sha256: 076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -27121,16 +27082,24 @@ packages: - virtualenv ; extra == 'dev' - vulture ; extra == 'dev' - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl name: psutil - version: 7.2.1 - sha256: b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42 + version: 7.2.2 + sha256: ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 requires_dist: - psleak ; extra == 'dev' - pytest ; extra == 'dev' @@ -27157,11 +27126,19 @@ packages: - virtualenv ; extra == 'dev' - vulture ; extra == 'dev' - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' - psleak ; extra == 'test' - pytest ; extra == 'test' - pytest-instafail ; extra == 'test' - pytest-xdist ; extra == 'test' - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' requires_python: '>=3.6' - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.1-py313h54dd161_0.conda sha256: 8a5f773e22ccd08fbda57c92f1d094533474db75f70db35311912cdcdb2f18ad @@ -31035,10 +31012,10 @@ packages: - tiktoken>=0.5.1 - httpx requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/73/51/d6056841a4b440ba0a1703a9aff3a87b8be57c6bb5c42c6615696f01a890/tavily_python-0.7.19-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/52/10/39fec2367b152e989ed7aa825a6a794103ad6bc5203c009a6ca63ae7b6e1/tavily_python-0.7.20-py3-none-any.whl name: tavily-python - version: 0.7.19 - sha256: b3d95041f22c5dff37255f65308379e4f8ccef8fe0d92b860815812b570f5ef2 + version: 0.7.20 + sha256: a3735afcac030c229a380d06dd6eac3323f2ce441bba77a069aff134d2ff6e42 requires_dist: - requests - tiktoken>=0.5.1 @@ -32355,11 +32332,11 @@ packages: purls: [] size: 238764 timestamp: 1745560912727 -- pypi: https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl name: w3lib - version: 2.3.1 - sha256: 9ccd2ae10c8c41c7279cd8ad4fe65f834be894fe7bfdd7304b991fd69325847b - requires_python: '>=3.9' + version: 2.4.0 + sha256: 260b5a22aeb86ae73213857f69ed20829a45150f8d5b12050b1f02ada414db79 + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 md5: 035da2e4f5770f036ff704fa17aace24 @@ -32504,10 +32481,10 @@ packages: - pytest ; extra == 'dev' - setuptools ; extra == 'dev' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl name: xarray - version: 2025.12.0 - sha256: 9e77e820474dbbe4c6c2954d0da6342aa484e33adaa96ab916b15a786181e970 + version: 2026.1.0 + sha256: 5fcc03d3ed8dfb662aa254efe6cd65efc70014182bbc2126e4b90d291d970d41 requires_dist: - numpy>=1.26 - packaging>=24.1 @@ -32520,7 +32497,7 @@ packages: - opt-einsum ; extra == 'accel' - xarray[accel,etc,io,parallel,viz] ; extra == 'complete' - netcdf4>=1.6.0 ; extra == 'io' - - h5netcdf ; extra == 'io' + - h5netcdf>=1.4.0 ; extra == 'io' - pydap ; extra == 'io' - scipy>=1.13 ; extra == 'io' - zarr>=2.18 ; extra == 'io' diff --git a/pyproject.toml b/pyproject.toml index bd64a82d2..ad69bf040 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "langchain-text-splitters>=1.0.0,<2", "networkx>=3.4.2,<4", "nltk>=3.9.1,<4", - "nlr-elm>=0.0.35,<1", + "nlr-elm>=0.0.36,<1", "numpy>=2.2.4,<3", "openai>=1.1.0", "pandas>=2.2.3,<3", From f24ccdacf80804c358a17e071977f7e26e77c87c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:37:52 -0700 Subject: [PATCH 03/38] Update node labels on validation graph --- compass/validation/graphs.py | 18 ++++++---- .../unit/validation/test_validation_graphs.py | 34 +++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/compass/validation/graphs.py b/compass/validation/graphs.py index 01d98d30a..66e8c0318 100644 --- a/compass/validation/graphs.py +++ b/compass/validation/graphs.py @@ -432,13 +432,15 @@ def setup_graph_correct_jurisdiction_type(jurisdiction, **kwargs): if jurisdiction.subdivision_name: G.add_edge( - node_to_connect, "is_city", condition=llm_response_starts_with_no + node_to_connect, + "is_subdivision", + condition=llm_response_starts_with_no, ) G.add_edge( node_to_connect, "final", condition=llm_response_starts_with_yes ) G.add_node( - "is_city", + "is_subdivision", prompt=( "Based on the legal text, is it reasonable to conclude that " "the provisions apply specifically to " @@ -453,12 +455,16 @@ def setup_graph_correct_jurisdiction_type(jurisdiction, **kwargs): ), ) - G.add_edge("is_city", "final", condition=llm_response_starts_with_no) G.add_edge( - "is_city", "has_city_name", condition=llm_response_starts_with_yes + "is_subdivision", "final", condition=llm_response_starts_with_no + ) + G.add_edge( + "is_subdivision", + "has_subdivision_name", + condition=llm_response_starts_with_yes, ) G.add_node( - "has_city_name", + "has_subdivision_name", prompt=( "Based on the legal text, is there clear and specific " "evidence that the ordinance applies specifically to " @@ -477,7 +483,7 @@ def setup_graph_correct_jurisdiction_type(jurisdiction, **kwargs): "{YES_NO_PROMPT}" ), ) - G.add_edge("has_city_name", "final") + G.add_edge("has_subdivision_name", "final") G.add_node( "final", diff --git a/tests/python/unit/validation/test_validation_graphs.py b/tests/python/unit/validation/test_validation_graphs.py index db6546d81..8cc83700e 100644 --- a/tests/python/unit/validation/test_validation_graphs.py +++ b/tests/python/unit/validation/test_validation_graphs.py @@ -86,18 +86,21 @@ def test_setup_graph_correct_jurisdiction_type_city_no_county(): "init", "has_name", "is_state", - "is_city", - "has_city_name", + "is_subdivision", + "has_subdivision_name", "final", } assert set(graph.edges) == { ("init", "has_name"), ("has_name", "is_state"), ("is_state", "final"), # is_state --YES-> final (bad jur) - ("is_state", "is_city"), # is_state --NO-> is_county - ("is_city", "final"), # is_city --NO-> final (bad jur) - ("is_city", "has_city_name"), # is_city --YES-> has_city_name - ("has_city_name", "final"), + ("is_state", "is_subdivision"), # is_state --NO-> is_county + ("is_subdivision", "final"), # is_subdivision --NO-> final (bad jur) + ( + "is_subdivision", + "has_subdivision_name", + ), # is_subdivision --YES-> has_subdivision_name + ("has_subdivision_name", "final"), } assert f"{loc.state}" in graph.nodes["is_state"]["prompt"] @@ -106,7 +109,7 @@ def test_setup_graph_correct_jurisdiction_type_city_no_county(): assert ( f"the {loc.full_subdivision_phrase}" - in graph.nodes["is_city"]["prompt"] + in graph.nodes["is_subdivision"]["prompt"] ) assert loc.full_name in graph.nodes["final"]["prompt"] @@ -125,8 +128,8 @@ def test_setup_graph_correct_jurisdiction_type_city(): "has_name", "is_state", "is_county", - "is_city", - "has_city_name", + "is_subdivision", + "has_subdivision_name", "final", } assert set(graph.edges) == { @@ -135,10 +138,13 @@ def test_setup_graph_correct_jurisdiction_type_city(): ("is_state", "final"), # is_state --YES-> final (bad jur) ("is_state", "is_county"), # is_state --NO-> is_county ("is_county", "final"), # is_county --YES-> final (bad jur) - ("is_county", "is_city"), # is_county --NO-> is_city - ("is_city", "final"), # is_city --NO-> final (bad jur) - ("is_city", "has_city_name"), # is_city --YES-> has_city_name - ("has_city_name", "final"), + ("is_county", "is_subdivision"), # is_county --NO-> is_subdivision + ("is_subdivision", "final"), # is_subdivision --NO-> final (bad jur) + ( + "is_subdivision", + "has_subdivision_name", + ), # is_subdivision --YES-> has_subdivision_name + ("has_subdivision_name", "final"), } assert f"{loc.state}" in graph.nodes["is_state"]["prompt"] @@ -148,7 +154,7 @@ def test_setup_graph_correct_jurisdiction_type_city(): assert loc.full_county_phrase in graph.nodes["is_county"]["prompt"] assert ( f"the {loc.full_subdivision_phrase}" - in graph.nodes["is_city"]["prompt"] + in graph.nodes["is_subdivision"]["prompt"] ) assert loc.full_name in graph.nodes["final"]["prompt"] From ab30952a016bccfe5695315b0cc0fe6d7e1dd807 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:38:18 -0700 Subject: [PATCH 04/38] Clarify docstring --- compass/validation/content.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compass/validation/content.py b/compass/validation/content.py index 4152d5a03..7f8ad7a7c 100644 --- a/compass/validation/content.py +++ b/compass/validation/content.py @@ -78,7 +78,8 @@ async def parse_from_ind(self, ind, key, llm_call_callback): JSON key expected in the LLM response. The same key is used to populate the decision cache. llm_call_callback : callable - Awaitable invoked with ``(key, text_chunk)`` that returns a + Awaitable invoked with + ``await llm_call_callback(key, text_chunk)`` that returns a boolean indicating whether the chunk satisfies the LLM validation check. From 7ccb77f899714ff5d6bff9e07f5ca27c9b427ce9 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:38:35 -0700 Subject: [PATCH 05/38] Add interface class --- compass/validation/content.py | 59 ++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/compass/validation/content.py b/compass/validation/content.py index 7f8ad7a7c..fddded70a 100644 --- a/compass/validation/content.py +++ b/compass/validation/content.py @@ -232,7 +232,64 @@ def GOOD_TECH_PHRASES(self): # noqa: N802 raise NotImplementedError -class LegalTextValidator(StructuredLLMCaller): +class TextKindValidator(ABC): + """Base class for a text kind validator + + This class is in charge of parsing text in chunks and ultimately + (after some X number of chunks have been parsed) determining if the + text is the right 'kind' of text for a given extraction. + """ + + @property + @abstractmethod + def is_correct_kind_of_text(self): + """bool: ``True`` if text is a good fit for extraction""" + raise NotImplementedError + + @abstractmethod + async def check_chunk(self, chunk_parser, ind): + """Check a chunk to see if it contains the right kind of text + + You should validate chunks like so:: + + is_correct_kind_of_text = await chunk_parser.parse_from_ind( + ind, + key="my_unique_validation_key", + llm_call_callback=my_async_llm_call_function, + ) + + where the `"key"` is unique to this particular validation (it + will be used to cache the validation result in the chunk + parser's memory) and `my_async_llm_call_function` is an async + function that takes in a key and text chunk and returns a + boolean indicating whether or not the text chunk passes the + validation. You can call `chunk_parser.parse_from_ind` as many + times as you want within this method, but be sure to use unique + keys for each validation. + + Parameters + ---------- + chunk_parser : ParseChunksWithMemory + Instance that contains a ``parse_from_ind`` method. + ind : int + Index of the chunk to check. + + Returns + ------- + bool + Boolean flag indicating whether or not the text in the chunk + resembles legal text. + + See Also + -------- + ParseChunksWithMemory.parse_from_ind + Method used to parse text from a chunk with memory of prior + chunk validations. + """ + raise NotImplementedError + + +class LegalTextValidator(TextKindValidator, StructuredLLMCaller): """Parse chunks to determine if they contain legal text""" SYSTEM_MESSAGE = ( From b277c6b91f6680eedc6b1ba457ed09db2b243b51 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:39:00 -0700 Subject: [PATCH 06/38] Use `text_kind_validator` parameter --- compass/validation/content.py | 30 +++++++++---------- .../validation/test_validation_content.py | 8 ++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/compass/validation/content.py b/compass/validation/content.py index fddded70a..7725a28d7 100644 --- a/compass/validation/content.py +++ b/compass/validation/content.py @@ -325,7 +325,7 @@ def __init__( self.doc_is_from_ocr = doc_is_from_ocr @property - def is_legal_text(self): + def is_correct_kind_of_text(self): """bool: ``True`` if text was found to be from a legal source""" if not self._legal_text_mem: return False @@ -385,14 +385,14 @@ async def _check_chunk_for_legal_text(self, key, text_chunk): async def parse_by_chunks( chunk_parser, heuristic, - legal_text_validator=None, + text_kind_validator=None, callbacks=None, min_chunks_to_process=3, ): """Stream text chunks through heuristic and legal validators This method goes through the chunks one by one, and passes them to - the callback parsers if the `legal_text_validator` check passes. If + the callback parsers if the `text_kind_validator` check passes. If `min_chunks_to_process` number of chunks fail the legal text check, parsing is aborted. @@ -407,10 +407,11 @@ async def parse_by_chunks( fast check meant to quickly dispose of chunks of text. Any chunk that fails this check will NOT be passed to the callback parsers. - legal_text_validator : LegalTextValidator, optional - Instance of `LegalTextValidator` that can be used to validate - each chunk for legal text. If not provided, the legal text check - will be skipped. By default, ``None``. + text_kind_validator : TextKindValidator, optional + Instance of `TextKindValidator` subclass that can be used to + validate whether each chunk of text is the kind needed for + extraction (e.g. is it legal text?). If not provided, the text + 'kind' check will be skipped. By default, ``None``. callbacks : list, optional List of async callbacks that take a `chunk_parser` and `index` as inputs and return a boolean determining whether the text @@ -434,19 +435,18 @@ async def parse_by_chunks( for ind, text in enumerate(chunk_parser.text_chunks): passed_heuristic_mem.append(heuristic.check(text)) if ind < min_chunks_to_process: - if legal_text_validator is not None: - is_legal = await legal_text_validator.check_chunk( + if text_kind_validator is not None: + is_correct_text_kind = await text_kind_validator.check_chunk( chunk_parser, ind ) - if not is_legal: # don't bother checking this chunk - continue + if not is_correct_text_kind: + continue # don't bother checking this chunk - # don't bother checking this document elif ( - legal_text_validator is not None - and not legal_text_validator.is_legal_text + text_kind_validator is not None + and not text_kind_validator.is_correct_kind_of_text ): - return + return # don't bother checking this document # hasn't passed heuristic, so don't pass it to callbacks elif not any(passed_heuristic_mem[-chunk_parser.num_to_recall :]): diff --git a/tests/python/unit/validation/test_validation_content.py b/tests/python/unit/validation/test_validation_content.py index 0e36dc808..f42ced70b 100644 --- a/tests/python/unit/validation/test_validation_content.py +++ b/tests/python/unit/validation/test_validation_content.py @@ -108,12 +108,12 @@ async def test_legal_text_validation( await parse_by_chunks( chunk_parser, heuristic=WindHeuristic(), - legal_text_validator=legal_text_validator, + text_kind_validator=legal_text_validator, callbacks=None, min_chunks_to_process=3, ) - assert legal_text_validator.is_legal_text == truth + assert legal_text_validator.is_correct_kind_of_text == truth @flaky(max_runs=3, min_passes=1) @@ -144,12 +144,12 @@ async def test_legal_text_validation_ocr( await parse_by_chunks( chunk_parser, heuristic=WindHeuristic(), - legal_text_validator=legal_text_validator, + text_kind_validator=legal_text_validator, callbacks=None, min_chunks_to_process=3, ) - assert legal_text_validator.is_legal_text + assert legal_text_validator.is_correct_kind_of_text if __name__ == "__main__": From 358c2caca0563a55237f91ad7ac740bd4e765291 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:39:46 -0700 Subject: [PATCH 07/38] Use `check_if_legal_doc` as flag --- compass/extraction/apply.py | 6 +++--- compass/scripts/process.py | 39 +++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/compass/extraction/apply.py b/compass/extraction/apply.py index 465e77b62..4ae5bfff4 100644 --- a/compass/extraction/apply.py +++ b/compass/extraction/apply.py @@ -82,15 +82,15 @@ async def check_for_ordinance_info( chunks = model_config.text_splitter.split_text(doc.text) chunk_parser = ParseChunksWithMemory(chunks, num_to_recall=2) legal_text_validator = ( - None - if doc.attrs.get("is_legal_doc", False) - else LegalTextValidator( + LegalTextValidator( tech=tech, llm_service=model_config.llm_service, usage_tracker=usage_tracker, doc_is_from_ocr=doc.attrs.get("from_ocr", False), **model_config.llm_call_kwargs, ) + if doc.attrs.get("check_if_legal_doc", True) + else None ) ordinance_text_collector = ordinance_text_collector_class( diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 6177beb6c..89569f379 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -298,15 +298,16 @@ async def process_jurisdictions_with_openai( # noqa: PLR0917, PLR0913 least the key ``"source_fp"`` pointing to the **full** path of the local document file. All other keys will be added as attributes to the loaded document instance. You can include the - key ``"is_legal_doc"`` to skip the legal document check for - known documents. Similarly, you can provide the ``"date"`` key, - which is a list of ``[year, month, day]``, some or all of which - can be null, to skip the date extraction step of the processing - pipeline. If this input is provided, local documents will be - checked first. See the top-level documentation of this function - for the full processing of the pipeline. This input can also be - a path to a JSON file containing the dictionary of - code-to-document-info mappings. By default, ``None``. + key ``"check_if_legal_doc"`` to manually enable/disable the + legal document check for known documents. Similarly, you can + provide the ``"date"`` key, which is a list of + ``[year, month, day]``, some or all of which can be null, to + skip the date extraction step of the processing pipeline. If + this input is provided, local documents will be checked first. + See the top-level documentation of this function for the full + processing of the pipeline. This input can also be a path to a + JSON file containing the dictionary of code-to-document-info + mappings. By default, ``None``. known_doc_urls : dict or path-like, optional A dictionary where keys are the jurisdiction codes (as strings) and values are lists of dictionaries containing information @@ -314,16 +315,16 @@ async def process_jurisdictions_with_openai( # noqa: PLR0917, PLR0913 least the key ``"source"`` representing the known URL to check for that document. All other keys will be added as attributes to the loaded document instance. You can include the key - ``"is_legal_doc"`` to skip the legal document check for known - documents. Similarly, you can provide the ``"date"`` key, which - is a list of ``[year, month, day]``, some or all of which can - be null, to skip the date extraction step of the processing - pipeline. If this input is provided, the known URLs will be - checked before applying the search engine search. See the - top-level documentation of this function for the full processing - order of the pipeline. This input can also be a path to a JSON - file containing the dictionary of code-to-document-info - mappings. + ``"check_if_legal_doc"`` to manually enable/disable the legal + document check for documents at known URLs. Similarly, you can + provide the ``"date"`` key, which is a list of + ``[year, month, day]``, some or all of which can be null, to + skip the date extraction step of the processing pipeline. If + this input is provided, the known URLs will be checked before + applying the search engine search. See the top-level + documentation of this function for the full processing order of + the pipeline. This input can also be a path to a JSON file + containing the dictionary of code-to-document-info mappings. .. Note:: The same input can be used for both `known_local_docs` and `known_doc_urls` as long as both ``"source_fp"`` From 89e09c876c9d064f10e0c4fdb9be0ce40054a8e7 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:40:18 -0700 Subject: [PATCH 08/38] `_move_files` now purely moves files --- compass/scripts/process.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 89569f379..2da1c62f8 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1563,22 +1563,10 @@ async def _extract_ordinances_from_text( ) -async def _move_files(doc, jurisdiction): +async def _move_files(doc): """Move files to output folders, if applicable""" - ord_count = num_ordinances_in_doc(doc) - if ord_count == 0: - logger.info("No ordinances found for %s.", jurisdiction.full_name) - return doc - doc = await _move_file_to_out_dir(doc) - doc = await _write_ord_db(doc) - logger.info( - "%d ordinance value(s) found for %s. Outputs are here: '%s'", - ord_count, - jurisdiction.full_name, - doc.attrs["ord_db_fp"], - ) - return doc + return await _write_ord_db(doc) async def _move_file_to_out_dir(doc): From db8928ca258f09dc6ea53df99605ed0edafb8ca6 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:41:14 -0700 Subject: [PATCH 09/38] Move tech specs up a class --- compass/scripts/process.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 2da1c62f8..01bec4688 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -631,6 +631,11 @@ def tpe_kwargs(self): """dict: Keyword arguments for ``ThreadPoolExecutor``""" return _configure_thread_pool_kwargs(self.process_kwargs.tpe_kwargs) + @cached_property + def tech_specs(self): + """TechSpec: TechSpec for the current technology""" + return _compile_tech_specs(self.tech) + @cached_property def _base_services(self): """list: Services required to support jurisdiction processing""" @@ -831,7 +836,7 @@ class _SingleJurisdictionRunner: def __init__( # noqa: PLR0913 self, - tech, + tech_specs, jurisdiction, models, web_search_params, @@ -848,7 +853,7 @@ def __init__( # noqa: PLR0913 perform_website_search=True, usage_tracker=None, ): - self.tech_specs = _compile_tech_specs(tech) + self.tech_specs = tech_specs self.jurisdiction = jurisdiction self.models = models self.web_search_params = web_search_params From 0684e5f3f480ae549e0097dfa7d57a3366abcfb2 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:41:49 -0700 Subject: [PATCH 10/38] `filter_docs` now own method --- compass/scripts/process.py | 108 ++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 44 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 01bec4688..cfdced05d 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1035,20 +1035,8 @@ async def _download_known_url_documents(self): _add_known_doc_attrs_to_all_docs( docs, self.known_doc_urls, key="source" ) - docs = await filter_ordinance_docs( - docs, - self.jurisdiction, - self.models, - heuristic=self.tech_specs.heuristic, - tech=self.tech_specs.name, - ordinance_text_collector_class=( - self.tech_specs.ordinance_text_collector - ), - permitted_use_text_collector_class=( - self.tech_specs.permitted_use_text_collector - ), - usage_tracker=self.usage_tracker, - check_for_correct_jurisdiction=False, + docs = await self._filter_down_docs( + docs, check_for_correct_jurisdiction=False ) if not docs: return None @@ -1074,20 +1062,8 @@ async def _find_documents_using_search_engine(self): url_ignore_substrings=self.web_search_params.url_ignore_substrings, **self.web_search_params.se_kwargs, ) - docs = await filter_ordinance_docs( - docs, - self.jurisdiction, - self.models, - heuristic=self.tech_specs.heuristic, - tech=self.tech_specs.name, - ordinance_text_collector_class=( - self.tech_specs.ordinance_text_collector - ), - permitted_use_text_collector_class=( - self.tech_specs.permitted_use_text_collector - ), - usage_tracker=self.usage_tracker, - check_for_correct_jurisdiction=True, + docs = await self._filter_down_docs( + docs, check_for_correct_jurisdiction=True ) if not docs: return None @@ -1196,20 +1172,8 @@ async def _try_elm_crawl(self): return_c4ai_results=True, ) docs, scrape_results = out - docs = await filter_ordinance_docs( - docs, - self.jurisdiction, - self.models, - heuristic=self.tech_specs.heuristic, - tech=self.tech_specs.name, - ordinance_text_collector_class=( - self.tech_specs.ordinance_text_collector - ), - permitted_use_text_collector_class=( - self.tech_specs.permitted_use_text_collector - ), - usage_tracker=self.usage_tracker, - check_for_correct_jurisdiction=True, + docs = await self._filter_down_docs( + docs, check_for_correct_jurisdiction=True ) return docs, scrape_results @@ -1229,7 +1193,40 @@ async def _try_compass_crawl(self, scrape_results): pb_jurisdiction_name=self.jurisdiction.full_name, ) ) - return await filter_ordinance_docs( + return await self._filter_down_docs( + docs, check_for_correct_jurisdiction=True + ) + + async def _filter_down_docs(self, docs, check_for_correct_jurisdiction): + """Filter down candidate documents before parsing""" + if docs and self.tech_specs.post_download_docs_hook is not None: + logger.debug( + "%d document(s) passed in to `post_download_docs_hook` for " + "%s\n\t- %s", + len(docs), + self.jurisdiction.full_name, + "\n\t- ".join( + [doc.attrs.get("source", "Unknown source") for doc in docs] + ), + ) + + docs = await self.tech_specs.post_download_docs_hook( + docs, + jurisdiction=self.jurisdiction, + model_configs=self.models, + usage_tracker=self.usage_tracker, + ) + logger.info( + "%d document(s) remaining after `post_download_docs_hook` for " + "%s\n\t- %s", + len(docs), + self.jurisdiction.full_name, + "\n\t- ".join( + [doc.attrs.get("source", "Unknown source") for doc in docs] + ), + ) + + docs = await filter_ordinance_docs( docs, self.jurisdiction, self.models, @@ -1242,9 +1239,32 @@ async def _try_compass_crawl(self, scrape_results): self.tech_specs.permitted_use_text_collector ), usage_tracker=self.usage_tracker, - check_for_correct_jurisdiction=True, + check_for_correct_jurisdiction=check_for_correct_jurisdiction, ) + if docs and self.tech_specs.post_filter_docs_hook is not None: + logger.debug( + "Passing %d document(s) in to `post_filter_docs_hook` ", + len(docs), + ) + docs = await self.tech_specs.post_filter_docs_hook( + docs, + jurisdiction=self.jurisdiction, + model_configs=self.models, + usage_tracker=self.usage_tracker, + ) + logger.info( + "%d document(s) remaining after `post_filter_docs_hook` for " + "%s\n\t- %s", + len(docs), + self.jurisdiction.full_name, + "\n\t- ".join( + [doc.attrs.get("source", "Unknown source") for doc in docs] + ), + ) + + return docs or None + async def _parse_docs_for_ordinances(self, docs): """Parse candidate documents in order until ordinances found""" for possible_ord_doc in docs: From 5fa2b9b1170e50bf7ba064321070eafccecb6d70 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:42:29 -0700 Subject: [PATCH 11/38] Generalized `_parse_docs_for_ordinances` --- compass/scripts/process.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index cfdced05d..134ba2c34 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1269,19 +1269,36 @@ async def _parse_docs_for_ordinances(self, docs): """Parse candidate documents in order until ordinances found""" for possible_ord_doc in docs: doc = await self._try_extract_all_ordinances(possible_ord_doc) - ord_count = num_ordinances_in_doc( - doc, exclude_features=EXCLUDE_FROM_ORD_DOC_CHECK - ) + ord_count = self._get_ordinance_count(doc) if ord_count > 0: - logger.debug( - "Found ordinances in doc from %s", + doc = await _move_files(doc) + logger.info( + "%d ordinance value(s) found in doc from %s for %s. " + "Outputs are here: '%s'", + ord_count, possible_ord_doc.attrs.get("source", "unknown source"), + self.jurisdiction.full_name, + doc.attrs["ord_db_fp"], ) - return await _move_files(doc, self.jurisdiction) + return doc logger.debug("No ordinances found; searched %d docs", len(docs)) return None + def _get_ordinance_count(self, doc): + """Get the number of ordinances extracted from a document""" + if doc is None or doc.attrs.get("ordinance_values") is None: + return 0 + + ord_df = doc.attrs["ordinance_values"] + + if self.tech_specs.num_ordinances_in_df_callback is not None: + return self.tech_specs.num_ordinances_in_df_callback(ord_df) + + return num_ordinances_dataframe( + ord_df, exclude_features=EXCLUDE_FROM_ORD_DOC_CHECK + ) + async def _try_extract_all_ordinances(self, possible_ord_doc): """Extract both ordinance values and permitted-use districts""" with self._tracked_progress(): From 6cdae48a08a42b92790db94cfb603c533c00f217 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:42:51 -0700 Subject: [PATCH 12/38] pass in tech specs --- compass/scripts/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 134ba2c34..8fd793ba0 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -800,7 +800,7 @@ async def _process_jurisdiction_with_logging( ): task = asyncio.create_task( _SingleJurisdictionRunner( - self.tech, + self.tech_specs, jurisdiction, self.models, self.web_search_params, From 04ac67f6c9eaf356c2adec8a126206d9d5dbb76f Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:43:13 -0700 Subject: [PATCH 13/38] permitted use extraction now optional --- compass/scripts/process.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 8fd793ba0..fe09734ee 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1317,7 +1317,7 @@ async def _try_extract_all_ordinances(self, possible_ord_doc): @property def _extraction_task_kwargs(self): """list: Dictionaries describing extraction task config""" - return [ + tasks = [ { "extractor_class": self.tech_specs.ordinance_text_extractor, "original_text_key": "ordinance_text", @@ -1332,7 +1332,15 @@ def _extraction_task_kwargs(self): LLMTasks.ORDINANCE_VALUE_EXTRACTION, self.models[LLMTasks.DEFAULT], ), - }, + } + ] + if ( + self.tech_specs.permitted_use_text_extractor is None + or self.tech_specs.structured_permitted_use_parser is None + ): + return tasks + + tasks.append( { "extractor_class": ( self.tech_specs.permitted_use_text_extractor @@ -1351,8 +1359,9 @@ def _extraction_task_kwargs(self): LLMTasks.PERMITTED_USE_VALUE_EXTRACTION, self.models[LLMTasks.DEFAULT], ), - }, - ] + } + ) + return tasks async def _try_extract_ordinances( self, From 11c71e146ce43768dc7dd51703095c46be21438d Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:43:59 -0700 Subject: [PATCH 14/38] Add water rights tech specs --- compass/scripts/process.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index fe09734ee..ce7491253 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -59,6 +59,18 @@ SMALL_WIND_QUESTION_TEMPLATES, BEST_SMALL_WIND_ORDINANCE_WEBSITE_URL_KEYWORDS, ) +from compass.extraction.water import ( + build_corpus, + extract_water_rights_ordinance_values, + label_docs_no_legal_check, + write_water_rights_data_to_disk, + WaterRightsHeuristic, + WaterRightsTextCollector, + WaterRightsTextExtractor, + StructuredWaterParser, + WATER_RIGHTS_QUESTION_TEMPLATES, + BEST_WATER_RIGHTS_ORDINANCE_WEBSITE_URL_KEYWORDS, +) from compass.validation.location import JurisdictionWebsiteValidator from compass.llm import LLMCaller, OpenAIConfig from compass.services.cpu import ( @@ -139,6 +151,7 @@ SmallWindPermittedUseDistrictsTextExtractor: ( "Extracting small wind permitted use text" ), + WaterRightsTextExtractor: "Extracting water rights ordinance text", } _JUR_COLS = [ "Jurisdiction Type", @@ -1453,6 +1466,25 @@ def _compile_tech_specs(tech): BEST_SMALL_WIND_ORDINANCE_WEBSITE_URL_KEYWORDS, ) + if tech.casefold() == "water rights": + return TechSpec( + "water rights", + WATER_RIGHTS_QUESTION_TEMPLATES, + WaterRightsHeuristic(), + WaterRightsTextCollector, + WaterRightsTextExtractor, + None, + None, + StructuredWaterParser, + None, + BEST_WATER_RIGHTS_ORDINANCE_WEBSITE_URL_KEYWORDS, + label_docs_no_legal_check, + build_corpus, + extract_water_rights_ordinance_values, + len, + write_water_rights_data_to_disk, + ) + msg = f"Unknown tech input: {tech}" raise COMPASSValueError(msg) From 0d6d947bf53fcbec3b48bd25eebc3e1d8ee02dff Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:44:16 -0700 Subject: [PATCH 15/38] Allow custom callback for writing out data --- compass/scripts/process.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index ce7491253..395b21bcb 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -711,9 +711,19 @@ async def run(self, jurisdiction_fp): start_date = datetime.now(UTC) doc_infos, total_cost = await self._run_all(jurisdictions) + doc_infos = [ + di + for di in doc_infos + if di is not None and di.get("ord_db_fp") is not None + ] + + if self.tech_specs.save_db_callback is not None: + num_docs_found = self.tech_specs.save_db_callback( + doc_infos, self.dirs.out + ) + else: + num_docs_found = _write_data_to_disk(doc_infos, self.dirs.out) - db, num_docs_found = doc_infos_to_db(doc_infos) - save_db(db, self.dirs.out) total_time = save_run_meta( self.dirs, self.tech, From 5950eab08c114f9df2055943b13a76bd240c6eae Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:44:38 -0700 Subject: [PATCH 16/38] Allow custom callback for extracting ordinances --- compass/scripts/process.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 395b21bcb..6b7afd03a 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1413,14 +1413,24 @@ async def _try_extract_ordinances( ) await self._record_usage() self._jsp.remove_task(task_id) - out = await _extract_ordinances_from_text( - doc, - parser_class=parser_class, - text_key=cleaned_text_key, - out_key=out_key, - usage_tracker=self.usage_tracker, - model_config=value_model, - ) + if self.tech_specs.extract_ordinances_callback is None: + out = await _extract_ordinances_from_text( + doc, + parser_class=parser_class, + text_key=cleaned_text_key, + out_key=out_key, + usage_tracker=self.usage_tracker, + model_config=value_model, + ) + else: + out = await self.tech_specs.extract_ordinances_callback( + doc, + parser_class=parser_class, + text_key=cleaned_text_key, + out_key=out_key, + usage_tracker=self.usage_tracker, + model_config=value_model, + ) await self._record_usage() return out From f16d0a14146a4492e296c6a0d5b0ebc259f7039e Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:44:52 -0700 Subject: [PATCH 17/38] Throw error if user does not specify model for default tasks --- compass/scripts/process.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 6b7afd03a..d266e6dad 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1607,6 +1607,15 @@ def _initialize_model_params(user_input): raise COMPASSValueError(msg) caller_instances[task] = model_config + if LLMTasks.DEFAULT not in caller_instances: + msg = ( + "No 'default' LLM caller defined in the `model` portion of the " + "input config! Please ensure exactly one of the model " + "definitions has 'tasks' set to 'default' or left unspecified.\n" + f"Found tasks: {list(caller_instances)}" + ) + raise COMPASSValueError(msg) + return caller_instances From 85d82f415582163abde175155768308a8c4e6249 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:45:03 -0700 Subject: [PATCH 18/38] Add missing function --- compass/scripts/process.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index d266e6dad..080252a11 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1702,6 +1702,13 @@ async def _write_ord_db(doc): return doc +def _write_data_to_disk(doc_infos, out_dir): + """Write extracted data to disk""" + db, num_docs_found = doc_infos_to_db(doc_infos) + save_db(db, out_dir) + return num_docs_found + + async def _record_jurisdiction_info(loc, doc, start_time, usage_tracker): """Record info about jurisdiction""" seconds_elapsed = time.monotonic() - start_time From 9cc67c08c00f9c9ef9c59f18f0acff71d96a2c98 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:45:23 -0700 Subject: [PATCH 19/38] Add missing import --- compass/scripts/process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 080252a11..2c5f0cd63 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -100,7 +100,7 @@ doc_infos_to_db, load_all_jurisdiction_info, load_jurisdictions_from_fp, - num_ordinances_in_doc, + num_ordinances_dataframe, save_db, save_run_meta, Directories, From 51d98cdfe77d65bc027a70f1eab09f40d093d4cb Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:45:36 -0700 Subject: [PATCH 20/38] Fix call --- compass/scripts/process.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/compass/scripts/process.py b/compass/scripts/process.py index 2c5f0cd63..a311744ad 100644 --- a/compass/scripts/process.py +++ b/compass/scripts/process.py @@ -1015,20 +1015,8 @@ async def _load_known_local_documents(self): _add_known_doc_attrs_to_all_docs( docs, self.known_local_docs, key="source_fp" ) - docs = await filter_ordinance_docs( - docs, - self.jurisdiction, - self.models, - heuristic=self.tech_specs.heuristic, - tech=self.tech_specs.name, - ordinance_text_collector_class=( - self.tech_specs.ordinance_text_collector - ), - permitted_use_text_collector_class=( - self.tech_specs.permitted_use_text_collector - ), - usage_tracker=self.usage_tracker, - check_for_correct_jurisdiction=False, + docs = await self._filter_down_docs( + docs, check_for_correct_jurisdiction=False ) if not docs: return None From fc453772bd15b6ca46c4a035645fd5afe2243d1e Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:46:07 -0700 Subject: [PATCH 21/38] Add extra fields to tech spec --- compass/utilities/nt.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/compass/utilities/nt.py b/compass/utilities/nt.py index d27e8f7c0..5fed9bca1 100644 --- a/compass/utilities/nt.py +++ b/compass/utilities/nt.py @@ -55,7 +55,13 @@ "structured_ordinance_parser", "structured_permitted_use_parser", "website_url_keyword_points", + "post_download_docs_hook", + "post_filter_docs_hook", + "extract_ordinances_callback", + "num_ordinances_in_df_callback", + "save_db_callback", ], + defaults=[None, None, None, None, None], ) TechSpec.__doc__ = """Bundle extraction configuration for a technology @@ -81,4 +87,12 @@ Callable that transforms permitted-use text into structured values. website_url_keyword_points : dict or None Weightings for scoring website URLs during search. +post_download_docs_hook : callable or None + Optional async function to filter/process downloaded documents. +post_filter_docs_hook : callable or None + Optional async function to filter/process filtered documents. +extract_ordinances_callback : callable or None + Optional async function to extract ordinance data from documents. +save_db_callback : callable or None + Optional **sync** function to save ordinance database to disk. """ From ac024df1723153719dc62c13337c149456273a6a Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:46:27 -0700 Subject: [PATCH 22/38] Param now optional --- compass/scripts/download.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compass/scripts/download.py b/compass/scripts/download.py index c2910a07b..760336b1a 100644 --- a/compass/scripts/download.py +++ b/compass/scripts/download.py @@ -590,7 +590,7 @@ async def filter_ordinance_docs( heuristic, tech, ordinance_text_collector_class, - permitted_use_text_collector_class, + permitted_use_text_collector_class=None, usage_tracker=None, check_for_correct_jurisdiction=True, ): @@ -613,7 +613,7 @@ async def filter_ordinance_docs( used to set up some document validation decision trees. ordinance_text_collector_class : type Collector class used to extract ordinance text sections. - permitted_use_text_collector_class : type + permitted_use_text_collector_class : type, optional Collector class used to extract permitted-use text sections. usage_tracker : UsageTracker, optional Optional tracker instance to monitor token usage during From 7b5e860602b5d9a57773d088b32afd4451365037 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:47:19 -0700 Subject: [PATCH 23/38] Add logger statement and remove unused function --- compass/scripts/download.py | 38 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/compass/scripts/download.py b/compass/scripts/download.py index 760336b1a..9d1031ef2 100644 --- a/compass/scripts/download.py +++ b/compass/scripts/download.py @@ -634,6 +634,15 @@ async def filter_ordinance_docs( The function updates CLI progress bars to reflect each filtering phase and returns documents sorted by quality heuristics. """ + logger.info( + "%d document(s) passed in to COMPASS filter for %s\n\t- %s", + len(docs), + jurisdiction.full_name, + "\n\t- ".join( + [doc.attrs.get("source", "Unknown source") for doc in docs] + ), + ) + if check_for_correct_jurisdiction: COMPASS_PB.update_jurisdiction_task( jurisdiction.full_name, @@ -661,9 +670,10 @@ async def filter_ordinance_docs( COMPASS_PB.update_jurisdiction_task( jurisdiction.full_name, description="Checking files for legal text..." ) - docs = await _down_select_docs_correct_content( + docs = await filter_documents( docs, - jurisdiction=jurisdiction, + validation_coroutine=_contains_ordinances, + task_name=jurisdiction.full_name, model_configs=model_configs, heuristic=heuristic, tech=tech, @@ -750,30 +760,6 @@ async def _down_select_docs_correct_jurisdiction( ) -async def _down_select_docs_correct_content( - docs, - jurisdiction, - model_configs, - heuristic, - tech, - ordinance_text_collector_class, - permitted_use_text_collector_class, - usage_tracker, -): - """Remove documents that do not contain ordinance information""" - return await filter_documents( - docs, - validation_coroutine=_contains_ordinances, - task_name=jurisdiction.full_name, - model_configs=model_configs, - heuristic=heuristic, - tech=tech, - ordinance_text_collector_class=ordinance_text_collector_class, - permitted_use_text_collector_class=permitted_use_text_collector_class, - usage_tracker=usage_tracker, - ) - - async def _contains_ordinances( doc, model_configs, usage_tracker=None, **kwargs ): From 306fcc952b1575df9ded9da4ac4d79f084217933 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:47:35 -0700 Subject: [PATCH 24/38] Add logger statement --- compass/scripts/download.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compass/scripts/download.py b/compass/scripts/download.py index 9d1031ef2..ce41187ba 100644 --- a/compass/scripts/download.py +++ b/compass/scripts/download.py @@ -768,6 +768,10 @@ async def _contains_ordinances( LLMTasks.DOCUMENT_CONTENT_VALIDATION, model_configs[LLMTasks.DEFAULT], ) + logger.debug( + "Checking doc for ordinance info (source: %r)...", + doc.attrs.get("source", "unknown"), + ) doc = await check_for_ordinance_info( doc, model_config=model_config, From 4b01488fc28e125c788047a8e8054b8336032d50 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:48:44 -0700 Subject: [PATCH 25/38] Fix date bug --- compass/scripts/download.py | 3 ++- compass/services/threaded.py | 2 +- compass/utilities/parsing.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compass/scripts/download.py b/compass/scripts/download.py index ce41187ba..33d1bbe22 100644 --- a/compass/scripts/download.py +++ b/compass/scripts/download.py @@ -800,7 +800,8 @@ def _sort_final_ord_docs(all_ord_docs): def _ord_doc_sorting_key(doc): """Compute a composite sorting score for ordinance documents""" - latest_year, latest_month, latest_day = doc.attrs.get("date", (-1, -1, -1)) + no_date = (-1, -1, -1) + latest_year, latest_month, latest_day = doc.attrs.get("date") or no_date best_docs_from_website = doc.attrs.get(_SCORE_KEY, 0) prefer_pdf_files = isinstance(doc, PDFDocument) highest_jurisdiction_score = doc.attrs.get( diff --git a/compass/services/threaded.py b/compass/services/threaded.py index d75e58815..c5c79bf62 100644 --- a/compass/services/threaded.py +++ b/compass/services/threaded.py @@ -561,7 +561,7 @@ def _dump_jurisdiction_info( def _compile_doc_info(doc): """Put together meta information about a single document""" - year, month, day = doc.attrs.get("date", (None, None, None)) + year, month, day = doc.attrs.get("date") or (None, None, None) return { "source": doc.attrs.get("source"), "effective_year": year if year is not None and year > 0 else None, diff --git a/compass/utilities/parsing.py b/compass/utilities/parsing.py index f29ca9562..7e3c02156 100644 --- a/compass/utilities/parsing.py +++ b/compass/utilities/parsing.py @@ -137,7 +137,7 @@ def extract_ord_year_from_doc_attrs(doc_attrs): >>> extract_ord_year_from_doc_attrs({"date": (None, None, None)}) None """ - year = doc_attrs.get("date", (None, None, None))[0] + year, *__ = doc_attrs.get("date") or (None, None, None) return year if year is not None and year > 0 else None From ecb5662032181acb596edf0a93bbba7b098d636d Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:51:00 -0700 Subject: [PATCH 26/38] Use registry for jurisdiction data --- compass/utilities/jurisdictions.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/compass/utilities/jurisdictions.py b/compass/utilities/jurisdictions.py index 774edcd9d..dfe2797b7 100644 --- a/compass/utilities/jurisdictions.py +++ b/compass/utilities/jurisdictions.py @@ -2,7 +2,7 @@ import logging from warnings import warn -from pathlib import Path +import importlib.resources import numpy as np import pandas as pd @@ -12,9 +12,10 @@ logger = logging.getLogger(__name__) -_COUNTY_DATA_FP = ( - Path(__file__).parent.parent / "data" / "conus_jurisdictions.csv" -) +KNOWN_JURISDICTIONS_REGISTRY = { + importlib.resources.files("compass") / "data" / "conus_jurisdictions.csv", + importlib.resources.files("compass") / "data" / "tx_water_districts.csv", +} def load_all_jurisdiction_info(): @@ -31,7 +32,10 @@ def load_all_jurisdiction_info(): Missing values are normalized to ``None`` to simplify downstream serialization. """ - return pd.read_csv(_COUNTY_DATA_FP).replace({np.nan: None}) + return pd.concat( + pd.read_csv(fp).replace({np.nan: None}) + for fp in KNOWN_JURISDICTIONS_REGISTRY + ) def jurisdiction_websites(jurisdiction_info=None): From 1a301a5a2393d820277752637f886514f1a585ac Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:51:11 -0700 Subject: [PATCH 27/38] Add texas GWCD --- compass/data/tx_water_districts.csv | 99 +++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 compass/data/tx_water_districts.csv diff --git a/compass/data/tx_water_districts.csv b/compass/data/tx_water_districts.csv new file mode 100644 index 000000000..f1e543100 --- /dev/null +++ b/compass/data/tx_water_districts.csv @@ -0,0 +1,99 @@ +State,County,Subdivision,Jurisdiction Type,FIPS,Website +Texas,,Bandera County River,Authority & Groundwater District,1, +Texas,,Barton Springs/Edwards,Aquifer Conservation District,2, +Texas,,Bee,Groundwater Conservation District,3, +Texas,,Blanco Pedernales,Groundwater Conservation District,4, +Texas,,Bluebonnet,Groundwater Conservation District,5, +Texas,,Brazoria County,Groundwater Conservation District,6, +Texas,,Brazos Valley,Groundwater Conservation District,7, +Texas,,Brewster County,Groundwater Conservation District,8, +Texas,,Brush Country,Groundwater Conservation District,9, +Texas,,Calhoun County,Groundwater Conservation District,10, +Texas,,Central Texas,Groundwater Conservation District,11, +Texas,,Clear Fork,Groundwater Conservation District,12, +Texas,,Clearwater,Underground Water Conservation District,13, +Texas,,Coastal Bend,Groundwater Conservation District,14, +Texas,,Coastal Plains,Groundwater Conservation District,15, +Texas,,Coke County,Underground Water Conservation District,16, +Texas,,Colorado County,Groundwater Conservation District,17, +Texas,,Comal Trinity,Groundwater Conservation District,18, +Texas,,Corpus Christi,ASRConservation District,19, +Texas,,Cow Creek,Groundwater Conservation District,20, +Texas,,Crockett County,Groundwater Conservation District,21, +Texas,,Culberson County,Groundwater Conservation District,22, +Texas,,Duval County,Groundwater Conservation District,23, +Texas,,Evergreen,Underground Water Conservation District,24, +Texas,,Fayette County,Groundwater Conservation District,25, +Texas,,Garza County,Underground Water Conservation District,26, +Texas,,Gateway,Groundwater Conservation District,27, +Texas,,Glasscock,Groundwater Conservation District,28, +Texas,,Goliad County,Groundwater Conservation District,29, +Texas,,Gonzales County,Underground Water Conservation District,30, +Texas,,Guadalupe County,Groundwater Conservation District,31, +Texas,,Hays Trinity,Groundwater Conservation District,32, +Texas,,Headwaters,Groundwater Conservation District,33, +Texas,,Hemphill County,Underground Water Conservation District,34, +Texas,,Hickory,Underground Water Conservation District,35, +Texas,,High Plains,Underground Water Conservation District,36, +Texas,,Hill Country,Underground Water Conservation District,37, +Texas,,Hudspeth County,Underground Water Conservation District,38, +Texas,,Irion County,WConservation District,39, +Texas,,Jeff Davis,County Underground Water Conservation District,40, +Texas,,Kenedy County,Groundwater Conservation District,41, +Texas,,Kimble County,Groundwater Conservation District,42, +Texas,,Kinney County,Groundwater Conservation District,43, +Texas,,Lipan Kickapoo,WConservation District,44, +Texas,,Live Oak,Underground Water Conservation District,45, +Texas,,Llano Estacado,Underground Water Conservation District,46, +Texas,,Lone Star,Groundwater Conservation District,47, +Texas,,Lone Wolf,Groundwater Conservation District,48, +Texas,,Lost Pines,Groundwater Conservation District,49, +Texas,,Lower Trinity,Groundwater Conservation District,50, +Texas,,McMullen,Groundwater Conservation District,51, +Texas,,Medina County,Groundwater Conservation District,52, +Texas,,Menard County,UWD,53, +Texas,,Mesa,Underground Water Conservation District,54, +Texas,,Mesquite,Groundwater Conservation District,55, +Texas,,Mid East Texas,Groundwater Conservation District,56, +Texas,,Middle Pecos,Groundwater Conservation District,57, +Texas,,Middle Trinity,Groundwater Conservation District,58, +Texas,,Neches & Trinity Valleys,Groundwater Conservation District,59, +Texas,,North Plains,Groundwater Conservation District,60, +Texas,,North Texas,Groundwater Conservation District,61, +Texas,,Northern,Trinity Groundwater Conservation District,62, +Texas,,Panhandle,Groundwater Conservation District,63, +Texas,,Panola County,Groundwater Conservation District,64, +Texas,,Pecan Valley,Groundwater Conservation District,65, +Texas,,Permian Basin,Underground Water Conservation District,66, +Texas,,Pineywoods,Groundwater Conservation District,67, +Texas,,Plateau,UWC and Supply District,68, +Texas,,Plum Creek,Conservation District,69, +Texas,,Post Oak Savannah,Groundwater Conservation District,70, +Texas,,Prairielands,Groundwater Conservation District,71, +Texas,,Presidio County,Underground Water Conservation District,72, +Texas,,Real Edwards,C and R District,73, +Texas,,Red River,Groundwater Conservation District,74, +Texas,,Red Sands,Groundwater Conservation District,75, +Texas,,Reeves County,Groundwater Conservation District,76, +Texas,,Refugio,Groundwater Conservation District,77, +Texas,,Rolling Plains,Groundwater Conservation District,78, +Texas,,Rusk County,Groundwater Conservation District,79, +Texas,,San Patricio County,Groundwater Conservation District,80, +Texas,,Sandy Land,Underground Water Conservation District,81, +Texas,,Santa Rita,Underground Water Conservation District,82, +Texas,,Saratoga,Underground Water Conservation District,83, +Texas,,South Plains,Underground Water Conservation District,84, +Texas,,Southeast Texas,Groundwater Conservation District,85, +Texas,,Southern Trinity,Groundwater Conservation District,86, +Texas,,Southwestern Travis County,Groundwater Conservation District,87, +Texas,,Starr County,Groundwater Conservation District,88, +Texas,,Sterling County,Underground Water Conservation District,89, +Texas,,Sutton County,Underground Water Conservation District,90, +Texas,,Terrell County,Groundwater Conservation District,91, +Texas,,Texana,Groundwater Conservation District,92, +Texas,,Trinity Glen Rose,Groundwater Conservation District,93, +Texas,,Upper Trinity,Groundwater Conservation District,94, +Texas,,Uvalde County,Underground Water Conservation District,95, +Texas,,Victoria County,Groundwater Conservation District,96, +Texas,,Wes Tex,Groundwater Conservation District,97, +Texas,,Wintergarden,Groundwater Conservation District,98, From fdd1c53f3f1c7ba790ebf21906e4b89b8fbd417f Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:51:33 -0700 Subject: [PATCH 28/38] Add embedding task --- compass/utilities/enums.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compass/utilities/enums.py b/compass/utilities/enums.py index fa2e092b4..d36a732f2 100644 --- a/compass/utilities/enums.py +++ b/compass/utilities/enums.py @@ -87,6 +87,9 @@ class LLMTasks(StrEnum): document pertains to a particular jurisdiction. """ + EMBEDDING = auto() + """Text chunk embedding task""" + JURISDICTION_MAIN_WEBSITE_VALIDATION = ( LLMUsageCategory.JURISDICTION_MAIN_WEBSITE_VALIDATION ) From 8dc0fa02eb699bb888f7e9ba21ca5df358f0e6ab Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:53:13 -0700 Subject: [PATCH 29/38] Add prices --- compass/utilities/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compass/utilities/__init__.py b/compass/utilities/__init__.py index 0251ef138..b5053a963 100644 --- a/compass/utilities/__init__.py +++ b/compass/utilities/__init__.py @@ -60,6 +60,7 @@ "gpt-5-mini": {"prompt": 0.25, "response": 2}, "gpt-5-nano": {"prompt": 0.05, "response": 0.4}, "gpt-5-chat-latest": {"prompt": 1.25, "response": 10}, + "egswaterord-gpt4.1-mini": {"prompt": 0.4, "response": 1.6}, "wetosa-gpt-4o": {"prompt": 2.5, "response": 10}, "wetosa-gpt-4o-mini": {"prompt": 0.15, "response": 0.6}, "wetosa-gpt-4.1": {"prompt": 2, "response": 8}, @@ -69,6 +70,7 @@ "wetosa-gpt-5-mini": {"prompt": 0.25, "response": 2}, "wetosa-gpt-5-nano": {"prompt": 0.05, "response": 0.4}, "wetosa-gpt-5-chat-latest": {"prompt": 1.25, "response": 10}, + "text-embedding-ada-002": {"prompt": 0.10}, } """LLM Costs registry From 85c88805d969129c5d1bb7e9a324d98ce7cfbeb9 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:53:31 -0700 Subject: [PATCH 30/38] Formatting --- compass/extraction/water/graphs.py | 153 +++++++++++++++-------------- 1 file changed, 79 insertions(+), 74 deletions(-) diff --git a/compass/extraction/water/graphs.py b/compass/extraction/water/graphs.py index 71e3d0adc..f39406649 100644 --- a/compass/extraction/water/graphs.py +++ b/compass/extraction/water/graphs.py @@ -22,7 +22,8 @@ def setup_graph_permits(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Permit Requirements", **kwargs) + d_tree_name="Permit Requirements", **kwargs + ) G.add_node( "init", @@ -33,26 +34,24 @@ def setup_graph_permits(**kwargs): "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' ), - db_query=("Is an application or permit required to drill a " - "groundwater well in the {DISTRICT_NAME}?"), + db_query=( + "Is an application or permit required to drill a " + "groundwater well in the {DISTRICT_NAME}?" + ), ) G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) G.add_node( "get_reqs", - prompt=( - "What are the requirements the text mentions? " - ), + prompt=("What are the requirements the text mentions? "), ) G.add_edge("get_reqs", "get_exempt") G.add_node( "get_exempt", - prompt=( - "Are any wells exempt from the permitting process? " - ), + prompt=("Are any wells exempt from the permitting process? "), ) G.add_edge("get_exempt", "final") @@ -93,7 +92,8 @@ def setup_graph_extraction(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Water Extraction Requirements", **kwargs) + d_tree_name="Water Extraction Requirements", **kwargs + ) G.add_node( "init", @@ -103,17 +103,17 @@ def setup_graph_extraction(**kwargs): "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' ), - db_query=("Is an application or permit required to extract or " - "produce groundwater in the {DISTRICT_NAME}?"), + db_query=( + "Is an application or permit required to extract or " + "produce groundwater in the {DISTRICT_NAME}?" + ), ) G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) G.add_node( "get_reqs", - prompt=( - "What are the requirements the text mentions? " - ), + prompt=("What are the requirements the text mentions? "), ) G.add_edge("get_reqs", "final") @@ -150,7 +150,8 @@ def setup_graph_geothermal(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Geothermal Policies", **kwargs) + d_tree_name="Geothermal Policies", **kwargs + ) G.add_node( "init", @@ -160,8 +161,10 @@ def setup_graph_geothermal(**kwargs): "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' ), - db_query=("Does {DISTRICT_NAME} implement policies that are specific " - "to geothermal systems?"), + db_query=( + "Does {DISTRICT_NAME} implement policies that are specific " + "to geothermal systems?" + ), ) G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) @@ -211,7 +214,8 @@ def setup_graph_oil_and_gas(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Oil and Gas Policies", **kwargs) + d_tree_name="Oil and Gas Policies", **kwargs + ) G.add_node( "init", @@ -221,8 +225,10 @@ def setup_graph_oil_and_gas(**kwargs): "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' ), - db_query=("Does {DISTRICT_NAME} implement policies that are specific " - "to oil and gas operations?"), + db_query=( + "Does {DISTRICT_NAME} implement policies that are specific " + "to oil and gas operations?" + ), ) G.add_edge("init", "get_reqs", condition=llm_response_starts_with_yes) @@ -272,7 +278,8 @@ def setup_graph_limits(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Extraction Limits", **kwargs) + d_tree_name="Extraction Limits", **kwargs + ) G.add_node( "init", @@ -288,7 +295,7 @@ def setup_graph_limits(**kwargs): db_query=( "Does {DISTRICT_NAME} have {interval} water well production, " "extraction, or withdrawal limits? " - ), + ), ) G.add_edge("init", "get_permit", condition=llm_response_starts_with_yes) @@ -313,10 +320,10 @@ def setup_graph_limits(**kwargs): ), ) - G.add_edge("get_type", "get_limit", - condition=llm_response_starts_with_yes) - G.add_edge("get_type", "permit_final", - condition=llm_response_starts_with_no) + G.add_edge("get_type", "get_limit", condition=llm_response_starts_with_yes) + G.add_edge( + "get_type", "permit_final", condition=llm_response_starts_with_no + ) G.add_node( "get_limit", @@ -381,7 +388,8 @@ def setup_graph_well_spacing(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Well Spacing", **kwargs) + d_tree_name="Well Spacing", **kwargs + ) G.add_node( "init", @@ -399,7 +407,7 @@ def setup_graph_well_spacing(**kwargs): db_query=( "Does {DISTRICT_NAME} have restrictions related to well spacing " "or a required distance between wells? " - ) + ), ) G.add_edge("init", "get_spacing", condition=llm_response_starts_with_yes) @@ -423,8 +431,9 @@ def setup_graph_well_spacing(**kwargs): ), ) - G.add_edge("get_wells", "get_qualifier", - condition=llm_response_starts_with_yes) + G.add_edge( + "get_wells", "get_qualifier", condition=llm_response_starts_with_yes + ) G.add_node( "get_qualifier", @@ -473,7 +482,8 @@ def setup_graph_time(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Drilling Window", **kwargs) + d_tree_name="Drilling Window", **kwargs + ) G.add_node( "init", @@ -537,7 +547,8 @@ def setup_graph_metering_device(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Metering Device", **kwargs) + d_tree_name="Metering Device", **kwargs + ) G.add_node( "init", @@ -552,16 +563,13 @@ def setup_graph_metering_device(**kwargs): "Is a metering device that monitors water usage required " "in {DISTRICT_NAME}?" ), - ) G.add_edge("init", "get_device", condition=llm_response_starts_with_yes) G.add_node( "get_device", - prompt=( - "What device is mentioned in the text? " - ), + prompt=("What device is mentioned in the text? "), ) G.add_edge("get_device", "final") @@ -598,7 +606,8 @@ def setup_graph_drought(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Drought Management Plan", **kwargs) + d_tree_name="Drought Management Plan", **kwargs + ) G.add_node( "init", @@ -661,7 +670,8 @@ def setup_graph_contingency(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Contingency Plan Requirements", **kwargs) + d_tree_name="Contingency Plan Requirements", **kwargs + ) G.add_node( "init", @@ -724,7 +734,8 @@ def setup_graph_plugging_reqs(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="Plugging Requirements", **kwargs) + d_tree_name="Plugging Requirements", **kwargs + ) G.add_node( "init", @@ -739,16 +750,14 @@ def setup_graph_plugging_reqs(**kwargs): db_query=( "Does {DISTRICT_NAME} implement plugging requirements specific " "to water wells?" - ) + ), ) G.add_edge("init", "get_plugging", condition=llm_response_starts_with_yes) G.add_node( "get_plugging", - prompt=( - "What are the plugging requirements mentioned in the text? " - ), + prompt=("What are the plugging requirements mentioned in the text? "), ) G.add_edge("get_plugging", "final") @@ -785,7 +794,8 @@ def setup_graph_external_transfer(**kwargs): `elm.tree.DecisionTree`. """ G = setup_graph_no_nodes( # noqa: N806 - d_tree_name="External Transfer Restrictions", **kwargs) + d_tree_name="External Transfer Restrictions", **kwargs + ) G.add_node( "init", @@ -796,23 +806,22 @@ def setup_graph_external_transfer(**kwargs): "a location outside of the district boundaries. " "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' - ), + ), db_query=( "Does {DISTRICT_NAME} implement restrictions or costs related to " "the external transport or export of water? External transport " "refers to cases in which well owners sell or transport water to " "a location outside of the district boundaries. " - ) + ), ) - G.add_edge("init", "get_restrictions", - condition=llm_response_starts_with_yes) + G.add_edge( + "init", "get_restrictions", condition=llm_response_starts_with_yes + ) G.add_node( "get_restrictions", - prompt=( - "What are the restrictions the text mentions?" - ), + prompt=("What are the restrictions the text mentions?"), ) G.add_edge("get_restrictions", "get_permit") @@ -837,8 +846,9 @@ def setup_graph_external_transfer(**kwargs): ), ) - G.add_edge("get_cost", "get_cost_amount", - condition=llm_response_starts_with_yes) + G.add_edge( + "get_cost", "get_cost_amount", condition=llm_response_starts_with_yes + ) G.add_node( "get_cost_amount", @@ -894,7 +904,7 @@ def setup_graph_production_reporting(**kwargs): """ G = setup_graph_no_nodes( # noqa: N806 d_tree_name="Water Well Production Reporting", **kwargs - ) + ) G.add_node( "init", @@ -910,16 +920,13 @@ def setup_graph_production_reporting(**kwargs): "Does {DISTRICT_NAME} require production reporting for water " "wells?" ), - ) G.add_edge("init", "get_reporting", condition=llm_response_starts_with_yes) G.add_node( "get_reporting", - prompt=( - "What are the requirements mentioned in the text?" - ), + prompt=("What are the requirements mentioned in the text?"), ) G.add_edge("get_reporting", "final") @@ -957,7 +964,7 @@ def setup_graph_production_cost(**kwargs): """ G = setup_graph_no_nodes( # noqa: N806 d_tree_name="Water Well Production Cost", **kwargs - ) + ) G.add_node( "init", @@ -969,12 +976,12 @@ def setup_graph_production_cost(**kwargs): "gallon or acre-foot figures) rather than one-time permit costs." "{YES_NO_PROMPT}" '\n\n"""\n{text}\n"""' - ), + ), db_query=( "Does {DISTRICT_NAME} charge well operators or owners to " "produce or extract water from a groundwater well? " "This is likely a dollar amount per gallon or acre-foot fee." - ) + ), ) G.add_edge("init", "get_type", condition=llm_response_starts_with_yes) @@ -1040,7 +1047,7 @@ def setup_graph_setback_features(**kwargs): """ G = setup_graph_no_nodes( # noqa: N806 d_tree_name="Setback Features", **kwargs - ) + ) G.add_node( "init", @@ -1058,18 +1065,15 @@ def setup_graph_setback_features(**kwargs): "systems, or located relative to property lines, buildings, " "septic systems, or other sources of contamination'?" ), - ) - G.add_edge("init", "get_restrictions", - condition=llm_response_starts_with_yes) - + G.add_edge( + "init", "get_restrictions", condition=llm_response_starts_with_yes + ) G.add_node( "get_restrictions", - prompt=( - "What are the restrictions mentioned in the text? " - ), + prompt=("What are the restrictions mentioned in the text? "), ) G.add_edge("get_restrictions", "final") @@ -1107,7 +1111,7 @@ def setup_graph_redrilling(**kwargs): """ G = setup_graph_no_nodes( # noqa: N806 d_tree_name="Redrilling Restrictions", **kwargs - ) + ) G.add_node( "init", @@ -1122,11 +1126,12 @@ def setup_graph_redrilling(**kwargs): db_query=( "Does {DISTRICT_NAME} implement restrictions related to " "redrilling or deepening water wells?" - ) + ), ) - G.add_edge("init", "get_redrilling", - condition=llm_response_starts_with_yes) + G.add_edge( + "init", "get_redrilling", condition=llm_response_starts_with_yes + ) G.add_node( "get_redrilling", From 62fa5f7672eac3854661d82b06bd8a436b440935 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:54:10 -0700 Subject: [PATCH 31/38] Add missing classes for water extraction --- compass/extraction/water/ordinance.py | 164 ++++++++++++++------------ 1 file changed, 90 insertions(+), 74 deletions(-) diff --git a/compass/extraction/water/ordinance.py b/compass/extraction/water/ordinance.py index 2190089dc..49d5e8006 100644 --- a/compass/extraction/water/ordinance.py +++ b/compass/extraction/water/ordinance.py @@ -1,22 +1,30 @@ """Water ordinance document content collection and extraction These methods help filter down the document text to only the portions -relevant to utility-scale water ordinances. +relevant to water rights ordinances. """ + import logging -from elm.ords.validation.content import ( - ValidationWithMemory, # compass equivalent = ParseChunksWithMemory? -) -from compass.validation.content import ParseChunksWithMemory +from compass.common import BaseTextExtractor +from compass.llm.calling import StructuredLLMCaller from compass.utilities.parsing import merge_overlapping_texts +from compass.utilities.enums import LLMUsageCategory logger = logging.getLogger(__name__) -class OrdinanceValidator(ParseChunksWithMemory): - """Check document text for water ordinances.""" +class WaterRightsHeuristic: + """NoOp heuristic check""" + + def check(self, *__, **___): # noqa: PLR6301 + """Always return ``True`` for water rights documents""" + return True + + +class WaterRightsTextCollector(StructuredLLMCaller): + """Check text chunks for ordinances and collect them if they do""" WELL_PERMITS_PROMPT = ( "You extract structured data from text. Return your answer in JSON " @@ -29,94 +37,102 @@ class OrdinanceValidator(ParseChunksWithMemory): "text excerpt provides substantive information related to the " "groundwater conservation district's rules or management plans. " ) + """Prompt to check if chunk contains water rights ordinance info""" - def __init__(self, structured_llm_caller, text_chunks, num_to_recall=2): - """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._ordinance_chunks = {} - Parameters - ---------- - structured_llm_caller : elm.ords.llm.StructuredLLMCaller - StructuredLLMCaller instance. Used for structured validation - queries. - text_chunks : list of str - List of strings, each of which represent a chunk of text. - The order of the strings should be the order of the text - chunks. This validator may refer to previous text chunks to - answer validation questions. - num_to_recall : int, optional - Number of chunks to check for each validation call. This - includes the original chunk! For example, if - `num_to_recall=2`, the validator will first check the chunk - at the requested index, and then the previous chunk as well. - By default, ``2``. - """ - super().__init__( - structured_llm_caller=structured_llm_caller, - text_chunks=text_chunks, - num_to_recall=num_to_recall, - ) - # self._legal_text_mem = [] - # self._wind_mention_mem = [] - self._ordinance_chunks = [] + @property + def contains_ord_info(self): + """bool: Flag indicating whether text contains ordinance info""" + return bool(self._ordinance_chunks) @property def ordinance_text(self): - """str: Combined ordinance text from the individual chunks.""" - inds_to_grab = set() - for info in self._ordinance_chunks: - inds_to_grab |= { - info["ind"] + x for x in range(1 - self.num_to_recall, 2) - } + """str: Combined ordinance text from the individual chunks""" + logger.debug( + "Grabbing %d ordinance chunk(s) from original text at these " + "indices: %s", + len(self._ordinance_chunks), + list(self._ordinance_chunks), + ) text = [ - self.text_chunks[ind] - for ind in sorted(inds_to_grab) - if 0 <= ind < len(self.text_chunks) + self._ordinance_chunks[ind] + for ind in sorted(self._ordinance_chunks) ] return merge_overlapping_texts(text) - async def parse(self, min_chunks_to_process=3): - """Parse text chunks and look for ordinance text. + async def check_chunk(self, chunk_parser, ind): + """Check a chunk at a given ind to see if it contains ordinance Parameters ---------- - min_chunks_to_process : int, optional - Minimum number of chunks to process before checking if - document resembles legal text and ignoring chunks that don't - pass the wind heuristic. By default, ``3``. + chunk_parser : ParseChunksWithMemory + Instance that contains a ``parse_from_ind`` method. + ind : int + Index of the chunk to check. Returns ------- bool - ``True`` if any ordinance text was found in the chunks. + Boolean flag indicating whether or not the text in the chunk + contains water rights ordinance text. """ - for ind, text in enumerate(self.text_chunks): - # TODO: I got good results without a similar test for water - # but is it worth including for the sake of being thorough? + contains_ord_info = await chunk_parser.parse_from_ind( + ind, + key="contains_ord_info", + llm_call_callback=self._check_chunk_contains_ord, + ) - # self._wind_mention_mem.append(possibly_mentions_wind(text)) - # if ind >= min_chunks_to_process: - # # fmt: off - # if not any(self._wind_mention_mem[-self.num_to_recall:]): - # continue + if contains_ord_info: + logger.debug( + "Text at ind %d contains water rights ordinance info", ind + ) + _store_chunk(chunk_parser, ind, self._ordinance_chunks) + else: + logger.debug( + "Text at ind %d does not contain water rights ordinance info", + ind, + ) - logger.debug("Processing text at ind %d", ind) - logger.debug("Text:\n%s", text) + return contains_ord_info - contains_ord_info = await self.parse_from_ind( - ind, self.WELL_PERMITS_PROMPT, key="contains_ord_info" - ) - if not contains_ord_info: - logger.debug( - "Text at ind %d does not contain ordinance info", ind - ) - continue + async def _check_chunk_contains_ord(self, key, text_chunk): + """Call LLM on a chunk of text to check for ordinance""" + content = await self.call( + sys_msg=self.WELL_PERMITS_PROMPT.format(key=key), + content=text_chunk, + usage_sub_label=(LLMUsageCategory.DOCUMENT_CONTENT_VALIDATION), + ) + logger.debug("LLM response: %s", content) + return content.get(key, False) - logger.debug("Text at ind %d does contain ordinance info", ind) - self._ordinance_chunks.append({"text": text, "ind": ind}) - logger.debug("Added text at ind %d to ordinances", ind) - # mask, since we got a good result - # self._wind_mention_mem[-1] = False +class WaterRightsTextExtractor(BaseTextExtractor): + """No-Op text extractor""" - return bool(self._ordinance_chunks) + @property + def parsers(self): + """Iterable of parsers provided by this extractor + + Yields + ------ + name : str + Name describing the type of text output by the parser. + parser : callable + Async function that takes a ``text_chunks`` input and + outputs parsed text. + """ + yield "cleaned_ordinance_text", merge_overlapping_texts + + +def _store_chunk(parser, chunk_ind, store): + """Store chunk and its neighbors if it is not already stored""" + for offset in range(1 - parser.num_to_recall, 2): + ind_to_grab = chunk_ind + offset + if ind_to_grab < 0 or ind_to_grab >= len(parser.text_chunks): + continue + + store.setdefault(ind_to_grab, parser.text_chunks[ind_to_grab]) From d9518c36e5189b334f1ab552f565fd4e81b2678b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 14:59:29 -0700 Subject: [PATCH 32/38] Minor formatting --- compass/extraction/water/parse.py | 159 ++++++++++++------------------ 1 file changed, 61 insertions(+), 98 deletions(-) diff --git a/compass/extraction/water/parse.py b/compass/extraction/water/parse.py index 7d20b392a..b0066574a 100644 --- a/compass/extraction/water/parse.py +++ b/compass/extraction/water/parse.py @@ -2,17 +2,11 @@ import asyncio import logging -from copy import deepcopy -from itertools import chain -from warnings import warn import pandas as pd from compass.llm.calling import BaseLLMCaller, ChatLLMCaller -from compass.common import ( - run_async_tree, - setup_async_decision_tree -) +from compass.common import run_async_tree, setup_async_decision_tree from compass.extraction.water.graphs import ( setup_graph_permits, setup_graph_extraction, @@ -42,19 +36,11 @@ class StructuredWaterParser(BaseLLMCaller): - """LLM ordinance document structured data scraping utility.""" - - def _init_chat_llm_caller(self, system_message): - """Initialize a ChatLLMCaller instance for the DecisionTree""" - return ChatLLMCaller( - self.llm_service, - system_message=system_message, - usage_tracker=self.usage_tracker, - **self.kwargs, - ) + """LLM ordinance document structured data scraping utility""" def __init__(self, wizard, location, **kwargs): """ + Parameters ---------- wizard : elm.wizard.EnergyWizard @@ -62,15 +48,22 @@ def __init__(self, wizard, location, **kwargs): location : str Name of the groundwater conservation district or county. """ + super().__init__(**kwargs) self.location = location self.wizard = wizard - super().__init__(**kwargs) + def _init_chat_llm_caller(self, system_message): + """Initialize a ChatLLMCaller instance for the DecisionTree""" + return ChatLLMCaller( + self.llm_service, + system_message=system_message, + usage_tracker=self.usage_tracker, + **self.kwargs, + ) - async def parse(self, location): - """Parse text and extract structured ordinance data.""" - self.location = location - values = {"location": location} + async def parse(self): + """Parse text and extract structured ordinance data""" + values = {"location": self.location} check_map = { "requirements": self._check_reqs, @@ -88,19 +81,23 @@ async def parse(self, location): "redrilling": self._check_redrilling, } - tasks = {name: asyncio.create_task(func()) for name, func in - check_map.items()} + tasks = { + name: asyncio.create_task(func()) + for name, func in check_map.items() + } limit_intervals = ["daily", "monthly", "annual"] for interval in limit_intervals: task_name = f"{interval}_limits" - tasks[task_name] = asyncio.create_task(self._check_limits(interval)) + tasks[task_name] = asyncio.create_task( + self._check_limits(interval) + ) logger.debug("Starting value extraction with %d tasks.", len(tasks)) results = await asyncio.gather(*tasks.values(), return_exceptions=True) - for key, result in zip(tasks.keys(), results): + for key, result in zip(tasks.keys(), results, strict=True): if isinstance(result, Exception): logger.warning("Task %s failed: %s", key, result) values[key] = None @@ -108,18 +105,15 @@ async def parse(self, location): values[key] = result logger.debug("Value extraction complete.") + return pd.DataFrame(values) - return values - - async def _check_with_graph(self, graph_setup_func, - limit=50, **format_kwargs): - """Generic method to check requirements using a graph setup - function. + async def _check_with_graph( + self, graph_setup_func, limit=50, **format_kwargs + ): + """Generic method to check requirements using a graph setup func Parameters ---------- - wizard : elm.wizard.EnergyWizard - Instance of the EnergyWizard class used for RAG. graph_setup_func : callable Function that returns a graph for the decision tree limit : int, optional @@ -147,104 +141,73 @@ async def _check_with_graph(self, graph_setup_func, graph_setup_func, text=all_text, chat_llm_caller=self._init_chat_llm_caller(DEFAULT_SYSTEM_MESSAGE), - **(format_kwargs or {}) + **(format_kwargs or {}), ) return await run_async_tree(tree) async def _check_reqs(self): - """Get the requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_permits, - ) + """Get the requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_permits) async def _check_extraction(self): - """Get the extraction requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_extraction, - ) + """Get the extraction requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_extraction) async def _check_geothermal(self): - """Get the geothermal requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_geothermal, - ) + """Get the geothermal requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_geothermal) async def _check_oil_and_gas(self): - """Get the oil and gas requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_oil_and_gas, - ) + """Get the oil and gas requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_oil_and_gas) async def _check_limits(self, interval): - """Get the extraction limits mentioned in the text.""" + """Get the extraction limits mentioned in the text""" return await self._check_with_graph( - setup_graph_limits, - interval=interval + setup_graph_limits, interval=interval ) async def _check_spacing(self): - """Get the spacing requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_well_spacing, - ) + """Get the spacing requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_well_spacing) async def _check_time(self): - """Get the time requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_time, - ) + """Get the time requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_time) async def _check_metering_device(self): - """Get the metering device mentioned in the text.""" - return await self._check_with_graph( - setup_graph_metering_device, - ) + """Get the metering device mentioned in the text""" + return await self._check_with_graph(setup_graph_metering_device) async def _check_district_drought(self): - """Get the drought management plan mentioned in the text.""" - return await self._check_with_graph( - setup_graph_drought, - ) + """Get the drought management plan mentioned in the text""" + return await self._check_with_graph(setup_graph_drought) async def _check_well_drought(self): - """Get the well drought management plan mentioned in the text.""" - return await self._check_with_graph( - setup_graph_contingency, - ) + """Get the well drought management plan mentioned in the text""" + return await self._check_with_graph(setup_graph_contingency) async def _check_plugging(self): - """Get the plugging requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_plugging_reqs, - ) + """Get the plugging requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_plugging_reqs) async def _check_transfer(self): - """Get the transfer requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_external_transfer, - ) + """Get the transfer requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_external_transfer) async def _check_production_reporting(self): - """Get the reporting requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_production_reporting, - ) + """Get the reporting requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_production_reporting) async def _check_production_cost(self): - """Get the production cost requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_production_cost, - ) + """Get the production cost requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_production_cost) async def _check_setbacks(self): - """Get the setback requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_setback_features, - ) + """Get the setback requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_setback_features) async def _check_redrilling(self): - """Get the redrilling requirements mentioned in the text.""" - return await self._check_with_graph( - setup_graph_redrilling, - ) + """Get the redrilling requirements mentioned in the text""" + return await self._check_with_graph(setup_graph_redrilling) From 8d4a6847b35011485c212a0f65753897768a83c2 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 15:00:54 -0700 Subject: [PATCH 33/38] Build water rights namespace --- compass/extraction/water/__init__.py | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/compass/extraction/water/__init__.py b/compass/extraction/water/__init__.py index 61344ef06..4141ecbbf 100644 --- a/compass/extraction/water/__init__.py +++ b/compass/extraction/water/__init__.py @@ -1 +1,48 @@ """Water ordinance extraction utilities""" + +from .parse import StructuredWaterParser +from .ordinance import ( + WaterRightsHeuristic, + WaterRightsTextCollector, + WaterRightsTextExtractor, +) +from .processing import ( + build_corpus, + extract_water_rights_ordinance_values, + label_docs_no_legal_check, + write_water_rights_data_to_disk, +) + + +WATER_RIGHTS_QUESTION_TEMPLATES = [ + "{jurisdiction} rules", + "{jurisdiction} management plan", + "{jurisdiction} well permits", + "{jurisdiction} well permit requirements", + "requirements to drill a water well in {jurisdiction}", +] + +BEST_WATER_RIGHTS_ORDINANCE_WEBSITE_URL_KEYWORDS = { + "pdf": 92160, + "water": 46080, + "rights": 23040, + "zoning": 11520, + "ordinance": 5760, + r"renewable%20energy": 1440, + r"renewable+energy": 1440, + "renewable energy": 1440, + "planning": 720, + "plan": 360, + "government": 180, + "code": 60, + "area": 60, + r"land%20development": 15, + r"land+development": 15, + "land development": 15, + "land": 3, + "environment": 3, + "energy": 3, + "renewable": 3, + "municipal": 1, + "department": 1, +} From 221372468fc3ca62dc234d57ece37718c9fb8132 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 17:04:18 -0700 Subject: [PATCH 34/38] Add processing functions --- compass/extraction/water/processing.py | 201 +++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 compass/extraction/water/processing.py diff --git a/compass/extraction/water/processing.py b/compass/extraction/water/processing.py new file mode 100644 index 000000000..8f11d9e6b --- /dev/null +++ b/compass/extraction/water/processing.py @@ -0,0 +1,201 @@ +"""Water ordinance structured parsing class""" + +import logging +from pathlib import Path + +import pandas as pd +from elm import EnergyWizard +from elm.embed import ChunkAndEmbed +from elm.web.document import PDFDocument + +from compass.utilities.enums import LLMTasks +from compass.exceptions import COMPASSRuntimeError + + +logger = logging.getLogger(__name__) + + +async def label_docs_no_legal_check(docs, **__): # noqa: RUF029 + """Label documents with the "don't check for legal status" flag + + Parameters + ---------- + docs : iterable of elm.web.document.PDFDocument + Documents to label. + + Returns + ------- + docs + Input docs with the "check_if_legal_doc" attribute set to False. + """ + for doc in docs: + doc.attrs["check_if_legal_doc"] = False + return docs + + +async def build_corpus(docs, jurisdiction, model_configs, **__): + """Build knowledge corpus for water rights extraction + + Parameters + ---------- + docs : iterable of elm.web.document.PDFDocument + Documents to build corpus from. + jurisdiction : compass.jurisdictions.jurisdiction.Jurisdiction + Jurisdiction being processed. + model_configs : dict + Dictionary of model configurations for various LLM tasks. + + Returns + ------- + list | None + List containing a single PDFDocument with the corpus, or None + if no corpus could be built. + + Raises + ------ + COMPASSRuntimeError + If embeddings could not be generated. + """ + model_config = model_configs.get( + LLMTasks.EMBEDDING, model_configs[LLMTasks.DEFAULT] + ) + _setup_endpoints(model_config) + + corpus = [] + for doc in docs: + url = doc.attrs.get("source", "unknown source") + logger.info("Embedding %r", url) + obj = ChunkAndEmbed( + doc.text, + model=model_config.name, + tokens_per_chunk=model_config.text_splitter_chunk_size, + overlap=model_config.text_splitter_chunk_overlap, + split_on="\n", + ) + try: + embeddings = await obj.run_async(rate_limit=3e4) + if any(e is None for e in embeddings): + msg = ( + "Embeddings are ``None`` when building corpus for " + "water rights extraction!" + ) + raise COMPASSRuntimeError(msg) # noqa: TRY301 + + corpus.append( + pd.DataFrame( + {"text": obj.text_chunks.chunks, "embedding": embeddings} + ) + ) + + except Exception as e: # noqa: BLE001 + logger.info("could not embed %r with error: %s", url, e) + + if len(corpus) == 0: + logger.info( + "No documents returned for %s, skipping", jurisdiction.full_name + ) + return None + + corpus_doc = PDFDocument( + ["water extraction context"], attrs={"corpus": pd.concat(corpus)} + ) + return [corpus_doc] + + +async def extract_water_rights_ordinance_values( + corpus_doc, parser_class, out_key, usage_tracker, model_config, **__ +): + """Extract ordinance values from a temporary vector store. + + Parameters + ---------- + corpus_doc : elm.web.document.PDFDocument + Document containing the vector store corpus. + parser_class : type + Class used to parse the vector store. + out_key : str + Key used to store extracted values in the document attributes. + usage_tracker : compass.tracking.usage.UsageTracker + Instance of the UsageTracker class used to track LLM usage. + model_config : compass.config.model.ModelConfig + Model configuration used for LLM calls. + + Returns + ------- + elm.web.document.PDFDocument + Document with extracted ordinance values stored in attributes. + """ + + logger.debug("Building energy wizard") + wizard = EnergyWizard(corpus_doc.attrs["corpus"], model=model_config.name) + + logger.debug("Calling parser class") + parser = parser_class( + wizard=wizard, + location=corpus_doc.attrs["jurisdiction_name"], + llm_service=model_config.llm_service, + usage_tracker=usage_tracker, + **model_config.llm_call_kwargs, + ) + corpus_doc.attrs[out_key] = await parser.parse() + return corpus_doc + + +def write_water_rights_data_to_disk(doc_infos, out_dir): + """Write extracted water rights data to disk + + Parameters + ---------- + doc_infos : list of dict + List of dictionaries containing extracted document information + and data file paths. + out_dir : path-like + Path to the output directory for the data. + + Returns + ------- + int + Number of unique water rights districts that information was + found/written for. + """ + db = [] + for doc_info in doc_infos: + ord_db = pd.read_csv(doc_info["ord_db_fp"]) + if len(ord_db) == 0: + continue + ord_db["source"] = doc_info.get("source") + + year, *__ = doc_info.get("date") or (None, None, None) + ord_db["ord_year"] = year if year is not None and year > 0 else None + + jurisdiction = doc_info["jurisdiction"] + ord_db["WCD_ID"] = jurisdiction.code + ord_db["county"] = jurisdiction.county + ord_db["state"] = jurisdiction.state + ord_db["subdivision"] = jurisdiction.subdivision_name + ord_db["jurisdiction_type"] = jurisdiction.type + + db.append(ord_db) + + if not db: + return 0 + + db = pd.concat([df.dropna(axis=1, how="all") for df in db], axis=0) + db.to_csv(Path(out_dir) / "water_rights.csv", index=False) + return len(db["WCD_ID"].unique()) + + +def _setup_endpoints(embedding_model_config): + """Set proper URLS for elm classes""" + ChunkAndEmbed.USE_CLIENT_EMBEDDINGS = True + EnergyWizard.USE_CLIENT_EMBEDDINGS = True + ChunkAndEmbed.EMBEDDING_MODEL = EnergyWizard.EMBEDDING_MODEL = ( + embedding_model_config.name + ) + + endpoint = embedding_model_config.client_kwargs["azure_endpoint"] + ChunkAndEmbed.EMBEDDING_URL = endpoint + ChunkAndEmbed.URL = endpoint + EnergyWizard.EMBEDDING_URL = endpoint + + EnergyWizard.URL = "openai.azure.com" # need to trigger Azure setup From feae7423ce8918c1535df7a862b30f89d0b89a73 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 17:14:05 -0700 Subject: [PATCH 35/38] Remove unused modules --- compass/extraction/water/apply.py | 86 ---------------- compass/extraction/water/download.py | 143 --------------------------- 2 files changed, 229 deletions(-) delete mode 100644 compass/extraction/water/apply.py delete mode 100644 compass/extraction/water/download.py diff --git a/compass/extraction/water/apply.py b/compass/extraction/water/apply.py deleted file mode 100644 index 5549e5303..000000000 --- a/compass/extraction/water/apply.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -"""ELM Ordinance function to apply ordinance extraction on a document """ -import logging - -from elm.ords.llm import StructuredLLMCaller -from elm.ords.extraction.date import DateExtractor -from elm.water_rights.extraction.ordinance import OrdinanceValidator - -from elm.water_rights.extraction.parse import StructuredOrdinanceParser - - -logger = logging.getLogger(__name__) - - -async def check_for_ordinance_info(doc, text_splitter, **kwargs): - """Parse a single document for ordinance information. - - Parameters - ---------- - doc : elm.web.document.BaseDocument - A document potentially containing ordinance information. Note - that if the document's metadata contains the - ``"contains_ord_info"`` key, it will not be processed. To force - a document to be processed by this function, remove that key - from the documents metadata. - text_splitter : obj - Instance of an object that implements a `split_text` method. - The method should take text as input (str) and return a list - of text chunks. Langchain's text splitters should work for this - input. - **kwargs - Keyword-value pairs used to initialize an - `elm.ords.llm.LLMCaller` instance. - - Returns - ------- - elm.web.document.BaseDocument - Document that has been parsed for ordinance text. The results of - the parsing are stored in the documents metadata. In particular, - the metadata will contain a ``"contains_ord_info"`` key that - will be set to ``True`` if ordinance info was found in the text, - and ``False`` otherwise. If ``True``, the metadata will also - contain a ``"date"`` key containing the most recent date that - the ordinance was enacted (or a tuple of `None` if not found), - and an ``"ordinance_text"`` key containing the ordinance text - snippet. Note that the snippet may contain other info as well, - but should encapsulate all of the ordinance text. - """ - if "contains_ord_info" in doc.attrs: - return doc - - llm_caller = StructuredLLMCaller(**kwargs) - chunks = text_splitter.split_text(doc.text) - validator = OrdinanceValidator(llm_caller, chunks) - doc.attrs["contains_ord_info"] = await validator.parse() - if doc.attrs["contains_ord_info"]: - doc.attrs["date"] = await DateExtractor(llm_caller).parse(doc) - doc.attrs["ordinance_text"] = validator.ordinance_text - - return doc - - -async def extract_ordinance_values(wizard, location, **kwargs): - """Extract ordinance values from a temporary vector store. - - Parameters - ---------- - wizard : elm.wizard.EnergyWizard - Instance of the EnergyWizard class used for RAG. - location : str - Name of the groundwater conservation district or county. - **kwargs - Keyword-value pairs used to initialize an - `elm.ords.llm.LLMCaller` instance. - - Returns - ------- - values : dict - Dictionary of values extracted from the vector store. - """ - - parser = StructuredOrdinanceParser(wizard=wizard, location=location, - **kwargs) - values = await parser.parse(location=location) - - return values diff --git a/compass/extraction/water/download.py b/compass/extraction/water/download.py deleted file mode 100644 index 1dd2f1c6a..000000000 --- a/compass/extraction/water/download.py +++ /dev/null @@ -1,143 +0,0 @@ -# -*- coding: utf-8 -*- -"""ELM Ordinance county file downloading logic""" -import logging - -from elm.ords.llm import StructuredLLMCaller -from elm.water_rights.extraction import check_for_ordinance_info -from elm.ords.services.threaded import TempFileCache -from elm.water_rights.validation.location import CountyValidator -from elm.web.search import web_search_links_as_docs -from elm.web.utilities import filter_documents - - -logger = logging.getLogger(__name__) - -QUESTION_TEMPLATES = [ - "{location} rules", - "{location} management plan", - "{location} well permits", - "{location} well permit requirements", - "requirements to drill a water well in {location}", - ] - -async def download_county_ordinance( - location, - text_splitter, - num_urls=5, - file_loader_kwargs=None, - browser_semaphore=None, - **kwargs -): - """Download ordinance documents for a single conservation district. - - Parameters - ---------- - location : :class:`elm.ords.utilities.location.Location` - Location objects representing the conservation district. - text_splitter : obj, optional - Instance of an object that implements a `split_text` method. - The method should take text as input (str) and return a list - of text chunks. Raw text from HTML pages will be passed through - this splitter to split the single wep page into multiple pages - for the output document. Langchain's text splitters should work - for this input. - num_urls : int, optional - Number of unique Google search result URL's to check for - ordinance document. By default, ``5``. - file_loader_kwargs : dict, optional - Dictionary of keyword-argument pairs to initialize - :class:`elm.web.file_loader.AsyncFileLoader` with. If found, the - "pw_launch_kwargs" key in these will also be used to initialize - the :class:`elm.web.google_search.PlaywrightGoogleLinkSearch` - used for the google URL search. By default, ``None``. - browser_semaphore : :class:`asyncio.Semaphore`, optional - Semaphore instance that can be used to limit the number of - playwright browsers open concurrently. If ``None``, no limits - are applied. By default, ``None``. - **kwargs - Keyword-value pairs used to initialize an - `elm.ords.llm.LLMCaller` instance. - - Returns - ------- - elm.web.document.BaseDocument | None - Document instance for the downloaded document, or ``None`` if no - document was found. - """ - docs = await _docs_from_google_search( - location, - text_splitter, - num_urls, - browser_semaphore, - **(file_loader_kwargs or {}) - ) - - docs = await _down_select_docs_correct_location( - docs, location=location, **kwargs - ) - - docs = await _down_select_docs_correct_content( - docs, location=location, text_splitter=text_splitter, **kwargs - ) - - logger.info( - "Found %d potential ordinance documents for %s", - len(docs), - location.full_name, - ) - - return docs - - -async def _docs_from_google_search( - location, text_splitter, num_urls, browser_semaphore, **file_loader_kwargs -): - """Download docs from google location queries. """ - queries = [ - question.format(location=location.name) - for question in QUESTION_TEMPLATES - ] - - file_loader_kwargs.update( - { - "html_read_kwargs": {"text_splitter": text_splitter}, - "file_cache_coroutine": TempFileCache.call, - } - ) - return await web_search_links_as_docs( - queries, - num_urls=num_urls, - browser_semaphore=browser_semaphore, - task_name=location.full_name, - **file_loader_kwargs, - ) - - -async def _down_select_docs_correct_location(docs, location, **kwargs): - """Remove all documents not pertaining to the location.""" - llm_caller = StructuredLLMCaller(**kwargs) - county_validator = CountyValidator(llm_caller, score_thresh=0.6) - return await filter_documents( - docs, - validation_coroutine=county_validator.check, - task_name=location.full_name, - county=location.name, - county_acronym=location.acronym, - state=location.state, - ) - - -async def _down_select_docs_correct_content(docs, location, **kwargs): - """Remove all documents that don't contain ordinance info.""" - return await filter_documents( - docs, - validation_coroutine=_contains_ords, - task_name=location.full_name, - **kwargs, - ) - - -async def _contains_ords(doc, **kwargs): - """Helper coroutine that checks for ordinance info. """ - doc = await check_for_ordinance_info(doc, **kwargs) - return doc.attrs.get("contains_ord_info", False) From 1efc31b076e279e83bfecf2a987ef333d5462364 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 17:14:16 -0700 Subject: [PATCH 36/38] Fix docstrings --- compass/extraction/water/processing.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compass/extraction/water/processing.py b/compass/extraction/water/processing.py index 8f11d9e6b..92d5daa92 100644 --- a/compass/extraction/water/processing.py +++ b/compass/extraction/water/processing.py @@ -25,7 +25,7 @@ async def label_docs_no_legal_check(docs, **__): # noqa: RUF029 Returns ------- - docs + iterable of elm.web.document.PDFDocument Input docs with the "check_if_legal_doc" attribute set to False. """ for doc in docs: @@ -40,14 +40,14 @@ async def build_corpus(docs, jurisdiction, model_configs, **__): ---------- docs : iterable of elm.web.document.PDFDocument Documents to build corpus from. - jurisdiction : compass.jurisdictions.jurisdiction.Jurisdiction + jurisdiction : compass.utilities.location.Jurisdiction Jurisdiction being processed. model_configs : dict Dictionary of model configurations for various LLM tasks. Returns ------- - list | None + list or None List containing a single PDFDocument with the corpus, or None if no corpus could be built. @@ -115,9 +115,9 @@ async def extract_water_rights_ordinance_values( Class used to parse the vector store. out_key : str Key used to store extracted values in the document attributes. - usage_tracker : compass.tracking.usage.UsageTracker + usage_tracker : compass.services.usage.UsageTracker Instance of the UsageTracker class used to track LLM usage. - model_config : compass.config.model.ModelConfig + model_config : compass.llm.config.LLMConfig Model configuration used for LLM calls. Returns From cf149a4d6716fd37d3c53c971d83a679e32b646d Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 17:26:54 -0700 Subject: [PATCH 37/38] Add water rights example folder --- examples/water_rights_demo/README.rst | 17 +++++++++++++ examples/water_rights_demo/config.json5 | 25 ++++++++++++++++++++ examples/water_rights_demo/jurisdictions.csv | 3 +++ 3 files changed, 45 insertions(+) create mode 100644 examples/water_rights_demo/README.rst create mode 100644 examples/water_rights_demo/config.json5 create mode 100644 examples/water_rights_demo/jurisdictions.csv diff --git a/examples/water_rights_demo/README.rst b/examples/water_rights_demo/README.rst new file mode 100644 index 000000000..7b10862b6 --- /dev/null +++ b/examples/water_rights_demo/README.rst @@ -0,0 +1,17 @@ +***************************************** +INFRA-COMPASS Texas Water Rights Demo Run +***************************************** + +This directory contains an example configuration for extracting groundwater rights +for several districtis in Texas. To execute this run, fill out the confg file with +the appropriate paths and API keys, then run the following command: + +.. code-block:: shell + + export OPENAI_API_KEY="dummy"; + export AZURE_OPENAI_KEY=""; + export AZURE_OPENAI_API_KEY=""; + export AZURE_OPENAI_VERSION=""; + export AZURE_OPENAI_ENDPOINT=""; + + compass process -c config.json5 diff --git a/examples/water_rights_demo/config.json5 b/examples/water_rights_demo/config.json5 new file mode 100644 index 000000000..177bf2308 --- /dev/null +++ b/examples/water_rights_demo/config.json5 @@ -0,0 +1,25 @@ +{ + out_dir: "./outputs", + tech: "water rights", + jurisdiction_fp: "jurisdictions.csv", + model: [ + { + name: "text-embedding-ada-002", + text_splitter_chunk_size: 500, + text_splitter_chunk_overlap: 1, + "tasks": "embedding", + }, + { + name: "egswaterord-gpt4.1-mini", + llm_call_kwargs: {temperature: 0, timeout: 300}, + llm_service_rate_limit: 500000, + text_splitter_chunk_size: 10000, + text_splitter_chunk_overlap: 500, + "client_kwargs": { + "api_key": "", + "api_version": "", + "azure_endpoint": "", + }, + }, + ], +} diff --git a/examples/water_rights_demo/jurisdictions.csv b/examples/water_rights_demo/jurisdictions.csv new file mode 100644 index 000000000..556251b00 --- /dev/null +++ b/examples/water_rights_demo/jurisdictions.csv @@ -0,0 +1,3 @@ +State,County,Subdivision,Jurisdiction Type +Texas,,Panola County,Groundwater Conservation District +Texas,,Panhandle,Groundwater Conservation District From 8ef4019d60dd1716cac3506deb676dc147abe513 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 31 Jan 2026 17:27:04 -0700 Subject: [PATCH 38/38] Lower threshold for now --- pixi.lock | 176 ++++++++++++++++++++++++++++++++++--------------- pyproject.toml | 2 +- 2 files changed, 125 insertions(+), 53 deletions(-) diff --git a/pixi.lock b/pixi.lock index c51e926c0..6072cf3d1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -235,7 +235,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -298,7 +298,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -569,7 +569,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -632,7 +632,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -854,7 +854,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -919,7 +919,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1141,7 +1141,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -1206,7 +1206,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1420,7 +1420,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -1482,7 +1482,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl @@ -1761,7 +1761,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -1799,7 +1799,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ @@ -2107,7 +2107,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -2145,7 +2145,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ @@ -2407,7 +2407,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -2445,7 +2445,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ @@ -2707,7 +2707,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -2745,7 +2745,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ @@ -2997,7 +2997,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -3034,7 +3034,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ @@ -3458,7 +3458,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -3496,7 +3496,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ @@ -3950,7 +3950,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -3988,7 +3988,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ @@ -4396,7 +4396,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -4434,7 +4434,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ @@ -4842,7 +4842,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -4880,7 +4880,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ @@ -5279,7 +5279,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -5316,7 +5316,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ @@ -5609,7 +5609,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -5647,7 +5647,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ @@ -5971,7 +5971,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -6009,7 +6009,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ @@ -6286,7 +6286,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -6324,7 +6324,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ @@ -6601,7 +6601,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -6639,7 +6639,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ @@ -6906,7 +6906,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -6943,7 +6943,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ @@ -7239,7 +7239,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -7277,7 +7277,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ @@ -7603,7 +7603,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -7641,7 +7641,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: ./ @@ -7921,7 +7921,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -7959,7 +7959,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: ./ @@ -8239,7 +8239,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/b5/1cfca43b7d20a0fdb1eac67313d6bb6b18d18897f82dd0f17436bdd2ba7f/cython-3.2.4-cp313-cp313-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -8277,7 +8277,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: ./ @@ -8547,7 +8547,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/43/97/cecb942d60a79d20b4d718a17ef599aee80ce54c32f0f214a880f406b5b8/crawl4ai-0.8.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/4b/9cc373120658a2516aa5f6dcdde631c95d714b876d29ad8f8e009d793f3f/dask-2026.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b5/0e/d4b7d6a8df5074cf67bc14adead39955b0bf847c947ff6cad0bb527887f4/ddgs-9.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e3/0b/2849c87d9f13766e29c0a2f4d31681aa72e035016b251ab19d99bde7b592/fake_http_header-0.3.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl @@ -8584,7 +8584,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/94/37/be6dfbfa45719aa82c008fb4772cfe5c46db765a2ca4b6f524a1fdfee4d7/ua_parser-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/82/aab481e2fc6dee0a13ce35c750e97dbe3f270fb327089c99a8f5e6900e0c/ua_parser_builtins-202601-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2e/f5/ce3ab627e0cb51591c9e3dc4b9b173f15d7f2bec1c0010420b15fc442940/w3lib-2.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl - pypi: ./ @@ -13530,6 +13530,38 @@ packages: - pytest-xdist ; extra == 'test' - pre-commit ; extra == 'test' requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e5/23/d39ccc4ed76222db31530b0a7d38876fdb7673e23f838e8d8f0ed4651a4f/dask-2026.1.2-py3-none-any.whl + name: dask + version: 2026.1.2 + sha256: 46a0cf3b8d87f78a3d2e6b145aea4418a6d6d606fe6a16c79bd8ca2bb862bc91 + requires_dist: + - click>=8.1 + - cloudpickle>=3.0.0 + - fsspec>=2021.9.0 + - packaging>=20.0 + - partd>=1.4.0 + - pyyaml>=5.3.1 + - toolz>=0.12.0 + - importlib-metadata>=4.13.0 ; python_full_version < '3.12' + - numpy>=1.24 ; extra == 'array' + - dask[array] ; extra == 'dataframe' + - pandas>=2.0 ; extra == 'dataframe' + - pyarrow>=16.0 ; extra == 'dataframe' + - distributed>=2026.1.2,<2026.1.3 ; extra == 'distributed' + - bokeh>=3.1.0 ; extra == 'diagnostics' + - jinja2>=2.10.3 ; extra == 'diagnostics' + - dask[array,dataframe,diagnostics,distributed] ; extra == 'complete' + - pyarrow>=16.0 ; extra == 'complete' + - lz4>=4.3.2 ; extra == 'complete' + - pandas[test] ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - pytest-rerunfailures ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - pre-commit ; extra == 'test' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/dataclasses-0.8-pyhc8e2a94_3.tar.bz2 sha256: 63a83e62e0939bc1ab32de4ec736f6403084198c4639638b354a352113809c92 md5: a362b2124b06aad102e2ee4581acee7d @@ -16660,8 +16692,8 @@ packages: timestamp: 1736252433366 - pypi: ./ name: infra-compass - version: 0.13.2.dev2+g0d6946c.d20260129 - sha256: 05313da525aab3c6bdcad20032f7c6d0bf821164504115c4c92198978b938742 + version: 0.13.2.dev37+g1efc31b.d20260201 + sha256: 11b69caa4a9bde6e3537064e5f9edb2b5381483014927be4c9bb2a6a45f2c3b0 requires_dist: - beautifulsoup4>=4.12.3,<5 - click>=8.1.7,<9 @@ -32481,6 +32513,46 @@ packages: - pytest ; extra == 'dev' - setuptools ; extra == 'dev' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/30/93/b414826a5aaf2fdcfe73c2e649cbeb2e098fef4820d1217554ee64f45666/wrapt-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl + name: wrapt + version: 2.1.0 + sha256: 875a10a6f3b667f90a39010af26acf684ba831d9b18a86b242899d57c74550fa + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3b/4e/e8447b31be27b6057cdfc904a38632a765c3407fb4d10d11e5c1d0c203d5/wrapt-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl + name: wrapt + version: 2.1.0 + sha256: d3dd4f8c2256fcde1a85037a1837afc52e8d32d086fd669ae469455fd9a988d6 + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/58/9e/8b21ea776bf2a3c858e3377ecde4b348893ec44dc1726baaf583ca22c56e/wrapt-2.1.0-cp313-cp313-macosx_11_0_arm64.whl + name: wrapt + version: 2.1.0 + sha256: e00f8559ceac0fb45091daad5f15d37f2c22bdc28ed71521d47ff01aad8fff3d + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/86/de/538fcef30f70a1aaadab4cab7d0396037518d7ec2b064557171147ce297f/wrapt-2.1.0-cp313-cp313-win_amd64.whl + name: wrapt + version: 2.1.0 + sha256: 57df799e67b011847ef7ac64b05ed4633e56b64e7e7cab5eb83dc9689dbe0acf + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/da/ec/48cd2470ad09557dfe6fccfe9de98698cc0df3786a6d4d97e8edd574d67a/wrapt-2.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: wrapt + version: 2.1.0 + sha256: ce0cf4c79c19904aaf2e822af280d7b3c23ad902f57e31c5a19433bc86e5d36d + requires_dist: + - pytest ; extra == 'dev' + - setuptools ; extra == 'dev' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/7d/8e/952a351c10df395d9bab850f611f4368834ae9104d6449049f5a49e00925/xarray-2026.1.0-py3-none-any.whl name: xarray version: 2026.1.0 diff --git a/pyproject.toml b/pyproject.toml index ad69bf040..a13d3a023 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -133,7 +133,7 @@ format = "ruff format ./compass" [tool.pixi.feature.python-test.tasks] tests-p = "pytest --durations=20 -rapP -vv --cov=compass --cov-report=html --cov-branch --cov-report=xml:coverage.xml --cov-fail-under=30 tests/python" tests-u = "pytest --durations=20 -rapP -vv --cov=compass --cov-report=html --cov-branch --cov-report=xml:coverage.xml --cov-fail-under=30 tests/python/unit" -tests-i = "pytest --durations=20 -rapP -vv --cov=compass --cov-report=html --cov-branch --cov-report=xml:coverage.xml --cov-fail-under=15 tests/python/integration" +tests-i = "pytest --durations=20 -rapP -vv --cov=compass --cov-report=html --cov-branch --cov-report=xml:coverage.xml --cov-fail-under=10 tests/python/integration" [tool.pixi.feature.python-doc.tasks] python-docs = { cmd = "make clean html", cwd = "docs", env = { SPHINXOPTS = "--fail-on-warning --keep-going --nitpicky" }}