mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-01 07:13:00 +00:00
Compare commits
3 Commits
devin/1746
...
devin/1739
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74dfcc723a | ||
|
|
0e97bc799b | ||
|
|
9cf4c092ba |
@@ -53,8 +53,6 @@ openpyxl = [
|
||||
mem0 = ["mem0ai>=0.1.29"]
|
||||
docling = [
|
||||
"docling>=2.12.0",
|
||||
# Required for transformers compatibility
|
||||
"tokenizers>=0.21,<0.22",
|
||||
]
|
||||
|
||||
[tool.uv]
|
||||
|
||||
@@ -107,6 +107,17 @@ class BaseAgent(ABC, BaseModel):
|
||||
default=False,
|
||||
description="Enable agent to delegate and ask questions among each other.",
|
||||
)
|
||||
allowed_agents: Optional[List[str]] = Field(
|
||||
default=None,
|
||||
description="List of agent roles that this agent is allowed to delegate tasks to.",
|
||||
docstring="""
|
||||
Specifies which agent roles this agent can delegate tasks to. When set:
|
||||
- Must be a list of role names as strings
|
||||
- Cannot be empty if delegation is enabled
|
||||
- Case-insensitive matching is used for role names
|
||||
- If None, agent can delegate to any other agent (when allow_delegation is True)
|
||||
""",
|
||||
)
|
||||
tools: Optional[List[Any]] = Field(
|
||||
default_factory=list, description="Tools at agents' disposal"
|
||||
)
|
||||
@@ -174,6 +185,9 @@ class BaseAgent(ABC, BaseModel):
|
||||
f"{field} must be provided either directly or through config"
|
||||
)
|
||||
|
||||
# Validate allowed_agents configuration
|
||||
self._validate_allowed_agents()
|
||||
|
||||
# Set private attributes
|
||||
self._logger = Logger(verbose=self.verbose)
|
||||
if self.max_rpm and not self._rpm_controller:
|
||||
@@ -214,6 +228,24 @@ class BaseAgent(ABC, BaseModel):
|
||||
]
|
||||
return md5("|".join(source).encode(), usedforsecurity=False).hexdigest()
|
||||
|
||||
def _validate_allowed_agents(self) -> None:
|
||||
"""Validate allowed_agents configuration.
|
||||
|
||||
Raises:
|
||||
ValueError: If allowed_agents is not properly configured:
|
||||
- Not a list of strings when specified
|
||||
- Empty list when delegation is enabled
|
||||
- Contains non-string entries
|
||||
"""
|
||||
if self.allow_delegation and self.allowed_agents is not None:
|
||||
if not isinstance(self.allowed_agents, list):
|
||||
raise ValueError("allowed_agents must be a list of strings")
|
||||
if not all(isinstance(agent, str) for agent in self.allowed_agents):
|
||||
raise ValueError("all entries in allowed_agents must be strings")
|
||||
if len(self.allowed_agents) == 0:
|
||||
raise ValueError("allowed_agents cannot be empty when delegation is enabled")
|
||||
|
||||
|
||||
@abstractmethod
|
||||
def execute_task(
|
||||
self,
|
||||
|
||||
@@ -15,15 +15,8 @@ from crewai.utilities.logger import Logger
|
||||
|
||||
|
||||
class CrewDoclingSource(BaseKnowledgeSource):
|
||||
"""Default Source class for converting documents to Markdown or JSON
|
||||
This will auto support PDF, DOCX, TXT, XLSX, Images, and HTML files without any additional dependencies and follows the docling package as the source of truth.
|
||||
|
||||
Requirements:
|
||||
- Install with: `pip install crewai[docling]`
|
||||
- Requires tokenizers>=0.21,<0.22 for transformers compatibility
|
||||
|
||||
Notes:
|
||||
- This is an optional dependency, only needed for document processing features.
|
||||
"""Default Source class for converting documents to markdown or json
|
||||
This will auto support PDF, DOCX, and TXT, XLSX, Images, and HTML files without any additional dependencies and follows the docling package as the source of truth.
|
||||
"""
|
||||
|
||||
_logger: Logger = Logger(verbose=True)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from typing import Optional, Union
|
||||
|
||||
from pydantic import Field
|
||||
from pydantic import UUID4, Field
|
||||
|
||||
from crewai.agents.agent_builder.base_agent import BaseAgent
|
||||
from crewai.task import Task
|
||||
@@ -12,10 +11,44 @@ class BaseAgentTool(BaseTool):
|
||||
"""Base class for agent-related tools"""
|
||||
|
||||
agents: list[BaseAgent] = Field(description="List of available agents")
|
||||
agent_id: UUID4 = Field(description="ID of the agent using this tool")
|
||||
i18n: I18N = Field(
|
||||
default_factory=I18N, description="Internationalization settings"
|
||||
)
|
||||
|
||||
def _get_agent_by_id(self, agent_id: UUID4) -> Optional[BaseAgent]:
|
||||
"""Helper method to find agent by ID."""
|
||||
return next((a for a in self.agents if a.id == agent_id), None)
|
||||
|
||||
def _get_agent_by_role(self, role: str) -> Optional[BaseAgent]:
|
||||
"""Helper method to find agent by role (case-insensitive)."""
|
||||
return next(
|
||||
(a for a in self.agents if a.role.casefold() == role.casefold()),
|
||||
None
|
||||
)
|
||||
|
||||
def _check_delegation_authorization(
|
||||
self, delegating_agent: BaseAgent, target_role: str
|
||||
) -> Optional[str]:
|
||||
"""Verify if delegation is authorized.
|
||||
|
||||
Args:
|
||||
delegating_agent: The agent attempting to delegate
|
||||
target_role: The role of the agent being delegated to
|
||||
|
||||
Returns:
|
||||
Optional[str]: Error message if delegation is not authorized, None otherwise
|
||||
"""
|
||||
if (delegating_agent.allowed_agents is not None and
|
||||
not any(allowed.casefold() == target_role.casefold()
|
||||
for allowed in delegating_agent.allowed_agents)):
|
||||
return self.i18n.errors("agent_tool_unauthorized_delegation").format(
|
||||
coworker=target_role,
|
||||
allowed_agents="\n".join([f"- {role}" for role in delegating_agent.allowed_agents])
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
def _get_coworker(self, coworker: Optional[str], **kwargs) -> Optional[str]:
|
||||
coworker = coworker or kwargs.get("co_worker") or kwargs.get("coworker")
|
||||
if coworker:
|
||||
@@ -58,6 +91,17 @@ class BaseAgentTool(BaseTool):
|
||||
)
|
||||
)
|
||||
|
||||
# Get delegating agent and check authorization
|
||||
delegating_agent = self._get_agent_by_id(self.agent_id)
|
||||
if not delegating_agent:
|
||||
return self.i18n.errors("agent_tool_unexisting_coworker").format(
|
||||
coworkers="\n".join([f"- {agent.role}" for agent in self.agents])
|
||||
)
|
||||
|
||||
auth_error = self._check_delegation_authorization(delegating_agent, agent[0].role)
|
||||
if auth_error:
|
||||
return auth_error
|
||||
|
||||
agent = agent[0]
|
||||
task_with_assigned_agent = Task( # type: ignore # Incompatible types in assignment (expression has type "Task", variable has type "str")
|
||||
description=task,
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
"tool_usage_error": "I encountered an error: {error}",
|
||||
"tool_arguments_error": "Error: the Action Input is not a valid key, value dictionary.",
|
||||
"wrong_tool_name": "You tried to use the tool {tool}, but it doesn't exist. You must use one of the following tools, use one at time: {tools}.",
|
||||
"tool_usage_exception": "I encountered an error while trying to use the tool. This was the error: {error}.\n Tool {tool} accepts these inputs: {tool_inputs}"
|
||||
"tool_usage_exception": "I encountered an error while trying to use the tool. This was the error: {error}.\n Tool {tool} accepts these inputs: {tool_inputs}",
|
||||
"agent_tool_unauthorized_delegation": "Authorization Error: Cannot delegate task to {coworker}.\nThis agent is only authorized to delegate to:\n{allowed_agents}\nPlease select an authorized agent for delegation."
|
||||
},
|
||||
"tools": {
|
||||
"delegate_work": "Delegate a specific task to one of the following coworkers: {coworkers}\nThe input to this tool should be the coworker, the task you want them to do, and ALL necessary context to execute the task, they know nothing about the task, so share absolute everything you know, don't reference things but instead explain them.",
|
||||
|
||||
212
tests/agents/test_delegation.py
Normal file
212
tests/agents/test_delegation.py
Normal file
@@ -0,0 +1,212 @@
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from crewai.agent import Agent
|
||||
from crewai.crew import Crew
|
||||
from crewai.task import Task
|
||||
from crewai.tools.agent_tools.delegate_work_tool import DelegateWorkTool
|
||||
|
||||
def test_delegate_work_with_allowed_agents():
|
||||
"""Test successful delegation to allowed agent."""
|
||||
# Create agents
|
||||
executive = Agent(
|
||||
role="Executive Director",
|
||||
goal="Manage the team",
|
||||
backstory="An experienced manager",
|
||||
allow_delegation=True,
|
||||
allowed_agents=["Communications Manager"]
|
||||
)
|
||||
comms_manager = Agent(
|
||||
role="Communications Manager",
|
||||
goal="Handle communications",
|
||||
backstory="A skilled communicator",
|
||||
allow_delegation=False
|
||||
)
|
||||
|
||||
# Mock LLM to avoid actual API calls
|
||||
mock_content = "Thought: I will handle this task\nFinal Answer: Task completed successfully"
|
||||
mock_response = {
|
||||
"choices": [{
|
||||
"message": {
|
||||
"content": mock_content
|
||||
}
|
||||
}]
|
||||
}
|
||||
executive.llm = MagicMock()
|
||||
executive.llm.invoke = MagicMock(return_value=mock_response)
|
||||
executive.llm.call = MagicMock(return_value=mock_content)
|
||||
comms_manager.llm = MagicMock()
|
||||
comms_manager.llm.invoke = MagicMock(return_value=mock_response)
|
||||
comms_manager.llm.call = MagicMock(return_value=mock_content)
|
||||
|
||||
# Create crew and tool
|
||||
crew = Crew(agents=[executive, comms_manager])
|
||||
tool = DelegateWorkTool(
|
||||
name="Delegate work to coworker",
|
||||
description="Tool for delegating work to coworkers",
|
||||
agents=[executive, comms_manager],
|
||||
agent_id=executive.id
|
||||
)
|
||||
|
||||
# Test delegation
|
||||
result = tool._execute(
|
||||
agent_name="Communications Manager",
|
||||
task="Write a press release",
|
||||
context="Important company announcement"
|
||||
)
|
||||
|
||||
# Verify delegation was allowed
|
||||
assert "authorization error" not in result.lower()
|
||||
assert "cannot delegate" not in result.lower()
|
||||
|
||||
def test_delegate_work_with_unauthorized_agent():
|
||||
"""Test failed delegation to unauthorized agent."""
|
||||
# Create agents
|
||||
executive = Agent(
|
||||
role="Executive Director",
|
||||
goal="Manage the team",
|
||||
backstory="An experienced manager",
|
||||
allow_delegation=True,
|
||||
allowed_agents=["Communications Manager"]
|
||||
)
|
||||
tech_manager = Agent(
|
||||
role="Tech Manager",
|
||||
goal="Manage technology",
|
||||
backstory="A tech expert",
|
||||
allow_delegation=False
|
||||
)
|
||||
|
||||
# Mock LLM to avoid actual API calls
|
||||
mock_content = "Thought: I will handle this task\nFinal Answer: Task completed successfully"
|
||||
mock_response = {
|
||||
"choices": [{
|
||||
"message": {
|
||||
"content": mock_content
|
||||
}
|
||||
}]
|
||||
}
|
||||
executive.llm = MagicMock()
|
||||
executive.llm.invoke = MagicMock(return_value=mock_response)
|
||||
executive.llm.call = MagicMock(return_value=mock_content)
|
||||
tech_manager.llm = MagicMock()
|
||||
tech_manager.llm.invoke = MagicMock(return_value=mock_response)
|
||||
tech_manager.llm.call = MagicMock(return_value=mock_content)
|
||||
|
||||
# Create crew and tool
|
||||
crew = Crew(agents=[executive, tech_manager])
|
||||
tool = DelegateWorkTool(
|
||||
name="Delegate work to coworker",
|
||||
description="Tool for delegating work to coworkers",
|
||||
agents=[executive, tech_manager],
|
||||
agent_id=executive.id
|
||||
)
|
||||
|
||||
# Test delegation
|
||||
result = tool._execute(
|
||||
agent_name="Tech Manager",
|
||||
task="Update servers",
|
||||
context="Server maintenance needed"
|
||||
)
|
||||
|
||||
# Verify delegation was blocked with proper error message
|
||||
assert "authorization error" in result.lower()
|
||||
assert "tech manager" in result.lower()
|
||||
assert "communications manager" in result.lower()
|
||||
|
||||
@pytest.mark.parametrize("scenario", [
|
||||
{
|
||||
"name": "empty_allowed_agents",
|
||||
"delegating_agent": {
|
||||
"role": "Manager",
|
||||
"allow_delegation": True,
|
||||
"allowed_agents": []
|
||||
},
|
||||
"target_agent": "Worker",
|
||||
"should_succeed": False,
|
||||
"error_contains": "cannot be empty"
|
||||
},
|
||||
{
|
||||
"name": "case_insensitive_match",
|
||||
"delegating_agent": {
|
||||
"role": "Manager",
|
||||
"allow_delegation": True,
|
||||
"allowed_agents": ["Worker"]
|
||||
},
|
||||
"target_agent": "WORKER",
|
||||
"should_succeed": True
|
||||
},
|
||||
{
|
||||
"name": "unauthorized_delegation",
|
||||
"delegating_agent": {
|
||||
"role": "Manager",
|
||||
"allow_delegation": True,
|
||||
"allowed_agents": ["Worker A"]
|
||||
},
|
||||
"target_agent": "Worker B",
|
||||
"should_succeed": False,
|
||||
"error_contains": "Authorization Error"
|
||||
},
|
||||
{
|
||||
"name": "no_allowed_agents_specified",
|
||||
"delegating_agent": {
|
||||
"role": "Manager",
|
||||
"allow_delegation": True,
|
||||
"allowed_agents": None
|
||||
},
|
||||
"target_agent": "Worker",
|
||||
"should_succeed": True
|
||||
}
|
||||
])
|
||||
def test_delegation_scenarios(scenario):
|
||||
"""Test various delegation scenarios."""
|
||||
# Create agents
|
||||
delegating_agent = Agent(
|
||||
role=scenario["delegating_agent"]["role"],
|
||||
goal="Manage the team",
|
||||
backstory="An experienced manager",
|
||||
allow_delegation=scenario["delegating_agent"]["allow_delegation"],
|
||||
allowed_agents=scenario["delegating_agent"]["allowed_agents"]
|
||||
)
|
||||
target_agent = Agent(
|
||||
role=scenario["target_agent"],
|
||||
goal="Do the work",
|
||||
backstory="A skilled worker",
|
||||
allow_delegation=False
|
||||
)
|
||||
|
||||
# Mock LLM to avoid actual API calls
|
||||
mock_content = "Thought: I will handle this task\nFinal Answer: Task completed successfully"
|
||||
mock_response = {
|
||||
"choices": [{
|
||||
"message": {
|
||||
"content": mock_content
|
||||
}
|
||||
}]
|
||||
}
|
||||
for agent in [delegating_agent, target_agent]:
|
||||
agent.llm = MagicMock()
|
||||
agent.llm.invoke = MagicMock(return_value=mock_response)
|
||||
agent.llm.call = MagicMock(return_value=mock_content)
|
||||
|
||||
# Create crew and tool
|
||||
crew = Crew(agents=[delegating_agent, target_agent])
|
||||
tool = DelegateWorkTool(
|
||||
name="Delegate work to coworker",
|
||||
description="Tool for delegating work to coworkers",
|
||||
agents=[delegating_agent, target_agent],
|
||||
agent_id=delegating_agent.id
|
||||
)
|
||||
|
||||
# Test delegation
|
||||
result = tool._execute(
|
||||
agent_name=scenario["target_agent"],
|
||||
task="Complete task",
|
||||
context="Important task"
|
||||
)
|
||||
|
||||
# Verify results
|
||||
if scenario["should_succeed"]:
|
||||
assert "authorization error" not in result.lower()
|
||||
assert "cannot delegate" not in result.lower()
|
||||
else:
|
||||
assert scenario["error_contains"].lower() in result.lower()
|
||||
@@ -1,26 +0,0 @@
|
||||
"""Test suite to verify compatibility between tokenizers and transformers packages.
|
||||
Ensures the installed tokenizers version meets requirements and can work effectively with transformers.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
def test_tokenizers_transformers_compatibility():
|
||||
"""Test that the installed tokenizers version is compatible with transformers."""
|
||||
try:
|
||||
import tokenizers
|
||||
import transformers
|
||||
except ImportError:
|
||||
pytest.skip("tokenizers or transformers not installed")
|
||||
|
||||
tokenizers_version = tokenizers.__version__
|
||||
transformers_version = transformers.__version__
|
||||
|
||||
tokenizers_major, tokenizers_minor, _ = map(int, tokenizers_version.split('.'))
|
||||
|
||||
assert tokenizers_major == 0, f"Expected tokenizers major version 0, got {tokenizers_major}"
|
||||
assert tokenizers_minor >= 21, f"Expected tokenizers minor version >=21, got {tokenizers_minor}"
|
||||
assert tokenizers_minor < 22, f"Expected tokenizers minor version <22, got {tokenizers_minor}"
|
||||
|
||||
print(f"Tokenizers version: {tokenizers_version}")
|
||||
print(f"Transformers version: {transformers_version}")
|
||||
68
uv.lock
generated
68
uv.lock
generated
@@ -1,18 +1,10 @@
|
||||
version = 1
|
||||
requires-python = ">=3.10, <3.13"
|
||||
resolution-markers = [
|
||||
"python_full_version < '3.11' and sys_platform == 'darwin'",
|
||||
"python_full_version < '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux'",
|
||||
"(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')",
|
||||
"python_full_version == '3.11.*' and sys_platform == 'darwin'",
|
||||
"python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux'",
|
||||
"(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux')",
|
||||
"python_full_version >= '3.12' and python_full_version < '3.12.4' and sys_platform == 'darwin'",
|
||||
"python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine == 'aarch64' and sys_platform == 'linux'",
|
||||
"(python_full_version >= '3.12' and python_full_version < '3.12.4' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12' and python_full_version < '3.12.4' and sys_platform != 'darwin' and sys_platform != 'linux')",
|
||||
"python_full_version >= '3.12.4' and sys_platform == 'darwin'",
|
||||
"python_full_version >= '3.12.4' and platform_machine == 'aarch64' and sys_platform == 'linux'",
|
||||
"(python_full_version >= '3.12.4' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.12.4' and sys_platform != 'darwin' and sys_platform != 'linux')",
|
||||
"python_full_version < '3.11'",
|
||||
"python_full_version == '3.11.*'",
|
||||
"python_full_version >= '3.12' and python_full_version < '3.12.4'",
|
||||
"python_full_version >= '3.12.4'",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -308,7 +300,7 @@ name = "build"
|
||||
version = "1.2.2.post1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "(os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "colorama", marker = "os_name == 'nt'" },
|
||||
{ name = "importlib-metadata", marker = "python_full_version < '3.10.2'" },
|
||||
{ name = "packaging" },
|
||||
{ name = "pyproject-hooks" },
|
||||
@@ -543,7 +535,7 @@ name = "click"
|
||||
version = "8.1.7"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
{ name = "colorama", marker = "platform_system == 'Windows'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 }
|
||||
wheels = [
|
||||
@@ -650,6 +642,7 @@ tools = [
|
||||
[package.dev-dependencies]
|
||||
dev = [
|
||||
{ name = "cairosvg" },
|
||||
{ name = "crewai-tools" },
|
||||
{ name = "mkdocs" },
|
||||
{ name = "mkdocs-material" },
|
||||
{ name = "mkdocs-material-extensions" },
|
||||
@@ -703,6 +696,7 @@ requires-dist = [
|
||||
[package.metadata.requires-dev]
|
||||
dev = [
|
||||
{ name = "cairosvg", specifier = ">=2.7.1" },
|
||||
{ name = "crewai-tools", specifier = ">=0.17.0" },
|
||||
{ name = "mkdocs", specifier = ">=1.4.3" },
|
||||
{ name = "mkdocs-material", specifier = ">=9.5.7" },
|
||||
{ name = "mkdocs-material-extensions", specifier = ">=1.3.1" },
|
||||
@@ -2468,7 +2462,7 @@ version = "1.6.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "click" },
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
{ name = "colorama", marker = "platform_system == 'Windows'" },
|
||||
{ name = "ghp-import" },
|
||||
{ name = "jinja2" },
|
||||
{ name = "markdown" },
|
||||
@@ -2649,7 +2643,7 @@ version = "2.10.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "pygments" },
|
||||
{ name = "pywin32", marker = "sys_platform == 'win32'" },
|
||||
{ name = "pywin32", marker = "platform_system == 'Windows'" },
|
||||
{ name = "tqdm" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/3a/93/80ac75c20ce54c785648b4ed363c88f148bf22637e10c9863db4fbe73e74/mpire-2.10.2.tar.gz", hash = "sha256:f66a321e93fadff34585a4bfa05e95bd946cf714b442f51c529038eb45773d97", size = 271270 }
|
||||
@@ -2896,7 +2890,7 @@ name = "nvidia-cudnn-cu12"
|
||||
version = "9.1.0.70"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
]
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741 },
|
||||
@@ -2923,9 +2917,9 @@ name = "nvidia-cusolver-cu12"
|
||||
version = "11.4.5.107"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
{ name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
]
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 },
|
||||
@@ -2936,7 +2930,7 @@ name = "nvidia-cusparse-cu12"
|
||||
version = "12.1.0.106"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
]
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 },
|
||||
@@ -3486,7 +3480,7 @@ name = "portalocker"
|
||||
version = "2.10.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "pywin32", marker = "sys_platform == 'win32'" },
|
||||
{ name = "pywin32", marker = "platform_system == 'Windows'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ed/d3/c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4/portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f", size = 40891 }
|
||||
wheels = [
|
||||
@@ -5028,19 +5022,19 @@ dependencies = [
|
||||
{ name = "fsspec" },
|
||||
{ name = "jinja2" },
|
||||
{ name = "networkx" },
|
||||
{ name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "sympy" },
|
||||
{ name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
|
||||
{ name = "triton", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
wheels = [
|
||||
@@ -5087,7 +5081,7 @@ name = "tqdm"
|
||||
version = "4.66.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
{ name = "colorama", marker = "platform_system == 'Windows'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/58/83/6ba9844a41128c62e810fddddd72473201f3eacde02046066142a2d96cc5/tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad", size = 169504 }
|
||||
wheels = [
|
||||
@@ -5130,7 +5124,7 @@ version = "0.27.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "attrs" },
|
||||
{ name = "cffi", marker = "(implementation_name != 'pypy' and os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (implementation_name != 'pypy' and os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" },
|
||||
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
||||
{ name = "idna" },
|
||||
{ name = "outcome" },
|
||||
@@ -5161,7 +5155,7 @@ name = "triton"
|
||||
version = "3.0.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "filelock", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
|
||||
{ name = "filelock", marker = "(platform_machine != 'aarch64' and platform_system != 'Darwin') or (platform_system != 'Darwin' and platform_system != 'Linux')" },
|
||||
]
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/45/27/14cc3101409b9b4b9241d2ba7deaa93535a217a211c86c4cc7151fb12181/triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a", size = 209376304 },
|
||||
|
||||
Reference in New Issue
Block a user