feat: Bump ruff version to 0.9 (#5666)

* Bump ruff version to 0.9

* Rename some modules for A005 ruff rule
This commit is contained in:
Christophe Bornet 2025-01-15 16:14:43 +01:00 • committed by GitHub
commit da83dbbcb5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 137 additions and 136 deletions

View file

@ -154,7 +154,7 @@ dev-dependencies = [
"types-redis>=4.6.0.5", "types-redis>=4.6.0.5",
"ipykernel>=6.29.0", "ipykernel>=6.29.0",
"mypy>=1.11.0", "mypy>=1.11.0",
"ruff>=0.8.4,<0.9.0", "ruff>=0.9.1,<0.10",
"httpx>=0.27.0", "httpx>=0.27.0",
"pytest>=8.2.0", "pytest>=8.2.0",
"types-requests>=2.32.0", "types-requests>=2.32.0",

View file

@ -11,7 +11,7 @@ from langflow.initial_setup.setup import (
update_project_file, update_project_file,
update_projects_components_with_latest_component_versions, update_projects_components_with_latest_component_versions,
) )
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.components import get_and_cache_all_types_dict
from langflow.services.deps import get_settings_service from langflow.services.deps import get_settings_service
from langflow.services.utils import initialize_services from langflow.services.utils import initialize_services

View file

@ -48,7 +48,7 @@ from langflow.services.deps import get_chat_service, get_session, get_telemetry_
from langflow.services.telemetry.schema import ComponentPayload, PlaygroundPayload from langflow.services.telemetry.schema import ComponentPayload, PlaygroundPayload
if TYPE_CHECKING: if TYPE_CHECKING:
from langflow.graph.vertex.types import InterfaceVertex from langflow.graph.vertex.vertex_types import InterfaceVertex
router = APIRouter(tags=["Chat"]) router = APIRouter(tags=["Chat"])

View file

@ -58,7 +58,7 @@ router = APIRouter(tags=["Base"])
@router.get("/all", dependencies=[Depends(get_current_active_user)]) @router.get("/all", dependencies=[Depends(get_current_active_user)])
async def get_all(): async def get_all():
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.components import get_and_cache_all_types_dict
try: try:
return await get_and_cache_all_types_dict(settings_service=get_settings_service()) return await get_and_cache_all_types_dict(settings_service=get_settings_service())

View file

@ -1,9 +1,9 @@
from .character import CharacterTextSplitterComponent from .character import CharacterTextSplitterComponent
from .conversation import ConversationChainComponent from .conversation import ConversationChainComponent
from .csv import CSVAgentComponent from .csv_agent import CSVAgentComponent
from .fake_embeddings import FakeEmbeddingsComponent from .fake_embeddings import FakeEmbeddingsComponent
from .html_link_extractor import HtmlLinkExtractorComponent from .html_link_extractor import HtmlLinkExtractorComponent
from .json import JsonAgentComponent from .json_agent import JsonAgentComponent
from .json_document_builder import JSONDocumentBuilder from .json_document_builder import JSONDocumentBuilder
from .langchain_hub import LangChainHubPromptComponent from .langchain_hub import LangChainHubPromptComponent
from .language_recursive import LanguageRecursiveTextSplitterComponent from .language_recursive import LanguageRecursiveTextSplitterComponent
@ -26,7 +26,7 @@ from .tool_calling import ToolCallingAgentComponent
from .vector_store import VectoStoreRetrieverComponent from .vector_store import VectoStoreRetrieverComponent
from .vector_store_info import VectorStoreInfoComponent from .vector_store_info import VectorStoreInfoComponent
from .vector_store_router import VectorStoreRouterAgentComponent from .vector_store_router import VectorStoreRouterAgentComponent
from .xml import XMLAgentComponent from .xml_agent import XMLAgentComponent
__all__ = [ __all__ = [
"CSVAgentComponent", "CSVAgentComponent",

View file

@ -1,6 +1,6 @@
from langflow.graph.edge.base import Edge from langflow.graph.edge.base import Edge
from langflow.graph.graph.base import Graph from langflow.graph.graph.base import Graph
from langflow.graph.vertex.base import Vertex from langflow.graph.vertex.base import Vertex
from langflow.graph.vertex.types import CustomComponentVertex, InterfaceVertex, StateVertex from langflow.graph.vertex.vertex_types import CustomComponentVertex, InterfaceVertex, StateVertex
__all__ = ["CustomComponentVertex", "Edge", "Graph", "InterfaceVertex", "StateVertex", "Vertex"] __all__ = ["CustomComponentVertex", "Edge", "Graph", "InterfaceVertex", "StateVertex", "Vertex"]

View file

@ -33,7 +33,7 @@ from langflow.graph.graph.utils import (
from langflow.graph.schema import InterfaceComponentTypes, RunOutputs from langflow.graph.schema import InterfaceComponentTypes, RunOutputs
from langflow.graph.vertex.base import Vertex, VertexStates from langflow.graph.vertex.base import Vertex, VertexStates
from langflow.graph.vertex.schema import NodeData, NodeTypeEnum from langflow.graph.vertex.schema import NodeData, NodeTypeEnum
from langflow.graph.vertex.types import ComponentVertex, InterfaceVertex, StateVertex from langflow.graph.vertex.vertex_types import ComponentVertex, InterfaceVertex, StateVertex
from langflow.logging.logger import LogConfig, configure from langflow.logging.logger import LogConfig, configure
from langflow.schema.dotdict import dotdict from langflow.schema.dotdict import dotdict
from langflow.schema.schema import INPUT_FIELD_NAME, InputType from langflow.schema.schema import INPUT_FIELD_NAME, InputType

View file

@ -11,9 +11,9 @@ class Finish:
def _import_vertex_types(): def _import_vertex_types():
from langflow.graph.vertex import types from langflow.graph.vertex import vertex_types
return types return vertex_types
class VertexTypesDict(LazyLoadDictBase): class VertexTypesDict(LazyLoadDictBase):

View file

@ -17,7 +17,7 @@ class AllTypesDict(LazyLoadDictBase):
@override @override
def get_type_dict(self): def get_type_dict(self):
from langflow.interface.types import get_all_types_dict from langflow.interface.components import get_all_types_dict
settings_service = get_settings_service() settings_service = get_settings_service()
return get_all_types_dict(settings_service.settings.components_path) return get_all_types_dict(settings_service.settings.components_path)

View file

@ -29,7 +29,7 @@ from langflow.initial_setup.setup import (
load_bundles_from_urls, load_bundles_from_urls,
load_flows_from_directory, load_flows_from_directory,
) )
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.components import get_and_cache_all_types_dict
from langflow.interface.utils import setup_llm_caching from langflow.interface.utils import setup_llm_caching
from langflow.logging.logger import configure from langflow.logging.logger import configure
from langflow.middleware import ContentSizeLimitMiddleware from langflow.middleware import ContentSizeLimitMiddleware

View file

@ -7,6 +7,7 @@ if hasattr(asyncio, "timeout"):
async def timeout_context(timeout_seconds): async def timeout_context(timeout_seconds):
with asyncio.timeout(timeout_seconds) as ctx: with asyncio.timeout(timeout_seconds) as ctx:
yield ctx yield ctx
else: else:
@asynccontextmanager @asynccontextmanager

View file

@ -58,7 +58,7 @@ async def test_initialize_super_user():
@pytest.mark.benchmark @pytest.mark.benchmark
async def test_get_and_cache_all_types_dict(): async def test_get_and_cache_all_types_dict():
"""Benchmark get_and_cache_all_types_dict function.""" """Benchmark get_and_cache_all_types_dict function."""
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.components import get_and_cache_all_types_dict
settings_service = get_settings_service() settings_service = get_settings_service()
result = await get_and_cache_all_types_dict(settings_service) result = await get_and_cache_all_types_dict(settings_service)
@ -70,7 +70,7 @@ async def test_get_and_cache_all_types_dict():
async def test_create_starter_projects(): async def test_create_starter_projects():
"""Benchmark creation of starter projects.""" """Benchmark creation of starter projects."""
from langflow.initial_setup.setup import create_or_update_starter_projects from langflow.initial_setup.setup import create_or_update_starter_projects
from langflow.interface.types import get_and_cache_all_types_dict from langflow.interface.components import get_and_cache_all_types_dict
from langflow.services.utils import initialize_services from langflow.services.utils import initialize_services
await initialize_services(fix_migration=False) await initialize_services(fix_migration=False)

View file

@ -150,6 +150,6 @@ def test_component_inputs_toolkit():
for input_name, expected in expected_inputs.items(): for input_name, expected in expected_inputs.items():
assert input_name in properties, f"{input_name} is missing in properties." assert input_name in properties, f"{input_name} is missing in properties."
assert properties[input_name]["title"] == expected["title"], f"Title mismatch for {input_name}." assert properties[input_name]["title"] == expected["title"], f"Title mismatch for {input_name}."
assert ( assert properties[input_name]["description"] == expected["description"], (
properties[input_name]["description"] == expected["description"] f"Description mismatch for {input_name}."
), f"Description mismatch for {input_name}." )

View file

@ -78,9 +78,9 @@ async def test_httpx_metadata_behavior(api_request, include_metadata, expected_p
assert metadata["response_headers"]["custom-header"] == "HeaderValue" assert metadata["response_headers"]["custom-header"] == "HeaderValue"
# Validate redirection history # Validate redirection history
assert metadata["redirection_history"] == [ assert metadata["redirection_history"] == [{"url": redirected_url, "status_code": 303}], (
{"url": redirected_url, "status_code": 303} "Redirection history is incorrect"
], "Redirection history is incorrect" )
# Validate result # Validate result
assert metadata["result"] == response_content, "Response content mismatch" assert metadata["result"] == response_content, "Response content mismatch"
@ -111,9 +111,9 @@ async def test_save_to_file_behavior(api_request, save_to_file, expected_propert
# Check returned metadata # Check returned metadata
metadata = result.data metadata = result.data
assert ( assert set(metadata.keys()) == expected_properties, (
set(metadata.keys()) == expected_properties f"Unexpected properties: {set(metadata.keys())}. Raw result: {result.data}"
), f"Unexpected properties: {set(metadata.keys())}. Raw result: {result.data}" )
if save_to_file: if save_to_file:
# Validate that file_path exists in metadata # Validate that file_path exists in metadata

View file

@ -159,9 +159,9 @@ class TestDirectoryComponent(ComponentTestBaseWithoutClient):
# Check column names # Check column names
expected_columns = ["text", "file_path"] expected_columns = ["text", "file_path"]
actual_columns = list(data_frame.columns) actual_columns = list(data_frame.columns)
assert set(expected_columns).issubset( assert set(expected_columns).issubset(set(actual_columns)), (
set(actual_columns) f"Missing required columns. Expected at least {expected_columns}, got {actual_columns}"
), f"Missing required columns. Expected at least {expected_columns}, got {actual_columns}" )
# Verify content matches input files # Verify content matches input files
texts = data_frame["text"].tolist() texts = data_frame["text"].tolist()
@ -260,9 +260,9 @@ class TestDirectoryComponent(ComponentTestBaseWithoutClient):
results = directory_component.load_directory() results = directory_component.load_directory()
# Verify number of loaded files # Verify number of loaded files
assert ( assert len(results) == expected_count, (
len(results) == expected_count f"Expected {expected_count} results for file types {file_types}, got {len(results)}"
), f"Expected {expected_count} results for file types {file_types}, got {len(results)}" )
# Optionally, check the file extension in each result # Optionally, check the file extension in each result
for r in results: for r in results:
# e.g., verify that the extension is indeed in file_types # e.g., verify that the extension is indeed in file_types
@ -358,20 +358,20 @@ class TestDirectoryComponent(ComponentTestBaseWithoutClient):
# Verify parallel_load_data was called with correct parameters # Verify parallel_load_data was called with correct parameters
mock_parallel_load.assert_called_once() mock_parallel_load.assert_called_once()
call_args = mock_parallel_load.call_args[1] call_args = mock_parallel_load.call_args[1]
assert ( assert call_args["max_concurrency"] == 2, (
call_args["max_concurrency"] == 2 f"Expected max_concurrency=2, got {call_args.get('max_concurrency')}"
), f"Expected max_concurrency=2, got {call_args.get('max_concurrency')}" )
assert ( assert call_args["silent_errors"] is False, (
call_args["silent_errors"] is False f"Expected silent_errors=False, got {call_args.get('silent_errors')}"
), f"Expected silent_errors=False, got {call_args.get('silent_errors')}" )
# Verify results # Verify results
assert ( assert len(results) == 2, (
len(results) == 2 f"Expected 2 results, got {len(results)}: {[r.data['file_path'] for r in results]}"
), f"Expected 2 results, got {len(results)}: {[r.data['file_path'] for r in results]}" )
assert all( assert all(isinstance(r, Data) for r in results), (
isinstance(r, Data) for r in results f"All results should be Data objects, got types: {[type(r) for r in results]}"
), f"All results should be Data objects, got types: {[type(r) for r in results]}" )
actual_texts = [r.text for r in results] actual_texts = [r.text for r in results]
expected_texts = ["content1", "content2"] expected_texts = ["content1", "content2"]

View file

@ -121,7 +121,7 @@ class TestURLComponent(ComponentTestBaseWithoutClient):
component.set_attributes({"urls": urls}) component.set_attributes({"urls": urls})
mock_web_load.return_value = [ mock_web_load.return_value = [
Mock(page_content=f"content{i+1}", metadata={"source": url}) for i, url in enumerate(urls) Mock(page_content=f"content{i + 1}", metadata={"source": url}) for i, url in enumerate(urls)
] ]
# Test fetch_content # Test fetch_content
@ -131,7 +131,7 @@ class TestURLComponent(ComponentTestBaseWithoutClient):
for i, item in enumerate(content): for i, item in enumerate(content):
url = urls[i] url = urls[i]
assert item.source == url, f"Expected '{url}', got '{item.source}'" assert item.source == url, f"Expected '{url}', got '{item.source}'"
assert item.text == f"content{i+1}" assert item.text == f"content{i + 1}"
@respx.mock @respx.mock
async def test_url_request_success(self, mock_web_load): async def test_url_request_success(self, mock_web_load):

View file

@ -24,6 +24,6 @@ def test_huggingface_inputs():
# Check if all expected inputs are present # Check if all expected inputs are present
for name, input_type in expected_inputs.items(): for name, input_type in expected_inputs.items():
assert any( assert any(isinstance(inp, input_type) and inp.name == name for inp in inputs), (
isinstance(inp, input_type) and inp.name == name for inp in inputs f"Missing or incorrect input: {name}"
), f"Missing or incorrect input: {name}" )

View file

@ -54,9 +54,9 @@ class TestSplitTextComponent(ComponentTestBaseWithoutClient):
assert len(results) == 3, f"Expected 3 chunks, got {len(results)}" assert len(results) == 3, f"Expected 3 chunks, got {len(results)}"
assert "This is a test" in results[0].text, f"Expected 'This is a test', got '{results[0].text}'" assert "This is a test" in results[0].text, f"Expected 'This is a test', got '{results[0].text}'"
assert "It has multiple lines" in results[1].text, f"Expected 'It has multiple lines', got '{results[1].text}'" assert "It has multiple lines" in results[1].text, f"Expected 'It has multiple lines', got '{results[1].text}'"
assert ( assert "Each line should be a chunk" in results[2].text, (
"Each line should be a chunk" in results[2].text f"Expected 'Each line should be a chunk', got '{results[2].text}'"
), f"Expected 'Each line should be a chunk', got '{results[2].text}'" )
def test_split_text_with_overlap(self): def test_split_text_with_overlap(self):
"""Test text splitting with overlap.""" """Test text splitting with overlap."""
@ -123,12 +123,12 @@ class TestSplitTextComponent(ComponentTestBaseWithoutClient):
results = component.split_text() results = component.split_text()
assert len(results) == 2, f"Expected 2 chunks, got {len(results)}" assert len(results) == 2, f"Expected 2 chunks, got {len(results)}"
for result in results: for result in results:
assert ( assert result.data["source"] == test_metadata["source"], (
result.data["source"] == test_metadata["source"] f"Expected source '{test_metadata['source']}', got '{result.data.get('source')}'"
), f"Expected source '{test_metadata['source']}', got '{result.data.get('source')}'" )
assert ( assert result.data["author"] == test_metadata["author"], (
result.data["author"] == test_metadata["author"] f"Expected author '{test_metadata['author']}', got '{result.data.get('author')}'"
), f"Expected author '{test_metadata['author']}', got '{result.data.get('author')}'" )
def test_split_text_as_dataframe(self): def test_split_text_as_dataframe(self):
"""Test converting split text results to DataFrame.""" """Test converting split text results to DataFrame."""
@ -150,15 +150,15 @@ class TestSplitTextComponent(ComponentTestBaseWithoutClient):
assert isinstance(data_frame, DataFrame), "Expected DataFrame instance" assert isinstance(data_frame, DataFrame), "Expected DataFrame instance"
assert len(data_frame) == 3, f"Expected DataFrame with 3 rows, got {len(data_frame)}" assert len(data_frame) == 3, f"Expected DataFrame with 3 rows, got {len(data_frame)}"
assert list(data_frame.columns) == ["text"], f"Expected columns ['text'], got {list(data_frame.columns)}" assert list(data_frame.columns) == ["text"], f"Expected columns ['text'], got {list(data_frame.columns)}"
assert ( assert "First chunk" in data_frame.iloc[0]["text"], (
"First chunk" in data_frame.iloc[0]["text"] f"Expected 'First chunk', got '{data_frame.iloc[0]['text']}'"
), f"Expected 'First chunk', got '{data_frame.iloc[0]['text']}'" )
assert ( assert "Second chunk" in data_frame.iloc[1]["text"], (
"Second chunk" in data_frame.iloc[1]["text"] f"Expected 'Second chunk', got '{data_frame.iloc[1]['text']}'"
), f"Expected 'Second chunk', got '{data_frame.iloc[1]['text']}'" )
assert ( assert "Third chunk" in data_frame.iloc[2]["text"], (
"Third chunk" in data_frame.iloc[2]["text"] f"Expected 'Third chunk', got '{data_frame.iloc[2]['text']}'"
), f"Expected 'Third chunk', got '{data_frame.iloc[2]['text']}'" )
def test_split_text_empty_input(self): def test_split_text_empty_input(self):
"""Test handling of empty input text.""" """Test handling of empty input text."""

View file

@ -672,13 +672,13 @@ def test_get_sorted_vertices_with_complex_cycle(graph_with_loop):
# When is_cyclic is True and start_vertex_id is provided: # When is_cyclic is True and start_vertex_id is provided:
# 1. The first layer will contain vertices with no predecessors and vertices that are part of the cycle # 1. The first layer will contain vertices with no predecessors and vertices that are part of the cycle
# 2. This is because the cycle vertices are treated as having no dependencies in the initial sort # 2. This is because the cycle vertices are treated as having no dependencies in the initial sort
assert ( assert "OpenAI Embeddings" in first_layer, (
"OpenAI Embeddings" in first_layer "Vertex with no predecessors 'OpenAI Embeddings' should be in first layer"
), "Vertex with no predecessors 'OpenAI Embeddings' should be in first layer" )
assert "Playlist Extractor" in first_layer, "Input vertex 'Playlist Extractor' should be in first layer" assert "Playlist Extractor" in first_layer, "Input vertex 'Playlist Extractor' should be in first layer"
assert ( assert len(first_layer) == 2, (
len(first_layer) == 2 f"First layer should contain exactly 4 vertices, got {len(first_layer)}: {first_layer}"
), f"First layer should contain exactly 4 vertices, got {len(first_layer)}: {first_layer}" )
# Verify that the remaining layers contain the rest of the vertices in the correct order # Verify that the remaining layers contain the rest of the vertices in the correct order
# The graph structure shows: # The graph structure shows:
@ -747,14 +747,14 @@ def test_get_sorted_vertices_with_stop_at_chroma(graph_with_loop):
# When is_cyclic is True and we have a stop component: # When is_cyclic is True and we have a stop component:
# 1. The first layer will contain vertices with no predecessors and vertices that are part of the cycle # 1. The first layer will contain vertices with no predecessors and vertices that are part of the cycle
# 2. This is because the cycle vertices are treated as having no dependencies in the initial sort # 2. This is because the cycle vertices are treated as having no dependencies in the initial sort
assert ( assert "OpenAI Embeddings" in first_layer, (
"OpenAI Embeddings" in first_layer "Vertex with no predecessors 'OpenAI Embeddings' should be in first layer"
), "Vertex with no predecessors 'OpenAI Embeddings' should be in first layer" )
assert "Playlist Extractor" in first_layer, "Input vertex 'Playlist Extractor' should be in first layer" assert "Playlist Extractor" in first_layer, "Input vertex 'Playlist Extractor' should be in first layer"
assert ( assert len(first_layer) == 2, (
len(first_layer) == 2 f"First layer should contain exactly 4 vertices, got {len(first_layer)}: {first_layer}"
), f"First layer should contain exactly 4 vertices, got {len(first_layer)}: {first_layer}" )
# Verify that the remaining layers contain the rest of the vertices in the correct order # Verify that the remaining layers contain the rest of the vertices in the correct order
# The graph structure shows: # The graph structure shows:
@ -848,5 +848,5 @@ def test_get_sorted_vertices_exact_sequence(graph_with_loop):
assert sequence == expected_sequence, f"Sequence: {sequence}" assert sequence == expected_sequence, f"Sequence: {sequence}"
# Verify the exact sequence # Verify the exact sequence
assert len(sequence) == len(expected_sequence), ( assert len(sequence) == len(expected_sequence), (
f"Expected sequence length {len(expected_sequence)}, " f"but got {len(sequence)}" f"Expected sequence length {len(expected_sequence)}, but got {len(sequence)}"
) )

View file

@ -180,9 +180,9 @@ def test_process_flow_vector_store_grouped(vector_store_grouped_json_flow):
for idx, expected_keyword in enumerate(expected_keywords): for idx, expected_keyword in enumerate(expected_keywords):
for key, value in expected_keyword.items(): for key, value in expected_keyword.items():
assert ( assert value in edges[idx][key].split("-")[0], (
value in edges[idx][key].split("-")[0] f"Edge {idx}, key {key} expected to contain {value} but got {edges[idx][key]}"
), f"Edge {idx}, key {key} expected to contain {value} but got {edges[idx][key]}" )
def test_update_template(sample_template, sample_nodes): def test_update_template(sample_template, sample_nodes):

View file

@ -145,7 +145,7 @@ def test_vector_store_rag_dump_components_and_edges(ingestion_graph, rag_graph):
for node_id, expected_type in expected_nodes.items(): for node_id, expected_type in expected_nodes.items():
assert node_id in node_map, f"Missing node {node_id}" assert node_id in node_map, f"Missing node {node_id}"
assert node_map[node_id]["type"] == expected_type, ( assert node_map[node_id]["type"] == expected_type, (
f"Node {node_id} has incorrect type. " f"Expected {expected_type}, got {node_map[node_id]['type']}" f"Node {node_id} has incorrect type. Expected {expected_type}, got {node_map[node_id]['type']}"
) )
# Verify all nodes in graph are expected # Verify all nodes in graph are expected
@ -226,9 +226,9 @@ def test_vector_store_rag_add(ingestion_graph: Graph, rag_graph: Graph):
f"Vertices mismatch: {len(ingestion_graph_copy.vertices)} " f"Vertices mismatch: {len(ingestion_graph_copy.vertices)} "
f"!= {len(ingestion_graph.vertices)} + {len(rag_graph.vertices)}" f"!= {len(ingestion_graph.vertices)} + {len(rag_graph.vertices)}"
) )
assert len(ingestion_graph_copy.edges) == len(ingestion_graph.edges) + len( assert len(ingestion_graph_copy.edges) == len(ingestion_graph.edges) + len(rag_graph.edges), (
rag_graph.edges f"Edges mismatch: {len(ingestion_graph_copy.edges)} != {len(ingestion_graph.edges)} + {len(rag_graph.edges)}"
), f"Edges mismatch: {len(ingestion_graph_copy.edges)} != {len(ingestion_graph.edges)} + {len(rag_graph.edges)}" )
combined_graph_dump = ingestion_graph_copy.dump( combined_graph_dump = ingestion_graph_copy.dump(
name="Combined Graph", description="Graph for data ingestion and RAG", endpoint_name="combined" name="Combined Graph", description="Graph for data ingestion and RAG", endpoint_name="combined"

View file

@ -417,9 +417,9 @@ async def test_successful_run_with_input_type_text(client, simple_api_test, crea
assert len(text_input_outputs) == 1 assert len(text_input_outputs) == 1
# Now we check if the input_value is correct # Now we check if the input_value is correct
# We get text key twice because the output is now a Message # We get text key twice because the output is now a Message
assert all( assert all(output.get("results").get("text").get("text") == "value1" for output in text_input_outputs), (
output.get("results").get("text").get("text") == "value1" for output in text_input_outputs text_input_outputs
), text_input_outputs )
@pytest.mark.api_key_required @pytest.mark.api_key_required
@ -451,9 +451,9 @@ async def test_successful_run_with_input_type_chat(client: AsyncClient, simple_a
chat_input_outputs = [output for output in outputs_dict.get("outputs") if "ChatInput" in output.get("component_id")] chat_input_outputs = [output for output in outputs_dict.get("outputs") if "ChatInput" in output.get("component_id")]
assert len(chat_input_outputs) == 1 assert len(chat_input_outputs) == 1
# Now we check if the input_value is correct # Now we check if the input_value is correct
assert all( assert all(output.get("results").get("message").get("text") == "value1" for output in chat_input_outputs), (
output.get("results").get("message").get("text") == "value1" for output in chat_input_outputs chat_input_outputs
), chat_input_outputs )
@pytest.mark.benchmark @pytest.mark.benchmark
@ -507,9 +507,9 @@ async def test_successful_run_with_input_type_any(client, simple_api_test, creat
all_message_or_text_dicts = [ all_message_or_text_dicts = [
result_dict.get("message", result_dict.get("text")) for result_dict in all_result_dicts result_dict.get("message", result_dict.get("text")) for result_dict in all_result_dicts
] ]
assert all( assert all(message_or_text_dict.get("text") == "value1" for message_or_text_dict in all_message_or_text_dicts), (
message_or_text_dict.get("text") == "value1" for message_or_text_dict in all_message_or_text_dicts any_input_outputs
), any_input_outputs )
async def test_invalid_flow_id(client, created_api_key): async def test_invalid_flow_id(client, created_api_key):

View file

@ -15,7 +15,7 @@ from langflow.initial_setup.setup import (
load_starter_projects, load_starter_projects,
update_projects_components_with_latest_component_versions, update_projects_components_with_latest_component_versions,
) )
from langflow.interface.types import aget_all_types_dict from langflow.interface.components import aget_all_types_dict
from langflow.services.database.models import Flow from langflow.services.database.models import Flow
from langflow.services.database.models.folder.model import Folder from langflow.services.database.models.folder.model import Folder
from langflow.services.deps import get_settings_service, session_scope from langflow.services.deps import get_settings_service, session_scope
@ -52,9 +52,9 @@ async def test_get_project_data():
assert isinstance(updated_at_datetime, datetime), f"Project {project_name} has no updated_at_datetime" assert isinstance(updated_at_datetime, datetime), f"Project {project_name} has no updated_at_datetime"
assert isinstance(project_data, dict), f"Project {project_name} has no data" assert isinstance(project_data, dict), f"Project {project_name} has no data"
assert isinstance(project_icon, str) or project_icon is None, f"Project {project_name} has no icon" assert isinstance(project_icon, str) or project_icon is None, f"Project {project_name} has no icon"
assert ( assert isinstance(project_icon_bg_color, str) or project_icon_bg_color is None, (
isinstance(project_icon_bg_color, str) or project_icon_bg_color is None f"Project {project_name} has no icon_bg_color"
), f"Project {project_name} has no icon_bg_color" )
@pytest.mark.usefixtures("client") @pytest.mark.usefixtures("client")

76
uv.lock generated
View file

@ -532,7 +532,7 @@ name = "blessed"
version = "1.20.0" version = "1.20.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "jinxed", marker = "platform_system == 'Windows'" }, { name = "jinxed", marker = "sys_platform == 'win32'" },
{ name = "six" }, { name = "six" },
{ name = "wcwidth" }, { name = "wcwidth" },
] ]
@ -954,7 +954,7 @@ name = "click"
version = "8.1.8" version = "8.1.8"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "colorama", marker = "platform_system == 'Windows'" }, { name = "colorama", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
wheels = [ wheels = [
@ -3142,7 +3142,7 @@ name = "ipykernel"
version = "6.29.5" version = "6.29.5"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "appnope", marker = "platform_system == 'Darwin'" }, { name = "appnope", marker = "sys_platform == 'darwin'" },
{ name = "comm" }, { name = "comm" },
{ name = "debugpy" }, { name = "debugpy" },
{ name = "ipython" }, { name = "ipython" },
@ -3233,7 +3233,7 @@ name = "jinxed"
version = "1.3.0" version = "1.3.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "ansicon", marker = "platform_system == 'Windows'" }, { name = "ansicon", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/20/d0/59b2b80e7a52d255f9e0ad040d2e826342d05580c4b1d7d7747cfb8db731/jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf", size = 80981 } sdist = { url = "https://files.pythonhosted.org/packages/20/d0/59b2b80e7a52d255f9e0ad040d2e826342d05580c4b1d7d7747cfb8db731/jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf", size = 80981 }
wheels = [ wheels = [
@ -4201,7 +4201,7 @@ dev = [
{ name = "pytest-xdist", specifier = ">=3.6.0" }, { name = "pytest-xdist", specifier = ">=3.6.0" },
{ name = "requests", specifier = ">=2.32.0" }, { name = "requests", specifier = ">=2.32.0" },
{ name = "respx", specifier = ">=0.21.1" }, { name = "respx", specifier = ">=0.21.1" },
{ name = "ruff", specifier = ">=0.8.4,<0.9.0" }, { name = "ruff", specifier = ">=0.9.1,<0.10" },
{ name = "types-aiofiles", specifier = ">=24.1.0.20240626" }, { name = "types-aiofiles", specifier = ">=24.1.0.20240626" },
{ name = "types-google-cloud-ndb", specifier = ">=2.2.0.0" }, { name = "types-google-cloud-ndb", specifier = ">=2.2.0.0" },
{ name = "types-markdown", specifier = ">=3.7.0.20240822" }, { name = "types-markdown", specifier = ">=3.7.0.20240822" },
@ -6148,7 +6148,7 @@ name = "portalocker"
version = "2.10.1" version = "2.10.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "pywin32", marker = "platform_system == 'Windows'" }, { name = "pywin32", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/ed/d3/c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4/portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f", size = 40891 } sdist = { url = "https://files.pythonhosted.org/packages/ed/d3/c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4/portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f", size = 40891 }
wheels = [ wheels = [
@ -7788,27 +7788,27 @@ wheels = [
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.8.4" version = "0.9.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/34/37/9c02181ef38d55b77d97c68b78e705fd14c0de0e5d085202bb2b52ce5be9/ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8", size = 3402103 } sdist = { url = "https://files.pythonhosted.org/packages/67/3e/e89f736f01aa9517a97e2e7e0ce8d34a4d8207087b3cfdec95133fee13b5/ruff-0.9.1.tar.gz", hash = "sha256:fd2b25ecaf907d6458fa842675382c8597b3c746a2dde6717fe3415425df0c17", size = 3498844 }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/05/67/f480bf2f2723b2e49af38ed2be75ccdb2798fca7d56279b585c8f553aaab/ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60", size = 10546415 }, { url = "https://files.pythonhosted.org/packages/dc/05/c3a2e0feb3d5d394cdfd552de01df9d3ec8a3a3771bbff247fab7e668653/ruff-0.9.1-py3-none-linux_armv6l.whl", hash = "sha256:84330dda7abcc270e6055551aca93fdde1b0685fc4fd358f26410f9349cf1743", size = 10645241 },
{ url = "https://files.pythonhosted.org/packages/eb/7a/5aba20312c73f1ce61814e520d1920edf68ca3b9c507bd84d8546a8ecaa8/ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac", size = 10346113 }, { url = "https://files.pythonhosted.org/packages/dd/da/59f0a40e5f88ee5c054ad175caaa2319fc96571e1d29ab4730728f2aad4f/ruff-0.9.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3cae39ba5d137054b0e5b472aee3b78a7c884e61591b100aeb544bcd1fc38d4f", size = 10391066 },
{ url = "https://files.pythonhosted.org/packages/76/f4/c41de22b3728486f0aa95383a44c42657b2db4062f3234ca36fc8cf52d8b/ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296", size = 9943564 }, { url = "https://files.pythonhosted.org/packages/b7/fe/85e1c1acf0ba04a3f2d54ae61073da030f7a5dc386194f96f3c6ca444a78/ruff-0.9.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:50c647ff96f4ba288db0ad87048257753733763b409b2faf2ea78b45c8bb7fcb", size = 10012308 },
{ url = "https://files.pythonhosted.org/packages/0e/f0/afa0d2191af495ac82d4cbbfd7a94e3df6f62a04ca412033e073b871fc6d/ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643", size = 10805522 }, { url = "https://files.pythonhosted.org/packages/6f/9b/780aa5d4bdca8dcea4309264b8faa304bac30e1ce0bcc910422bfcadd203/ruff-0.9.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c8b149e9c7353cace7d698e1656ffcf1e36e50f8ea3b5d5f7f87ff9986a7ca", size = 10881960 },
{ url = "https://files.pythonhosted.org/packages/12/57/5d1e9a0fd0c228e663894e8e3a8e7063e5ee90f8e8e60cf2085f362bfa1a/ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e", size = 10306763 }, { url = "https://files.pythonhosted.org/packages/12/f4/dac4361afbfe520afa7186439e8094e4884ae3b15c8fc75fb2e759c1f267/ruff-0.9.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:beb3298604540c884d8b282fe7625651378e1986c25df51dec5b2f60cafc31ce", size = 10414803 },
{ url = "https://files.pythonhosted.org/packages/04/df/f069fdb02e408be8aac6853583572a2873f87f866fe8515de65873caf6b8/ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3", size = 11359574 }, { url = "https://files.pythonhosted.org/packages/f0/a2/057a3cb7999513cb78d6cb33a7d1cc6401c82d7332583786e4dad9e38e44/ruff-0.9.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39d0174ccc45c439093971cc06ed3ac4dc545f5e8bdacf9f067adf879544d969", size = 11464929 },
{ url = "https://files.pythonhosted.org/packages/d3/04/37c27494cd02e4a8315680debfc6dfabcb97e597c07cce0044db1f9dfbe2/ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f", size = 12094851 }, { url = "https://files.pythonhosted.org/packages/eb/c6/1ccfcc209bee465ced4874dcfeaadc88aafcc1ea9c9f31ef66f063c187f0/ruff-0.9.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69572926c0f0c9912288915214ca9b2809525ea263603370b9e00bed2ba56dbd", size = 12170717 },
{ url = "https://files.pythonhosted.org/packages/81/b1/c5d7fb68506cab9832d208d03ea4668da9a9887a4a392f4f328b1bf734ad/ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604", size = 11655539 }, { url = "https://files.pythonhosted.org/packages/84/97/4a524027518525c7cf6931e9fd3b2382be5e4b75b2b61bec02681a7685a5/ruff-0.9.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:937267afce0c9170d6d29f01fcd1f4378172dec6760a9f4dface48cdabf9610a", size = 11708921 },
{ url = "https://files.pythonhosted.org/packages/ef/38/8f8f2c8898dc8a7a49bc340cf6f00226917f0f5cb489e37075bcb2ce3671/ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf", size = 12912805 }, { url = "https://files.pythonhosted.org/packages/a6/a4/4e77cf6065c700d5593b25fca6cf725b1ab6d70674904f876254d0112ed0/ruff-0.9.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:186c2313de946f2c22bdf5954b8dd083e124bcfb685732cfb0beae0c47233d9b", size = 13058074 },
{ url = "https://files.pythonhosted.org/packages/06/dd/fa6660c279f4eb320788876d0cff4ea18d9af7d9ed7216d7bd66877468d0/ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720", size = 11205976 }, { url = "https://files.pythonhosted.org/packages/f9/d6/fcb78e0531e863d0a952c4c5600cc5cd317437f0e5f031cd2288b117bb37/ruff-0.9.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f94942a3bb767675d9a051867c036655fe9f6c8a491539156a6f7e6b5f31831", size = 11281093 },
{ url = "https://files.pythonhosted.org/packages/a8/d7/de94cc89833b5de455750686c17c9e10f4e1ab7ccdc5521b8fe911d1477e/ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae", size = 10792039 }, { url = "https://files.pythonhosted.org/packages/e4/3b/7235bbeff00c95dc2d073cfdbf2b871b5bbf476754c5d277815d286b4328/ruff-0.9.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:728d791b769cc28c05f12c280f99e8896932e9833fef1dd8756a6af2261fd1ab", size = 10882610 },
{ url = "https://files.pythonhosted.org/packages/6d/15/3e4906559248bdbb74854af684314608297a05b996062c9d72e0ef7c7097/ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7", size = 10400088 }, { url = "https://files.pythonhosted.org/packages/2a/66/5599d23257c61cf038137f82999ca8f9d0080d9d5134440a461bef85b461/ruff-0.9.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2f312c86fb40c5c02b44a29a750ee3b21002bd813b5233facdaf63a51d9a85e1", size = 10489273 },
{ url = "https://files.pythonhosted.org/packages/a2/21/9ed4c0e8133cb4a87a18d470f534ad1a8a66d7bec493bcb8bda2d1a5d5be/ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111", size = 10900814 }, { url = "https://files.pythonhosted.org/packages/78/85/de4aa057e2532db0f9761e2c2c13834991e087787b93e4aeb5f1cb10d2df/ruff-0.9.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ae017c3a29bee341ba584f3823f805abbe5fe9cd97f87ed07ecbf533c4c88366", size = 11003314 },
{ url = "https://files.pythonhosted.org/packages/0d/5d/122a65a18955bd9da2616b69bc839351f8baf23b2805b543aa2f0aed72b5/ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8", size = 11268828 }, { url = "https://files.pythonhosted.org/packages/00/42/afedcaa089116d81447347f76041ff46025849fedb0ed2b187d24cf70fca/ruff-0.9.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5dc40a378a0e21b4cfe2b8a0f1812a6572fc7b230ef12cd9fac9161aa91d807f", size = 11342982 },
{ url = "https://files.pythonhosted.org/packages/43/a9/1676ee9106995381e3d34bccac5bb28df70194167337ed4854c20f27c7ba/ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835", size = 8805621 }, { url = "https://files.pythonhosted.org/packages/39/c6/fe45f3eb27e3948b41a305d8b768e949bf6a39310e9df73f6c576d7f1d9f/ruff-0.9.1-py3-none-win32.whl", hash = "sha256:46ebf5cc106cf7e7378ca3c28ce4293b61b449cd121b98699be727d40b79ba72", size = 8819750 },
{ url = "https://files.pythonhosted.org/packages/10/98/ed6b56a30ee76771c193ff7ceeaf1d2acc98d33a1a27b8479cbdb5c17a23/ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d", size = 9660086 }, { url = "https://files.pythonhosted.org/packages/38/8d/580db77c3b9d5c3d9479e55b0b832d279c30c8f00ab0190d4cd8fc67831c/ruff-0.9.1-py3-none-win_amd64.whl", hash = "sha256:342a824b46ddbcdddd3abfbb332fa7fcaac5488bf18073e841236aadf4ad5c19", size = 9701331 },
{ url = "https://files.pythonhosted.org/packages/13/9f/026e18ca7d7766783d779dae5e9c656746c6ede36ef73c6d934aaf4a6dec/ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08", size = 9074500 }, { url = "https://files.pythonhosted.org/packages/b2/94/0498cdb7316ed67a1928300dd87d659c933479f44dec51b4f62bfd1f8028/ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7", size = 9145708 },
] ]
[[package]] [[package]]
@ -8645,19 +8645,19 @@ dependencies = [
{ name = "fsspec" }, { name = "fsspec" },
{ name = "jinja2" }, { name = "jinja2" },
{ name = "networkx" }, { name = "networkx" },
{ name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == '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 platform_system == '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 platform_system == '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 platform_system == 'Linux'" }, { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "sympy" }, { name = "sympy" },
{ name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, { name = "triton", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "typing-extensions" }, { name = "typing-extensions" },
] ]
wheels = [ wheels = [
@ -8698,7 +8698,7 @@ name = "tqdm"
version = "4.67.1" version = "4.67.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
dependencies = [ dependencies = [
{ name = "colorama", marker = "platform_system == 'Windows'" }, { name = "colorama", marker = "sys_platform == 'win32'" },
] ]
sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 }
wheels = [ wheels = [