diff --git a/pyproject.toml b/pyproject.toml index 57eb32625..0b16485cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,9 +21,8 @@ dependencies = [ "opentelemetry-sdk>=1.30.0", "opentelemetry-exporter-otlp-proto-http>=1.30.0", # Data Handling - "chromadb>=0.5.23", + "chromadb~=1.1.0", "tokenizers>=0.20.3", - "onnxruntime==1.22.0", "openpyxl>=3.1.5", "pyvis>=0.3.2", # Authentication and Security @@ -49,7 +48,9 @@ Documentation = "https://docs.crewai.com" Repository = "https://github.com/crewAIInc/crewAI" [project.optional-dependencies] -tools = ["crewai-tools~=0.73.0"] +tools = [ + "crewai-tools>=0.74.0", +] embeddings = [ "tiktoken~=0.8.0" ] @@ -195,3 +196,4 @@ exclude = [ "docs/**", "docs/", ] + diff --git a/src/crewai/agent.py b/src/crewai/agent.py index 122ddc82f..07de3d533 100644 --- a/src/crewai/agent.py +++ b/src/crewai/agent.py @@ -1,17 +1,10 @@ import shutil import subprocess import time +from collections.abc import Callable, Sequence from typing import ( Any, - Callable, - Dict, - List, Literal, - Optional, - Sequence, - Tuple, - Type, - Union, ) from pydantic import Field, InstanceOf, PrivateAttr, model_validator @@ -19,12 +12,31 @@ from pydantic import Field, InstanceOf, PrivateAttr, model_validator from crewai.agents import CacheHandler from crewai.agents.agent_builder.base_agent import BaseAgent from crewai.agents.crew_agent_executor import CrewAgentExecutor +from crewai.events.event_bus import crewai_event_bus +from crewai.events.types.agent_events import ( + AgentExecutionCompletedEvent, + AgentExecutionErrorEvent, + AgentExecutionStartedEvent, +) +from crewai.events.types.knowledge_events import ( + KnowledgeQueryCompletedEvent, + KnowledgeQueryFailedEvent, + KnowledgeQueryStartedEvent, + KnowledgeRetrievalCompletedEvent, + KnowledgeRetrievalStartedEvent, + KnowledgeSearchQueryFailedEvent, +) +from crewai.events.types.memory_events import ( + MemoryRetrievalCompletedEvent, + MemoryRetrievalStartedEvent, +) from crewai.knowledge.knowledge import Knowledge from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource from crewai.knowledge.utils.knowledge_utils import extract_knowledge_context from crewai.lite_agent import LiteAgent, LiteAgentOutput from crewai.llm import BaseLLM from crewai.memory.contextual.contextual_memory import ContextualMemory +from crewai.rag.embeddings.types import EmbedderConfig from crewai.security import Fingerprint from crewai.task import Task from crewai.tools import BaseTool @@ -38,24 +50,6 @@ from crewai.utilities.agent_utils import ( ) from crewai.utilities.constants import TRAINED_AGENTS_DATA_FILE, TRAINING_DATA_FILE from crewai.utilities.converter import generate_model_description -from crewai.events.types.agent_events import ( - AgentExecutionCompletedEvent, - AgentExecutionErrorEvent, - AgentExecutionStartedEvent, -) -from crewai.events.event_bus import crewai_event_bus -from crewai.events.types.memory_events import ( - MemoryRetrievalStartedEvent, - MemoryRetrievalCompletedEvent, -) -from crewai.events.types.knowledge_events import ( - KnowledgeQueryCompletedEvent, - KnowledgeQueryFailedEvent, - KnowledgeQueryStartedEvent, - KnowledgeRetrievalCompletedEvent, - KnowledgeRetrievalStartedEvent, - KnowledgeSearchQueryFailedEvent, -) from crewai.utilities.llm_utils import create_llm from crewai.utilities.token_counter_callback import TokenCalcHandler from crewai.utilities.training_handler import CrewTrainingHandler @@ -87,36 +81,36 @@ class Agent(BaseAgent): """ _times_executed: int = PrivateAttr(default=0) - max_execution_time: Optional[int] = Field( + max_execution_time: int | None = Field( default=None, description="Maximum execution time for an agent to execute a task", ) agent_ops_agent_name: str = None # type: ignore # Incompatible types in assignment (expression has type "None", variable has type "str") agent_ops_agent_id: str = None # type: ignore # Incompatible types in assignment (expression has type "None", variable has type "str") - step_callback: Optional[Any] = Field( + step_callback: Any | None = Field( default=None, description="Callback to be executed after each step of the agent execution.", ) - use_system_prompt: Optional[bool] = Field( + use_system_prompt: bool | None = Field( default=True, description="Use system prompt for the agent.", ) - llm: Union[str, InstanceOf[BaseLLM], Any] = Field( + llm: str | InstanceOf[BaseLLM] | Any = Field( description="Language model that will run the agent.", default=None ) - function_calling_llm: Optional[Union[str, InstanceOf[BaseLLM], Any]] = Field( + function_calling_llm: str | InstanceOf[BaseLLM] | Any | None = Field( description="Language model that will run the agent.", default=None ) - system_template: Optional[str] = Field( + system_template: str | None = Field( default=None, description="System format for the agent." ) - prompt_template: Optional[str] = Field( + prompt_template: str | None = Field( default=None, description="Prompt format for the agent." ) - response_template: Optional[str] = Field( + response_template: str | None = Field( default=None, description="Response format for the agent." ) - allow_code_execution: Optional[bool] = Field( + allow_code_execution: bool | None = Field( default=False, description="Enable code execution for the agent." ) respect_context_window: bool = Field( @@ -147,31 +141,31 @@ class Agent(BaseAgent): default=False, description="Whether the agent should reflect and create a plan before executing a task.", ) - max_reasoning_attempts: Optional[int] = Field( + max_reasoning_attempts: int | None = Field( default=None, description="Maximum number of reasoning attempts before executing the task. If None, will try until ready.", ) - embedder: Optional[Dict[str, Any]] = Field( + embedder: EmbedderConfig | None = Field( default=None, description="Embedder configuration for the agent.", ) - agent_knowledge_context: Optional[str] = Field( + agent_knowledge_context: str | None = Field( default=None, description="Knowledge context for the agent.", ) - crew_knowledge_context: Optional[str] = Field( + crew_knowledge_context: str | None = Field( default=None, description="Knowledge context for the crew.", ) - knowledge_search_query: Optional[str] = Field( + knowledge_search_query: str | None = Field( default=None, description="Knowledge search query for the agent dynamically generated by the agent.", ) - from_repository: Optional[str] = Field( + from_repository: str | None = Field( default=None, description="The Agent's role to be used from your repository.", ) - guardrail: Optional[Union[Callable[[Any], Tuple[bool, Any]], str]] = Field( + guardrail: Callable[[Any], tuple[bool, Any]] | str | None = Field( default=None, description="Function or string description of a guardrail to validate agent output", ) @@ -180,7 +174,7 @@ class Agent(BaseAgent): ) @model_validator(mode="before") - def validate_from_repository(cls, v): + def validate_from_repository(cls, v): # noqa: N805 if v is not None and (from_repository := v.get("from_repository")): return load_agent_from_repository(from_repository) | v return v @@ -208,7 +202,7 @@ class Agent(BaseAgent): self.cache_handler = CacheHandler() self.set_cache_handler(self.cache_handler) - def set_knowledge(self, crew_embedder: Optional[Dict[str, Any]] = None): + def set_knowledge(self, crew_embedder: EmbedderConfig | None = None): try: if self.embedder is None and crew_embedder: self.embedder = crew_embedder @@ -224,7 +218,7 @@ class Agent(BaseAgent): ) self.knowledge.add_sources() except (TypeError, ValueError) as e: - raise ValueError(f"Invalid Knowledge Configuration: {str(e)}") + raise ValueError(f"Invalid Knowledge Configuration: {e!s}") from e def _is_any_available_memory(self) -> bool: """Check if any memory is available.""" @@ -244,8 +238,8 @@ class Agent(BaseAgent): def execute_task( self, task: Task, - context: Optional[str] = None, - tools: Optional[List[BaseTool]] = None, + context: str | None = None, + tools: list[BaseTool] | None = None, ) -> str: """Execute a task with the agent. @@ -278,11 +272,9 @@ class Agent(BaseAgent): task.description += f"\n\nReasoning Plan:\n{reasoning_output.plan.plan}" except Exception as e: if hasattr(self, "_logger"): - self._logger.log( - "error", f"Error during reasoning process: {str(e)}" - ) + self._logger.log("error", f"Error during reasoning process: {e!s}") else: - print(f"Error during reasoning process: {str(e)}") + print(f"Error during reasoning process: {e!s}") self._inject_date_to_task(task) @@ -335,7 +327,7 @@ class Agent(BaseAgent): agent=self, task=task, ) - memory = contextual_memory.build_context_for_task(task, context) + memory = contextual_memory.build_context_for_task(task, context) # type: ignore[arg-type] if memory.strip() != "": task_prompt += self.i18n.slice("memory").format(memory=memory) @@ -525,14 +517,14 @@ class Agent(BaseAgent): try: return future.result(timeout=timeout) - except concurrent.futures.TimeoutError: + except concurrent.futures.TimeoutError as e: future.cancel() raise TimeoutError( f"Task '{task.description}' execution timed out after {timeout} seconds. Consider increasing max_execution_time or optimizing the task." - ) + ) from e except Exception as e: future.cancel() - raise RuntimeError(f"Task execution failed: {str(e)}") + raise RuntimeError(f"Task execution failed: {e!s}") from e def _execute_without_timeout(self, task_prompt: str, task: Task) -> str: """Execute a task without a timeout. @@ -554,14 +546,14 @@ class Agent(BaseAgent): )["output"] def create_agent_executor( - self, tools: Optional[List[BaseTool]] = None, task=None + self, tools: list[BaseTool] | None = None, task=None ) -> None: """Create an agent executor for the agent. Returns: An instance of the CrewAgentExecutor class. """ - raw_tools: List[BaseTool] = tools or self.tools or [] + raw_tools: list[BaseTool] = tools or self.tools or [] parsed_tools = parse_tools(raw_tools) prompt = Prompts( @@ -587,7 +579,7 @@ class Agent(BaseAgent): agent=self, crew=self.crew, tools=parsed_tools, - prompt=prompt, + prompt=prompt, # type: ignore[arg-type] original_tools=raw_tools, stop_words=stop_words, max_iter=self.max_iter, @@ -603,10 +595,9 @@ class Agent(BaseAgent): callbacks=[TokenCalcHandler(self._token_process)], ) - def get_delegation_tools(self, agents: List[BaseAgent]): + def get_delegation_tools(self, agents: list[BaseAgent]): agent_tools = AgentTools(agents=agents) - tools = agent_tools.tools() - return tools + return agent_tools.tools() def get_multimodal_tools(self) -> Sequence[BaseTool]: from crewai.tools.agent_tools.add_image_tool import AddImageTool @@ -654,7 +645,7 @@ class Agent(BaseAgent): ) return task_prompt - def _render_text_description(self, tools: List[Any]) -> str: + def _render_text_description(self, tools: list[Any]) -> str: """Render the tool name and description in plain text. Output will be in the format of: @@ -664,15 +655,13 @@ class Agent(BaseAgent): search: This tool is used for search calculator: This tool is used for math """ - description = "\n".join( + return "\n".join( [ f"Tool name: {tool.name}\nTool description:\n{tool.description}" for tool in tools ] ) - return description - def _inject_date_to_task(self, task): """Inject the current date into the task description if inject_date is enabled.""" if self.inject_date: @@ -696,13 +685,13 @@ class Agent(BaseAgent): if not is_valid: raise ValueError(f"Invalid date format: {self.date_format}") - current_date: str = datetime.now().strftime(self.date_format) + current_date = datetime.now().strftime(self.date_format) task.description += f"\n\nCurrent Date: {current_date}" except Exception as e: if hasattr(self, "_logger"): - self._logger.log("warning", f"Failed to inject date: {str(e)}") + self._logger.log("warning", f"Failed to inject date: {e!s}") else: - print(f"Warning: Failed to inject date: {str(e)}") + print(f"Warning: Failed to inject date: {e!s}") def _validate_docker_installation(self) -> None: """Check if Docker is installed and running.""" @@ -713,15 +702,15 @@ class Agent(BaseAgent): try: subprocess.run( - ["docker", "info"], + ["/usr/bin/docker", "info"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) - except subprocess.CalledProcessError: + except subprocess.CalledProcessError as e: raise RuntimeError( f"Docker is not running. Please start Docker to use code execution with agent: {self.role}" - ) + ) from e def __repr__(self): return f"Agent(role={self.role}, goal={self.goal}, backstory={self.backstory})" @@ -796,8 +785,8 @@ class Agent(BaseAgent): def kickoff( self, - messages: Union[str, List[Dict[str, str]]], - response_format: Optional[Type[Any]] = None, + messages: str | list[dict[str, str]], + response_format: type[Any] | None = None, ) -> LiteAgentOutput: """ Execute the agent with the given messages using a LiteAgent instance. @@ -836,8 +825,8 @@ class Agent(BaseAgent): async def kickoff_async( self, - messages: Union[str, List[Dict[str, str]]], - response_format: Optional[Type[Any]] = None, + messages: str | list[dict[str, str]], + response_format: type[Any] | None = None, ) -> LiteAgentOutput: """ Execute the agent asynchronously with the given messages using a LiteAgent instance. diff --git a/src/crewai/agents/agent_builder/base_agent.py b/src/crewai/agents/agent_builder/base_agent.py index 41344aea2..27a2840c5 100644 --- a/src/crewai/agents/agent_builder/base_agent.py +++ b/src/crewai/agents/agent_builder/base_agent.py @@ -22,6 +22,7 @@ from crewai.agents.tools_handler import ToolsHandler from crewai.knowledge.knowledge import Knowledge from crewai.knowledge.knowledge_config import KnowledgeConfig from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource +from crewai.rag.embeddings.types import EmbedderConfig from crewai.security.security_config import SecurityConfig from crewai.tools.base_tool import BaseTool, Tool from crewai.utilities import I18N, Logger, RPMController @@ -359,5 +360,5 @@ class BaseAgent(ABC, BaseModel): self._rpm_controller = rpm_controller self.create_agent_executor() - def set_knowledge(self, crew_embedder: dict[str, Any] | None = None): + def set_knowledge(self, crew_embedder: EmbedderConfig | None = None): pass diff --git a/src/crewai/crew.py b/src/crewai/crew.py index 95b3e3c30..ed9479bdc 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -59,6 +59,7 @@ from crewai.memory.external.external_memory import ExternalMemory from crewai.memory.long_term.long_term_memory import LongTermMemory from crewai.memory.short_term.short_term_memory import ShortTermMemory from crewai.process import Process +from crewai.rag.embeddings.types import EmbedderConfig from crewai.rag.types import SearchResult from crewai.security import Fingerprint, SecurityConfig from crewai.task import Task @@ -168,7 +169,7 @@ class Crew(FlowTrackable, BaseModel): default=None, description="An Instance of the ExternalMemory to be used by the Crew", ) - embedder: dict | None = Field( + embedder: EmbedderConfig | None = Field( default=None, description="Configuration for the embedder to be used for the crew.", ) @@ -622,7 +623,8 @@ class Crew(FlowTrackable, BaseModel): training_data=training_data, agent_id=str(agent.id) ) CrewTrainingHandler(filename).save_trained_data( - agent_id=str(agent.role), trained_data=result.model_dump() + agent_id=str(agent.role), + trained_data=result.model_dump(), # type: ignore[arg-type] ) crewai_event_bus.emit( @@ -1057,7 +1059,10 @@ class Crew(FlowTrackable, BaseModel): def _log_task_start(self, task: Task, role: str = "None"): if self.output_log_file: self._file_handler.log( - task_name=task.name, task=task.description, agent=role, status="started" + task_name=task.name, # type: ignore[arg-type] + task=task.description, + agent=role, + status="started", ) def _update_manager_tools( @@ -1086,7 +1091,7 @@ class Crew(FlowTrackable, BaseModel): role = task.agent.role if task.agent is not None else "None" if self.output_log_file: self._file_handler.log( - task_name=task.name, + task_name=task.name, # type: ignore[arg-type] task=task.description, agent=role, status="completed", diff --git a/src/crewai/knowledge/knowledge.py b/src/crewai/knowledge/knowledge.py index fc5493ceb..c1f326c9d 100644 --- a/src/crewai/knowledge/knowledge.py +++ b/src/crewai/knowledge/knowledge.py @@ -1,10 +1,10 @@ import os -from typing import Any from pydantic import BaseModel, ConfigDict, Field from crewai.knowledge.source.base_knowledge_source import BaseKnowledgeSource from crewai.knowledge.storage.knowledge_storage import KnowledgeStorage +from crewai.rag.embeddings.types import EmbedderConfig from crewai.rag.types import SearchResult os.environ["TOKENIZERS_PARALLELISM"] = "false" # removes logging from fastembed @@ -16,20 +16,20 @@ class Knowledge(BaseModel): Args: sources: list[BaseKnowledgeSource] = Field(default_factory=list) storage: KnowledgeStorage | None = Field(default=None) - embedder: dict[str, Any] | None = None + embedder: EmbedderConfig | None = None """ sources: list[BaseKnowledgeSource] = Field(default_factory=list) model_config = ConfigDict(arbitrary_types_allowed=True) storage: KnowledgeStorage | None = Field(default=None) - embedder: dict[str, Any] | None = None + embedder: EmbedderConfig | None = None collection_name: str | None = None def __init__( self, collection_name: str, sources: list[BaseKnowledgeSource], - embedder: dict[str, Any] | None = None, + embedder: EmbedderConfig | None = None, storage: KnowledgeStorage | None = None, **data, ): diff --git a/src/crewai/knowledge/storage/knowledge_storage.py b/src/crewai/knowledge/storage/knowledge_storage.py index c06f513b7..8019d4d11 100644 --- a/src/crewai/knowledge/storage/knowledge_storage.py +++ b/src/crewai/knowledge/storage/knowledge_storage.py @@ -24,7 +24,10 @@ class KnowledgeStorage(BaseKnowledgeStorage): def __init__( self, - embedder: ProviderSpec | BaseEmbeddingsProvider | None = None, + embedder: ProviderSpec + | BaseEmbeddingsProvider + | type[BaseEmbeddingsProvider] + | None = None, collection_name: str | None = None, ) -> None: self.collection_name = collection_name @@ -37,7 +40,7 @@ class KnowledgeStorage(BaseKnowledgeStorage): ) if embedder: - embedding_function = build_embedder(embedder) + embedding_function = build_embedder(embedder) # type: ignore[arg-type] config = ChromaDBConfig( embedding_function=cast( ChromaEmbeddingFunctionWrapper, embedding_function diff --git a/src/crewai/memory/entity/entity_memory.py b/src/crewai/memory/entity/entity_memory.py index 5176db882..18a08809e 100644 --- a/src/crewai/memory/entity/entity_memory.py +++ b/src/crewai/memory/entity/entity_memory.py @@ -27,7 +27,10 @@ class EntityMemory(Memory): _memory_provider: str | None = PrivateAttr() def __init__(self, crew=None, embedder_config=None, storage=None, path=None): - memory_provider = embedder_config.get("provider") if embedder_config else None + memory_provider = None + if embedder_config and isinstance(embedder_config, dict): + memory_provider = embedder_config.get("provider") + if memory_provider == "mem0": try: from crewai.memory.storage.mem0_storage import Mem0Storage @@ -35,7 +38,11 @@ class EntityMemory(Memory): raise ImportError( "Mem0 is not installed. Please install it with `pip install mem0ai`." ) from e - config = embedder_config.get("config") if embedder_config else None + config = ( + embedder_config.get("config") + if embedder_config and isinstance(embedder_config, dict) + else None + ) storage = Mem0Storage(type="short_term", crew=crew, config=config) else: storage = ( diff --git a/src/crewai/memory/external/external_memory.py b/src/crewai/memory/external/external_memory.py index 9cdb6872f..f1f4af41a 100644 --- a/src/crewai/memory/external/external_memory.py +++ b/src/crewai/memory/external/external_memory.py @@ -13,6 +13,7 @@ from crewai.events.types.memory_events import ( from crewai.memory.external.external_memory_item import ExternalMemoryItem from crewai.memory.memory import Memory from crewai.memory.storage.interface import Storage +from crewai.rag.embeddings.types import ProviderSpec if TYPE_CHECKING: from crewai.memory.storage.mem0_storage import Mem0Storage @@ -35,7 +36,9 @@ class ExternalMemory(Memory): } @staticmethod - def create_storage(crew: Any, embedder_config: dict[str, Any] | None) -> Storage: + def create_storage( + crew: Any, embedder_config: dict[str, Any] | ProviderSpec | None + ) -> Storage: if not embedder_config: raise ValueError("embedder_config is required") @@ -159,6 +162,6 @@ class ExternalMemory(Memory): super().set_crew(crew) if not self.storage: - self.storage = self.create_storage(crew, self.embedder_config) + self.storage = self.create_storage(crew, self.embedder_config) # type: ignore[arg-type] return self diff --git a/src/crewai/memory/memory.py b/src/crewai/memory/memory.py index fae7cc2f1..dbb2469b5 100644 --- a/src/crewai/memory/memory.py +++ b/src/crewai/memory/memory.py @@ -2,6 +2,8 @@ from typing import TYPE_CHECKING, Any, Optional from pydantic import BaseModel +from crewai.rag.embeddings.types import EmbedderConfig + if TYPE_CHECKING: from crewai.agent import Agent from crewai.task import Task @@ -12,7 +14,7 @@ class Memory(BaseModel): Base class for memory, now supporting agent tags and generic metadata. """ - embedder_config: dict[str, Any] | None = None + embedder_config: EmbedderConfig | dict[str, Any] | None = None crew: Any | None = None storage: Any diff --git a/src/crewai/memory/short_term/short_term_memory.py b/src/crewai/memory/short_term/short_term_memory.py index ceb6de82b..b7ccfef26 100644 --- a/src/crewai/memory/short_term/short_term_memory.py +++ b/src/crewai/memory/short_term/short_term_memory.py @@ -29,7 +29,10 @@ class ShortTermMemory(Memory): _memory_provider: str | None = PrivateAttr() def __init__(self, crew=None, embedder_config=None, storage=None, path=None): - memory_provider = embedder_config.get("provider") if embedder_config else None + memory_provider = None + if embedder_config and isinstance(embedder_config, dict): + memory_provider = embedder_config.get("provider") + if memory_provider == "mem0": try: from crewai.memory.storage.mem0_storage import Mem0Storage @@ -37,7 +40,11 @@ class ShortTermMemory(Memory): raise ImportError( "Mem0 is not installed. Please install it with `pip install mem0ai`." ) from e - config = embedder_config.get("config") if embedder_config else None + config = ( + embedder_config.get("config") + if embedder_config and isinstance(embedder_config, dict) + else None + ) storage = Mem0Storage(type="short_term", crew=crew, config=config) else: storage = ( diff --git a/src/crewai/rag/chromadb/utils.py b/src/crewai/rag/chromadb/utils.py index 978725628..db66745ac 100644 --- a/src/crewai/rag/chromadb/utils.py +++ b/src/crewai/rag/chromadb/utils.py @@ -10,7 +10,6 @@ from chromadb.api.models.AsyncCollection import AsyncCollection from chromadb.api.models.Collection import Collection from chromadb.api.types import ( Include, - IncludeEnum, QueryResult, ) @@ -142,9 +141,12 @@ def _extract_search_params( score_threshold=kwargs.get("score_threshold"), where=kwargs.get("where"), where_document=kwargs.get("where_document"), - include=kwargs.get( - "include", - [IncludeEnum.metadatas, IncludeEnum.documents, IncludeEnum.distances], + include=cast( + Include, + kwargs.get( + "include", + ["metadatas", "documents", "distances"], + ), ), ) @@ -193,7 +195,7 @@ def _convert_chromadb_results_to_search_results( """ search_results: list[SearchResult] = [] - include_strings = [item.value for item in include] if include else [] + include_strings = list(include) if include else [] ids = results["ids"][0] if results.get("ids") else [] diff --git a/src/crewai/rag/embeddings/providers/aws/bedrock.py b/src/crewai/rag/embeddings/providers/aws/bedrock.py index 9319b8c82..68c4713dd 100644 --- a/src/crewai/rag/embeddings/providers/aws/bedrock.py +++ b/src/crewai/rag/embeddings/providers/aws/bedrock.py @@ -1,5 +1,7 @@ """Amazon Bedrock embeddings provider.""" +from typing import Any + from chromadb.utils.embedding_functions.amazon_bedrock_embedding_function import ( AmazonBedrockEmbeddingFunction, ) @@ -7,15 +9,8 @@ from pydantic import Field from crewai.rag.core.base_embeddings_provider import BaseEmbeddingsProvider -try: - from boto3.session import Session # type: ignore[import-untyped] -except ImportError as exc: - raise ImportError( - "boto3 is required for amazon-bedrock embeddings. Install it with: uv add boto3" - ) from exc - -def create_aws_session() -> Session: +def create_aws_session() -> Any: """Create an AWS session for Bedrock. Returns: @@ -53,6 +48,6 @@ class BedrockProvider(BaseEmbeddingsProvider[AmazonBedrockEmbeddingFunction]): description="Model name to use for embeddings", validation_alias="BEDROCK_MODEL_NAME", ) - session: Session = Field( + session: Any = Field( default_factory=create_aws_session, description="AWS session object" ) diff --git a/src/crewai/rag/embeddings/providers/aws/types.py b/src/crewai/rag/embeddings/providers/aws/types.py index c2f80f095..39b4c5fba 100644 --- a/src/crewai/rag/embeddings/providers/aws/types.py +++ b/src/crewai/rag/embeddings/providers/aws/types.py @@ -1,6 +1,8 @@ """Type definitions for AWS embedding providers.""" -from typing import Annotated, Any, Literal, TypedDict +from typing import Annotated, Any, Literal + +from typing_extensions import Required, TypedDict class BedrockProviderConfig(TypedDict, total=False): @@ -10,8 +12,8 @@ class BedrockProviderConfig(TypedDict, total=False): session: Any -class BedrockProviderSpec(TypedDict): +class BedrockProviderSpec(TypedDict, total=False): """Bedrock provider specification.""" - provider: Literal["amazon-bedrock"] + provider: Required[Literal["amazon-bedrock"]] config: BedrockProviderConfig diff --git a/src/crewai/rag/embeddings/providers/cohere/types.py b/src/crewai/rag/embeddings/providers/cohere/types.py index 77947e787..b10931530 100644 --- a/src/crewai/rag/embeddings/providers/cohere/types.py +++ b/src/crewai/rag/embeddings/providers/cohere/types.py @@ -1,6 +1,8 @@ """Type definitions for Cohere embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class CohereProviderConfig(TypedDict, total=False): @@ -10,8 +12,8 @@ class CohereProviderConfig(TypedDict, total=False): model_name: Annotated[str, "large"] -class CohereProviderSpec(TypedDict): +class CohereProviderSpec(TypedDict, total=False): """Cohere provider specification.""" - provider: Literal["cohere"] + provider: Required[Literal["cohere"]] config: CohereProviderConfig diff --git a/src/crewai/rag/embeddings/providers/custom/types.py b/src/crewai/rag/embeddings/providers/custom/types.py index b7e05dc92..c3918942e 100644 --- a/src/crewai/rag/embeddings/providers/custom/types.py +++ b/src/crewai/rag/embeddings/providers/custom/types.py @@ -1,8 +1,9 @@ """Type definitions for custom embedding providers.""" -from typing import Literal, TypedDict +from typing import Literal from chromadb.api.types import EmbeddingFunction +from typing_extensions import Required, TypedDict class CustomProviderConfig(TypedDict, total=False): @@ -11,8 +12,8 @@ class CustomProviderConfig(TypedDict, total=False): embedding_callable: type[EmbeddingFunction] -class CustomProviderSpec(TypedDict): +class CustomProviderSpec(TypedDict, total=False): """Custom provider specification.""" - provider: Literal["custom"] + provider: Required[Literal["custom"]] config: CustomProviderConfig diff --git a/src/crewai/rag/embeddings/providers/google/types.py b/src/crewai/rag/embeddings/providers/google/types.py index 8f82483ef..b97ec9474 100644 --- a/src/crewai/rag/embeddings/providers/google/types.py +++ b/src/crewai/rag/embeddings/providers/google/types.py @@ -1,6 +1,8 @@ """Type definitions for Google embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class GenerativeAiProviderConfig(TypedDict, total=False): @@ -27,8 +29,8 @@ class VertexAIProviderConfig(TypedDict, total=False): region: Annotated[str, "us-central1"] -class VertexAIProviderSpec(TypedDict): +class VertexAIProviderSpec(TypedDict, total=False): """Vertex AI provider specification.""" - provider: Literal["google-vertex"] + provider: Required[Literal["google-vertex"]] config: VertexAIProviderConfig diff --git a/src/crewai/rag/embeddings/providers/huggingface/types.py b/src/crewai/rag/embeddings/providers/huggingface/types.py index 9735e8d8b..48ff4f5b3 100644 --- a/src/crewai/rag/embeddings/providers/huggingface/types.py +++ b/src/crewai/rag/embeddings/providers/huggingface/types.py @@ -1,6 +1,8 @@ """Type definitions for HuggingFace embedding providers.""" -from typing import Literal, TypedDict +from typing import Literal + +from typing_extensions import Required, TypedDict class HuggingFaceProviderConfig(TypedDict, total=False): @@ -9,8 +11,8 @@ class HuggingFaceProviderConfig(TypedDict, total=False): url: str -class HuggingFaceProviderSpec(TypedDict): +class HuggingFaceProviderSpec(TypedDict, total=False): """HuggingFace provider specification.""" - provider: Literal["huggingface"] + provider: Required[Literal["huggingface"]] config: HuggingFaceProviderConfig diff --git a/src/crewai/rag/embeddings/providers/ibm/embedding_callable.py b/src/crewai/rag/embeddings/providers/ibm/embedding_callable.py index ef983f62d..17181afdf 100644 --- a/src/crewai/rag/embeddings/providers/ibm/embedding_callable.py +++ b/src/crewai/rag/embeddings/providers/ibm/embedding_callable.py @@ -2,11 +2,6 @@ from typing import cast -import ibm_watsonx_ai.foundation_models as watson_models # type: ignore[import-not-found, import-untyped] -from ibm_watsonx_ai import Credentials # type: ignore[import-not-found, import-untyped] -from ibm_watsonx_ai.metanames import ( # type: ignore[import-not-found, import-untyped] - EmbedTextParamsMetaNames as EmbedParams, -) from typing_extensions import Unpack from crewai.rag.core.base_embeddings_callable import EmbeddingFunction @@ -34,6 +29,21 @@ class WatsonEmbeddingFunction(EmbeddingFunction[Documents]): Returns: List of embedding vectors. """ + try: + import ibm_watsonx_ai.foundation_models as watson_models # type: ignore[import-not-found, import-untyped] + from ibm_watsonx_ai import ( + Credentials, # type: ignore[import-not-found, import-untyped] + ) + from ibm_watsonx_ai.metanames import ( # type: ignore[import-not-found, import-untyped] + EmbedTextParamsMetaNames as EmbedParams, + ) + + except ImportError as e: + raise ImportError( + "ibm-watsonx-ai is required for watson embeddings. " + "Install it with: uv add ibm-watsonx-ai" + ) from e + if isinstance(input, str): input = [input] diff --git a/src/crewai/rag/embeddings/providers/ibm/types.py b/src/crewai/rag/embeddings/providers/ibm/types.py index 048ce5267..a8e0f28a1 100644 --- a/src/crewai/rag/embeddings/providers/ibm/types.py +++ b/src/crewai/rag/embeddings/providers/ibm/types.py @@ -1,6 +1,8 @@ """Type definitions for IBM Watson embedding providers.""" -from typing import Annotated, Any, Literal, TypedDict +from typing import Annotated, Any, Literal + +from typing_extensions import Required, TypedDict class WatsonProviderConfig(TypedDict, total=False): @@ -35,8 +37,8 @@ class WatsonProviderConfig(TypedDict, total=False): proxies: dict -class WatsonProviderSpec(TypedDict): +class WatsonProviderSpec(TypedDict, total=False): """Watson provider specification.""" - provider: Literal["watson"] + provider: Required[Literal["watson"]] config: WatsonProviderConfig diff --git a/src/crewai/rag/embeddings/providers/ibm/watson.py b/src/crewai/rag/embeddings/providers/ibm/watson.py index 562c3923e..ccc63be74 100644 --- a/src/crewai/rag/embeddings/providers/ibm/watson.py +++ b/src/crewai/rag/embeddings/providers/ibm/watson.py @@ -1,9 +1,7 @@ """IBM Watson embeddings provider.""" -from ibm_watsonx_ai import ( # type: ignore[import-not-found,import-untyped] - APIClient, - Credentials, -) +from typing import Any + from pydantic import Field, model_validator from typing_extensions import Self @@ -28,9 +26,7 @@ class WatsonProvider(BaseEmbeddingsProvider[WatsonEmbeddingFunction]): params: dict[str, str | dict[str, str]] | None = Field( default=None, description="Additional parameters" ) - credentials: Credentials | None = Field( - default=None, description="Watson credentials" - ) + credentials: Any | None = Field(default=None, description="Watson credentials") project_id: str | None = Field( default=None, description="Watson project ID", @@ -39,7 +35,7 @@ class WatsonProvider(BaseEmbeddingsProvider[WatsonEmbeddingFunction]): space_id: str | None = Field( default=None, description="Watson space ID", validation_alias="WATSON_SPACE_ID" ) - api_client: APIClient | None = Field(default=None, description="Watson API client") + api_client: Any | None = Field(default=None, description="Watson API client") verify: bool | str | None = Field( default=None, description="SSL verification", validation_alias="WATSON_VERIFY" ) diff --git a/src/crewai/rag/embeddings/providers/instructor/types.py b/src/crewai/rag/embeddings/providers/instructor/types.py index b75ee89a4..ced3b67a4 100644 --- a/src/crewai/rag/embeddings/providers/instructor/types.py +++ b/src/crewai/rag/embeddings/providers/instructor/types.py @@ -1,6 +1,8 @@ """Type definitions for Instructor embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class InstructorProviderConfig(TypedDict, total=False): @@ -11,8 +13,8 @@ class InstructorProviderConfig(TypedDict, total=False): instruction: str -class InstructorProviderSpec(TypedDict): +class InstructorProviderSpec(TypedDict, total=False): """Instructor provider specification.""" - provider: Literal["instructor"] + provider: Required[Literal["instructor"]] config: InstructorProviderConfig diff --git a/src/crewai/rag/embeddings/providers/jina/types.py b/src/crewai/rag/embeddings/providers/jina/types.py index 2ebc1669e..e89239ccb 100644 --- a/src/crewai/rag/embeddings/providers/jina/types.py +++ b/src/crewai/rag/embeddings/providers/jina/types.py @@ -1,6 +1,8 @@ """Type definitions for Jina embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class JinaProviderConfig(TypedDict, total=False): @@ -10,8 +12,8 @@ class JinaProviderConfig(TypedDict, total=False): model_name: Annotated[str, "jina-embeddings-v2-base-en"] -class JinaProviderSpec(TypedDict): +class JinaProviderSpec(TypedDict, total=False): """Jina provider specification.""" - provider: Literal["jina"] + provider: Required[Literal["jina"]] config: JinaProviderConfig diff --git a/src/crewai/rag/embeddings/providers/microsoft/types.py b/src/crewai/rag/embeddings/providers/microsoft/types.py index 2d7bf6e8b..2f00cf787 100644 --- a/src/crewai/rag/embeddings/providers/microsoft/types.py +++ b/src/crewai/rag/embeddings/providers/microsoft/types.py @@ -1,6 +1,8 @@ """Type definitions for Microsoft Azure embedding providers.""" -from typing import Annotated, Any, Literal, TypedDict +from typing import Annotated, Any, Literal + +from typing_extensions import Required, TypedDict class AzureProviderConfig(TypedDict, total=False): @@ -17,8 +19,8 @@ class AzureProviderConfig(TypedDict, total=False): organization_id: str -class AzureProviderSpec(TypedDict): +class AzureProviderSpec(TypedDict, total=False): """Azure provider specification.""" - provider: Literal["azure"] + provider: Required[Literal["azure"]] config: AzureProviderConfig diff --git a/src/crewai/rag/embeddings/providers/ollama/types.py b/src/crewai/rag/embeddings/providers/ollama/types.py index fdd8953b7..cfbea997f 100644 --- a/src/crewai/rag/embeddings/providers/ollama/types.py +++ b/src/crewai/rag/embeddings/providers/ollama/types.py @@ -1,6 +1,8 @@ """Type definitions for Ollama embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class OllamaProviderConfig(TypedDict, total=False): @@ -10,8 +12,8 @@ class OllamaProviderConfig(TypedDict, total=False): model_name: str -class OllamaProviderSpec(TypedDict): +class OllamaProviderSpec(TypedDict, total=False): """Ollama provider specification.""" - provider: Literal["ollama"] + provider: Required[Literal["ollama"]] config: OllamaProviderConfig diff --git a/src/crewai/rag/embeddings/providers/onnx/types.py b/src/crewai/rag/embeddings/providers/onnx/types.py index 6c3191f58..43afdbc52 100644 --- a/src/crewai/rag/embeddings/providers/onnx/types.py +++ b/src/crewai/rag/embeddings/providers/onnx/types.py @@ -1,6 +1,8 @@ """Type definitions for ONNX embedding providers.""" -from typing import Literal, TypedDict +from typing import Literal + +from typing_extensions import Required, TypedDict class ONNXProviderConfig(TypedDict, total=False): @@ -9,8 +11,8 @@ class ONNXProviderConfig(TypedDict, total=False): preferred_providers: list[str] -class ONNXProviderSpec(TypedDict): +class ONNXProviderSpec(TypedDict, total=False): """ONNX provider specification.""" - provider: Literal["onnx"] + provider: Required[Literal["onnx"]] config: ONNXProviderConfig diff --git a/src/crewai/rag/embeddings/providers/openai/openai_provider.py b/src/crewai/rag/embeddings/providers/openai/openai_provider.py index dc454a30a..24eb06c63 100644 --- a/src/crewai/rag/embeddings/providers/openai/openai_provider.py +++ b/src/crewai/rag/embeddings/providers/openai/openai_provider.py @@ -17,8 +17,8 @@ class OpenAIProvider(BaseEmbeddingsProvider[OpenAIEmbeddingFunction]): default=OpenAIEmbeddingFunction, description="OpenAI embedding function class", ) - api_key: str = Field( - description="OpenAI API key", validation_alias="OPENAI_API_KEY" + api_key: str | None = Field( + default=None, description="OpenAI API key", validation_alias="OPENAI_API_KEY" ) model_name: str = Field( default="text-embedding-ada-002", diff --git a/src/crewai/rag/embeddings/providers/openai/types.py b/src/crewai/rag/embeddings/providers/openai/types.py index 4da0ba770..eed17e83e 100644 --- a/src/crewai/rag/embeddings/providers/openai/types.py +++ b/src/crewai/rag/embeddings/providers/openai/types.py @@ -1,6 +1,8 @@ """Type definitions for OpenAI embedding providers.""" -from typing import Annotated, Any, Literal, TypedDict +from typing import Annotated, Any, Literal + +from typing_extensions import Required, TypedDict class OpenAIProviderConfig(TypedDict, total=False): @@ -17,8 +19,8 @@ class OpenAIProviderConfig(TypedDict, total=False): organization_id: str -class OpenAIProviderSpec(TypedDict): +class OpenAIProviderSpec(TypedDict, total=False): """OpenAI provider specification.""" - provider: Literal["openai"] + provider: Required[Literal["openai"]] config: OpenAIProviderConfig diff --git a/src/crewai/rag/embeddings/providers/openclip/types.py b/src/crewai/rag/embeddings/providers/openclip/types.py index 2bd7b8055..868c9b55c 100644 --- a/src/crewai/rag/embeddings/providers/openclip/types.py +++ b/src/crewai/rag/embeddings/providers/openclip/types.py @@ -1,6 +1,8 @@ """Type definitions for OpenCLIP embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class OpenCLIPProviderConfig(TypedDict, total=False): @@ -14,5 +16,5 @@ class OpenCLIPProviderConfig(TypedDict, total=False): class OpenCLIPProviderSpec(TypedDict): """OpenCLIP provider specification.""" - provider: Literal["openclip"] + provider: Required[Literal["openclip"]] config: OpenCLIPProviderConfig diff --git a/src/crewai/rag/embeddings/providers/roboflow/types.py b/src/crewai/rag/embeddings/providers/roboflow/types.py index fded96517..482864d7b 100644 --- a/src/crewai/rag/embeddings/providers/roboflow/types.py +++ b/src/crewai/rag/embeddings/providers/roboflow/types.py @@ -1,6 +1,8 @@ """Type definitions for Roboflow embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class RoboflowProviderConfig(TypedDict, total=False): @@ -13,5 +15,5 @@ class RoboflowProviderConfig(TypedDict, total=False): class RoboflowProviderSpec(TypedDict): """Roboflow provider specification.""" - provider: Literal["roboflow"] + provider: Required[Literal["roboflow"]] config: RoboflowProviderConfig diff --git a/src/crewai/rag/embeddings/providers/sentence_transformer/types.py b/src/crewai/rag/embeddings/providers/sentence_transformer/types.py index d186879b6..8f3e85189 100644 --- a/src/crewai/rag/embeddings/providers/sentence_transformer/types.py +++ b/src/crewai/rag/embeddings/providers/sentence_transformer/types.py @@ -1,6 +1,8 @@ """Type definitions for SentenceTransformer embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class SentenceTransformerProviderConfig(TypedDict, total=False): @@ -14,5 +16,5 @@ class SentenceTransformerProviderConfig(TypedDict, total=False): class SentenceTransformerProviderSpec(TypedDict): """SentenceTransformer provider specification.""" - provider: Literal["sentence-transformer"] + provider: Required[Literal["sentence-transformer"]] config: SentenceTransformerProviderConfig diff --git a/src/crewai/rag/embeddings/providers/text2vec/types.py b/src/crewai/rag/embeddings/providers/text2vec/types.py index f7aa8a171..ef5a11a4b 100644 --- a/src/crewai/rag/embeddings/providers/text2vec/types.py +++ b/src/crewai/rag/embeddings/providers/text2vec/types.py @@ -1,6 +1,8 @@ """Type definitions for Text2Vec embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class Text2VecProviderConfig(TypedDict, total=False): @@ -12,5 +14,5 @@ class Text2VecProviderConfig(TypedDict, total=False): class Text2VecProviderSpec(TypedDict): """Text2Vec provider specification.""" - provider: Literal["text2vec"] + provider: Required[Literal["text2vec"]] config: Text2VecProviderConfig diff --git a/src/crewai/rag/embeddings/providers/voyageai/embedding_callable.py b/src/crewai/rag/embeddings/providers/voyageai/embedding_callable.py index 39490ac0e..71610b839 100644 --- a/src/crewai/rag/embeddings/providers/voyageai/embedding_callable.py +++ b/src/crewai/rag/embeddings/providers/voyageai/embedding_callable.py @@ -2,7 +2,6 @@ from typing import cast -import voyageai from typing_extensions import Unpack from crewai.rag.core.base_embeddings_callable import EmbeddingFunction @@ -19,6 +18,14 @@ class VoyageAIEmbeddingFunction(EmbeddingFunction[Documents]): Args: **kwargs: Configuration parameters for VoyageAI. """ + try: + import voyageai # type: ignore[import-not-found] + + except ImportError as e: + raise ImportError( + "voyageai is required for voyageai embeddings. " + "Install it with: uv add voyageai" + ) from e self._config = kwargs self._client = voyageai.Client( api_key=kwargs["api_key"], @@ -35,6 +42,7 @@ class VoyageAIEmbeddingFunction(EmbeddingFunction[Documents]): Returns: List of embedding vectors. """ + if isinstance(input, str): input = [input] diff --git a/src/crewai/rag/embeddings/providers/voyageai/types.py b/src/crewai/rag/embeddings/providers/voyageai/types.py index 4d959b8a4..92579ba5d 100644 --- a/src/crewai/rag/embeddings/providers/voyageai/types.py +++ b/src/crewai/rag/embeddings/providers/voyageai/types.py @@ -1,6 +1,8 @@ """Type definitions for VoyageAI embedding providers.""" -from typing import Annotated, Literal, TypedDict +from typing import Annotated, Literal + +from typing_extensions import Required, TypedDict class VoyageAIProviderConfig(TypedDict, total=False): @@ -19,5 +21,5 @@ class VoyageAIProviderConfig(TypedDict, total=False): class VoyageAIProviderSpec(TypedDict): """VoyageAI provider specification.""" - provider: Literal["voyageai"] + provider: Required[Literal["voyageai"]] config: VoyageAIProviderConfig diff --git a/src/crewai/rag/embeddings/types.py b/src/crewai/rag/embeddings/types.py index ceafac805..2a7786c56 100644 --- a/src/crewai/rag/embeddings/types.py +++ b/src/crewai/rag/embeddings/types.py @@ -1,7 +1,8 @@ """Type definitions for the embeddings module.""" -from typing import Literal +from typing import Literal, TypeAlias +from crewai.rag.core.base_embeddings_provider import BaseEmbeddingsProvider from crewai.rag.embeddings.providers.aws.types import BedrockProviderSpec from crewai.rag.embeddings.providers.cohere.types import CohereProviderSpec from crewai.rag.embeddings.providers.custom.types import CustomProviderSpec @@ -66,3 +67,7 @@ AllowedEmbeddingProviders = Literal[ "voyageai", "watson", ] + +EmbedderConfig: TypeAlias = ( + ProviderSpec | BaseEmbeddingsProvider | type[BaseEmbeddingsProvider] +) diff --git a/uv.lock b/uv.lock index 31a9cbda6..238a97900 100644 --- a/uv.lock +++ b/uv.lock @@ -228,18 +228,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, ] -[[package]] -name = "asgiref" -version = "3.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7f/bf/0f3ecda32f1cb3bf1dca480aca08a7a8a3bdc4bed2343a103f30731565c9/asgiref-3.9.2.tar.gz", hash = "sha256:a0249afacb66688ef258ffe503528360443e2b9a8d8c4581b6ebefa58c841ef1", size = 36894, upload-time = "2025-09-23T15:00:55.136Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d1/69d02ce34caddb0a7ae088b84c356a625a93cd4ff57b2f97644c03fad905/asgiref-3.9.2-py3-none-any.whl", hash = "sha256:0b61526596219d70396548fc003635056856dba5d0d086f86476f10b33c75960", size = 23788, upload-time = "2025-09-23T15:00:53.627Z" }, -] - [[package]] name = "asttokens" version = "3.0.0" @@ -581,44 +569,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] -[[package]] -name = "chroma-hnswlib" -version = "0.7.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/73/09/10d57569e399ce9cbc5eee2134996581c957f63a9addfa6ca657daf006b8/chroma_hnswlib-0.7.6.tar.gz", hash = "sha256:4dce282543039681160259d29fcde6151cc9106c6461e0485f57cdccd83059b7", size = 32256, upload-time = "2024-07-22T20:19:29.259Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/74/b9dde05ea8685d2f8c4681b517e61c7887e974f6272bb24ebc8f2105875b/chroma_hnswlib-0.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f35192fbbeadc8c0633f0a69c3d3e9f1a4eab3a46b65458bbcbcabdd9e895c36", size = 195821, upload-time = "2024-07-22T20:18:26.163Z" }, - { url = "https://files.pythonhosted.org/packages/fd/58/101bfa6bc41bc6cc55fbb5103c75462a7bf882e1704256eb4934df85b6a8/chroma_hnswlib-0.7.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f007b608c96362b8f0c8b6b2ac94f67f83fcbabd857c378ae82007ec92f4d82", size = 183854, upload-time = "2024-07-22T20:18:27.6Z" }, - { url = "https://files.pythonhosted.org/packages/17/ff/95d49bb5ce134f10d6aa08d5f3bec624eaff945f0b17d8c3fce888b9a54a/chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:456fd88fa0d14e6b385358515aef69fc89b3c2191706fd9aee62087b62aad09c", size = 2358774, upload-time = "2024-07-22T20:18:29.161Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6d/27826180a54df80dbba8a4f338b022ba21c0c8af96fd08ff8510626dee8f/chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfaae825499c2beaa3b75a12d7ec713b64226df72a5c4097203e3ed532680da", size = 2392739, upload-time = "2024-07-22T20:18:30.938Z" }, - { url = "https://files.pythonhosted.org/packages/d6/63/ee3e8b7a8f931918755faacf783093b61f32f59042769d9db615999c3de0/chroma_hnswlib-0.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:2487201982241fb1581be26524145092c95902cb09fc2646ccfbc407de3328ec", size = 150955, upload-time = "2024-07-22T20:18:32.268Z" }, - { url = "https://files.pythonhosted.org/packages/f5/af/d15fdfed2a204c0f9467ad35084fbac894c755820b203e62f5dcba2d41f1/chroma_hnswlib-0.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81181d54a2b1e4727369486a631f977ffc53c5533d26e3d366dda243fb0998ca", size = 196911, upload-time = "2024-07-22T20:18:33.46Z" }, - { url = "https://files.pythonhosted.org/packages/0d/19/aa6f2139f1ff7ad23a690ebf2a511b2594ab359915d7979f76f3213e46c4/chroma_hnswlib-0.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b4ab4e11f1083dd0a11ee4f0e0b183ca9f0f2ed63ededba1935b13ce2b3606f", size = 185000, upload-time = "2024-07-22T20:18:36.16Z" }, - { url = "https://files.pythonhosted.org/packages/79/b1/1b269c750e985ec7d40b9bbe7d66d0a890e420525187786718e7f6b07913/chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53db45cd9173d95b4b0bdccb4dbff4c54a42b51420599c32267f3abbeb795170", size = 2377289, upload-time = "2024-07-22T20:18:37.761Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2d/d5663e134436e5933bc63516a20b5edc08b4c1b1588b9680908a5f1afd04/chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c093f07a010b499c00a15bc9376036ee4800d335360570b14f7fe92badcdcf9", size = 2411755, upload-time = "2024-07-22T20:18:39.949Z" }, - { url = "https://files.pythonhosted.org/packages/3e/79/1bce519cf186112d6d5ce2985392a89528c6e1e9332d680bf752694a4cdf/chroma_hnswlib-0.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:0540b0ac96e47d0aa39e88ea4714358ae05d64bbe6bf33c52f316c664190a6a3", size = 151888, upload-time = "2024-07-22T20:18:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/93/ac/782b8d72de1c57b64fdf5cb94711540db99a92768d93d973174c62d45eb8/chroma_hnswlib-0.7.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e87e9b616c281bfbe748d01705817c71211613c3b063021f7ed5e47173556cb7", size = 197804, upload-time = "2024-07-22T20:18:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/32/4e/fd9ce0764228e9a98f6ff46af05e92804090b5557035968c5b4198bc7af9/chroma_hnswlib-0.7.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec5ca25bc7b66d2ecbf14502b5729cde25f70945d22f2aaf523c2d747ea68912", size = 185421, upload-time = "2024-07-22T20:18:47.72Z" }, - { url = "https://files.pythonhosted.org/packages/d9/3d/b59a8dedebd82545d873235ef2d06f95be244dfece7ee4a1a6044f080b18/chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305ae491de9d5f3c51e8bd52d84fdf2545a4a2bc7af49765cda286b7bb30b1d4", size = 2389672, upload-time = "2024-07-22T20:18:49.583Z" }, - { url = "https://files.pythonhosted.org/packages/74/1e/80a033ea4466338824974a34f418e7b034a7748bf906f56466f5caa434b0/chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822ede968d25a2c88823ca078a58f92c9b5c4142e38c7c8b4c48178894a0a3c5", size = 2436986, upload-time = "2024-07-22T20:18:51.872Z" }, -] - [[package]] name = "chromadb" -version = "0.5.23" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bcrypt" }, { name = "build" }, - { name = "chroma-hnswlib" }, - { name = "fastapi" }, { name = "grpcio" }, { name = "httpx" }, { name = "importlib-resources" }, + { name = "jsonschema" }, { name = "kubernetes" }, { name = "mmh3" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -626,11 +587,11 @@ dependencies = [ { name = "onnxruntime" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "opentelemetry-instrumentation-fastapi" }, { name = "opentelemetry-sdk" }, { name = "orjson" }, { name = "overrides" }, { name = "posthog" }, + { name = "pybase64" }, { name = "pydantic" }, { name = "pypika" }, { name = "pyyaml" }, @@ -642,9 +603,13 @@ dependencies = [ { name = "typing-extensions" }, { name = "uvicorn", extra = ["standard"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/64/28daa773f784bcd18de944fe26ed301de844d6ee17188e26a9d6b4baf122/chromadb-0.5.23.tar.gz", hash = "sha256:360a12b9795c5a33cb1f839d14410ccbde662ef1accd36153b0ae22312edabd1", size = 33700455, upload-time = "2024-12-05T06:31:19.81Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/da/29ecec2b5609a8e4f6e93af01a95b716b3448fc94ab002efe421abef8e8e/chromadb-1.1.0.tar.gz", hash = "sha256:50be29e2ad45f1ac0b15f57e04f48766cf1e61de0fcc5e8d31dd738a5a773b48", size = 1311824, upload-time = "2025-09-16T21:23:08.273Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/8c/a9eb95a28e6c35a0122417976a9d435eeaceb53f596a8973e33b3dd4cfac/chromadb-0.5.23-py3-none-any.whl", hash = "sha256:ffe5bdd7276d12cb682df0d38a13aa37573e6a3678e71889ac45f539ae05ad7e", size = 628347, upload-time = "2024-12-05T06:31:17.231Z" }, + { url = "https://files.pythonhosted.org/packages/9f/63/7b02737d537aba017e464271fc0a94659b90862a9f8f6648942c00eb0541/chromadb-1.1.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:edfd17f5e04f762622d19969daffc255ae06cc3a63d8f9e5b04f291177f4bd5f", size = 19132671, upload-time = "2025-09-16T21:23:05.679Z" }, + { url = "https://files.pythonhosted.org/packages/52/8a/33ff83d0eaaa83875aedbfa220f651ae0ad6f6c1d997515fd47e8ee4c4b9/chromadb-1.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e847329f1e93252ae416478db54021cf7e86fe50bffc87e1429ead22d1ad0789", size = 18214077, upload-time = "2025-09-16T21:23:02.958Z" }, + { url = "https://files.pythonhosted.org/packages/e2/f0/a31bddc426b03a80286cc23480ace5e174c7b39f070b99967cd7bedb9a18/chromadb-1.1.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97dd7282fda79ef94ce20ee83b7cb62795231ecc657da5781bd2be4c55d9046", size = 18818050, upload-time = "2025-09-16T21:22:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/00/39/5969bec252d6b174eeb68a5b23c88cbe4913a1e20d6b313ec628e5079c74/chromadb-1.1.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:472d44f634e27b7b0ee42c17771c42af19a786f003500eb540add6f475791363", size = 19841393, upload-time = "2025-09-16T21:23:00.108Z" }, + { url = "https://files.pythonhosted.org/packages/90/64/595af82790623f72ee8301fcbfca55192e8e1f2d65562a14bc549e596b06/chromadb-1.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:4f3eaad5817b81d9f90ba2727a8b956b5428db64c0350252b5d919f1fd74632e", size = 19789778, upload-time = "2025-09-16T21:23:10.657Z" }, ] [[package]] @@ -693,7 +658,6 @@ dependencies = [ { name = "json5" }, { name = "jsonref" }, { name = "litellm" }, - { name = "onnxruntime" }, { name = "openai" }, { name = "openpyxl" }, { name = "opentelemetry-api" }, @@ -777,9 +741,9 @@ requires-dist = [ { name = "appdirs", specifier = ">=1.4.4" }, { name = "blinker", specifier = ">=1.9.0" }, { name = "boto3", marker = "extra == 'aws'", specifier = ">=1.40.38" }, - { name = "chromadb", specifier = ">=0.5.23" }, + { name = "chromadb", specifier = "~=1.1.0" }, { name = "click", specifier = ">=8.1.7" }, - { name = "crewai-tools", marker = "extra == 'tools'", specifier = "~=0.73.0" }, + { name = "crewai-tools", marker = "extra == 'tools'", specifier = ">=0.74.0" }, { name = "docling", marker = "extra == 'docling'", specifier = ">=2.12.0" }, { name = "ibm-watsonx-ai", marker = "extra == 'watson'", specifier = ">=1.3.39" }, { name = "instructor", specifier = ">=1.3.3" }, @@ -788,7 +752,6 @@ requires-dist = [ { name = "jsonref", specifier = ">=1.1.0" }, { name = "litellm", specifier = "==1.74.9" }, { name = "mem0ai", marker = "extra == 'mem0'", specifier = ">=0.1.94" }, - { name = "onnxruntime", specifier = "==1.22.0" }, { name = "openai", specifier = ">=1.13.3" }, { name = "openpyxl", specifier = ">=3.1.5" }, { name = "openpyxl", marker = "extra == 'openpyxl'", specifier = ">=3.1.5" }, @@ -837,18 +800,13 @@ dev = [ [[package]] name = "crewai-tools" -version = "0.73.1" +version = "0.74.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, - { name = "chromadb" }, - { name = "click" }, { name = "crewai" }, { name = "docker" }, { name = "lancedb" }, - { name = "openai" }, - { name = "portalocker" }, - { name = "pydantic" }, { name = "pypdf" }, { name = "python-docx" }, { name = "pytube" }, @@ -857,9 +815,9 @@ dependencies = [ { name = "tiktoken" }, { name = "youtube-transcript-api" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/cb/591efe36203b834d3ff0e0b55aad2b13283eeec3818780f7e2200da42751/crewai_tools-0.73.1.tar.gz", hash = "sha256:8c4ea2385d17cd07251df638f927b761abfad3035c15b87854de17e2361c357f", size = 1126262, upload-time = "2025-09-20T21:18:50.887Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/0e/f273a7b880f553f36391dbe4870d9079cd351c3e35765bb752d6de62622b/crewai_tools-0.74.0.tar.gz", hash = "sha256:64c1b627045312bba59d5cf8f624fce8c4bb82cfb6c6c627882208d9c7e3c058", size = 1126948, upload-time = "2025-09-25T23:31:07.83Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/e2/510eb9e2e80fb0d6f0343124d6295d615aa85d53b3ed58c2e4d15c16f6c1/crewai_tools-0.73.1-py3-none-any.whl", hash = "sha256:24b251d49641fb2ce6c9bdc147ec2e3cf0071e7433b8f0e639a8df4df91959df", size = 739618, upload-time = "2025-09-20T21:18:46.958Z" }, + { url = "https://files.pythonhosted.org/packages/b8/86/e3486cf2c7f155c46cf4599914d6fcf0f69ad161984896855bafa1675fcb/crewai_tools-0.74.0-py3-none-any.whl", hash = "sha256:16f4a95db499a04a1ed5ac34c91766448b3b6d159ce2c663f55f999ddd6f9a7d", size = 739647, upload-time = "2025-09-25T23:31:06.39Z" }, ] [[package]] @@ -1214,20 +1172,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f5/11/02ebebb09ff2104b690457cb7bc6ed700c9e0ce88cf581486bb0a5d3c88b/faker-37.8.0-py3-none-any.whl", hash = "sha256:b08233118824423b5fc239f7dd51f145e7018082b4164f8da6a9994e1f1ae793", size = 1953940, upload-time = "2025-09-15T20:24:11.482Z" }, ] -[[package]] -name = "fastapi" -version = "0.117.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7e/7e/d9788300deaf416178f61fb3c2ceb16b7d0dc9f82a08fdb87a5e64ee3cc7/fastapi-0.117.1.tar.gz", hash = "sha256:fb2d42082d22b185f904ca0ecad2e195b851030bd6c5e4c032d1c981240c631a", size = 307155, upload-time = "2025-09-20T20:16:56.663Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/d9d3e8eeefbe93be1c50060a9d9a9f366dba66f288bb518a9566a23a8631/fastapi-0.117.1-py3-none-any.whl", hash = "sha256:33c51a0d21cab2b9722d4e56dbb9316f3687155be6b276191790d8da03507552", size = 95959, upload-time = "2025-09-20T20:16:53.661Z" }, -] - [[package]] name = "fastembed" version = "0.7.3" @@ -3256,53 +3200,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload-time = "2025-09-11T10:28:46.726Z" }, ] -[[package]] -name = "opentelemetry-instrumentation" -version = "0.58b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "packaging" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/36/7c307d9be8ce4ee7beb86d7f1d31027f2a6a89228240405a858d6e4d64f9/opentelemetry_instrumentation-0.58b0.tar.gz", hash = "sha256:df640f3ac715a3e05af145c18f527f4422c6ab6c467e40bd24d2ad75a00cb705", size = 31549, upload-time = "2025-09-11T11:42:14.084Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/db/5ff1cd6c5ca1d12ecf1b73be16fbb2a8af2114ee46d4b0e6d4b23f4f4db7/opentelemetry_instrumentation-0.58b0-py3-none-any.whl", hash = "sha256:50f97ac03100676c9f7fc28197f8240c7290ca1baa12da8bfbb9a1de4f34cc45", size = 33019, upload-time = "2025-09-11T11:41:00.624Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.58b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asgiref" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/e2/03ff707d881d590c7adaed5e9d1979aed7e5e53fc1ed89035e5ed9f304af/opentelemetry_instrumentation_asgi-0.58b0.tar.gz", hash = "sha256:3ccc0c9c1c8c71e8d9da5945c6dcd9c0c8d147839f208536b7042c6dd98e65c9", size = 25116, upload-time = "2025-09-11T11:42:18.437Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/71/a00884c6655387c70070138acbf79a6616ad5d4489680f40708d75b598a7/opentelemetry_instrumentation_asgi-0.58b0-py3-none-any.whl", hash = "sha256:508a6d79e333d648d2afee0e140b6e80eb5d443be183be58e81d9ff88373168a", size = 16798, upload-time = "2025-09-11T11:41:08.105Z" }, -] - -[[package]] -name = "opentelemetry-instrumentation-fastapi" -version = "0.58b0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-instrumentation-asgi" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "opentelemetry-util-http" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/09/4f8fcab834af6b403e5e2d94bdfb2d0835ba8cd1049bcc156995f47b65fb/opentelemetry_instrumentation_fastapi-0.58b0.tar.gz", hash = "sha256:03da470d694116a0a40f4e76319e42f3ff9efc49abf804b2acc2c07f96661497", size = 24598, upload-time = "2025-09-11T11:42:35.325Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/fb/82de06eba54e5cb979274f073065ebc374794853502d342b5155073d1194/opentelemetry_instrumentation_fastapi-0.58b0-py3-none-any.whl", hash = "sha256:d89bfec69c9ffc5d9f3fe58655d6660a66b2bca863b9132712c06edcde68b6fa", size = 13460, upload-time = "2025-09-11T11:41:28.507Z" }, -] - [[package]] name = "opentelemetry-proto" version = "1.37.0" @@ -3342,15 +3239,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload-time = "2025-09-11T10:28:59.218Z" }, ] -[[package]] -name = "opentelemetry-util-http" -version = "0.58b0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c6/5f/02f31530faf50ef8a41ab34901c05cbbf8e9d76963ba2fb852b0b4065f4e/opentelemetry_util_http-0.58b0.tar.gz", hash = "sha256:de0154896c3472c6599311c83e0ecee856c4da1b17808d39fdc5cce5312e4d89", size = 9411, upload-time = "2025-09-11T11:43:05.602Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/a3/0a1430c42c6d34d8372a16c104e7408028f0c30270d8f3eb6cccf2e82934/opentelemetry_util_http-0.58b0-py3-none-any.whl", hash = "sha256:6c6b86762ed43025fbd593dc5f700ba0aa3e09711aedc36fd48a13b23d8cb1e7", size = 7652, upload-time = "2025-09-11T11:42:09.682Z" }, -] - [[package]] name = "orjson" version = "3.11.3" @@ -3685,7 +3573,7 @@ wheels = [ [[package]] name = "posthog" -version = "6.7.6" +version = "5.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backoff" }, @@ -3693,11 +3581,10 @@ dependencies = [ { name = "python-dateutil" }, { name = "requests" }, { name = "six" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/ce/11d6fa30ab517018796e1d675498992da585479e7079770ec8fa99a61561/posthog-6.7.6.tar.gz", hash = "sha256:ee5c5ad04b857d96d9b7a4f715e23916a2f206bfcf25e5a9d328a3d27664b0d3", size = 119129, upload-time = "2025-09-22T18:11:12.365Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/20/60ae67bb9d82f00427946218d49e2e7e80fb41c15dc5019482289ec9ce8d/posthog-5.4.0.tar.gz", hash = "sha256:701669261b8d07cdde0276e5bc096b87f9e200e3b9589c5ebff14df658c5893c", size = 88076, upload-time = "2025-06-20T23:19:23.485Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/84/586422d8861b5391c8414360b10f603c0b7859bb09ad688e64430ed0df7b/posthog-6.7.6-py3-none-any.whl", hash = "sha256:b09a7e65a042ec416c28874b397d3accae412a80a8b0ef3fa686fbffc99e4d4b", size = 137348, upload-time = "2025-09-22T18:11:10.807Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e480cab9a08d1c09b1c59a93dade92c1bb7544826684ff2acbfd10fcfbd4/posthog-5.4.0-py3-none-any.whl", hash = "sha256:284dfa302f64353484420b52d4ad81ff5c2c2d1d607c4e2db602ac72761831bd", size = 105364, upload-time = "2025-06-20T23:19:22.001Z" }, ] [[package]] @@ -3981,6 +3868,131 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, ] +[[package]] +name = "pybase64" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/14/43297a7b7f0c1bf0c00b596f754ee3ac946128c64d21047ccf9c9bbc5165/pybase64-1.4.2.tar.gz", hash = "sha256:46cdefd283ed9643315d952fe44de80dc9b9a811ce6e3ec97fd1827af97692d0", size = 137246, upload-time = "2025-07-27T13:08:57.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/6d/0a7159c24ed35c8b9190b148376ad9b96598354f94ede29df74861da9ec6/pybase64-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82b4593b480773b17698fef33c68bae0e1c474ba07663fad74249370c46b46c9", size = 38240, upload-time = "2025-07-27T13:02:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/86/2e/dad4cd832a90a49d98867e824180585e7c928504987d37304bccae11a314/pybase64-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a126f29d29cb4a498db179135dbf955442a0de5b00f374523f5dcceb9074ff58", size = 31658, upload-time = "2025-07-27T13:02:20.823Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d8/30ea35dc2c8c568be93e1379efcaa35092e37efa2ce7f1985ccc63babee7/pybase64-1.4.2-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:1eef93c29cc5567480d168f9cc1ebd3fc3107c65787aed2019a8ea68575a33e0", size = 65963, upload-time = "2025-07-27T13:02:22.376Z" }, + { url = "https://files.pythonhosted.org/packages/f6/da/1c22f2a21d6bb9ec2a214d15ae02d5b20a95335de218a0ecbf769c535a5c/pybase64-1.4.2-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:17b871a34aaeb0644145cb6bf28feb163f593abea11aec3dbcc34a006edfc828", size = 68887, upload-time = "2025-07-27T13:02:23.606Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8d/e04d489ba99b444ce94b4d5b232365d00b0f0e8564275d7ba7434dcabe72/pybase64-1.4.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1f734e16293637a35d282ce594eb05a7a90ea3ae2bc84a3496a5df9e6b890725", size = 57503, upload-time = "2025-07-27T13:02:24.83Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b8/5ec9c334f30cf898709a084d596bf4b47aec2e07870f07bac5cf39754eca/pybase64-1.4.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:22bd38db2d990d5545dde83511edeec366630d00679dbd945472315c09041dc6", size = 54517, upload-time = "2025-07-27T13:02:26.006Z" }, + { url = "https://files.pythonhosted.org/packages/b9/5a/6e4424ecca041e53aa7c14525f99edd43d0117c23c5d9cb14e931458a536/pybase64-1.4.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:dc65cee686dda72007b7541b2014f33ee282459c781b9b61305bd8b9cfadc8e1", size = 57167, upload-time = "2025-07-27T13:02:27.47Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d0/13f1a9467cf565eecc21dce89fb0723458d8c563d2ccfb99b96e8318dfd5/pybase64-1.4.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1e79641c420a22e49c67c046895efad05bf5f8b1dbe0dd78b4af3ab3f2923fe2", size = 57718, upload-time = "2025-07-27T13:02:28.631Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/d80335c36ad9400b18b4f92e9f680cf7646102fe4919f7bce5786a2ccb7b/pybase64-1.4.2-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:12f5e7db522ef780a8b333dab5f7d750d270b23a1684bc2235ba50756c7ba428", size = 53021, upload-time = "2025-07-27T13:02:29.823Z" }, + { url = "https://files.pythonhosted.org/packages/68/57/504ff75f7c78df28be126fe6634083d28d7f84c17e04a74a7dcb50ab2377/pybase64-1.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a618b1e1a63e75dd40c2a397d875935ed0835464dc55cb1b91e8f880113d0444", size = 56306, upload-time = "2025-07-27T13:02:31.314Z" }, + { url = "https://files.pythonhosted.org/packages/bf/bc/2d21cda8b73c8c9f5cd3d7e6e26dd6dfc96491052112f282332a3d5bf1d9/pybase64-1.4.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:89b0a51702c7746fa914e75e680ad697b979cdead6b418603f56a6fc9de2f50f", size = 50101, upload-time = "2025-07-27T13:02:32.662Z" }, + { url = "https://files.pythonhosted.org/packages/88/6d/51942e7737bb0711ca3e55db53924fd7f07166d79da5508ab8f5fd5972a8/pybase64-1.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5161b8b82f8ba5dbbc3f76e0270622a2c2fdb9ffaf092d8f774ad7ec468c027", size = 66555, upload-time = "2025-07-27T13:02:34.122Z" }, + { url = "https://files.pythonhosted.org/packages/b6/c8/c46024d196402e7be4d3fad85336863a34816c3436c51fcf9c7c0781bf11/pybase64-1.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2168de920c9b1e57850e9ff681852923a953601f73cc96a0742a42236695c316", size = 55684, upload-time = "2025-07-27T13:02:35.427Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/953782c9d599ff5217ee87f19e317c494cd4840afcab4c48f99cb78ca201/pybase64-1.4.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:7a1e3dc977562abe40ab43483223013be71b215a5d5f3c78a666e70a5076eeec", size = 52475, upload-time = "2025-07-27T13:02:36.634Z" }, + { url = "https://files.pythonhosted.org/packages/05/fb/57d36173631aab67ca4558cdbde1047fc67a09b77f9c53addd57c7e9fdd4/pybase64-1.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4cf1e8a57449e48137ef4de00a005e24c3f1cffc0aafc488e36ceb5bb2cbb1da", size = 53943, upload-time = "2025-07-27T13:02:37.777Z" }, + { url = "https://files.pythonhosted.org/packages/75/73/23e5bb0bffac0cabe2d11d1c618f6ef73da9f430da03c5249931e3c49b63/pybase64-1.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d8e1a381ba124f26a93d5925efbf6e6c36287fc2c93d74958e8b677c30a53fc0", size = 68411, upload-time = "2025-07-27T13:02:39.302Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e7/0d5c99e5e61ff5e46949a0128b49fc2c47afc0d2b815333459b17aa9d467/pybase64-1.4.2-cp310-cp310-win32.whl", hash = "sha256:8fdd9c5b60ec9a1db854f5f96bba46b80a9520069282dc1d37ff433eb8248b1f", size = 33614, upload-time = "2025-07-27T13:02:40.478Z" }, + { url = "https://files.pythonhosted.org/packages/23/40/879b6de61d7c07a2cbf76b75e9739c4938c3a1f66ac03243f2ff7ec9fb6b/pybase64-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:37a6c73f14c6539c0ad1aebf0cce92138af25c99a6e7aee637d9f9fc634c8a40", size = 35790, upload-time = "2025-07-27T13:02:41.864Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e2/75cec12880ce3f47a79a2b9a0cdc766dc0429a7ce967bb3ab3a4b55a7f6b/pybase64-1.4.2-cp310-cp310-win_arm64.whl", hash = "sha256:b3280d03b7b361622c469d005cc270d763d9e29d0a490c26addb4f82dfe71a79", size = 30900, upload-time = "2025-07-27T13:02:43.022Z" }, + { url = "https://files.pythonhosted.org/packages/da/fb/edaa56bbf04715efc3c36966cc0150e01d7a8336c3da182f850b7fd43d32/pybase64-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:26284ef64f142067293347bcc9d501d2b5d44b92eab9d941cb10a085fb01c666", size = 38238, upload-time = "2025-07-27T13:02:44.224Z" }, + { url = "https://files.pythonhosted.org/packages/28/a4/ca1538e9adf08f5016b3543b0060c18aea9a6e805dd20712a197c509d90d/pybase64-1.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52dd32fe5cbfd8af8f3f034a4a65ee61948c72e5c358bf69d59543fc0dbcf950", size = 31659, upload-time = "2025-07-27T13:02:45.445Z" }, + { url = "https://files.pythonhosted.org/packages/0b/8f/f9b49926a60848ba98350dd648227ec524fb78340b47a450c4dbaf24b1bb/pybase64-1.4.2-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:37f133e8c96427995480bb6d396d9d49e949a3e829591845bb6a5a7f215ca177", size = 68318, upload-time = "2025-07-27T13:02:46.644Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/6ed2dd2bc8007f33b8316d6366b0901acbdd5665b419c2893b3dd48708de/pybase64-1.4.2-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6ee3874b0abbdd4c903d3989682a3f016fd84188622879f6f95a5dc5718d7e5", size = 71357, upload-time = "2025-07-27T13:02:47.937Z" }, + { url = "https://files.pythonhosted.org/packages/fb/69/be9ac8127da8d8339db7129683bd2975cecb0bf40a82731e1a492577a177/pybase64-1.4.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c69f177b1e404b22b05802127d6979acf4cb57f953c7de9472410f9c3fdece7", size = 59817, upload-time = "2025-07-27T13:02:49.163Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a2/e3e09e000b509609276ee28b71beb0b61462d4a43b3e0db0a44c8652880c/pybase64-1.4.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:80c817e88ef2ca3cc9a285fde267690a1cb821ce0da4848c921c16f0fec56fda", size = 56639, upload-time = "2025-07-27T13:02:50.384Z" }, + { url = "https://files.pythonhosted.org/packages/01/70/ad7eff88aa4f1be06db705812e1f01749606933bf8fe9df553bb04b703e6/pybase64-1.4.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7a4bb6e7e45bfdaea0f2aaf022fc9a013abe6e46ccea31914a77e10f44098688", size = 59368, upload-time = "2025-07-27T13:02:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/9d/82/0cd1b4bcd2a4da7805cfa04587be783bf9583b34ac16cadc29cf119a4fa2/pybase64-1.4.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2710a80d41a2b41293cb0e5b84b5464f54aa3f28f7c43de88784d2d9702b8a1c", size = 59981, upload-time = "2025-07-27T13:02:53.16Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4c/8029a03468307dfaf0f9694d31830487ee43af5f8a73407004907724e8ac/pybase64-1.4.2-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:aa6122c8a81f6597e1c1116511f03ed42cf377c2100fe7debaae7ca62521095a", size = 54908, upload-time = "2025-07-27T13:02:54.363Z" }, + { url = "https://files.pythonhosted.org/packages/a1/8b/70bd0fe659e242efd0f60895a8ce1fe88e3a4084fd1be368974c561138c9/pybase64-1.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7e22b02505d64db308e9feeb6cb52f1d554ede5983de0befa59ac2d2ffb6a5f", size = 58650, upload-time = "2025-07-27T13:02:55.905Z" }, + { url = "https://files.pythonhosted.org/packages/64/ca/9c1d23cbc4b9beac43386a32ad53903c816063cef3f14c10d7c3d6d49a23/pybase64-1.4.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:edfe4a3c8c4007f09591f49b46a89d287ef5e8cd6630339536fe98ff077263c2", size = 52323, upload-time = "2025-07-27T13:02:57.192Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/a6292e9047248c8616dc53131a49da6c97a61616f80e1e36c73d7ef895fe/pybase64-1.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b79b4a53dd117ffbd03e96953f2e6bd2827bfe11afeb717ea16d9b0893603077", size = 68979, upload-time = "2025-07-27T13:02:58.594Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e0/cfec7b948e170395d8e88066e01f50e71195db9837151db10c14965d6222/pybase64-1.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fd9afa7a61d89d170607faf22287290045757e782089f0357b8f801d228d52c3", size = 58037, upload-time = "2025-07-27T13:02:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/74/7e/0ac1850198c9c35ef631174009cee576f4d8afff3bf493ce310582976ab4/pybase64-1.4.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5c17b092e4da677a595178d2db17a5d2fafe5c8e418d46c0c4e4cde5adb8cff3", size = 54416, upload-time = "2025-07-27T13:03:00.978Z" }, + { url = "https://files.pythonhosted.org/packages/1b/45/b0b037f27e86c50e62d927f0bc1bde8b798dd55ab39197b116702e508d05/pybase64-1.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:120799274cf55f3f5bb8489eaa85142f26170564baafa7cf3e85541c46b6ab13", size = 56257, upload-time = "2025-07-27T13:03:02.201Z" }, + { url = "https://files.pythonhosted.org/packages/d2/0d/5034598aac56336d88fd5aaf6f34630330643b51d399336b8c788d798fc5/pybase64-1.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:522e4e712686acec2d25de9759dda0b0618cb9f6588523528bc74715c0245c7b", size = 70889, upload-time = "2025-07-27T13:03:03.437Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3b/0645f21bb08ecf45635b624958b5f9e569069d31ecbf125dc7e0e5b83f60/pybase64-1.4.2-cp311-cp311-win32.whl", hash = "sha256:bfd828792982db8d787515535948c1e340f1819407c8832f94384c0ebeaf9d74", size = 33631, upload-time = "2025-07-27T13:03:05.194Z" }, + { url = "https://files.pythonhosted.org/packages/8f/08/24f8103c1f19e78761026cdd9f3b3be73239bc19cf5ab6fef0e8042d0bc6/pybase64-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7a9e89d40dbf833af481d1d5f1a44d173c9c4b56a7c8dba98e39a78ee87cfc52", size = 35781, upload-time = "2025-07-27T13:03:06.779Z" }, + { url = "https://files.pythonhosted.org/packages/66/cd/832fb035a0ea7eb53d776a5cfa961849e22828f6dfdfcdb9eb43ba3c0166/pybase64-1.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:ce5809fa90619b03eab1cd63fec142e6cf1d361731a9b9feacf27df76c833343", size = 30903, upload-time = "2025-07-27T13:03:07.903Z" }, + { url = "https://files.pythonhosted.org/packages/28/6d/11ede991e800797b9f5ebd528013b34eee5652df93de61ffb24503393fa5/pybase64-1.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2c75d1388855b5a1015b65096d7dbcc708e7de3245dcbedeb872ec05a09326", size = 38326, upload-time = "2025-07-27T13:03:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/fe/84/87f1f565f42e2397e2aaa2477c86419f5173c3699881c42325c090982f0a/pybase64-1.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b621a972a01841368fdb9dedc55fd3c6e0c7217d0505ba3b1ebe95e7ef1b493", size = 31661, upload-time = "2025-07-27T13:03:10.295Z" }, + { url = "https://files.pythonhosted.org/packages/cb/2a/a24c810e7a61d2cc6f73fe9ee4872a03030887fa8654150901b15f376f65/pybase64-1.4.2-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:f48c32ac6a16cbf57a5a96a073fef6ff7e3526f623cd49faa112b7f9980bafba", size = 68192, upload-time = "2025-07-27T13:03:11.467Z" }, + { url = "https://files.pythonhosted.org/packages/ee/87/d9baf98cbfc37b8657290ad4421f3a3c36aa0eafe4872c5859cfb52f3448/pybase64-1.4.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ace8b23093a6bb862477080d9059b784096ab2f97541e8bfc40d42f062875149", size = 71587, upload-time = "2025-07-27T13:03:12.719Z" }, + { url = "https://files.pythonhosted.org/packages/0b/89/3df043cc56ef3b91b7aa0c26ae822a2d7ec8da0b0fd7c309c879b0eb5988/pybase64-1.4.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1772c7532a7fb6301baea3dd3e010148dbf70cd1136a83c2f5f91bdc94822145", size = 59910, upload-time = "2025-07-27T13:03:14.266Z" }, + { url = "https://files.pythonhosted.org/packages/75/4f/6641e9edf37aeb4d4524dc7ba2168eff8d96c90e77f6283c2be3400ab380/pybase64-1.4.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:f86f7faddcba5cbfea475f8ab96567834c28bf09ca6c7c3d66ee445adac80d8f", size = 56701, upload-time = "2025-07-27T13:03:15.6Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7f/20d8ac1046f12420a0954a45a13033e75f98aade36eecd00c64e3549b071/pybase64-1.4.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0b8c8e275b5294089f314814b4a50174ab90af79d6a4850f6ae11261ff6a7372", size = 59288, upload-time = "2025-07-27T13:03:16.823Z" }, + { url = "https://files.pythonhosted.org/packages/17/ea/9c0ca570e3e50b3c6c3442e280c83b321a0464c86a9db1f982a4ff531550/pybase64-1.4.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:864d85a0470c615807ae8b97d724d068b940a2d10ac13a5f1b9e75a3ce441758", size = 60267, upload-time = "2025-07-27T13:03:18.132Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46894929d71ccedebbfb0284173b0fea96bc029cd262654ba8451a7035d6/pybase64-1.4.2-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:47254d97ed2d8351e30ecfdb9e2414547f66ba73f8a09f932c9378ff75cd10c5", size = 54801, upload-time = "2025-07-27T13:03:19.669Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/02c95218ea964f0b2469717c2c69b48e63f4ca9f18af01a5b2a29e4c1216/pybase64-1.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:264b65ecc4f0ee73f3298ab83bbd8008f7f9578361b8df5b448f985d8c63e02a", size = 58599, upload-time = "2025-07-27T13:03:20.951Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/ccc21004930789b8fb439d43e3212a6c260ccddb2bf450c39a20db093f33/pybase64-1.4.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fbcc2b30cd740c16c9699f596f22c7a9e643591311ae72b1e776f2d539e9dd9d", size = 52388, upload-time = "2025-07-27T13:03:23.064Z" }, + { url = "https://files.pythonhosted.org/packages/c4/45/22e46e549710c4c237d77785b6fb1bc4c44c288a5c44237ba9daf5c34b82/pybase64-1.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cda9f79c22d51ee4508f5a43b673565f1d26af4330c99f114e37e3186fdd3607", size = 68802, upload-time = "2025-07-27T13:03:24.673Z" }, + { url = "https://files.pythonhosted.org/packages/55/0c/232c6261b81296e5593549b36e6e7884a5da008776d12665923446322c36/pybase64-1.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0c91c6d2a7232e2a1cd10b3b75a8bb657defacd4295a1e5e80455df2dfc84d4f", size = 57841, upload-time = "2025-07-27T13:03:25.948Z" }, + { url = "https://files.pythonhosted.org/packages/20/8a/b35a615ae6f04550d696bb179c414538b3b477999435fdd4ad75b76139e4/pybase64-1.4.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a370dea7b1cee2a36a4d5445d4e09cc243816c5bc8def61f602db5a6f5438e52", size = 54320, upload-time = "2025-07-27T13:03:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a9/8bd4f9bcc53689f1b457ecefed1eaa080e4949d65a62c31a38b7253d5226/pybase64-1.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9aa4de83f02e462a6f4e066811c71d6af31b52d7484de635582d0e3ec3d6cc3e", size = 56482, upload-time = "2025-07-27T13:03:28.942Z" }, + { url = "https://files.pythonhosted.org/packages/75/e5/4a7735b54a1191f61c3f5c2952212c85c2d6b06eb5fb3671c7603395f70c/pybase64-1.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83a1c2f9ed00fee8f064d548c8654a480741131f280e5750bb32475b7ec8ee38", size = 70959, upload-time = "2025-07-27T13:03:30.171Z" }, + { url = "https://files.pythonhosted.org/packages/d3/67/e2b6cb32c782e12304d467418e70da0212567f42bd4d3b5eb1fdf64920ad/pybase64-1.4.2-cp312-cp312-win32.whl", hash = "sha256:a6e5688b18d558e8c6b8701cc8560836c4bbeba61d33c836b4dba56b19423716", size = 33683, upload-time = "2025-07-27T13:03:31.775Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bc/d5c277496063a09707486180f17abbdbdebbf2f5c4441b20b11d3cb7dc7c/pybase64-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:c995d21b8bd08aa179cd7dd4db0695c185486ecc72da1e8f6c37ec86cadb8182", size = 35817, upload-time = "2025-07-27T13:03:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/e6/69/e4be18ae685acff0ae77f75d4586590f29d2cd187bf603290cf1d635cad4/pybase64-1.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:e254b9258c40509c2ea063a7784f6994988f3f26099d6e08704e3c15dfed9a55", size = 30900, upload-time = "2025-07-27T13:03:34.499Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/5337f27a8b8d2d6693f46f7b36bae47895e5820bfa259b0072574a4e1057/pybase64-1.4.2-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:0f331aa59549de21f690b6ccc79360ffed1155c3cfbc852eb5c097c0b8565a2b", size = 33888, upload-time = "2025-07-27T13:03:35.698Z" }, + { url = "https://files.pythonhosted.org/packages/4c/09/f3f4b11fc9beda7e8625e29fb0f549958fcbb34fea3914e1c1d95116e344/pybase64-1.4.2-cp313-cp313-android_21_x86_64.whl", hash = "sha256:9dad20bf1f3ed9e6fe566c4c9d07d9a6c04f5a280daebd2082ffb8620b0a880d", size = 40796, upload-time = "2025-07-27T13:03:36.927Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ff/470768f0fe6de0aa302a8cb1bdf2f9f5cffc3f69e60466153be68bc953aa/pybase64-1.4.2-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:69d3f0445b0faeef7bb7f93bf8c18d850785e2a77f12835f49e524cc54af04e7", size = 30914, upload-time = "2025-07-27T13:03:38.475Z" }, + { url = "https://files.pythonhosted.org/packages/75/6b/d328736662665e0892409dc410353ebef175b1be5eb6bab1dad579efa6df/pybase64-1.4.2-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2372b257b1f4dd512f317fb27e77d313afd137334de64c87de8374027aacd88a", size = 31380, upload-time = "2025-07-27T13:03:39.7Z" }, + { url = "https://files.pythonhosted.org/packages/ca/96/7ff718f87c67f4147c181b73d0928897cefa17dc75d7abc6e37730d5908f/pybase64-1.4.2-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:fb794502b4b1ec91c4ca5d283ae71aef65e3de7721057bd9e2b3ec79f7a62d7d", size = 38230, upload-time = "2025-07-27T13:03:41.637Z" }, + { url = "https://files.pythonhosted.org/packages/4d/58/a3307b048d799ff596a3c7c574fcba66f9b6b8c899a3c00a698124ca7ad5/pybase64-1.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d5c532b03fd14a5040d6cf6571299a05616f925369c72ddf6fe2fb643eb36fed", size = 38319, upload-time = "2025-07-27T13:03:42.847Z" }, + { url = "https://files.pythonhosted.org/packages/08/a7/0bda06341b0a2c830d348c6e1c4d348caaae86c53dc9a046e943467a05e9/pybase64-1.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f699514dc1d5689ca9cf378139e0214051922732f9adec9404bc680a8bef7c0", size = 31655, upload-time = "2025-07-27T13:03:44.426Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/e1d6e8479e0c5113c2c63c7b44886935ce839c2d99884c7304ca9e86547c/pybase64-1.4.2-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:cd3e8713cbd32c8c6aa935feaf15c7670e2b7e8bfe51c24dc556811ebd293a29", size = 68232, upload-time = "2025-07-27T13:03:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/ab/db4dbdfccb9ca874d6ce34a0784761471885d96730de85cee3d300381529/pybase64-1.4.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d377d48acf53abf4b926c2a7a24a19deb092f366a04ffd856bf4b3aa330b025d", size = 71608, upload-time = "2025-07-27T13:03:47.01Z" }, + { url = "https://files.pythonhosted.org/packages/11/e9/508df958563951045d728bbfbd3be77465f9231cf805cb7ccaf6951fc9f1/pybase64-1.4.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d83c076e78d619b9e1dd674e2bf5fb9001aeb3e0b494b80a6c8f6d4120e38cd9", size = 59912, upload-time = "2025-07-27T13:03:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/f2/58/7f2cef1ceccc682088958448d56727369de83fa6b29148478f4d2acd107a/pybase64-1.4.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:ab9cdb6a8176a5cb967f53e6ad60e40c83caaa1ae31c5e1b29e5c8f507f17538", size = 56413, upload-time = "2025-07-27T13:03:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/08/7c/7e0af5c5728fa7e2eb082d88eca7c6bd17429be819d58518e74919d42e66/pybase64-1.4.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:adf0c103ad559dbfb9fe69edfd26a15c65d9c991a5ab0a25b04770f9eb0b9484", size = 59311, upload-time = "2025-07-27T13:03:51.238Z" }, + { url = "https://files.pythonhosted.org/packages/03/8b/09825d0f37e45b9a3f546e5f990b6cf2dd838e54ea74122c2464646e0c77/pybase64-1.4.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:0d03ef2f253d97ce0685d3624bf5e552d716b86cacb8a6c971333ba4b827e1fc", size = 60282, upload-time = "2025-07-27T13:03:52.56Z" }, + { url = "https://files.pythonhosted.org/packages/9c/3f/3711d2413f969bfd5b9cc19bc6b24abae361b7673ff37bcb90c43e199316/pybase64-1.4.2-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:e565abf906efee76ae4be1aef5df4aed0fda1639bc0d7732a3dafef76cb6fc35", size = 54845, upload-time = "2025-07-27T13:03:54.167Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3c/4c7ce1ae4d828c2bb56d144322f81bffbaaac8597d35407c3d7cbb0ff98f/pybase64-1.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3c6a5f15fd03f232fc6f295cce3684f7bb08da6c6d5b12cc771f81c9f125cc6", size = 58615, upload-time = "2025-07-27T13:03:55.494Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8f/c2fc03bf4ed038358620065c75968a30184d5d3512d09d3ef9cc3bd48592/pybase64-1.4.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bad9e3db16f448728138737bbd1af9dc2398efd593a8bdd73748cc02cd33f9c6", size = 52434, upload-time = "2025-07-27T13:03:56.808Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0a/757d6df0a60327c893cfae903e15419914dd792092dc8cc5c9523d40bc9b/pybase64-1.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2683ef271328365c31afee0ed8fa29356fb8fb7c10606794656aa9ffb95e92be", size = 68824, upload-time = "2025-07-27T13:03:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/a0/14/84abe2ed8c29014239be1cfab45dfebe5a5ca779b177b8b6f779bd8b69da/pybase64-1.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:265b20089cd470079114c09bb74b101b3bfc3c94ad6b4231706cf9eff877d570", size = 57898, upload-time = "2025-07-27T13:04:00.379Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c6/d193031f90c864f7b59fa6d1d1b5af41f0f5db35439988a8b9f2d1b32a13/pybase64-1.4.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e53173badead10ef8b839aa5506eecf0067c7b75ad16d9bf39bc7144631f8e67", size = 54319, upload-time = "2025-07-27T13:04:01.742Z" }, + { url = "https://files.pythonhosted.org/packages/cb/37/ec0c7a610ff8f994ee6e0c5d5d66b6b6310388b96ebb347b03ae39870fdf/pybase64-1.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5823b8dcf74da7da0f761ed60c961e8928a6524e520411ad05fe7f9f47d55b40", size = 56472, upload-time = "2025-07-27T13:04:03.089Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/e585b74f85cedd261d271e4c2ef333c5cfce7e80750771808f56fee66b98/pybase64-1.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1237f66c54357d325390da60aa5e21c6918fbcd1bf527acb9c1f4188c62cb7d5", size = 70966, upload-time = "2025-07-27T13:04:04.361Z" }, + { url = "https://files.pythonhosted.org/packages/ad/20/1b2fdd98b4ba36008419668c813025758214c543e362c66c49214ecd1127/pybase64-1.4.2-cp313-cp313-win32.whl", hash = "sha256:b0b851eb4f801d16040047f6889cca5e9dfa102b3e33f68934d12511245cef86", size = 33681, upload-time = "2025-07-27T13:04:06.126Z" }, + { url = "https://files.pythonhosted.org/packages/ff/64/3df4067d169c047054889f34b5a946cbe3785bca43404b93c962a5461a41/pybase64-1.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:19541c6e26d17d9522c02680fe242206ae05df659c82a657aabadf209cd4c6c7", size = 35822, upload-time = "2025-07-27T13:04:07.752Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fd/db505188adf812e60ee923f196f9deddd8a1895b2b29b37f5db94afc3b1c/pybase64-1.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:77a191863d576c0a5dd81f8a568a5ca15597cc980ae809dce62c717c8d42d8aa", size = 30899, upload-time = "2025-07-27T13:04:09.062Z" }, + { url = "https://files.pythonhosted.org/packages/d9/27/5f5fecd206ec1e06e1608a380af18dcb76a6ab08ade6597a3251502dcdb2/pybase64-1.4.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2e194bbabe3fdf9e47ba9f3e157394efe0849eb226df76432126239b3f44992c", size = 38677, upload-time = "2025-07-27T13:04:10.334Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0f/abe4b5a28529ef5f74e8348fa6a9ef27d7d75fbd98103d7664cf485b7d8f/pybase64-1.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:39aef1dadf4a004f11dd09e703abaf6528a87c8dbd39c448bb8aebdc0a08c1be", size = 32066, upload-time = "2025-07-27T13:04:11.641Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7e/ea0ce6a7155cada5526017ec588b6d6185adea4bf9331565272f4ef583c2/pybase64-1.4.2-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:91cb920c7143e36ec8217031282c8651da3b2206d70343f068fac0e7f073b7f9", size = 72300, upload-time = "2025-07-27T13:04:12.969Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/e64c7a056c9ec48dfe130d1295e47a8c2b19c3984488fc08e5eaa1e86c88/pybase64-1.4.2-cp313-cp313t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6958631143fb9e71f9842000da042ec2f6686506b6706e2dfda29e97925f6aa0", size = 75520, upload-time = "2025-07-27T13:04:14.374Z" }, + { url = "https://files.pythonhosted.org/packages/43/e0/e5f93b2e1cb0751a22713c4baa6c6eaf5f307385e369180486c8316ed21e/pybase64-1.4.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dc35f14141ef3f1ac70d963950a278a2593af66fe5a1c7a208e185ca6278fa25", size = 65384, upload-time = "2025-07-27T13:04:16.204Z" }, + { url = "https://files.pythonhosted.org/packages/ff/23/8c645a1113ad88a1c6a3d0e825e93ef8b74ad3175148767853a0a4d7626e/pybase64-1.4.2-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:5d949d2d677859c3a8507e1b21432a039d2b995e0bd3fe307052b6ded80f207a", size = 60471, upload-time = "2025-07-27T13:04:17.947Z" }, + { url = "https://files.pythonhosted.org/packages/8b/81/edd0f7d8b0526b91730a0dd4ce6b4c8be2136cd69d424afe36235d2d2a06/pybase64-1.4.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:09caacdd3e15fe7253a67781edd10a6a918befab0052a2a3c215fe5d1f150269", size = 63945, upload-time = "2025-07-27T13:04:19.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a5/edc224cd821fd65100b7af7c7e16b8f699916f8c0226c9c97bbae5a75e71/pybase64-1.4.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:e44b0e793b23f28ea0f15a9754bd0c960102a2ac4bccb8fafdedbd4cc4d235c0", size = 64858, upload-time = "2025-07-27T13:04:20.807Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/92853f968f1af7e42b7e54d21bdd319097b367e7dffa2ca20787361df74c/pybase64-1.4.2-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:849f274d0bcb90fc6f642c39274082724d108e41b15f3a17864282bd41fc71d5", size = 58557, upload-time = "2025-07-27T13:04:22.229Z" }, + { url = "https://files.pythonhosted.org/packages/76/09/0ec6bd2b2303b0ea5c6da7535edc9a608092075ef8c0cdd96e3e726cd687/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:528dba7ef1357bd7ce1aea143084501f47f5dd0fff7937d3906a68565aa59cfe", size = 63624, upload-time = "2025-07-27T13:04:23.952Z" }, + { url = "https://files.pythonhosted.org/packages/73/6e/52cb1ced2a517a3118b2e739e9417432049013ac7afa15d790103059e8e4/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:1da54be743d9a68671700cfe56c3ab8c26e8f2f5cc34eface905c55bc3a9af94", size = 56174, upload-time = "2025-07-27T13:04:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/5b/9d/820fe79347467e48af985fe46180e1dd28e698ade7317bebd66de8a143f5/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9b07c0406c3eaa7014499b0aacafb21a6d1146cfaa85d56f0aa02e6d542ee8f3", size = 72640, upload-time = "2025-07-27T13:04:26.824Z" }, + { url = "https://files.pythonhosted.org/packages/53/58/e863e10d08361e694935c815b73faad7e1ab03f99ae154d86c4e2f331896/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:312f2aa4cf5d199a97fbcaee75d2e59ebbaafcd091993eb373b43683498cdacb", size = 62453, upload-time = "2025-07-27T13:04:28.562Z" }, + { url = "https://files.pythonhosted.org/packages/95/f0/c392c4ac8ccb7a34b28377c21faa2395313e3c676d76c382642e19a20703/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad59362fc267bf15498a318c9e076686e4beeb0dfe09b457fabbc2b32468b97a", size = 58103, upload-time = "2025-07-27T13:04:29.996Z" }, + { url = "https://files.pythonhosted.org/packages/32/30/00ab21316e7df8f526aa3e3dc06f74de6711d51c65b020575d0105a025b2/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:01593bd064e7dcd6c86d04e94e44acfe364049500c20ac68ca1e708fbb2ca970", size = 60779, upload-time = "2025-07-27T13:04:31.549Z" }, + { url = "https://files.pythonhosted.org/packages/a6/65/114ca81839b1805ce4a2b7d58bc16e95634734a2059991f6382fc71caf3e/pybase64-1.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5b81547ad8ea271c79fdf10da89a1e9313cb15edcba2a17adf8871735e9c02a0", size = 74684, upload-time = "2025-07-27T13:04:32.976Z" }, + { url = "https://files.pythonhosted.org/packages/54/8f/aa9d445b9bb693b8f6bb1456bd6d8576d79b7a63bf6c69af3a539235b15f/pybase64-1.4.2-cp313-cp313t-win32.whl", hash = "sha256:7edbe70b5654545a37e6e6b02de738303b1bbdfcde67f6cfec374cfb5cc4099e", size = 33961, upload-time = "2025-07-27T13:04:34.806Z" }, + { url = "https://files.pythonhosted.org/packages/0e/e5/da37cfb173c646fd4fc7c6aae2bc41d40de2ee49529854af8f4e6f498b45/pybase64-1.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:385690addf87c25d6366fab5d8ff512eed8a7ecb18da9e8152af1c789162f208", size = 36199, upload-time = "2025-07-27T13:04:36.223Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/1eb68fb7d00f2cec8bd9838e2a30d183d6724ae06e745fd6e65216f170ff/pybase64-1.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c2070d0aa88580f57fe15ca88b09f162e604d19282915a95a3795b5d3c1c05b5", size = 31221, upload-time = "2025-07-27T13:04:37.704Z" }, + { url = "https://files.pythonhosted.org/packages/32/34/b67371f4fcedd5e2def29b1cf92a4311a72f590c04850f370c75297b48ce/pybase64-1.4.2-graalpy311-graalpy242_311_native-macosx_10_9_x86_64.whl", hash = "sha256:b4eed40a5f1627ee65613a6ac834a33f8ba24066656f569c852f98eb16f6ab5d", size = 38667, upload-time = "2025-07-27T13:07:25.315Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3e/e57fe09ed1c7e740d21c37023c5f7c8963b4c36380f41d10261cc76f93b4/pybase64-1.4.2-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:57885fa521e9add235af4db13e9e048d3a2934cd27d7c5efac1925e1b4d6538d", size = 32094, upload-time = "2025-07-27T13:07:28.235Z" }, + { url = "https://files.pythonhosted.org/packages/51/34/f40d3262c3953814b9bcdcf858436bd5bc1133a698be4bcc7ed2a8c0730d/pybase64-1.4.2-graalpy311-graalpy242_311_native-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eef9255d926c64e2fca021d3aee98023bacb98e1518e5986d6aab04102411b04", size = 43212, upload-time = "2025-07-27T13:07:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2a/5e05d25718cb8ffd68bd46553ddfd2b660893d937feda1716b8a3b21fb38/pybase64-1.4.2-graalpy311-graalpy242_311_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89614ea2d2329b6708746c540e0f14d692125df99fb1203ff0de948d9e68dfc9", size = 35789, upload-time = "2025-07-27T13:07:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9d/f56c3ee6e94faaae2896ecaf666428330cb24096abf7d2427371bb2b403a/pybase64-1.4.2-graalpy311-graalpy242_311_native-win_amd64.whl", hash = "sha256:e401cecd2d7ddcd558768b2140fd4430746be4d17fb14c99eec9e40789df136d", size = 35861, upload-time = "2025-07-27T13:07:37.099Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/bfe2bd0d76385750f3541724b4abfe4ea111b3cc01ff7e83f410054adc30/pybase64-1.4.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4b29c93414ba965777643a9d98443f08f76ac04519ad717aa859113695372a07", size = 38226, upload-time = "2025-07-27T13:07:40.121Z" }, + { url = "https://files.pythonhosted.org/packages/22/13/c717855760b78ded1a9d308984c7e3e99fcf79c6cac5a231ed8c1238218f/pybase64-1.4.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5e0c3353c0bf099c5c3f8f750202c486abee8f23a566b49e9e7b1222fbf5f259", size = 31524, upload-time = "2025-07-27T13:07:43.946Z" }, + { url = "https://files.pythonhosted.org/packages/cf/da/2b7e69abfc62abe4d54b10d1e09ec78021a6b9b2d7e6e7b632243a19433e/pybase64-1.4.2-pp310-pypy310_pp73-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4f98c5c6152d3c01d933fcde04322cd9ddcf65b5346034aac69a04c1a7cbb012", size = 40667, upload-time = "2025-07-27T13:07:46.715Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/ba738655fb3ba85c7a0605eddd2709fef606e654840c72ee5c5ff7ab29bf/pybase64-1.4.2-pp310-pypy310_pp73-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9096a4977b7aff7ef250f759fb6a4b6b7b6199d99c84070c7fc862dd3b208b34", size = 41290, upload-time = "2025-07-27T13:07:49.534Z" }, + { url = "https://files.pythonhosted.org/packages/5d/38/2d5502fcaf712297b95c1b6ca924656dd7d17501fd7f9c9e0b3bbf8892ef/pybase64-1.4.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49d8597e2872966399410502310b1e2a5b7e8d8ba96766ee1fe242e00bd80775", size = 35438, upload-time = "2025-07-27T13:07:52.327Z" }, + { url = "https://files.pythonhosted.org/packages/b6/db/e03b8b6daa60a3fbef21741403e0cf18b2aff3beebdf6e3596bb9bab16c7/pybase64-1.4.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ef16366565389a287df82659e055e88bdb6c36e46a3394950903e0a9cb2e5bf", size = 36121, upload-time = "2025-07-27T13:07:55.54Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bf/5ebaa2d9ddb5fc506633bc8b820fc27e64da964937fb30929c0367c47d00/pybase64-1.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0a5393be20b0705870f5a8969749af84d734c077de80dd7e9f5424a247afa85e", size = 38162, upload-time = "2025-07-27T13:07:58.364Z" }, + { url = "https://files.pythonhosted.org/packages/25/41/795c5fd6e5571bb675bf9add8a048166dddf8951c2a903fea8557743886b/pybase64-1.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:448f0259a2f1a17eb086f70fe2ad9b556edba1fc5bc4e62ce6966179368ee9f8", size = 31452, upload-time = "2025-07-27T13:08:01.259Z" }, + { url = "https://files.pythonhosted.org/packages/aa/dd/c819003b59b2832256b72ad23cbeadbd95d083ef0318d07149a58b7a88af/pybase64-1.4.2-pp311-pypy311_pp73-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:1159e70cba8e76c3d8f334bd1f8fd52a1bb7384f4c3533831b23ab2df84a6ef3", size = 40668, upload-time = "2025-07-27T13:08:04.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/38c6aba28678c4a4db49312a6b8171b93a0ffe9f21362cf4c0f325caa850/pybase64-1.4.2-pp311-pypy311_pp73-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d943bc5dad8388971494554b97f22ae06a46cc7779ad0de3d4bfdf7d0bbea30", size = 41281, upload-time = "2025-07-27T13:08:07.395Z" }, + { url = "https://files.pythonhosted.org/packages/e5/23/5927bd9e59714e4e8cefd1d21ccd7216048bb1c6c3e7104b1b200afdc63d/pybase64-1.4.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10b99182c561d86422c5de4265fd1f8f172fb38efaed9d72c71fb31e279a7f94", size = 35433, upload-time = "2025-07-27T13:08:10.551Z" }, + { url = "https://files.pythonhosted.org/packages/01/0f/fab7ed5bf4926523c3b39f7621cea3e0da43f539fbc2270e042f1afccb79/pybase64-1.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bb082c1114f046e59fcbc4f2be13edc93b36d7b54b58605820605be948f8fdf6", size = 36131, upload-time = "2025-07-27T13:08:13.777Z" }, +] + [[package]] name = "pyclipper" version = "1.3.0.post6" @@ -5317,19 +5329,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/35/4012a5b1a2378ca773ee4e63ae96fd65a14004f8f5f94dfd938196844057/stagehand-0.5.3-py3-none-any.whl", hash = "sha256:bb3fa95b27f6dc5097c6535373f7a585c77aa235792959ac004e5b7df25094cd", size = 106894, upload-time = "2025-09-16T21:57:08.999Z" }, ] -[[package]] -name = "starlette" -version = "0.48.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/a5/d6f429d43394057b67a6b5bbe6eae2f77a6bf7459d961fdb224bf206eee6/starlette-0.48.0.tar.gz", hash = "sha256:7e8cee469a8ab2352911528110ce9088fdc6a37d9876926e73da7ce4aa4c7a46", size = 2652949, upload-time = "2025-09-13T08:41:05.699Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, -] - [[package]] name = "stevedore" version = "5.5.0"