From f655ee8194a779f8d34f2983408498c5481e4641 Mon Sep 17 00:00:00 2001 From: Boris Arzentar Date: Wed, 24 Apr 2024 19:35:36 +0200 Subject: [PATCH 01/21] Intermidiate commit --- .data/code/example.txt | 28 +++++++ .../cognify/graph/add_classification_nodes.py | 8 +- .../graph/add_cognitive_layer_graphs.py | 62 +++++++------- .../cognify/graph/add_cognitive_layers.py | 2 +- .../cognify/graph/add_document_node.py | 2 +- .../modules/cognify/graph/add_label_nodes.py | 2 +- .../cognify/graph/add_summary_nodes.py | 2 +- .../extract_knowledge_graph.py | 22 ++--- .../extract_knowledge_graph_module.py | 6 +- cognee/shared/SourceCodeGraph.py | 84 +++++++++++++++++++ cognee/shared/data_models.py | 12 +-- notebooks/full_run.ipynb | 10 ++- 12 files changed, 176 insertions(+), 64 deletions(-) create mode 100644 .data/code/example.txt create mode 100644 cognee/shared/SourceCodeGraph.py diff --git a/.data/code/example.txt b/.data/code/example.txt new file mode 100644 index 000000000..4596a08eb --- /dev/null +++ b/.data/code/example.txt @@ -0,0 +1,28 @@ +''' + Given a string, find the length of the longest substring without repeating characters. + + Examples: + + Given "abcabcbb", the answer is "abc", which the length is 3. + + Given "bbbbb", the answer is "b", with the length of 1. + + Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring. +''' + +class Solution(object): + def lengthOfLongestSubstring(self, s): + """ + :type s: str + :rtype: int + """ + mapSet = {} + start, result = 0, 0 + + for end in range(len(s)): + if s[end] in mapSet: + start = max(mapSet[s[end]], start) + result = max(result, end-start+1) + mapSet[s[end]] = end+1 + + return result diff --git a/cognee/modules/cognify/graph/add_classification_nodes.py b/cognee/modules/cognify/graph/add_classification_nodes.py index 67170b229..7a3a393df 100644 --- a/cognee/modules/cognify/graph/add_classification_nodes.py +++ b/cognee/modules/cognify/graph/add_classification_nodes.py @@ -5,20 +5,20 @@ async def add_classification_nodes(graph_client, parent_node_id: str, categories data_type = category["data_type"].upper().replace(' ', '_') category_name = category["category_name"].upper().replace(' ', '_').replace("'", "").replace("/", "_") - data_type_node_id = f"DATA_TYPE__{data_type}" + data_type_node_id = data_type data_type_node = await graph_client.extract_node(data_type_node_id) if not data_type_node: - data_type_node = await graph_client.add_node(data_type_node_id, dict(name = data_type, entity_type = "DataType")) + data_type_node = await graph_client.add_node(data_type_node_id, dict(name = data_type, type = "DataType")) await graph_client.add_edge(data_type_node_id, parent_node_id, "classified_as", dict(relationship_name = "classified_as")) - category_node_id = f"DATA_CATEGORY__{category_name}" + category_node_id = category_name category_node = await graph_client.extract_node(category_node_id) if not category_node: - category_node = await graph_client.add_node(category_node_id, dict(name = category_name, entity_type = "DataCategory")) + category_node = await graph_client.add_node(category_node_id, dict(name = category_name, type = "DataCategory")) await graph_client.add_edge(category_node_id, parent_node_id, "classified_as", dict(relationship_name = "classified_as")) diff --git a/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py b/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py index 11cc83a19..055362d8c 100644 --- a/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py +++ b/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py @@ -3,7 +3,6 @@ from uuid import uuid4 from typing import List, Tuple, TypedDict from cognee.infrastructure import infrastructure_config from cognee.infrastructure.databases.vector import DataPoint -from cognee.shared.data_models import KnowledgeGraph from cognee.utils import extract_pos_tags, extract_named_entities, extract_sentiment_vader class GraphLike(TypedDict): @@ -18,47 +17,50 @@ async def add_cognitive_layer_graphs( layer_graphs: List[Tuple[str, GraphLike]], ): vector_client = infrastructure_config.get_config("vector_engine") + graph_model = infrastructure_config.get_config("graph_model") for (layer_id, layer_graph) in layer_graphs: graph_nodes = [] graph_edges = [] - if not isinstance(layer_graph, KnowledgeGraph): - layer_graph = KnowledgeGraph.parse_obj(layer_graph) + if not isinstance(layer_graph, graph_model): + layer_graph = graph_model.parse_obj(layer_graph) for node in layer_graph.nodes: - node_id = generate_proposition_node_id(node.id) + node_id = generate_node_id(node.id) - entity_type_node_id = generate_type_node_id(node.entity_type) - entity_type_node = await graph_client.extract_node(entity_type_node_id) + type_node_id = generate_node_id(node.type) + type_node = await graph_client.extract_node(type_node_id) - if not entity_type_node: - node_name = node.entity_type.lower().capitalize() + if not type_node: + node_name = node.type.lower().capitalize() - entity_type_node = ( - entity_type_node_id, + type_node = ( + type_node_id, dict( - id = entity_type_node_id, + id = type_node_id, name = node_name, - entity_type = node_name, + type = node_name, created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ) ) - graph_nodes.append(entity_type_node) + graph_nodes.append(type_node) # Add relationship between document and entity type: "Document contains Person" graph_edges.append(( layer_id, - entity_type_node_id, + type_node_id, "contains", dict(relationship_name = "contains"), )) - pos_tags = extract_pos_tags(node.entity_description) - named_entities = extract_named_entities(node.entity_description) - sentiment = extract_sentiment_vader(node.entity_description) + # pos_tags = extract_pos_tags(node.description) + # named_entities = extract_named_entities(node.description) + # sentiment = extract_sentiment_vader(node.description) + + id, type, name, description, *node_properties = node graph_nodes.append(( node_id, @@ -67,21 +69,22 @@ async def add_cognitive_layer_graphs( layer_id = layer_id, chunk_id = chunk_id, chunk_collection = chunk_collection, - name = node.entity_name, - entity_type = node.entity_type.lower().capitalize(), - description = node.entity_description, - pos_tags = pos_tags, - sentiment = sentiment, - named_entities = named_entities, + name = node.name, + type = node.type.lower().capitalize(), + description = node.description, + # pos_tags = pos_tags, + # sentiment = sentiment, + # named_entities = named_entities, created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + *node_properties, ) )) # Add relationship between entity type and entity itself: "Jake is Person" graph_edges.append(( node_id, - entity_type_node_id, + type_node_id, "is", dict(relationship_name = "is"), )) @@ -96,8 +99,8 @@ async def add_cognitive_layer_graphs( # Add relationship that came from graphs. for edge in layer_graph.edges: graph_edges.append(( - generate_proposition_node_id(edge.source_node_id), - generate_proposition_node_id(edge.target_node_id), + generate_node_id(edge.source_node_id), + generate_node_id(edge.target_node_id), edge.relationship_name, dict(relationship_name = edge.relationship_name), )) @@ -129,8 +132,5 @@ async def add_cognitive_layer_graphs( await vector_client.create_data_points(layer_id, data_points) -def generate_proposition_node_id(node_id: str) -> str: - return f"PROPOSITION_NODE__{node_id.upper().replace(' ', '_')}".replace("'", "") - -def generate_type_node_id(node_id: str) -> str: - return f"PROPOSITION_TYPE_NODE__{node_id.upper().replace(' ', '_')}".replace("'", "") \ No newline at end of file +def generate_node_id(node_id: str) -> str: + return node_id.upper().replace(' ', '_').replace("'", "") diff --git a/cognee/modules/cognify/graph/add_cognitive_layers.py b/cognee/modules/cognify/graph/add_cognitive_layers.py index 6cd17c94a..50c87785e 100644 --- a/cognee/modules/cognify/graph/add_cognitive_layers.py +++ b/cognee/modules/cognify/graph/add_cognitive_layers.py @@ -21,4 +21,4 @@ async def add_cognitive_layers(graph_client, parent_node_id: str, cognitive_laye return cognitive_layer_nodes def generate_cognitive_layer_id(layer_id: str) -> str: - return f"COGNITIVE_LAYER__{layer_id.upper().replace(' ', '_')}".replace("'", "").replace("/", "_") + return layer_id.upper().replace(" ", "_").replace("'", "").replace("/", "_") diff --git a/cognee/modules/cognify/graph/add_document_node.py b/cognee/modules/cognify/graph/add_document_node.py index e1a6f7d52..027a5c241 100644 --- a/cognee/modules/cognify/graph/add_document_node.py +++ b/cognee/modules/cognify/graph/add_document_node.py @@ -13,7 +13,7 @@ async def add_document_node(graph_client: GraphDBInterface, parent_node_id, docu file_path = document_metadata["file_path"], ).model_dump() - document["entity_type"] = "Document" + document["type"] = "Document" await graph_client.add_node(document_id, document) diff --git a/cognee/modules/cognify/graph/add_label_nodes.py b/cognee/modules/cognify/graph/add_label_nodes.py index 572475060..245814f7c 100644 --- a/cognee/modules/cognify/graph/add_label_nodes.py +++ b/cognee/modules/cognify/graph/add_label_nodes.py @@ -19,7 +19,7 @@ async def add_label_nodes(graph_client, parent_node_id: str, chunk_id: str, keyw chunk_id = chunk_id, name = keyword.lower().capitalize(), keyword = keyword.lower(), - entity_type = "Keyword", + type = "Keyword", created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ), diff --git a/cognee/modules/cognify/graph/add_summary_nodes.py b/cognee/modules/cognify/graph/add_summary_nodes.py index 1424e64c5..0ea8dd7ca 100644 --- a/cognee/modules/cognify/graph/add_summary_nodes.py +++ b/cognee/modules/cognify/graph/add_summary_nodes.py @@ -20,7 +20,7 @@ async def add_summary_nodes(graph_client, document_id, summary): description_node_id, dict( name = "Description", - summary = summary["description"], + description = summary["description"], ), ) diff --git a/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph.py b/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph.py index 24c57a40e..1988c23bc 100644 --- a/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph.py +++ b/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph.py @@ -7,18 +7,18 @@ from .extract_content_graph import extract_content_graph logger = logging.getLogger("extract_knowledge_graph(text: str)") async def extract_knowledge_graph(text: str, cognitive_layer, graph_model): - try: - compiled_extract_knowledge_graph = ExtractKnowledgeGraph() - compiled_extract_knowledge_graph.load(get_absolute_path("./programs/extract_knowledge_graph/extract_knowledge_graph.json")) + # try: + # compiled_extract_knowledge_graph = ExtractKnowledgeGraph() + # compiled_extract_knowledge_graph.load(get_absolute_path("./programs/extract_knowledge_graph/extract_knowledge_graph.json")) - event_loop = asyncio.get_event_loop() + # event_loop = asyncio.get_event_loop() - def sync_extract_knowledge_graph(): - return compiled_extract_knowledge_graph(context = text, question = "") + # def sync_extract_knowledge_graph(): + # return compiled_extract_knowledge_graph(context = text, question = "") - return (await event_loop.run_in_executor(None, sync_extract_knowledge_graph)).graph - # return compiled_extract_knowledge_graph(text, question = "").graph - except Exception as error: - logger.error("Error extracting graph from content: %s", error, exc_info = True) + # return (await event_loop.run_in_executor(None, sync_extract_knowledge_graph)).graph + # # return compiled_extract_knowledge_graph(text, question = "").graph + # except Exception as error: + # logger.error("Error extracting graph from content: %s", error, exc_info = True) - return await extract_content_graph(text, cognitive_layer, graph_model) + return await extract_content_graph(text, cognitive_layer, graph_model) diff --git a/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph_module.py b/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph_module.py index 04ff42c8a..48ce1fc10 100644 --- a/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph_module.py +++ b/cognee/modules/data/extraction/knowledge_graph/extract_knowledge_graph_module.py @@ -29,8 +29,8 @@ class GraphFromText(dspy.Signature): def are_all_nodes_and_edges_valid(graph: KnowledgeGraph) -> bool: - return all([getattr(node, "entity_type", "").strip() != "" for node in graph.nodes]) and \ - all([getattr(node, "entity_name", "").strip() != "" for node in graph.nodes]) and \ + return all([getattr(node, "type", "").strip() != "" for node in graph.nodes]) and \ + all([getattr(node, "name", "").strip() != "" for node in graph.nodes]) and \ all([getattr(edge, "relationship_name", "").strip() != "" for edge in graph.edges]) def is_node_connected(node: Node, edges: List[Edge]) -> bool: @@ -56,7 +56,7 @@ class ExtractKnowledgeGraph(dspy.Module): graph = self.generate_graph(text = context).graph not_valid_nodes_or_edges_message = """ - All nodes must contain "entity_name". + All nodes must contain "name". All edges must contain "relationship_name". Please add mandatory fields to nodes and edges.""" diff --git a/cognee/shared/SourceCodeGraph.py b/cognee/shared/SourceCodeGraph.py new file mode 100644 index 000000000..279eb6870 --- /dev/null +++ b/cognee/shared/SourceCodeGraph.py @@ -0,0 +1,84 @@ +from typing import List, Union, Literal, Optional +from pydantic import BaseModel + +class BaseClass(BaseModel): + id: str + name: str + type: Literal["Class"] = "Class" + description: str + constructor_parameters: Optional[List[str]] + +class Class(BaseModel): + id: str + name: str + type: Literal["Class"] = "Class" + description: str + constructor_parameters: Optional[List[str]] + from_class: Optional[BaseClass] + +class ClassInstance(BaseModel): + id: str + name: str + type: Literal["ClassInstance"] = "ClassInstance" + description: str + from_class: Class + +class Function(BaseModel): + id: str + name: str + type: Literal["Function"] = "Function" + description: str + parameters: Optional[List[str]] + return_type: str + is_static: Optional[bool] = False + +class Variable(BaseModel): + id: str + name: str + type: Literal["Variable"] = "Variable" + description: str + is_static: Optional[bool] = False + default_value: Optional[str] + +class Operator(BaseModel): + id: str + name: str + type: Literal["Operator"] = "Operator" + description: str + return_type: str + +class ExpressionPart(BaseModel): + id: str + name: str + type: Literal["Expression"] = "Expression" + description: str + expression: str + members: List[Union[Variable, Function, Operator]] + +class Expression(BaseModel): + id: str + name: str + type: Literal["Expression"] = "Expression" + description: str + expression: str + members: List[Union[Variable, Function, Operator, ExpressionPart]] + +class Edge(BaseModel): + source_node_id: str + target_node_id: str + relationship_name: Literal["called in", "stored in", "defined in", "returned by", "instantiated in", "uses", "updates"] + +class SourceCodeGraph(BaseModel): + id: str + name: str + description: str + language: str + nodes: List[Union[ + Class, + Function, + Variable, + Operator, + Expression, + ClassInstance, + ]] + edges: List[Edge] diff --git a/cognee/shared/data_models.py b/cognee/shared/data_models.py index 8de86a291..034c97224 100644 --- a/cognee/shared/data_models.py +++ b/cognee/shared/data_models.py @@ -7,9 +7,9 @@ from pydantic import BaseModel, Field class Node(BaseModel): """Node in a knowledge graph.""" id: str - entity_name: str - entity_type: str - entity_description: str + name: str + type: str + description: str class Edge(BaseModel): """Edge in a knowledge graph.""" @@ -26,8 +26,6 @@ class GraphQLQuery(BaseModel): """GraphQL query.""" query: str - - class Answer(BaseModel): """Answer.""" answer: str @@ -42,7 +40,6 @@ class MemorySummary(BaseModel): nodes: List[Node] = Field(..., default_factory=list) edges: List[Edge] = Field(..., default_factory=list) - class TextSubclass(str, Enum): ARTICLES = "Articles, essays, and reports" BOOKS = "Books and manuscripts" @@ -107,7 +104,6 @@ class ImageSubclass(str, Enum): SCREENSHOTS = "Screenshots and graphical user interfaces" OTHER_IMAGES = "Other types of images" - class VideoSubclass(str, Enum): MOVIES = "Movies and short films" DOCUMENTARIES = "Documentaries and educational videos" @@ -183,7 +179,6 @@ class DefaultContentPrediction(BaseModel): ProceduralContent, ] - class SummarizedContent(BaseModel): """Class for a single class label summary and description.""" summary: str @@ -194,7 +189,6 @@ class LabeledContent(BaseModel): content_labels: str - class CognitiveLayerSubgroup(BaseModel): """ CognitiveLayerSubgroup in a general layer """ id: int diff --git a/notebooks/full_run.ipynb b/notebooks/full_run.ipynb index 878346fdf..250993b38 100644 --- a/notebooks/full_run.ipynb +++ b/notebooks/full_run.ipynb @@ -11,6 +11,7 @@ "import cognee\n", "import dspy\n", "from cognee.modules.cognify.dataset import HotPotQA\n", + "from cognee.shared.SourceCodeGraph import SourceCodeGraph\n", "\n", "data_directory_path = path.abspath(\"../.data\")\n", "cognee.config.data_root_directory(data_directory_path)\n", @@ -18,6 +19,8 @@ "cognee_directory_path = path.abspath(\"../.cognee_system\")\n", "cognee.config.system_root_directory(cognee_directory_path)\n", "\n", + "cognee.config.set_graph_model(SourceCodeGraph)\n", + "\n", "await cognee.prune.prune_system()\n", "\n", "colbertv2_wiki17_abstracts = dspy.ColBERTv2(url = \"http://20.102.90.50:2017/wiki17_abstracts\")\n", @@ -39,7 +42,7 @@ "\n", "# texts_to_add.append(train_case_text)\n", "\n", - "dataset_name = \"short_stories\"\n", + "dataset_name = \"code\"\n", "await cognee.add(\"data://\" + data_directory_path, dataset_name)\n" ] }, @@ -75,6 +78,9 @@ "from os import path\n", "import logging\n", "import cognee\n", + "from cognee.shared.SourceCodeGraph import SourceCodeGraph\n", + "\n", + "cognee.config.set_graph_model(SourceCodeGraph)\n", "\n", "logging.basicConfig(level = logging.INFO)\n", "\n", @@ -86,7 +92,7 @@ "cognee_directory_path = path.abspath(\"../.cognee_system\")\n", "cognee.config.system_root_directory(cognee_directory_path)\n", "\n", - "await cognee.cognify('short_stories')" + "await cognee.cognify('code')" ] }, { From 84fcf6c5a695f566e7029bf160c7c80e8a42e0bb Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:52:44 +0200 Subject: [PATCH 02/21] fix cog layers --- cognee/modules/cognify/graph/add_cognitive_layer_graphs.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py b/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py index 055362d8c..f52fe8a3c 100644 --- a/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py +++ b/cognee/modules/cognify/graph/add_cognitive_layer_graphs.py @@ -62,6 +62,10 @@ async def add_cognitive_layer_graphs( id, type, name, description, *node_properties = node + print("Node properties: ", node_properties) + + node_properties = dict(node_properties) + graph_nodes.append(( node_id, dict( @@ -77,7 +81,7 @@ async def add_cognitive_layer_graphs( # named_entities = named_entities, created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - *node_properties, + **node_properties, ) )) From 8e850c19f8efb2418a9935b9c504535994524498 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:14:11 +0200 Subject: [PATCH 03/21] fix search, add improvements --- .github/workflows/test_common.yml | 14 +- cognee/api/v1/cognify/cognify.py | 16 +- cognee/api/v1/search/search.py | 3 + .../databases/graph/networkx/adapter.py | 3 + .../llm/prompts/categorize_categories.txt | 2 + .../llm/prompts/categorize_summary.txt | 2 + .../cognify/graph/add_summary_nodes.py | 2 + .../modules/search/graph/search_categories.py | 35 +- cognee/modules/search/graph/search_summary.py | 32 +- .../categorize_relevant_category.py | 17 + .../extraction/categorize_relevant_summary.py | 17 + .../search/llm/get_relevant_summary.py | 17 + cognee/shared/data_models.py | 7 + notebooks/full_run.ipynb | 321 ++++++++++- poetry.lock | 536 +++++++++++++++--- pyproject.toml | 3 + 16 files changed, 907 insertions(+), 120 deletions(-) create mode 100644 cognee/infrastructure/llm/prompts/categorize_categories.txt create mode 100644 cognee/infrastructure/llm/prompts/categorize_summary.txt create mode 100644 cognee/modules/search/llm/extraction/categorize_relevant_category.py create mode 100644 cognee/modules/search/llm/extraction/categorize_relevant_summary.py create mode 100644 cognee/modules/search/llm/get_relevant_summary.py diff --git a/.github/workflows/test_common.yml b/.github/workflows/test_common.yml index ac8dd5189..0c9b5a653 100644 --- a/.github/workflows/test_common.yml +++ b/.github/workflows/test_common.yml @@ -72,13 +72,13 @@ jobs: - name: Install dependencies run: poetry install --no-interaction - # - name: Build with Poetry - # run: poetry build - - # - name: Install Package - # run: | - # cd dist - # pip install *.whl + # - name: Build with Poetry + # run: poetry build + # + # - name: Install Package + # run: | + # cd dist + # pip install *.whl # - name: Download NLTK Punkt Tokenizer Models # run: | diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 32fcd9285..1f084a75e 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -126,6 +126,8 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi print(f"Chunk ({chunk_id}) classified.") + print("document_id", document_id) + content_summary = await get_content_summary(input_text) await add_summary_nodes(graph_client, document_id, content_summary) @@ -171,16 +173,16 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi if __name__ == "__main__": async def test(): - - from cognee.api.v1.add import add - - await add(["A large language model (LLM) is a language model notable for its ability to achieve general-purpose language generation and other natural language processing tasks such as classification"], "test") - - graph = await cognify() + # + # from cognee.api.v1.add import add + # + # await add(["A large language model (LLM) is a language model notable for its ability to achieve general-purpose language generation and other natural language processing tasks such as classification"], "code") + # + # graph = await cognify() from cognee.utils import render_graph - await render_graph(graph, include_color=True, include_nodes=True, include_size=True) + await render_graph(graph, include_color=True, include_nodes=False, include_size=False) import asyncio asyncio.run(test()) diff --git a/cognee/api/v1/search/search.py b/cognee/api/v1/search/search.py index 99ffb6b93..af8a7b728 100644 --- a/cognee/api/v1/search/search.py +++ b/cognee/api/v1/search/search.py @@ -18,6 +18,9 @@ class SearchType(Enum): CATEGORIES = 'CATEGORIES' NEIGHBOR = 'NEIGHBOR' SUMMARY = 'SUMMARY' + SUMMARY_CLASSIFICATION = 'SUMMARY_CLASSIFICATION' + NODE_CLASSIFICATION = 'NODE_CLASSIFICATION' + DOCUMENT_CLASSIFICATION = 'DOCUMENT_CLASSIFICATION' @staticmethod def from_str(name: str): diff --git a/cognee/infrastructure/databases/graph/networkx/adapter.py b/cognee/infrastructure/databases/graph/networkx/adapter.py index fc01795d5..d5a8da0b0 100644 --- a/cognee/infrastructure/databases/graph/networkx/adapter.py +++ b/cognee/infrastructure/databases/graph/networkx/adapter.py @@ -41,6 +41,9 @@ class NetworkXAdapter(GraphDBInterface): ) -> None: self.graph.add_nodes_from(nodes) await self.save_graph_to_file(self.filename) + + async def get_graph(self): + return self.graph async def add_edge( self, diff --git a/cognee/infrastructure/llm/prompts/categorize_categories.txt b/cognee/infrastructure/llm/prompts/categorize_categories.txt new file mode 100644 index 000000000..4b14f59bb --- /dev/null +++ b/cognee/infrastructure/llm/prompts/categorize_categories.txt @@ -0,0 +1,2 @@ +Chose the summary that is the most relevant to the query`{{ query }}` +Here are the categories:`{{ categories }}` \ No newline at end of file diff --git a/cognee/infrastructure/llm/prompts/categorize_summary.txt b/cognee/infrastructure/llm/prompts/categorize_summary.txt new file mode 100644 index 000000000..d5e77da36 --- /dev/null +++ b/cognee/infrastructure/llm/prompts/categorize_summary.txt @@ -0,0 +1,2 @@ +Chose the summary that is the most relevant to the query`{{ query }}` +Here are the summaries:`{{ summaries }}` \ No newline at end of file diff --git a/cognee/modules/cognify/graph/add_summary_nodes.py b/cognee/modules/cognify/graph/add_summary_nodes.py index 0ea8dd7ca..89e4666a2 100644 --- a/cognee/modules/cognify/graph/add_summary_nodes.py +++ b/cognee/modules/cognify/graph/add_summary_nodes.py @@ -7,6 +7,7 @@ async def add_summary_nodes(graph_client, document_id, summary): summary_node_id, dict( name = "Summary", + document_id = document_id, summary = summary["summary"], ), ) @@ -20,6 +21,7 @@ async def add_summary_nodes(graph_client, document_id, summary): description_node_id, dict( name = "Description", + document_id= document_id, description = summary["description"], ), ) diff --git a/cognee/modules/search/graph/search_categories.py b/cognee/modules/search/graph/search_categories.py index ce96a4b35..87096ad9e 100644 --- a/cognee/modules/search/graph/search_categories.py +++ b/cognee/modules/search/graph/search_categories.py @@ -1,11 +1,19 @@ -from typing import Union, Dict +from typing import Union, Dict, re + +from cognee.modules.search.llm.extraction.categorize_relevant_category import categorize_relevant_category """ Search categories in the graph and return their summary attributes. """ -from cognee.shared.data_models import GraphDBType +from cognee.shared.data_models import GraphDBType, DefaultContentPrediction import networkx as nx -async def search_categories(graph: Union[nx.Graph, any], query_label: str, infrastructure_config: Dict): +def strip_exact_regex(s, substring): + # Escaping substring to be used in a regex pattern + pattern = re.escape(substring) + # Regex to match the exact substring at the start and end + return re.sub(f"^{pattern}|{pattern}$", "", s) + +async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: str, infrastructure_config: Dict): """ Filter nodes in the graph that contain the specified label and return their summary attributes. This function supports both NetworkX graphs and Neo4j graph databases. @@ -22,8 +30,25 @@ async def search_categories(graph: Union[nx.Graph, any], query_label: str, infra """ # Determine which client is in use based on the configuration if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: - # Logic for NetworkX - return {node: data.get('content_labels') for node, data in graph.nodes(data=True) if query_label in node and 'content_labels' in data} + + categories_and_ids = [ + {'document_id': strip_exact_regex(_, "DATA_SUMMARY__"), 'Summary': data['summary']} + for _, data in graph.nodes(data=True) + if 'summary' in data + ] + print("summaries_and_ids", categories_and_ids) + check_relevant_category = await categorize_relevant_category(query, categories_and_ids, response_model= infrastructure_config.get_config()["classification_model"]) + print("check_relevant_summary", check_relevant_category) + + connected_nodes = list(graph.neighbors(check_relevant_category['document_id'])) + print("connected_nodes", connected_nodes) + descriptions = {node: graph.nodes[node].get('description', 'No desc available') for node in connected_nodes} + print("descs", descriptions) + return descriptions + + # + # # Logic for NetworkX + # return {node: data.get('content_labels') for node, data in graph.nodes(data=True) if query_label in node and 'content_labels' in data} elif infrastructure_config.get_config()["graph_engine"] == GraphDBType.NEO4J: # Logic for Neo4j diff --git a/cognee/modules/search/graph/search_summary.py b/cognee/modules/search/graph/search_summary.py index be8f3f3e8..4618fc04e 100644 --- a/cognee/modules/search/graph/search_summary.py +++ b/cognee/modules/search/graph/search_summary.py @@ -3,9 +3,19 @@ from typing import Union, Dict import networkx as nx -from cognee.shared.data_models import GraphDBType +from cognee.infrastructure import infrastructure_config -async def search_summary(graph: Union[nx.Graph, any], query: str, infrastructure_config: Dict, other_param: str = None) -> Dict[str, str]: +from cognee.modules.search.llm.extraction.categorize_relevant_summary import categorize_relevant_summary +from cognee.shared.data_models import GraphDBType, ResponseSummaryModel + +import re + +def strip_exact_regex(s, substring): + # Escaping substring to be used in a regex pattern + pattern = re.escape(substring) + # Regex to match the exact substring at the start and end + return re.sub(f"^{pattern}|{pattern}$", "", s) +async def search_summary( query: str, graph: Union[nx.Graph, any]) -> Dict[str, str]: """ Filter nodes based on a condition (such as containing 'SUMMARY' in their identifiers) and return their summary attributes. Supports both NetworkX graphs and Neo4j graph databases based on the configuration. @@ -19,8 +29,24 @@ async def search_summary(graph: Union[nx.Graph, any], query: str, infrastructure Returns: - Dict[str, str]: A dictionary where keys are node identifiers containing the query string, and values are their 'summary' attributes. """ + if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: - return {node: data.get('summary') for node, data in graph.nodes(data=True) if query in node and 'summary' in data} + print("graph", graph) + summaries_and_ids = [ + {'document_id': strip_exact_regex(_, "DATA_SUMMARY__"), 'Summary': data['summary']} + for _, data in graph.nodes(data=True) + if 'summary' in data + ] + print("summaries_and_ids", summaries_and_ids) + check_relevant_summary = await categorize_relevant_summary(query, summaries_and_ids, response_model=ResponseSummaryModel) + print("check_relevant_summary", check_relevant_summary) + + connected_nodes = list(graph.neighbors(check_relevant_summary['document_id'])) + print("connected_nodes", connected_nodes) + descriptions = {node: graph.nodes[node].get('description', 'No desc available') for node in connected_nodes} + print("descs", descriptions) + return descriptions + elif infrastructure_config.get_config()["graph_engine"] == GraphDBType.NEO4J: cypher_query = f""" diff --git a/cognee/modules/search/llm/extraction/categorize_relevant_category.py b/cognee/modules/search/llm/extraction/categorize_relevant_category.py new file mode 100644 index 000000000..d49c9f55b --- /dev/null +++ b/cognee/modules/search/llm/extraction/categorize_relevant_category.py @@ -0,0 +1,17 @@ +from typing import Type +from pydantic import BaseModel +from cognee.infrastructure.llm.prompts import render_prompt +from cognee.infrastructure.llm.get_llm_client import get_llm_client + +async def categorize_relevant_category(query: str, summary, response_model: Type[BaseModel]): + llm_client = get_llm_client() + + enriched_query= render_prompt("categorize_category.txt", {"query": query, "categories": summary}) + + print("enriched_query", enriched_query) + + system_prompt = " Choose the relevant categories and return appropriate output based on the model" + + llm_output = await llm_client.acreate_structured_output(enriched_query, system_prompt, response_model) + + return llm_output.model_dump() diff --git a/cognee/modules/search/llm/extraction/categorize_relevant_summary.py b/cognee/modules/search/llm/extraction/categorize_relevant_summary.py new file mode 100644 index 000000000..2d6be6790 --- /dev/null +++ b/cognee/modules/search/llm/extraction/categorize_relevant_summary.py @@ -0,0 +1,17 @@ +from typing import Type +from pydantic import BaseModel +from cognee.infrastructure.llm.prompts import render_prompt +from cognee.infrastructure.llm.get_llm_client import get_llm_client + +async def categorize_relevant_summary(query: str, summary, response_model: Type[BaseModel]): + llm_client = get_llm_client() + + enriched_query= render_prompt("categorize_summary.txt", {"query": query, "summaries": summary}) + + print("enriched_query", enriched_query) + + system_prompt = " Choose the relevant summary and return appropriate output based on the model" + + llm_output = await llm_client.acreate_structured_output(enriched_query, system_prompt, response_model) + + return llm_output.model_dump() diff --git a/cognee/modules/search/llm/get_relevant_summary.py b/cognee/modules/search/llm/get_relevant_summary.py new file mode 100644 index 000000000..a4af4753b --- /dev/null +++ b/cognee/modules/search/llm/get_relevant_summary.py @@ -0,0 +1,17 @@ +import logging +from typing import List, Dict +from cognee.infrastructure import infrastructure_config +from.extraction.categorize_relevant_summary import categorize_relevant_summary + +logger = logging.getLogger(__name__) + +async def get_cognitive_layers(content: str, categories: List[Dict]): + try: + return (await categorize_relevant_summary( + content, + categories[0], + infrastructure_config.get_config()["categorize_summary_model"] + )).cognitive_layers + except Exception as error: + logger.error("Error extracting cognitive layers from content: %s", error, exc_info = True) + raise error diff --git a/cognee/shared/data_models.py b/cognee/shared/data_models.py index 034c97224..7eea17cdc 100644 --- a/cognee/shared/data_models.py +++ b/cognee/shared/data_models.py @@ -244,3 +244,10 @@ class DefaultGraphModel(BaseModel): documents: List[Document] = [] default_fields: Optional[Dict[str, Any]] = {} default_relationship: Relationship = Relationship(type = "has_properties") + + +class ResponseSummaryModel(BaseModel): + """ Response summary model and existing document id """ + document_id: str + response_summary: str + diff --git a/notebooks/full_run.ipynb b/notebooks/full_run.ipynb index 250993b38..d6dc41261 100644 --- a/notebooks/full_run.ipynb +++ b/notebooks/full_run.ipynb @@ -2,10 +2,31 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "38135bf7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:NetworkXAdapter:File /Users/vasa/Projects/cognee/.cognee_system/databases/cognee_graph.pkl not found. Initializing an empty graph./Users/vasa/Projects/cognee/.venv/lib/python3.11/site-packages/dlt/common/configuration/container.py:94: DeprecationWarning: currentThread() is deprecated, use current_thread() instead\n", + " if m := re.match(r\"dlt-pool-(\\d+)-\", threading.currentThread().getName()):\n", + "/Users/vasa/Projects/cognee/.venv/lib/python3.11/site-packages/dlt/common/configuration/container.py:94: DeprecationWarning: getName() is deprecated, get the name attribute instead\n", + " if m := re.match(r\"dlt-pool-(\\d+)-\", threading.currentThread().getName()):\n" + ] + }, + { + "data": { + "text/plain": [ + "[[LoadInfo(pipeline=, metrics={'1714493358.732525': [{'started_at': DateTime(2024, 4, 30, 16, 9, 19, 653744, tzinfo=Timezone('UTC')), 'finished_at': DateTime(2024, 4, 30, 16, 9, 19, 957893, tzinfo=Timezone('UTC'))}]}, destination_type='dlt.destinations.duckdb', destination_displayable_credentials='duckdb:///:external:', destination_name='duckdb', environment=None, staging_type=None, staging_name=None, staging_displayable_credentials=None, destination_fingerprint='', dataset_name='code', loads_ids=['1714493358.732525'], load_packages=[LoadPackageInfo(load_id='1714493358.732525', package_path='/Users/vasa/.dlt/pipelines/file_load_from_filesystem/load/loaded/1714493358.732525', state='loaded', schema=Schema file_load_from_filesystem at 13554777360, schema_update={'_dlt_loads': {'name': '_dlt_loads', 'columns': {'load_id': {'name': 'load_id', 'data_type': 'text', 'nullable': False}, 'schema_name': {'name': 'schema_name', 'data_type': 'text', 'nullable': True}, 'status': {'name': 'status', 'data_type': 'bigint', 'nullable': False}, 'inserted_at': {'name': 'inserted_at', 'data_type': 'timestamp', 'nullable': False}, 'schema_version_hash': {'name': 'schema_version_hash', 'data_type': 'text', 'nullable': True}}, 'write_disposition': 'skip', 'resource': '_dlt_loads', 'description': 'Created by DLT. Tracks completed loads', 'table_format': None}, '_dlt_pipeline_state': {'columns': {'version': {'name': 'version', 'data_type': 'bigint', 'nullable': False}, 'engine_version': {'name': 'engine_version', 'data_type': 'bigint', 'nullable': False}, 'pipeline_name': {'name': 'pipeline_name', 'data_type': 'text', 'nullable': False}, 'state': {'name': 'state', 'data_type': 'text', 'nullable': False}, 'created_at': {'name': 'created_at', 'data_type': 'timestamp', 'nullable': False}, 'version_hash': {'name': 'version_hash', 'data_type': 'text', 'nullable': True}, '_dlt_load_id': {'name': '_dlt_load_id', 'data_type': 'text', 'nullable': False}, '_dlt_id': {'name': '_dlt_id', 'data_type': 'text', 'nullable': False, 'unique': True}}, 'write_disposition': 'append', 'name': '_dlt_pipeline_state', 'resource': '_dlt_pipeline_state', 'x-normalizer': {'seen-data': True}, 'table_format': None}, 'file_metadata': {'columns': {'id': {'name': 'id', 'nullable': False, 'merge_key': True, 'data_type': 'text'}, 'name': {'name': 'name', 'data_type': 'text', 'nullable': True}, 'file_path': {'name': 'file_path', 'data_type': 'text', 'nullable': True}, 'extension': {'name': 'extension', 'data_type': 'text', 'nullable': True}, 'mime_type': {'name': 'mime_type', 'data_type': 'text', 'nullable': True}, 'keywords': {'name': 'keywords', 'data_type': 'text', 'nullable': True}, '_dlt_load_id': {'name': '_dlt_load_id', 'data_type': 'text', 'nullable': False}, '_dlt_id': {'name': '_dlt_id', 'data_type': 'text', 'nullable': False, 'unique': True}}, 'write_disposition': 'merge', 'name': 'file_metadata', 'resource': 'data_resources', 'x-normalizer': {'seen-data': True}, 'table_format': None}, '_dlt_version': {'name': '_dlt_version', 'columns': {'version': {'name': 'version', 'data_type': 'bigint', 'nullable': False}, 'engine_version': {'name': 'engine_version', 'data_type': 'bigint', 'nullable': False}, 'inserted_at': {'name': 'inserted_at', 'data_type': 'timestamp', 'nullable': False}, 'schema_name': {'name': 'schema_name', 'data_type': 'text', 'nullable': False}, 'version_hash': {'name': 'version_hash', 'data_type': 'text', 'nullable': False}, 'schema': {'name': 'schema', 'data_type': 'text', 'nullable': False}}, 'write_disposition': 'skip', 'resource': '_dlt_version', 'description': 'Created by DLT. Tracks schema updates', 'table_format': None}}, completed_at=DateTime(2024, 4, 30, 16, 9, 19, 951047, tzinfo=Timezone('UTC')), jobs={'new_jobs': [], 'failed_jobs': [], 'started_jobs': [], 'completed_jobs': [LoadJobInfo(state='completed_jobs', file_path='/Users/vasa/.dlt/pipelines/file_load_from_filesystem/load/loaded/1714493358.732525/completed_jobs/_dlt_pipeline_state.5b1065da97.0.insert_values', file_size=526, created_at=DateTime(2024, 4, 30, 16, 9, 19, 309619, tzinfo=Timezone('UTC')), elapsed=0.6414282321929932, job_file_info=ParsedLoadJobFileName(table_name='_dlt_pipeline_state', file_id='5b1065da97', retry_count=0, file_format='insert_values'), failed_message=None), LoadJobInfo(state='completed_jobs', file_path='/Users/vasa/.dlt/pipelines/file_load_from_filesystem/load/loaded/1714493358.732525/completed_jobs/file_metadata.13d63c321b.0.insert_values', file_size=354, created_at=DateTime(2024, 4, 30, 16, 9, 19, 309748, tzinfo=Timezone('UTC')), elapsed=0.6412985324859619, job_file_info=ParsedLoadJobFileName(table_name='file_metadata', file_id='13d63c321b', retry_count=0, file_format='insert_values'), failed_message=None), LoadJobInfo(state='completed_jobs', file_path='/Users/vasa/.dlt/pipelines/file_load_from_filesystem/load/loaded/1714493358.732525/completed_jobs/file_metadata.c6d93b3a58.0.sql', file_size=401, created_at=DateTime(2024, 4, 30, 16, 9, 19, 721255, tzinfo=Timezone('UTC')), elapsed=0.22979211807250977, job_file_info=ParsedLoadJobFileName(table_name='file_metadata', file_id='c6d93b3a58', retry_count=0, file_format='sql'), failed_message=None)]})], first_run=True)]]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from os import path\n", "import cognee\n", @@ -48,32 +69,207 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "44603a2a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['code']\n" + ] + }, + { + "ename": "CatalogException", + "evalue": "Catalog Error: Table with name file_metadata does not exist!\nDid you mean \"code_staging.file_metadata\"?", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCatalogException\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 12\u001b[0m\n\u001b[1;32m 8\u001b[0m cognee\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msystem_root_directory(cognee_directory_path)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(cognee\u001b[38;5;241m.\u001b[39mdatasets\u001b[38;5;241m.\u001b[39mlist_datasets())\n\u001b[0;32m---> 12\u001b[0m train_dataset \u001b[38;5;241m=\u001b[39m \u001b[43mcognee\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdatasets\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mquery_data\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mshort_stories\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28mlen\u001b[39m(train_dataset))\n", + "File \u001b[0;32m~/Projects/cognee/cognee/api/v1/datasets/datasets.py:17\u001b[0m, in \u001b[0;36mdatasets.query_data\u001b[0;34m(dataset_name)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;129m@staticmethod\u001b[39m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mquery_data\u001b[39m(dataset_name: \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 16\u001b[0m db \u001b[38;5;241m=\u001b[39m infrastructure_config\u001b[38;5;241m.\u001b[39mget_config(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdatabase_engine\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 17\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_files_metadata\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset_name\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Projects/cognee/cognee/infrastructure/databases/relational/duckdb/DuckDBAdapter.py:21\u001b[0m, in \u001b[0;36mDuckDBAdapter.get_files_metadata\u001b[0;34m(self, dataset_name)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_files_metadata\u001b[39m(\u001b[38;5;28mself\u001b[39m, dataset_name: \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m---> 21\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_connection\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconnection\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 22\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mreturn\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msql\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mSELECT id, name, file_path, extension, mime_type, keywords FROM \u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mdataset_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.file_metadata;\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_df\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrecords\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Projects/cognee/cognee/infrastructure/databases/relational/duckdb/DuckDBAdapter.py:22\u001b[0m, in \u001b[0;36mDuckDBAdapter.get_files_metadata\u001b[0;34m(self, dataset_name)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_files_metadata\u001b[39m(\u001b[38;5;28mself\u001b[39m, dataset_name: \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_connection() \u001b[38;5;28;01mas\u001b[39;00m connection:\n\u001b[0;32m---> 22\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msql\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mSELECT id, name, file_path, extension, mime_type, keywords FROM \u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mdataset_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.file_metadata;\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mto_df()\u001b[38;5;241m.\u001b[39mto_dict(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrecords\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mCatalogException\u001b[0m: Catalog Error: Table with name file_metadata does not exist!\nDid you mean \"code_staging.file_metadata\"?" + ] + } + ], "source": [ - "from os import path\n", - "import cognee\n", + "# from os import path\n", + "# import cognee\n", "\n", - "data_directory_path = path.abspath(\"../.data\")\n", - "cognee.config.data_root_directory(data_directory_path)\n", + "# data_directory_path = path.abspath(\"../.data\")\n", + "# cognee.config.data_root_directory(data_directory_path)\n", "\n", - "cognee_directory_path = path.abspath(\"../.cognee_system\")\n", - "cognee.config.system_root_directory(cognee_directory_path)\n", + "# cognee_directory_path = path.abspath(\"../.cognee_system\")\n", + "# cognee.config.system_root_directory(cognee_directory_path)\n", "\n", - "print(cognee.datasets.list_datasets())\n", + "# print(cognee.datasets.list_datasets())\n", "\n", - "train_dataset = cognee.datasets.query_data(\"short_stories\")\n", - "print(len(train_dataset))" + "# train_dataset = cognee.datasets.query_data(\"short_stories\")\n", + "# print(len(train_dataset))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "65bfaf09", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:NetworkXAdapter:File /Users/vasa/Projects/cognee/.cognee_system/databases/cognee_graph.pkl not found. Initializing an empty graph.WARNING:NetworkXAdapter:File /Users/vasa/Projects/cognee/.cognee_system/databases/cognee_graph.pkl not found. Initializing an empty graph.ERROR:root:Collection still not found. Creating collection again." + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "050895021b1a44cab961b00c590714ce", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 7 files: 0%| | 0/7 [00:00>\n", + " _warn(f\"unclosed transport {self!r}\", ResourceWarning, source=self)\n", + "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n", + "/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/selector_events.py:864: ResourceWarning: unclosed transport <_SelectorSocketTransport fd=92 read=idle write=>\n", + " _warn(f\"unclosed transport {self!r}\", ResourceWarning, source=self)\n", + "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n", + "/Users/vasa/Projects/cognee/.venv/lib/python3.11/site-packages/pydantic/main.py:1096: PydanticDeprecatedSince20: The `parse_obj` method is deprecated; use `model_validate` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Node properties: [('constructor_parameters', None), ('from_class', None)]\n", + "Node properties: [('parameters', ['s']), ('return_type', 'int'), ('is_static', False)]\n", + "Node properties: [('is_static', False), ('default_value', '{}')]\n", + "Node properties: [('is_static', False), ('default_value', '0')]\n", + "Node properties: [('is_static', False), ('default_value', '0')]\n", + "Node properties: [('is_static', False), ('default_value', None)]\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f1e021c7325f4fe099571713aa4cefed", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 7 files: 0%| | 0/7 [00:00>\n", + " _warn(f\"unclosed transport {self!r}\", ResourceWarning, source=self)\n", + "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ee03487aeb94cae97d1b67ea8d239af", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 7 files: 0%| | 0/7 [00:00" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from os import path\n", "import logging\n", @@ -97,10 +293,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "a514cf38", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph is visualized at: https://hub.graphistry.com/graph/graph.html?dataset=bcdf88d11a934508b58e6c7850e73fd3&type=arrow&viztoken=2823d6ff-3dd6-464c-b864-2dcb8f399d79&usertag=1daaf574-pygraphistry-0.33.7&splashAfter=1714419870&info=true\n" + ] + } + ], "source": [ "import networkx as nx\n", "import pandas as pd\n", @@ -141,15 +345,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "e916c484", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "graph MultiDiGraph with 45 nodes and 62 edges\n", + "summaries_and_ids [{'document_id': 'DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f', 'Summary': 'Longest Substring Without Repeating Characters'}]\n", + "enriched_query Chose the summary that is the most relevant to the query`Who are French girls?`\n", + "Here are the summaries:`[{'document_id': 'DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f', 'Summary': 'Longest Substring Without Repeating Characters'}]`\n", + "check_relevant_summary {'document_id': 'DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f', 'response_summary': 'Longest Substring Without Repeating Characters'}\n", + "connected_nodes ['DATA_LABEL_STRING', 'DATA_LABEL_LENGTH', 'DATA_LABEL_SUBSTRING', 'DATA_LABEL_ANSWER', 'DATA_LABEL_BBBBB', 'DATA_LABEL_PWWKEW', 'DATA_LABEL_NOTE', 'DATA_LABEL_PWKE', 'DATA_LABEL_SUBSEQUENCE', 'DATA_LABEL_CLASS', 'DATA_LABEL_OBJECT', 'DATA_LABEL_LENGTHOFLONGESTSUBSTRING', 'DATA_LABEL_TYPE', 'DATA_LABEL_RTYPE', 'DATA_LABEL_MAPSET', 'DATA_SUMMARY__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f', 'DATA_DESCRIPTION__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f', 'COGNITIVE_LAYER__SYNTAX_LAYER', 'COGNITIVE_LAYER__SEMANTIC_LAYER', 'COGNITIVE_LAYER__FUNCTIONAL_LAYER', 'COGNITIVE_LAYER__MODULE_INTERACTION_LAYER', 'COGNITIVE_LAYER__DATA_FLOW_LAYER', 'COGNITIVE_LAYER__CONTROL_FLOW_LAYER', 'COGNITIVE_LAYER__PERFORMANCE_LAYER', 'COGNITIVE_LAYER__SECURITY_LAYER', 'COGNITIVE_LAYER__DOCUMENTATION_AND_COMMENTS_LAYER', 'COGNITIVE_LAYER__CONVENTIONS_AND_STYLE_LAYER', 'COGNITIVE_LAYER__DEPENDENCY_AND_INTEGRATION_LAYER', 'COGNITIVE_LAYER__VERSION_CONTROL_AND_HISTORY_LAYER', 'COGNITIVE_LAYER__TEST_AND_VERIFICATION_LAYER', 'COGNITIVE_LAYER__LICENSE_AND_COPYRIGHT_LAYER', 'COGNITIVE_LAYER__PLATFORM_AND_ENVIRONMENT_LAYER']\n", + "descs {'DATA_LABEL_STRING': 'No desc available', 'DATA_LABEL_LENGTH': 'No desc available', 'DATA_LABEL_SUBSTRING': 'No desc available', 'DATA_LABEL_ANSWER': 'No desc available', 'DATA_LABEL_BBBBB': 'No desc available', 'DATA_LABEL_PWWKEW': 'No desc available', 'DATA_LABEL_NOTE': 'No desc available', 'DATA_LABEL_PWKE': 'No desc available', 'DATA_LABEL_SUBSEQUENCE': 'No desc available', 'DATA_LABEL_CLASS': 'No desc available', 'DATA_LABEL_OBJECT': 'No desc available', 'DATA_LABEL_LENGTHOFLONGESTSUBSTRING': 'No desc available', 'DATA_LABEL_TYPE': 'No desc available', 'DATA_LABEL_RTYPE': 'No desc available', 'DATA_LABEL_MAPSET': 'No desc available', 'DATA_SUMMARY__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f': 'No desc available', 'DATA_DESCRIPTION__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f': \"The task is to find the length of the longest substring in a given string that does not contain any repeating characters. Examples include finding such substrings in 'abcabcbb' (resulting in 'abc' with length 3), 'bbbbb' (resulting in 'b' with length 1), and 'pwwkew' (resulting in 'wke' with length 3), emphasizing that substrings are different from subsequences. The provided Python class 'Solution' includes a method 'lengthOfLongestSubstring' that uses a hash map to track characters and their indices, updating start and result variables to calculate the maximum length of such substrings without repetitions.\", 'COGNITIVE_LAYER__SYNTAX_LAYER': 'This layer deals with the syntactic structure of the source code including tokens, keywords, operators, and control structures, which are essential for understanding its grammatical correctness.', 'COGNITIVE_LAYER__SEMANTIC_LAYER': 'This layer addresses the meanings of individual instructions and the functions they perform within the code. It covers variable declarations, method calls, and data manipulations that carry semantic value.', 'COGNITIVE_LAYER__FUNCTIONAL_LAYER': 'This layer focuses on the algorithmic and logical aspects of the code, assessing how different components interact to fulfill designated tasks and solve specific problems.', 'COGNITIVE_LAYER__MODULE_INTERACTION_LAYER': 'Here, the analysis is on the interaction between different modules, functions, or classes in the source code, illustrating the architectural design and interdependencies.', 'COGNITIVE_LAYER__DATA_FLOW_LAYER': \"This layer examines how data is passed through the system, including variable scopes, parameter passing, and state management, which is crucial for understanding the program's behavior.\", 'COGNITIVE_LAYER__CONTROL_FLOW_LAYER': 'Examining the flow of execution throughout the code (e.g., loops, conditionals, and function calls), this layer is important for understanding the logic and potential execution paths in the program.', 'COGNITIVE_LAYER__PERFORMANCE_LAYER': 'This layer analyzes aspects of the code that affect its performance, such as complexity, optimization, potential bottlenecks, and resource management.', 'COGNITIVE_LAYER__SECURITY_LAYER': 'Focuses on identifying security-related aspects of source code, such as vulnerabilities, security controls, and adherence to secure coding practices.', 'COGNITIVE_LAYER__DOCUMENTATION_AND_COMMENTS_LAYER': \"Includes inline comments, docstrings, and external documentation that provide insights into the developer's intentions, explain complex pieces of code and specify APIs.\", 'COGNITIVE_LAYER__CONVENTIONS_AND_STYLE_LAYER': 'Encompasses coding standards, naming conventions, and formatting that contribute to code readability, maintainability, and consistency across a codebase.', 'COGNITIVE_LAYER__DEPENDENCY_AND_INTEGRATION_LAYER': 'Analyzes external libraries, components, or services that the code interacts with, both at the source level and through build and deployment processes.', 'COGNITIVE_LAYER__VERSION_CONTROL_AND_HISTORY_LAYER': 'Captures changes, version history, collaboration, and branch management within version control systems to understand the development and evolution of the codebase.', 'COGNITIVE_LAYER__TEST_AND_VERIFICATION_LAYER': \"This layer includes test scripts, test cases, and the overall testing strategy implemented to verify the code's functionality and robustness.\", 'COGNITIVE_LAYER__LICENSE_AND_COPYRIGHT_LAYER': 'Deals with legal aspects such as copyright notices, licensing information, and intellectual property concerns related to the source code.', 'COGNITIVE_LAYER__PLATFORM_AND_ENVIRONMENT_LAYER': 'Examines compatibility issues, target runtime environments, and platform-specific considerations that are important for code deployment and execution.'}\n", + "{'DATA_LABEL_STRING': 'No desc available', 'DATA_LABEL_LENGTH': 'No desc available', 'DATA_LABEL_SUBSTRING': 'No desc available', 'DATA_LABEL_ANSWER': 'No desc available', 'DATA_LABEL_BBBBB': 'No desc available', 'DATA_LABEL_PWWKEW': 'No desc available', 'DATA_LABEL_NOTE': 'No desc available', 'DATA_LABEL_PWKE': 'No desc available', 'DATA_LABEL_SUBSEQUENCE': 'No desc available', 'DATA_LABEL_CLASS': 'No desc available', 'DATA_LABEL_OBJECT': 'No desc available', 'DATA_LABEL_LENGTHOFLONGESTSUBSTRING': 'No desc available', 'DATA_LABEL_TYPE': 'No desc available', 'DATA_LABEL_RTYPE': 'No desc available', 'DATA_LABEL_MAPSET': 'No desc available', 'DATA_SUMMARY__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f': 'No desc available', 'DATA_DESCRIPTION__DOCUMENT__d87dfe97f0d55afb9b3bf6cb14f8bb0f': \"The task is to find the length of the longest substring in a given string that does not contain any repeating characters. Examples include finding such substrings in 'abcabcbb' (resulting in 'abc' with length 3), 'bbbbb' (resulting in 'b' with length 1), and 'pwwkew' (resulting in 'wke' with length 3), emphasizing that substrings are different from subsequences. The provided Python class 'Solution' includes a method 'lengthOfLongestSubstring' that uses a hash map to track characters and their indices, updating start and result variables to calculate the maximum length of such substrings without repetitions.\", 'COGNITIVE_LAYER__SYNTAX_LAYER': 'This layer deals with the syntactic structure of the source code including tokens, keywords, operators, and control structures, which are essential for understanding its grammatical correctness.', 'COGNITIVE_LAYER__SEMANTIC_LAYER': 'This layer addresses the meanings of individual instructions and the functions they perform within the code. It covers variable declarations, method calls, and data manipulations that carry semantic value.', 'COGNITIVE_LAYER__FUNCTIONAL_LAYER': 'This layer focuses on the algorithmic and logical aspects of the code, assessing how different components interact to fulfill designated tasks and solve specific problems.', 'COGNITIVE_LAYER__MODULE_INTERACTION_LAYER': 'Here, the analysis is on the interaction between different modules, functions, or classes in the source code, illustrating the architectural design and interdependencies.', 'COGNITIVE_LAYER__DATA_FLOW_LAYER': \"This layer examines how data is passed through the system, including variable scopes, parameter passing, and state management, which is crucial for understanding the program's behavior.\", 'COGNITIVE_LAYER__CONTROL_FLOW_LAYER': 'Examining the flow of execution throughout the code (e.g., loops, conditionals, and function calls), this layer is important for understanding the logic and potential execution paths in the program.', 'COGNITIVE_LAYER__PERFORMANCE_LAYER': 'This layer analyzes aspects of the code that affect its performance, such as complexity, optimization, potential bottlenecks, and resource management.', 'COGNITIVE_LAYER__SECURITY_LAYER': 'Focuses on identifying security-related aspects of source code, such as vulnerabilities, security controls, and adherence to secure coding practices.', 'COGNITIVE_LAYER__DOCUMENTATION_AND_COMMENTS_LAYER': \"Includes inline comments, docstrings, and external documentation that provide insights into the developer's intentions, explain complex pieces of code and specify APIs.\", 'COGNITIVE_LAYER__CONVENTIONS_AND_STYLE_LAYER': 'Encompasses coding standards, naming conventions, and formatting that contribute to code readability, maintainability, and consistency across a codebase.', 'COGNITIVE_LAYER__DEPENDENCY_AND_INTEGRATION_LAYER': 'Analyzes external libraries, components, or services that the code interacts with, both at the source level and through build and deployment processes.', 'COGNITIVE_LAYER__VERSION_CONTROL_AND_HISTORY_LAYER': 'Captures changes, version history, collaboration, and branch management within version control systems to understand the development and evolution of the codebase.', 'COGNITIVE_LAYER__TEST_AND_VERIFICATION_LAYER': \"This layer includes test scripts, test cases, and the overall testing strategy implemented to verify the code's functionality and robustness.\", 'COGNITIVE_LAYER__LICENSE_AND_COPYRIGHT_LAYER': 'Deals with legal aspects such as copyright notices, licensing information, and intellectual property concerns related to the source code.', 'COGNITIVE_LAYER__PLATFORM_AND_ENVIRONMENT_LAYER': 'Examines compatibility issues, target runtime environments, and platform-specific considerations that are important for code deployment and execution.'}\n" + ] + } + ], "source": [ "from os import path\n", "import cognee\n", "from cognee.infrastructure.databases.graph.get_graph_client import get_graph_client, GraphDBType\n", "from cognee.modules.search.vector.search_similarity import search_similarity\n", + "from cognee.modules.search.graph.search_summary import search_summary\n", "\n", "data_directory_path = path.abspath(\"../.data\")\n", "cognee.config.data_root_directory(data_directory_path)\n", @@ -160,12 +380,65 @@ "graph_client = await get_graph_client(GraphDBType.NETWORKX)\n", "graph = graph_client.graph\n", "\n", - "results = await search_similarity(\"Who are French girls?\", graph)\n", + "results = await search_summary(\"Who are French girls?\", graph)\n", "\n", - "for result in results:\n", - " print(\"French girls\" in result)\n", - " print(result)" + "print(results)" ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b2ffa34a-bd42-4556-807d-c32ff82479f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'name': 'Conventions and Style Layer',\n", + " 'description': 'Encompasses coding standards, naming conventions, and formatting that contribute to code readability, maintainability, and consistency across a codebase.'}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph.nodes['COGNITIVE_LAYER__CONVENTIONS_AND_STYLE_LAYER']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "59a56a97-051e-4f49-b1e5-985748e057ad", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'results' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Assuming connected_nodes is a list of node IDs you obtained from graph.neighbors()\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Safely fetch summaries, providing a default if 'summary' is not available\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m descriptions \u001b[38;5;241m=\u001b[39m {node: graph\u001b[38;5;241m.\u001b[39mnodes[node]\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msummary\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo summary available\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;28;01mfor\u001b[39;00m node \u001b[38;5;129;01min\u001b[39;00m \u001b[43mresults\u001b[49m}\n", + "\u001b[0;31mNameError\u001b[0m: name 'results' is not defined" + ] + } + ], + "source": [ + "# Assuming connected_nodes is a list of node IDs you obtained from graph.neighbors()\n", + "\n", + "# Safely fetch summaries, providing a default if 'summary' is not available\n", + "descriptions = {node: graph.nodes[node].get('summary', 'No summary available') for node in connected_nodes}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "497f448c-afc1-4b7e-814f-1ebf55fe510c", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -184,7 +457,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.8" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/poetry.lock b/poetry.lock index 3711a9966..53879c375 100644 --- a/poetry.lock +++ b/poetry.lock @@ -215,6 +215,17 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "appnope" version = "0.1.4" @@ -508,33 +519,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "24.4.1" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f7749fd0d97ff9415975a1432fac7df89bf13c3833cea079e55fa004d5f28c0"}, - {file = "black-24.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859f3cc5d2051adadf8fd504a01e02b0fd866d7549fff54bc9202d524d2e8bd7"}, - {file = "black-24.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59271c9c29dfa97f7fda51f56c7809b3f78e72fd8d2205189bbd23022a0618b6"}, - {file = "black-24.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:5ed9c34cba223149b5a0144951a0f33d65507cf82c5449cb3c35fe4b515fea9a"}, - {file = "black-24.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dae3ae59d6f2dc93700fd5034a3115434686e66fd6e63d4dcaa48d19880f2b0"}, - {file = "black-24.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5f8698974a81af83283eb47644f2711b5261138d6d9180c863fce673cbe04b13"}, - {file = "black-24.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f404b6e77043b23d0321fb7772522b876b6de737ad3cb97d6b156638d68ce81"}, - {file = "black-24.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:c94e52b766477bdcd010b872ba0714d5458536dc9d0734eff6583ba7266ffd89"}, - {file = "black-24.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:962d9e953872cdb83b97bb737ad47244ce2938054dc946685a4cad98520dab38"}, - {file = "black-24.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b1d8e3b2486b7dd522b1ab2ba1ec4907f0aa8f5e10a33c4271fb331d1d10b70c"}, - {file = "black-24.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed77e214b785148f57e43ca425b6e0850165144aa727d66ac604e56a70bb7825"}, - {file = "black-24.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:4ef4764437d7eba8386689cd06e1fb5341ee0ae2e9e22582b21178782de7ed94"}, - {file = "black-24.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:92b183f8eef5baf7b20a513abcf982ad616f544f593f6688bb2850d2982911f1"}, - {file = "black-24.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:945abd7b3572add997757c94295bb3e73c6ffaf3366b1f26cb2356a4bffd1dc3"}, - {file = "black-24.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db5154b9e5b478031371d8bc41ff37b33855fa223a6cfba456c9b73fb96f77d4"}, - {file = "black-24.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:afc84c33c1a9aaf3d73140cee776b4ddf73ff429ffe6b7c56dc1c9c10725856d"}, - {file = "black-24.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0889f4eb8b3bdf8b189e41a71cf0dbb8141a98346cd1a2695dea5995d416e940"}, - {file = "black-24.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5bb0143f175db45a55227eefd63e90849d96c266330ba31719e9667d0d5ec3b9"}, - {file = "black-24.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:713a04a78e78f28ef7e8df7a16fe075670ea164860fcef3885e4f3dffc0184b3"}, - {file = "black-24.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:171959bc879637a8cdbc53dc3fddae2a83e151937a28cf605fd175ce61e0e94a"}, - {file = "black-24.4.1-py3-none-any.whl", hash = "sha256:ecbab810604fe02c70b3a08afd39beb599f7cc9afd13e81f5336014133b4fe35"}, - {file = "black-24.4.1.tar.gz", hash = "sha256:5241612dc8cad5b6fd47432b8bd04db80e07cfbc53bb69e9ae18985063bcb8dd"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -572,17 +583,17 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "boto3" -version = "1.34.91" +version = "1.34.93" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.91-py3-none-any.whl", hash = "sha256:97fac686c47647db4b44e4789317e4aeecd38511d71e84f8d20abe33eb630ff1"}, - {file = "boto3-1.34.91.tar.gz", hash = "sha256:5077917041adaaae15eeca340289547ef905ca7e11516e9bd22d394fb5057d2a"}, + {file = "boto3-1.34.93-py3-none-any.whl", hash = "sha256:b59355bf4a1408563969526f314611dbeacc151cf90ecb22af295dcc4fe18def"}, + {file = "boto3-1.34.93.tar.gz", hash = "sha256:e39516e4ca21612932599819662759c04485d53ca457996a913163da11f052a4"}, ] [package.dependencies] -botocore = ">=1.34.91,<1.35.0" +botocore = ">=1.34.93,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -591,13 +602,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.91" +version = "1.34.93" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.91-py3-none-any.whl", hash = "sha256:4d1b13f2b1c28ce1743b1e5895ae62bb7e67f892b51882164ea19c27a130852b"}, - {file = "botocore-1.34.91.tar.gz", hash = "sha256:93ef7071292a1b2b9fc26537f8ae3a8227da1177969241939ea3fbdb1a1a1d0c"}, + {file = "botocore-1.34.93-py3-none-any.whl", hash = "sha256:6fbd5a53a2adc9b3d4ebd90ae0ede83a91a41d96231f8a5984051f75495f246d"}, + {file = "botocore-1.34.93.tar.gz", hash = "sha256:79d39b0b87e962991c6dd55e78ce15155099f6fb741be88b1b8a456a702cc150"}, ] [package.dependencies] @@ -624,13 +635,13 @@ files = [ [[package]] name = "cairocffi" -version = "1.6.1" +version = "1.7.0" description = "cffi-based cairo bindings for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cairocffi-1.6.1-py3-none-any.whl", hash = "sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e"}, - {file = "cairocffi-1.6.1.tar.gz", hash = "sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7"}, + {file = "cairocffi-1.7.0-py3-none-any.whl", hash = "sha256:1f29a8d41dbda4090c0aa33bcdea64f3b493e95f74a43ea107c4a8a7b7f632ef"}, + {file = "cairocffi-1.7.0.tar.gz", hash = "sha256:7761863603894305f3160eca68452f373433ca8745ab7dd445bd2c6ce50dcab7"}, ] [package.dependencies] @@ -638,7 +649,7 @@ cffi = ">=1.1.0" [package.extras] doc = ["sphinx", "sphinx_rtd_theme"] -test = ["flake8", "isort", "numpy", "pikepdf", "pytest"] +test = ["numpy", "pikepdf", "pytest", "ruff"] xcb = ["xcffib (>=1.4.0)"] [[package]] @@ -1138,6 +1149,21 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "dataclasses-json" +version = "0.6.4" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dataclasses_json-0.6.4-py3-none-any.whl", hash = "sha256:f90578b8a3177f7552f4e1a6e535e84293cd5da421fcce0642d49c0d7bdf8df2"}, + {file = "dataclasses_json-0.6.4.tar.gz", hash = "sha256:73696ebf24936560cca79a2430cbc4f3dd23ac7bf46ed17f38e5e5e7657a6377"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + [[package]] name = "datasets" version = "2.14.7" @@ -1223,6 +1249,41 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deepeval" +version = "0.21.36" +description = "The open-source evaluation framework for LLMs." +optional = false +python-versions = "*" +files = [ + {file = "deepeval-0.21.36-py3-none-any.whl", hash = "sha256:e1c9fa0a37c74e79eb1c21a98437d04d4be964e9db0cc7ce46d2ff7c190772e6"}, + {file = "deepeval-0.21.36.tar.gz", hash = "sha256:5447512c6e60ec9840c1c11b48f697470b26c718e729e7d48b97887a5db095a3"}, +] + +[package.dependencies] +docx2txt = ">=0.8,<1.0" +importlib-metadata = ">=6.0.2" +langchain = "*" +langchain-core = "*" +langchain-openai = "*" +portalocker = "*" +protobuf = "4.25.1" +pydantic = "*" +pytest = "*" +pytest-repeat = "*" +pytest-xdist = "*" +ragas = "*" +requests = "*" +rich = "*" +sentry-sdk = "*" +tabulate = "*" +tenacity = ">=8.2.3,<8.3.0" +tqdm = "*" +typer = "*" + +[package.extras] +dev = ["black"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -1356,6 +1417,16 @@ files = [ {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, ] +[[package]] +name = "docx2txt" +version = "0.8" +description = "A pure python-based utility to extract text and images from docx files." +optional = false +python-versions = "*" +files = [ + {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, +] + [[package]] name = "dspy-ai" version = "2.4.3" @@ -1478,6 +1549,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + [[package]] name = "executing" version = "2.0.1" @@ -2346,22 +2431,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "6.1.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, + {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "importlib-resources" @@ -2596,6 +2681,20 @@ files = [ {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, ] +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + [[package]] name = "jsonpath-ng" version = "1.6.1" @@ -2804,13 +2903,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.1.6" +version = "4.1.8" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.1.6-py3-none-any.whl", hash = "sha256:cf3e862bc10dbf4331e4eb37438634f813c238cfc62c71c640b3b3b2caa089a8"}, - {file = "jupyterlab-4.1.6.tar.gz", hash = "sha256:7935f36ba26eb615183a4f5c2bbca5791b5108ce2a00b5505f8cfd100d53648e"}, + {file = "jupyterlab-4.1.8-py3-none-any.whl", hash = "sha256:c3baf3a2f91f89d110ed5786cd18672b9a357129d4e389d2a0dead15e11a4d2c"}, + {file = "jupyterlab-4.1.8.tar.gz", hash = "sha256:3384aded8680e7ce504fd63b8bb89a39df21c9c7694d9e7dc4a68742cdb30f9b"}, ] [package.dependencies] @@ -2822,7 +2921,7 @@ jinja2 = ">=3.0.3" jupyter-core = "*" jupyter-lsp = ">=2.0.0" jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.19.0,<3" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} @@ -3017,17 +3116,17 @@ files = [ [[package]] name = "lancedb" -version = "0.6.10" +version = "0.6.11" description = "lancedb" optional = false python-versions = ">=3.8" files = [ - {file = "lancedb-0.6.10-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:c7e10eb5f5fdb22452d7678e9bf3df14e2463331868607067aba4ba19a0f4022"}, - {file = "lancedb-0.6.10-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:3a1548bf3820ff606e4efce840bd0e979206eb1815915fff9f738c1d8e337293"}, - {file = "lancedb-0.6.10-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3874f8aee55c5b4f41b953f4eac28d69c8a9bc10ad992fc7fd2b699a1f4b88ed"}, - {file = "lancedb-0.6.10-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:73c0909ac7ae95d8128d25936fc0ff670cf6d9ae1b44e06ec48f3a60081d61ca"}, - {file = "lancedb-0.6.10-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:750fb23a6eaa7daea241a124be3970447d45ace1c4f894df197e9869d677b6ba"}, - {file = "lancedb-0.6.10-cp38-abi3-win_amd64.whl", hash = "sha256:06a299d91e1d9d2663fea7086efc784bf8643f51ff1532617c4910ec63cd2004"}, + {file = "lancedb-0.6.11-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:79dbc2a79dac7b843e328a3b7eecb1b42f38ad524742111a38efbeaa1f58ddfe"}, + {file = "lancedb-0.6.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:bfc6661e1fe5dd75346b4a1980243b4ccecd2b0ad991f8becc6e506a608c2d8a"}, + {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0998c2dae676c24b95d492358f80ef6e5100b86335b96bf402af3f28f7ec4f3b"}, + {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:b6b289599c4c6a61a70da89d4c3201abec7483d0e03573506014af2dcddfe0c4"}, + {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d789d5a181c4bc42650567cb63ce2772ed902046b08e8e401970df284a4df1c1"}, + {file = "lancedb-0.6.11-cp38-abi3-win_amd64.whl", hash = "sha256:ea12fc94545afb03933d080cce593491e593ab95cbfddf05ab7183bce2bc8d62"}, ] [package.dependencies] @@ -3051,6 +3150,143 @@ docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings[python]"] embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "google-generativeai", "huggingface-hub", "instructorembedding", "open-clip-torch", "openai (>=1.6.1)", "pillow", "sentence-transformers", "torch"] tests = ["aiohttp", "boto3", "duckdb", "pandas (>=1.4)", "polars (>=0.19)", "pytest", "pytest-asyncio", "pytest-mock", "pytz", "tantivy"] +[[package]] +name = "langchain" +version = "0.1.10" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain-0.1.10-py3-none-any.whl", hash = "sha256:dcc1c0968b8d946a812155584ecbbeda690c930c3ee27bb5ecc113d954f6cf1a"}, + {file = "langchain-0.1.10.tar.gz", hash = "sha256:17951bcd6d74adc74aa081f260ef5514c449488815314420b7e0f8349f15d932"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +dataclasses-json = ">=0.5.7,<0.7" +jsonpatch = ">=1.33,<2.0" +langchain-community = ">=0.0.25,<0.1" +langchain-core = ">=0.1.28,<0.2" +langchain-text-splitters = ">=0.0.1,<0.1" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<5)"] +docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] +embeddings = ["sentence-transformers (>=2,<3)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchain-community" +version = "0.0.34" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_community-0.0.34-py3-none-any.whl", hash = "sha256:bc13b21a44bbfca01bff8b35c10a26d71485b57c1d284f499b577ba6e1a5d84a"}, + {file = "langchain_community-0.0.34.tar.gz", hash = "sha256:96e9a807d9b4777820df5a970996f6bf3ad5632137bf0f4d863bd832bdeb2b0f"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain-core = ">=0.1.45,<0.2.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] + +[[package]] +name = "langchain-core" +version = "0.1.46" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.1.46-py3-none-any.whl", hash = "sha256:1c0befcd2665dd4aa153318aa9bf729071644b4c179e491769b8e583b4bf7441"}, + {file = "langchain_core-0.1.46.tar.gz", hash = "sha256:17c416349f5c7a9808e70e3725749a3a2df5088f1ecca045c883871aa95f9c9e"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.0,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langchain-openai" +version = "0.1.4" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.4-py3-none-any.whl", hash = "sha256:a349ada8724921e380aab03ee312568f5ca99adbc806f6878d79ff9cd1d6d353"}, + {file = "langchain_openai-0.1.4.tar.gz", hash = "sha256:1a3220464c270d73ea3987010617789adc2099d4d4740b15c7734ab07e1f054b"}, +] + +[package.dependencies] +langchain-core = ">=0.1.46,<0.2.0" +openai = ">=1.10.0,<2.0.0" +tiktoken = ">=0.5.2,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.0.1" +description = "LangChain text splitting utilities" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_text_splitters-0.0.1-py3-none-any.whl", hash = "sha256:f5b802f873f5ff6a8b9259ff34d53ed989666ef4e1582e6d1adb3b5520e3839a"}, + {file = "langchain_text_splitters-0.0.1.tar.gz", hash = "sha256:ac459fa98799f5117ad5425a9330b21961321e30bc19a2a2f9f761ddadd62aa1"}, +] + +[package.dependencies] +langchain-core = ">=0.1.28,<0.2.0" + +[package.extras] +extended-testing = ["lxml (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langsmith" +version = "0.1.5" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langsmith-0.1.5-py3-none-any.whl", hash = "sha256:a1811821a923d90e53bcbacdd0988c3c366aff8f4c120d8777e7af8ecda06268"}, + {file = "langsmith-0.1.5.tar.gz", hash = "sha256:aa7a2861aa3d9ae563a077c622953533800466c4e2e539b0d567b84d5fd5b157"}, +] + +[package.dependencies] +pydantic = ">=1,<3" +requests = ">=2,<3" + [[package]] name = "loguru" version = "0.7.2" @@ -3210,6 +3446,25 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "marshmallow" +version = "3.21.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.1-py3-none-any.whl", hash = "sha256:f085493f79efb0644f270a9bf2892843142d80d7174bbbd2f3713f2a589dc633"}, + {file = "marshmallow-3.21.1.tar.gz", hash = "sha256:4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==4.0.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + [[package]] name = "matplotlib" version = "3.8.4" @@ -3832,12 +4087,12 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "neo4j" -version = "5.19.0" +version = "5.20.0" description = "Neo4j Bolt driver for Python" optional = false python-versions = ">=3.7" files = [ - {file = "neo4j-5.19.0.tar.gz", hash = "sha256:23704f604214174f3b7d15a38653a1462809986019dfdaf773ff7ca4e1b9e2de"}, + {file = "neo4j-5.20.0.tar.gz", hash = "sha256:c59e54a0c0fa1f109f1d2fa5293c29c2bb30ba388b4f9dd9656919793c10063a"}, ] [package.dependencies] @@ -4198,13 +4453,13 @@ files = [ [[package]] name = "packaging" -version = "24.0" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -4665,22 +4920,22 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.1" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, + {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, + {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, + {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, + {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, + {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, + {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, + {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, + {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, ] [[package]] @@ -4999,13 +5254,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "10.8" +version = "10.8.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.8-py3-none-any.whl", hash = "sha256:3539003ff0d5e219ba979d2dc961d18fcad5ac259e66c764482e8347b4c0503c"}, - {file = "pymdown_extensions-10.8.tar.gz", hash = "sha256:91ca336caf414e1e5e0626feca86e145de9f85a3921a7bcbd32890b51738c428"}, + {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, + {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, ] [package.dependencies] @@ -5061,6 +5316,16 @@ files = [ {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, ] +[[package]] +name = "pysbd" +version = "0.3.4" +description = "pysbd (Python Sentence Boundary Disambiguation) is a rule-based sentence boundary detection that works out-of-the-box across many languages." +optional = false +python-versions = ">=3" +files = [ + {file = "pysbd-0.3.4-py3-none-any.whl", hash = "sha256:cd838939b7b0b185fcf86b0baf6636667dfb6e474743beeff878e9f42e022953"}, +] + [[package]] name = "pytest" version = "7.4.4" @@ -5117,6 +5382,40 @@ black = ">=23" pytest = ">=7" ruff = ">=0.0.258" +[[package]] +name = "pytest-repeat" +version = "0.9.3" +description = "pytest plugin for repeating tests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest_repeat-0.9.3-py3-none-any.whl", hash = "sha256:26ab2df18226af9d5ce441c858f273121e92ff55f5bb311d25755b8d7abdd8ed"}, + {file = "pytest_repeat-0.9.3.tar.gz", hash = "sha256:ffd3836dfcd67bb270bec648b330e20be37d2966448c4148c4092d1e8aba8185"}, +] + +[package.dependencies] +pytest = "*" + +[[package]] +name = "pytest-xdist" +version = "3.5.0" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, + {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, +] + +[package.dependencies] +execnet = ">=1.1" +pytest = ">=6.2.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -5401,6 +5700,33 @@ urllib3 = ">=1.26.14,<3" [package.extras] fastembed = ["fastembed (==0.2.6)"] +[[package]] +name = "ragas" +version = "0.1.7" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "ragas-0.1.7-py3-none-any.whl", hash = "sha256:abe02b40a8d11842c42e222226901287858beb70203f1227a403a9261d0bb684"}, + {file = "ragas-0.1.7.tar.gz", hash = "sha256:db857262dda63fc01a7eef837cbba166202084b5d535b2e8ad408c63a66f9319"}, +] + +[package.dependencies] +appdirs = "*" +datasets = "*" +langchain = "*" +langchain-community = "*" +langchain-core = "*" +langchain-openai = "*" +nest-asyncio = "*" +numpy = "*" +openai = ">1" +pysbd = ">=0.3.4" +tiktoken = "*" + +[package.extras] +all = ["sentence-transformers"] + [[package]] name = "ratelimiter" version = "1.2.0.post0" @@ -5905,6 +6231,53 @@ nativelib = ["pyobjc-framework-Cocoa", "pywin32"] objc = ["pyobjc-framework-Cocoa"] win32 = ["pywin32"] +[[package]] +name = "sentry-sdk" +version = "2.0.1" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.0.1-py2.py3-none-any.whl", hash = "sha256:b54c54a2160f509cf2757260d0cf3885b608c6192c2555a3857e3a4d0f84bdb3"}, + {file = "sentry_sdk-2.0.1.tar.gz", hash = "sha256:c278e0f523f6f0ee69dc43ad26dcdb1202dffe5ac326ae31472e012d941bee21"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + [[package]] name = "setuptools" version = "69.5.1" @@ -6644,6 +7017,21 @@ files = [ {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + [[package]] name = "tzdata" version = "2024.1" @@ -7227,7 +7615,7 @@ duckdb = ["duckdb"] filesystem = [] gcp = [] gs = [] -lancedb = [] +lancedb = ["lancedb"] motherduck = ["duckdb", "pyarrow"] mssql = [] neo4j = ["neo4j"] @@ -7244,4 +7632,4 @@ weaviate = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "9609dfc41209efd1fd5e53fd1b77353cb5bce3244ffdb65f81eee686a68b6fc5" +content-hash = "0f66c0ad86b74b152f430a3ed9376bf63154eac83b12b7c3dd96f86af4399079" diff --git a/pyproject.toml b/pyproject.toml index d3d5a2da6..94ceb2e5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,9 @@ tiktoken = "^0.6.0" dspy-ai = "2.4.3" posthog = "^3.5.0" lancedb = "^0.6.10" +importlib-metadata = "6.1.0" +deepeval = "^0.21.36" + [tool.poetry.extras] From e1a9a236a500ab3ccca3cc4fd4ac1911fb0282c1 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Thu, 9 May 2024 23:11:33 +0200 Subject: [PATCH 04/21] fix search, add improvements --- cognee/api/v1/cognify/cognify.py | 20 +++++--- cognee/api/v1/config/config.py | 6 +++ cognee/config.py | 3 +- cognee/infrastructure/InfrastructureConfig.py | 8 +++ .../data/chunking/HaystackChunkEngine.py | 0 .../data/chunking/LangchainChunkingEngine.py | 50 +++++++++++++++++++ .../files/utils/get_file_metadata.py | 9 +++- cognee/modules/cognify/graph/create.py | 2 + .../modules/cognify/graph/initialize_graph.py | 4 +- cognee/shared/GithubTopology.py | 36 +++++++++++++ cognee/shared/data_models.py | 1 + cognee/utils.py | 4 +- 12 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 cognee/infrastructure/data/chunking/HaystackChunkEngine.py create mode 100644 cognee/infrastructure/data/chunking/LangchainChunkingEngine.py create mode 100644 cognee/shared/GithubTopology.py diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 1f084a75e..bc2a7188d 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -14,6 +14,7 @@ from cognee.modules.cognify.graph.add_cognitive_layer_graphs import add_cognitiv from cognee.modules.cognify.graph.add_summary_nodes import add_summary_nodes from cognee.modules.cognify.graph.add_node_connections import group_nodes_by_layer, \ graph_ready_output, connect_nodes_in_graph +from cognee.modules.cognify.graph.initialize_graph import initialize_graph from cognee.modules.cognify.llm.resolve_cross_graph_references import resolve_cross_graph_references from cognee.infrastructure.databases.graph.get_graph_client import get_graph_client from cognee.modules.cognify.graph.add_label_nodes import add_label_nodes @@ -73,7 +74,14 @@ async def cognify(datasets: Union[str, List[str]] = None): if dataset_name in added_dataset: dataset_files.append((added_dataset, db_engine.get_files_metadata(added_dataset))) - # await initialize_graph(USER_ID, graph_data_model, graph_client) + + + + graph_topology = infrastructure_config.get_config()["graph_topology"] + + + + await initialize_graph(USER_ID, graph_client=graph_client) data_chunks = {} @@ -174,11 +182,11 @@ if __name__ == "__main__": async def test(): # - # from cognee.api.v1.add import add - # - # await add(["A large language model (LLM) is a language model notable for its ability to achieve general-purpose language generation and other natural language processing tasks such as classification"], "code") - # - # graph = await cognify() + from cognee.api.v1.add import add + + await add(["A large language model (LLM) is a language model notable for its ability to achieve general-purpose language generation and other natural language processing tasks such as classification"], "code") + + graph = await cognify() from cognee.utils import render_graph diff --git a/cognee/api/v1/config/config.py b/cognee/api/v1/config/config.py index 1b8afd95d..832d75705 100644 --- a/cognee/api/v1/config/config.py +++ b/cognee/api/v1/config/config.py @@ -72,3 +72,9 @@ class config(): infrastructure_config.set_config({ "chunk_strategy": chunk_strategy }) + + @staticmethod + def set_graph_topology(graph_topology: object): + infrastructure_config.set_config({ + "graph_topology": graph_topology + }) diff --git a/cognee/config.py b/cognee/config.py index aa4a3e882..91101334b 100644 --- a/cognee/config.py +++ b/cognee/config.py @@ -8,7 +8,7 @@ from dataclasses import dataclass, field from pathlib import Path from dotenv import load_dotenv from cognee.root_dir import get_absolute_path -from cognee.shared.data_models import ChunkStrategy +from cognee.shared.data_models import ChunkStrategy, DefaultGraphModel base_dir = Path(__file__).resolve().parent.parent # Load the .env file from the base directory @@ -74,6 +74,7 @@ class Config: # Database parameters graph_database_provider: str = os.getenv("GRAPH_DB_PROVIDER", "NETWORKX") + graph_topology:str = DefaultGraphModel if ( os.getenv("ENV") == "prod" diff --git a/cognee/infrastructure/InfrastructureConfig.py b/cognee/infrastructure/InfrastructureConfig.py index 12a21b188..042addd0f 100644 --- a/cognee/infrastructure/InfrastructureConfig.py +++ b/cognee/infrastructure/InfrastructureConfig.py @@ -33,6 +33,7 @@ class InfrastructureConfig(): database_file_path: str = None chunk_strategy = config.chunk_strategy chunk_engine = None + graph_topology = config.graph_topology def get_config(self, config_entity: str = None) -> dict: if (config_entity is None or config_entity == "database_engine") and self.database_engine is None: @@ -78,6 +79,9 @@ class InfrastructureConfig(): if self.chunk_engine is None: self.chunk_engine = DefaultChunkEngine() + if self.graph_topology is None: + self.graph_topology = config.graph_topology + if (config_entity is None or config_entity == "llm_engine") and self.llm_engine is None: self.llm_engine = OpenAIAdapter(config.openai_key, config.openai_model) @@ -129,6 +133,7 @@ class InfrastructureConfig(): "database_path": self.database_file_path, "chunk_strategy": self.chunk_strategy, "chunk_engine": self.chunk_engine, + "graph_topology": self.graph_topology } def set_config(self, new_config: dict): @@ -183,4 +188,7 @@ class InfrastructureConfig(): if "chunk_engine" in new_config: self.chunk_engine = new_config["chunk_engine"] + if "graph_topology" in new_config: + self.graph_topology = new_config["graph_topology"] + infrastructure_config = InfrastructureConfig() diff --git a/cognee/infrastructure/data/chunking/HaystackChunkEngine.py b/cognee/infrastructure/data/chunking/HaystackChunkEngine.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py b/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py new file mode 100644 index 000000000..f15d66f7e --- /dev/null +++ b/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py @@ -0,0 +1,50 @@ +from __future__ import annotations +import re + +from cognee.infrastructure.data.chunking.DefaultChunkEngine import DefaultChunkEngine +from cognee.shared.data_models import ChunkStrategy + + + +class LangchainChunkEngine(): + @staticmethod + def chunk_data( + chunk_strategy = None, + source_data = None, + chunk_size = None, + chunk_overlap = None, + ): + """ + Chunk data based on the specified strategy. + + Parameters: + - chunk_strategy: The strategy to use for chunking. + - source_data: The data to be chunked. + - chunk_size: The size of each chunk. + - chunk_overlap: The overlap between chunks. + + Returns: + - The chunked data. + """ + + if chunk_strategy == ChunkStrategy.CODE: + chunked_data = LangchainChunkEngine.chunk_data_by_code(source_data,chunk_size, chunk_overlap) + else: + chunked_data = DefaultChunkEngine.chunk_data_by_paragraph(source_data,chunk_size, chunk_overlap) + return chunked_data + + @staticmethod + def chunk_data_by_code(data_chunks, chunk_size, chunk_overlap, language=None): + from langchain_text_splitters import ( + Language, + RecursiveCharacterTextSplitter, + ) + if language is None: + language = Language.PYTHON + python_splitter = RecursiveCharacterTextSplitter.from_language( + language=language, chunk_size=chunk_size, chunk_overlap=chunk_overlap + ) + code_chunks = python_splitter.create_documents([data_chunks]) + + return code_chunks + diff --git a/cognee/infrastructure/files/utils/get_file_metadata.py b/cognee/infrastructure/files/utils/get_file_metadata.py index 2b9d6ed0a..44c53bb11 100644 --- a/cognee/infrastructure/files/utils/get_file_metadata.py +++ b/cognee/infrastructure/files/utils/get_file_metadata.py @@ -16,7 +16,14 @@ def get_file_metadata(file: BinaryIO) -> FileMetadata: file.seek(0) file_text = extract_text_from_file(file, file_type) - keywords = extract_keywords(file_text) + + import uuid + + try: + keywords = extract_keywords(file_text) + except: + keywords = ["no keywords detected" + str(uuid.uuid4())] + file_path = file.name file_name = file_path.split("/")[-1].split(".")[0] diff --git a/cognee/modules/cognify/graph/create.py b/cognee/modules/cognify/graph/create.py index 020af9f7f..e6bbd8868 100644 --- a/cognee/modules/cognify/graph/create.py +++ b/cognee/modules/cognify/graph/create.py @@ -44,6 +44,7 @@ async def add_node(client, parent_id: Optional[str], node_id: str, node_data: di # Add an edge if a parent ID is provided and the graph engine is NETWORKX if parent_id and "default_relationship" in node_data and infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: + print("Node id", node_id) await client.add_edge(parent_id, node_id, relationship_name = node_data["default_relationship"]["type"], edge_properties = node_data) except Exception as e: # Log the exception; consider a logging framework for production use @@ -103,6 +104,7 @@ async def add_node(client, parent_id: Optional[str], node_id: str, node_data: di async def add_edge(client, parent_id: Optional[str], node_id: str, node_data: dict, created_node_ids): + print('NODE ID', node_data) if node_id == "Relationship_default" and parent_id: # Initialize source and target variables outside the loop diff --git a/cognee/modules/cognify/graph/initialize_graph.py b/cognee/modules/cognify/graph/initialize_graph.py index d6c13512c..dcb3517d8 100644 --- a/cognee/modules/cognify/graph/initialize_graph.py +++ b/cognee/modules/cognify/graph/initialize_graph.py @@ -2,9 +2,9 @@ from datetime import datetime from cognee.shared.data_models import DefaultGraphModel, Relationship, UserProperties, UserLocation from cognee.modules.cognify.graph.create import create_semantic_graph -async def initialize_graph(root_id: str, graphdatamodel, graph_client): +async def initialize_graph(root_id: str, graphdatamodel=None, graph_client=None): if graphdatamodel: - graph = graphdatamodel(id = root_id) + graph = graphdatamodel(node_id= root_id) graph_ = await create_semantic_graph(graph, graph_client) return graph_ else: diff --git a/cognee/shared/GithubTopology.py b/cognee/shared/GithubTopology.py new file mode 100644 index 000000000..f0b9e3c2b --- /dev/null +++ b/cognee/shared/GithubTopology.py @@ -0,0 +1,36 @@ + + +from pydantic import BaseModel +from typing import List, Optional, Dict, Any, Union + +class Relationship(BaseModel): + type: str + attributes: Optional[Dict[str, Any]] = {} + +class Document(BaseModel): + name: str + content: str + filetype: str + +class Directory(BaseModel): + name: str + documents: List[Document] = [] + directories: List['Directory'] = [] + + # Allows recursive Directory Model + Directory.update_forward_refs() + +class RepositoryProperties(BaseModel): + custom_properties: Optional[Dict[str, Any]] = None + location: Optional[str] = None # Simplified location reference + +class RepositoryNode(BaseModel): + node_id: str + node_type: str # 'document' or 'directory' + properties: RepositoryProperties = RepositoryProperties() + content: Union[Document, Directory, None] = None + relationships: List[Relationship] = [] + +class RepositoryGraphModel(BaseModel): + root: RepositoryNode + default_relationships: List[Relationship] = [] diff --git a/cognee/shared/data_models.py b/cognee/shared/data_models.py index 7eea17cdc..cbaabfe44 100644 --- a/cognee/shared/data_models.py +++ b/cognee/shared/data_models.py @@ -34,6 +34,7 @@ class ChunkStrategy(Enum): EXACT = "exact" PARAGRAPH = "paragraph" SENTENCE = "sentence" + CODE = "code" class MemorySummary(BaseModel): """ Memory summary. """ diff --git a/cognee/utils.py b/cognee/utils.py index 98d7e68e0..19d52740e 100644 --- a/cognee/utils.py +++ b/cognee/utils.py @@ -1,5 +1,5 @@ """ This module contains utility functions for the cognee. """ - +import logging import os import uuid import datetime @@ -20,6 +20,8 @@ config.load() def send_telemetry(event_name: str): if os.getenv("TELEMETRY_DISABLED"): + print("Telemetry is disabled.") + logging.info("Telemetry is disabled.") return env = os.getenv("ENV") From 01446deb6f1f861ae69ba4148a1ba042ddcf1390 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Fri, 10 May 2024 15:13:14 +0200 Subject: [PATCH 05/21] working topology inference --- cognee/api/v1/cognify/cognify.py | 8 ++ .../llm/prompts/extract_topology.txt | 1 + cognee/modules/topology/__init__.py | 0 .../topology/extraction/extract_topology.py | 14 ++ .../modules/topology/infer_data_topology.py | 19 +++ cognee/modules/topology/topology.py | 120 ++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 cognee/infrastructure/llm/prompts/extract_topology.txt create mode 100644 cognee/modules/topology/__init__.py create mode 100644 cognee/modules/topology/extraction/extract_topology.py create mode 100644 cognee/modules/topology/infer_data_topology.py create mode 100644 cognee/modules/topology/topology.py diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index bc2a7188d..474760ebc 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -75,6 +75,14 @@ async def cognify(datasets: Union[str, List[str]] = None): dataset_files.append((added_dataset, db_engine.get_files_metadata(added_dataset))) + print(dataset_files) + + # topology can be inferred, loaded, or extrapolated from the data in the end of the flow + # for code generation, we infer the topology from the folder structure as simple step + + + + graph_topology = infrastructure_config.get_config()["graph_topology"] diff --git a/cognee/infrastructure/llm/prompts/extract_topology.txt b/cognee/infrastructure/llm/prompts/extract_topology.txt new file mode 100644 index 000000000..f3b21077f --- /dev/null +++ b/cognee/infrastructure/llm/prompts/extract_topology.txt @@ -0,0 +1 @@ +You are a topology master and need to extract the following topology information from the text provided to you \ No newline at end of file diff --git a/cognee/modules/topology/__init__.py b/cognee/modules/topology/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/modules/topology/extraction/extract_topology.py b/cognee/modules/topology/extraction/extract_topology.py new file mode 100644 index 000000000..7fd6fc8ac --- /dev/null +++ b/cognee/modules/topology/extraction/extract_topology.py @@ -0,0 +1,14 @@ +from typing import Type, List +from pydantic import BaseModel +from cognee.infrastructure.llm.prompts import read_query_prompt +from cognee.infrastructure.llm.get_llm_client import get_llm_client + + +async def extract_categories(content: str, response_model: Type[BaseModel]): + llm_client = get_llm_client() + + system_prompt = read_query_prompt("extract_topology.txt") + + llm_output = await llm_client.acreate_structured_output(content, system_prompt, response_model) + + return llm_output.model_dump() \ No newline at end of file diff --git a/cognee/modules/topology/infer_data_topology.py b/cognee/modules/topology/infer_data_topology.py new file mode 100644 index 000000000..935cc702e --- /dev/null +++ b/cognee/modules/topology/infer_data_topology.py @@ -0,0 +1,19 @@ +import logging +from typing import List, Dict +from cognee.infrastructure import infrastructure_config +from cognee.modules.topology.extraction.extract_topology import extract_categories + + +logger = logging.getLogger(__name__) + +async def infer_data_topology(content: str, graph_topology=None): + if graph_topology is None: + graph_topology = infrastructure_config.get_config()["graph_topology"] + try: + return (await extract_categories( + content, + graph_topology + )) + except Exception as error: + logger.error("Error extracting cognitive layers from content: %s", error, exc_info = True) + raise error diff --git a/cognee/modules/topology/topology.py b/cognee/modules/topology/topology.py new file mode 100644 index 000000000..c65a13272 --- /dev/null +++ b/cognee/modules/topology/topology.py @@ -0,0 +1,120 @@ + +import os +import glob +from pydantic import BaseModel, create_model +from typing import Dict, Type, Any + +from pydantic import BaseModel, Field +from typing import Dict, List, Optional, Union +from datetime import datetime + +from cognee import config +from cognee.infrastructure import infrastructure_config +from infer_data_topology import infer_data_topology + + + +# class UserLocation(BaseModel): +# location_id: str +# description: str +# default_relationship: Relationship = Relationship(type = "located_in") +# +# class UserProperties(BaseModel): +# custom_properties: Optional[Dict[str, Any]] = None +# location: Optional[UserLocation] = None +# +# class DefaultGraphModel(BaseModel): +# node_id: str +# user_properties: UserProperties = UserProperties() +# documents: List[Document] = [] +# default_fields: Optional[Dict[str, Any]] = {} +# default_relationship: Relationship = Relationship(type = "has_properties") +# +class Relationship(BaseModel): + type: str + source: Optional[str] = None + target: Optional[str] = None + properties: Optional[Dict[str, Any]] = None + + + +class Document(BaseModel): + id: str + title: str + description: Optional[str] = None + default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + + +class DirectoryModel(BaseModel): + name: str + path: str + summary: str + documents: List[Document] = [] + subdirectories: List['DirectoryModel'] = [] + default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + +DirectoryModel.update_forward_refs() + +class RepositoryMetadata(BaseModel): + name: str + summary: str + owner: str + description: Optional[str] = None + directories: List[DirectoryModel] = [] + documents: List[Document] = [] + default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + +class GitHubRepositoryModel(BaseModel): + metadata: RepositoryMetadata + root_directory: DirectoryModel + +class TopologyEngine: + def __init__(self): + self.models: Dict[str, Type[BaseModel]] = {} + + async def infer(self, repository: str): + + path = infrastructure_config.get_config()["data_root_directory"] + + path = path +"/"+ str(repository) + print(path) + if not os.path.exists(path): + raise FileNotFoundError(f"No such directory: {path}") + + file_structure = {} + for filename in glob.glob(f"{path}/**", recursive=True): + if os.path.isfile(filename): + key = os.path.relpath(filename, start=path).replace(os.path.sep, "__") + file_structure[key] = (str, ...) # Assuming content as string for simplicity + + + result = await infer_data_topology(str(file_structure), GitHubRepositoryModel) + + return result + + def load(self, model_name: str): + return self.models.get(model_name) + + def extrapolate(self, model_name: str): + # This method would be implementation-specific depending on what "extrapolate" means + pass + + +if __name__ == "__main__": + data_directory_path = os.path.abspath("../../../.data") + print(data_directory_path) + config.data_root_directory(data_directory_path) + cognee_directory_path = os.path.abspath("../.cognee_system") + config.system_root_directory(cognee_directory_path) + async def main(): + engine = TopologyEngine() + # model = engine.load("GitHubRepositoryModel") + # if model is None: + # raise ValueError("Model not found") + result = await engine.infer("example") + print(result) + + import asyncio + asyncio.run(main()) + # result = engine.extrapolate("GitHubRepositoryModel") + # print(result) \ No newline at end of file From 7249c240d007ed2c1bb08b8d5728d128af3ffaf6 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 11 May 2024 23:10:00 +0200 Subject: [PATCH 06/21] working topology inference --- cognee/api/v1/cognify/cognify.py | 132 +- cognee/api/v1/topology/__init__.py | 0 cognee/api/v1/topology/add_topology.py | 91 ++ .../data/chunking/DefaultChunkEngine.py | 1 + .../embeddings/DefaultEmbeddingEngine.py | 29 +- .../databases/vector/lancedb/__init__.py | 0 .../llm/prompts/extract_topology.txt | 5 +- .../modules/cognify/graph/add_label_nodes.py | 42 +- cognee/modules/cognify/graph/create.py | 96 +- .../modules/cognify/graph/initialize_graph.py | 43 - cognee/modules/topology/topology.py | 96 +- poetry.lock | 1429 ++++++++++------- pyproject.toml | 3 +- 13 files changed, 1169 insertions(+), 798 deletions(-) create mode 100644 cognee/api/v1/topology/__init__.py create mode 100644 cognee/api/v1/topology/add_topology.py create mode 100644 cognee/infrastructure/databases/vector/lancedb/__init__.py delete mode 100644 cognee/modules/cognify/graph/initialize_graph.py diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 474760ebc..b9bcf81cb 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -1,4 +1,5 @@ import asyncio +import os from uuid import uuid4 from typing import List, Union import logging @@ -6,7 +7,11 @@ import instructor import nltk from openai import OpenAI from nltk.corpus import stopwords + +from cognee.api.v1.prune import prune from cognee.config import Config +from cognee.infrastructure.data.chunking.LangchainChunkingEngine import LangchainChunkEngine +from cognee.infrastructure.databases.vector.embeddings.DefaultEmbeddingEngine import OpenAIEmbeddingEngine from cognee.modules.cognify.graph.add_data_chunks import add_data_chunks from cognee.modules.cognify.graph.add_document_node import add_document_node from cognee.modules.cognify.graph.add_classification_nodes import add_classification_nodes @@ -14,7 +19,6 @@ from cognee.modules.cognify.graph.add_cognitive_layer_graphs import add_cognitiv from cognee.modules.cognify.graph.add_summary_nodes import add_summary_nodes from cognee.modules.cognify.graph.add_node_connections import group_nodes_by_layer, \ graph_ready_output, connect_nodes_in_graph -from cognee.modules.cognify.graph.initialize_graph import initialize_graph from cognee.modules.cognify.llm.resolve_cross_graph_references import resolve_cross_graph_references from cognee.infrastructure.databases.graph.get_graph_client import get_graph_client from cognee.modules.cognify.graph.add_label_nodes import add_label_nodes @@ -27,6 +31,8 @@ from cognee.modules.data.get_content_categories import get_content_categories from cognee.modules.data.get_content_summary import get_content_summary from cognee.modules.data.get_cognitive_layers import get_cognitive_layers from cognee.modules.data.get_layer_graphs import get_layer_graphs +from cognee.modules.topology.topology import TopologyEngine +from cognee.shared.data_models import ChunkStrategy from cognee.utils import send_telemetry @@ -69,27 +75,12 @@ async def cognify(datasets: Union[str, List[str]] = None): dataset_files = [] # datasets is a dataset name string dataset_name = datasets.replace(".", "_").replace(" ", "_") - for added_dataset in added_datasets: if dataset_name in added_dataset: dataset_files.append((added_dataset, db_engine.get_files_metadata(added_dataset))) + # print("dataset_files", dataset_files) - print(dataset_files) - - # topology can be inferred, loaded, or extrapolated from the data in the end of the flow - # for code generation, we infer the topology from the folder structure as simple step - - - - - - - graph_topology = infrastructure_config.get_config()["graph_topology"] - - - - await initialize_graph(USER_ID, graph_client=graph_client) data_chunks = {} @@ -102,6 +93,8 @@ async def cognify(datasets: Union[str, List[str]] = None): try: file_type = guess_file_type(file) text = extract_text_from_file(file, file_type) + if text is None: + text = "" subchunks = chunk_engine.chunk_data(chunk_strategy, text, config.chunk_size, config.chunk_overlap) if dataset_name not in data_chunks: @@ -125,22 +118,25 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi graph_client = await get_graph_client(infrastructure_config.get_config()["graph_engine"]) + graph_topology = infrastructure_config.get_config()["graph_topology"] + + document_id = await add_document_node( graph_client, - parent_node_id = f"DefaultGraphModel__{USER_ID}", #make a param of defaultgraph model to make sure when user passes his stuff, it doesn't break pipeline + parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}", #make a param of defaultgraph model to make sure when user passes his stuff, it doesn't break pipeline document_metadata = file_metadata, ) - + # await add_label_nodes(graph_client, document_id, chunk_id, file_metadata["keywords"].split("|")) - classified_categories = await get_content_categories(input_text) - await add_classification_nodes( - graph_client, - parent_node_id = document_id, - categories = classified_categories, - ) + # classified_categories = await get_content_categories(input_text) + # await add_classification_nodes( + # graph_client, + # parent_node_id = document_id, + # categories = classified_categories, + # ) - print(f"Chunk ({chunk_id}) classified.") + # print(f"Chunk ({chunk_id}) classified.") print("document_id", document_id) @@ -149,53 +145,61 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi print(f"Chunk ({chunk_id}) summarized.") - cognitive_layers = await get_cognitive_layers(input_text, classified_categories) - cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] - - layer_graphs = await get_layer_graphs(input_text, cognitive_layers) - await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) - - if infrastructure_config.get_config()["connect_documents"] is True: - db_engine = infrastructure_config.get_config()["database_engine"] - relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = file_metadata["id"]) - - list_of_nodes = [] - - relevant_documents_to_connect.append({ - "layer_id": document_id, - }) - - for document in relevant_documents_to_connect: - node_descriptions_to_match = await graph_client.extract_node_description(document["layer_id"]) - list_of_nodes.extend(node_descriptions_to_match) - - nodes_by_layer = await group_nodes_by_layer(list_of_nodes) - - results = await resolve_cross_graph_references(nodes_by_layer) - - relationships = graph_ready_output(results) - - await connect_nodes_in_graph( - graph_client, - relationships, - score_threshold = infrastructure_config.get_config()["intra_layer_score_treshold"] - ) - - send_telemetry("cognee.cognify") - - print(f"Chunk ({chunk_id}) cognified.") + # cognitive_layers = await get_cognitive_layers(input_text, classified_categories) + # cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] + # + # layer_graphs = await get_layer_graphs(input_text, cognitive_layers) + # await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) + # + # if infrastructure_config.get_config()["connect_documents"] is True: + # db_engine = infrastructure_config.get_config()["database_engine"] + # relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = file_metadata["id"]) + # + # list_of_nodes = [] + # + # relevant_documents_to_connect.append({ + # "layer_id": document_id, + # }) + # + # for document in relevant_documents_to_connect: + # node_descriptions_to_match = await graph_client.extract_node_description(document["layer_id"]) + # list_of_nodes.extend(node_descriptions_to_match) + # + # nodes_by_layer = await group_nodes_by_layer(list_of_nodes) + # + # results = await resolve_cross_graph_references(nodes_by_layer) + # + # relationships = graph_ready_output(results) + # + # await connect_nodes_in_graph( + # graph_client, + # relationships, + # score_threshold = infrastructure_config.get_config()["intra_layer_score_treshold"] + # ) + # + # send_telemetry("cognee.cognify") + # + # print(f"Chunk ({chunk_id}) cognified.") if __name__ == "__main__": async def test(): + # await prune.prune_system() + # # + # from cognee.api.v1.add import add + # data_directory_path = os.path.abspath("../../../.data") + # # print(data_directory_path) + # # config.data_root_directory(data_directory_path) + # # cognee_directory_path = os.path.abspath("../.cognee_system") + # # config.system_root_directory(cognee_directory_path) # - from cognee.api.v1.add import add + # await add("data://" +data_directory_path, "example") - await add(["A large language model (LLM) is a language model notable for its ability to achieve general-purpose language generation and other natural language processing tasks such as classification"], "code") + infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': OpenAIEmbeddingEngine()}) graph = await cognify() - + # from cognee.utils import render_graph await render_graph(graph, include_color=True, include_nodes=False, include_size=False) diff --git a/cognee/api/v1/topology/__init__.py b/cognee/api/v1/topology/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/api/v1/topology/add_topology.py b/cognee/api/v1/topology/add_topology.py new file mode 100644 index 000000000..3f5ad8c12 --- /dev/null +++ b/cognee/api/v1/topology/add_topology.py @@ -0,0 +1,91 @@ +from typing import List, Dict, Any, Union, Optional + +from cognee.infrastructure import infrastructure_config +from cognee.infrastructure.databases.graph.get_graph_client import get_graph_client + +from cognee.modules.topology.topology import TopologyEngine, GitHubRepositoryModel +import pandas as pd +from pydantic import BaseModel + +USER_ID = "default_user" +async def add_topology(directory="example", model=GitHubRepositoryModel): + graph_db_type = infrastructure_config.get_config()["graph_engine"] + + graph_client = await get_graph_client(graph_db_type) + + graph_topology = infrastructure_config.get_config()["graph_topology"] + + engine = TopologyEngine() + topology = await engine.infer_from_directory_structure(node_id =USER_ID , repository = directory, model=model) + + def flatten_model(model: BaseModel, parent_id: Optional[str] = None) -> Dict[str, Any]: + """Flatten a single Pydantic model to a dictionary handling nested structures.""" + result = {**model.dict(), 'parent_id': parent_id} + if hasattr(model, 'default_relationship') and model.default_relationship: + result.update({ + 'relationship_type': model.default_relationship.type, + 'relationship_source': model.default_relationship.source, + 'relationship_target': model.default_relationship.target + }) + return result + + def recursive_flatten(items: Union[List[Any], BaseModel], parent_id: Optional[str] = None) -> List[Dict[str, Any]]: + """Recursively flatten nested Pydantic models or lists of models.""" + if isinstance(items, list): + return [entry for item in items for entry in recursive_flatten(item, parent_id)] + elif isinstance(items, BaseModel): + flat = [flatten_model(items, parent_id)] + for field, value in items: + if isinstance(value, (BaseModel, list)): + flat.extend(recursive_flatten(value, items.dict().get('node_id', None))) + return flat + else: + return [] + + def flatten_repository(repo_model): + """ Flatten the entire repository model, starting with the top-level model """ + return recursive_flatten(repo_model) + + flt_topology = flatten_repository(topology) + + df =pd.DataFrame(flt_topology) + + print(df.head(10)) + + + for _, row in df.iterrows(): + node_data = row.to_dict() + node_id = node_data.pop('node_id') + + # Remove 'node_id' and get its value + await graph_client.add_node(node_id, node_data) + if pd.notna(row['relationship_source']) and pd.notna(row['relationship_target']): + await graph_client.add_edge(row['relationship_source'], row['relationship_target'], relationship_name=row['relationship_type']) + + return graph_client.graph + +if __name__ == "__main__": + async def test(): + # await prune.prune_system() + # # + # from cognee.api.v1.add import add + # data_directory_path = os.path.abspath("../../../.data") + # # print(data_directory_path) + # # config.data_root_directory(data_directory_path) + # # cognee_directory_path = os.path.abspath("../.cognee_system") + # # config.system_root_directory(cognee_directory_path) + # + # await add("data://" +data_directory_path, "example") + + graph = await add_topology() + + graph_db_type = infrastructure_config.get_config()["graph_engine"] + + graph_client = await get_graph_client(graph_db_type) + # + from cognee.utils import render_graph + + await render_graph(graph_client.graph, include_color=True, include_nodes=False, include_size=False) + + import asyncio + asyncio.run(test()) \ No newline at end of file diff --git a/cognee/infrastructure/data/chunking/DefaultChunkEngine.py b/cognee/infrastructure/data/chunking/DefaultChunkEngine.py index b486a5faa..0aca8da52 100644 --- a/cognee/infrastructure/data/chunking/DefaultChunkEngine.py +++ b/cognee/infrastructure/data/chunking/DefaultChunkEngine.py @@ -52,6 +52,7 @@ class DefaultChunkEngine(): elif chunk_strategy == ChunkStrategy.EXACT: chunked_data = DefaultChunkEngine.chunk_data_exact(source_data, chunk_size, chunk_overlap) + return chunked_data diff --git a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py index eb23b0509..8ced98728 100644 --- a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py @@ -1,3 +1,4 @@ +import asyncio from typing import List import instructor @@ -8,8 +9,8 @@ from openai import AsyncOpenAI from cognee.config import Config from cognee.root_dir import get_absolute_path -from .EmbeddingEngine import EmbeddingEngine - +from cognee.infrastructure.databases.vector.embeddings.EmbeddingEngine import EmbeddingEngine +from litellm import aembedding config = Config() config.load() @@ -27,16 +28,28 @@ class DefaultEmbeddingEngine(EmbeddingEngine): class OpenAIEmbeddingEngine(EmbeddingEngine): async def embed_text(self, text: List[str]) -> List[float]: - OPENAI_API_KEY = config.openai_key - aclient = instructor.patch(AsyncOpenAI()) - text = text.replace("\n", " ") - response = await aclient.embeddings.create(input = text, model = config.openai_embedding_model) - embedding = response.data[0].embedding + response = await aembedding(config.openai_embedding_model, input=text) + + + # embedding = response.data[0].embedding # embeddings_list = list(map(lambda embedding: embedding.tolist(), embedding_model.embed(text))) - return embedding + return response.data[0]['embedding'] def get_vector_size(self) -> int: return config.openai_embedding_dimensions + +if __name__ == "__main__": + async def gg(): + openai_embedding_engine = OpenAIEmbeddingEngine() + # print(openai_embedding_engine.embed_text(["Hello, how are you?"])) + # print(openai_embedding_engine.get_vector_size()) + # default_embedding_engine = DefaultEmbeddingEngine() + sds = await openai_embedding_engine.embed_text(["Hello, sadasdas are you?"]) + print(sds) + # print(default_embedding_engine.get_vector_size()) + + asyncio.run(gg()) + diff --git a/cognee/infrastructure/databases/vector/lancedb/__init__.py b/cognee/infrastructure/databases/vector/lancedb/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/infrastructure/llm/prompts/extract_topology.txt b/cognee/infrastructure/llm/prompts/extract_topology.txt index f3b21077f..2ef2c38f9 100644 --- a/cognee/infrastructure/llm/prompts/extract_topology.txt +++ b/cognee/infrastructure/llm/prompts/extract_topology.txt @@ -1 +1,4 @@ -You are a topology master and need to extract the following topology information from the text provided to you \ No newline at end of file +You are a topology master and need to extract the following topology information from the text provided to you. +Relationship part'S can't be empty, and have to be logical AND CONNECTING ELEMENTS OF THE TOPOLOGY +The source is the parent of the target. And the target is the child of the source. +Have in mind this model needs to become a graph later. \ No newline at end of file diff --git a/cognee/modules/cognify/graph/add_label_nodes.py b/cognee/modules/cognify/graph/add_label_nodes.py index 245814f7c..8a8d9b846 100644 --- a/cognee/modules/cognify/graph/add_label_nodes.py +++ b/cognee/modules/cognify/graph/add_label_nodes.py @@ -37,24 +37,24 @@ async def add_label_nodes(graph_client, parent_node_id: str, chunk_id: str, keyw ]) # Add data to vector - keyword_data_points = [ - DataPoint( - id = str(uuid4()), - payload = dict( - value = keyword_data["keyword"], - references = dict( - node_id = keyword_node_id, - cognitive_layer = parent_node_id, - ), - ), - embed_field = "value" - ) for (keyword_node_id, keyword_data) in keyword_nodes - ] - - try: - await vector_client.create_collection(parent_node_id) - except Exception: - # It's ok if the collection already exists. - pass - - await vector_client.create_data_points(parent_node_id, keyword_data_points) + # keyword_data_points = [ + # DataPoint( + # id = str(uuid4()), + # payload = dict( + # value = keyword_data["keyword"], + # references = dict( + # node_id = keyword_node_id, + # cognitive_layer = parent_node_id, + # ), + # ), + # embed_field = "value" + # ) for (keyword_node_id, keyword_data) in keyword_nodes + # ] + # + # try: + # await vector_client.create_collection(parent_node_id) + # except Exception: + # # It's ok if the collection already exists. + # pass + # + # await vector_client.create_data_points(parent_node_id, keyword_data_points) diff --git a/cognee/modules/cognify/graph/create.py b/cognee/modules/cognify/graph/create.py index e6bbd8868..dc1c03181 100644 --- a/cognee/modules/cognify/graph/create.py +++ b/cognee/modules/cognify/graph/create.py @@ -40,12 +40,20 @@ async def add_node(client, parent_id: Optional[str], node_id: str, node_data: di if node_id != "Relationship_default": try: # Attempt to add the node to the graph database + # print('NODE ID', node_id) + # print('NODE DATA', node_data) result = await client.add_node(node_id, node_properties = node_data) + print("added node", result) # Add an edge if a parent ID is provided and the graph engine is NETWORKX if parent_id and "default_relationship" in node_data and infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: - print("Node id", node_id) - await client.add_edge(parent_id, node_id, relationship_name = node_data["default_relationship"]["type"], edge_properties = node_data) + + try: + await client.add_edge(parent_id, node_id, relationship_name = node_data["default_relationship"]["type"], edge_properties = node_data) + print("added edge") + except Exception as e: + print(f"Error adding edge: {e}") + pass except Exception as e: # Log the exception; consider a logging framework for production use print(f"Error adding node or edge: {e}") @@ -139,39 +147,67 @@ async def add_edge(client, parent_id: Optional[str], node_id: str, node_data: di await client.add_edge(relationship_details['source'], relationship_details['target'], relationship_name = relationship_details['type']) - - async def process_attribute(graph_client, parent_id: Optional[str], attribute: str, value: Any, created_node_ids=None): - if created_node_ids is None: created_node_ids = [] + if isinstance(value, BaseModel): node_id = await generate_node_id(value) node_data = value.model_dump() - # Use the specified default relationship for the edge between the parent node and the current node - + # Add node to the graph created_node_id = await add_node(graph_client, parent_id, node_id, node_data) + created_node_ids.append(node_id) - created_node_ids.append(created_node_id) - - # await add_edge(graph_client, parent_id, node_id, node_data, relationship_data,created_node_ids) + # Add an edge if a default_relationship exists + if hasattr(value, 'default_relationship') and value.default_relationship: + await add_edge(graph_client, parent_id, node_id, value.default_relationship.dict()) # Recursively process nested attributes to ensure all nodes and relationships are added to the graph - for sub_attr, sub_val in value.__dict__.items(): # Access attributes and their values directly - - out = await process_attribute(graph_client, node_id, sub_attr, sub_val) - - created_node_ids.extend(out) + for sub_attr, sub_val in value.dict().items(): + if isinstance(sub_val, (BaseModel, list)): # Check if the value is a model or list + await process_attribute(graph_client, node_id, sub_attr, sub_val, created_node_ids) elif isinstance(value, list) and all(isinstance(item, BaseModel) for item in value): # For lists of BaseModel instances, process each item in the list for item in value: - out = await process_attribute(graph_client, parent_id, attribute, item, created_node_ids) - created_node_ids.extend(out) + await process_attribute(graph_client, parent_id, attribute, item, created_node_ids) return created_node_ids +# async def process_attribute(graph_client, parent_id: Optional[str], attribute: str, value: Any, created_node_ids=None): +# +# if created_node_ids is None: +# created_node_ids = [] +# if isinstance(value, BaseModel): +# node_id = await generate_node_id(value) +# node_data = value.model_dump() +# +# # Use the specified default relationship for the edge between the parent node and the current node +# +# created_node_id = await add_node(graph_client, parent_id, node_id, node_data) +# +# created_node_ids.append(created_node_id) +# +# # await add_edge(graph_client, parent_id, node_id, node_data, relationship_data,created_node_ids) +# +# # Recursively process nested attributes to ensure all nodes and relationships are added to the graph +# # for sub_attr, sub_val in value.__dict__.items(): # Access attributes and their values directly +# # print('SUB ATTR', sub_attr) +# # print('SUB VAL', sub_val) +# # +# # out = await process_attribute(graph_client, node_id, sub_attr, sub_val) +# # +# # created_node_ids.extend(out) +# +# elif isinstance(value, list) and all(isinstance(item, BaseModel) for item in value): +# # For lists of BaseModel instances, process each item in the list +# for item in value: +# out = await process_attribute(graph_client, parent_id, attribute, item, created_node_ids) +# created_node_ids.extend(out) +# +# return created_node_ids + async def process_attribute_edge(graph_client, parent_id: Optional[str], attribute: str, value: Any, created_node_ids=None): @@ -212,20 +248,22 @@ async def create_dynamic(graph_model, graph_client) : created_node_ids.append(out) + print('CREATED NODE IDS', created_node_ids) + for attribute_name, attribute_value in graph_model: ids = await process_attribute(graph_client, root_id, attribute_name, attribute_value) - created_node_ids.extend(ids) - - flattened_and_deduplicated = list({ - item["nodeId"]: item - # Use the 'nodeId' as the unique key in the dictionary comprehension - for sublist in created_node_ids if sublist # Ensure sublist is not None - for item in sublist # Iterate over items in the sublist - }.values()) - - for attribute_name, attribute_value in graph_model: - ids = await process_attribute_edge(graph_client, root_id, attribute_name, attribute_value, flattened_and_deduplicated) - + # created_node_ids.extend(ids) + # + # flattened_and_deduplicated = list({ + # item["nodeId"]: item + # # Use the 'nodeId' as the unique key in the dictionary comprehension + # for sublist in created_node_ids if sublist # Ensure sublist is not None + # for item in sublist # Iterate over items in the sublist + # }.values()) + # + # for attribute_name, attribute_value in graph_model: + # ids = await process_attribute_edge(graph_client, root_id, attribute_name, attribute_value, flattened_and_deduplicated) + # return graph_client diff --git a/cognee/modules/cognify/graph/initialize_graph.py b/cognee/modules/cognify/graph/initialize_graph.py deleted file mode 100644 index dcb3517d8..000000000 --- a/cognee/modules/cognify/graph/initialize_graph.py +++ /dev/null @@ -1,43 +0,0 @@ -from datetime import datetime -from cognee.shared.data_models import DefaultGraphModel, Relationship, UserProperties, UserLocation -from cognee.modules.cognify.graph.create import create_semantic_graph - -async def initialize_graph(root_id: str, graphdatamodel=None, graph_client=None): - if graphdatamodel: - graph = graphdatamodel(node_id= root_id) - graph_ = await create_semantic_graph(graph, graph_client) - return graph_ - else: - print("Creating default graph") - - graph = DefaultGraphModel( - node_id = root_id, - user_properties = UserProperties( - custom_properties = { "age": "30" }, - location = UserLocation( - location_id = "ny", - description = "New York", - default_relationship = Relationship( - type = "located_in", - source = "UserProperties", - target = "ny", - ) - ), - default_relationship = Relationship( - type = "has_properties", - source = root_id, - target = "UserProperties", - ) - ), - default_relationship = Relationship( - type = "has_properties", - source = root_id, - target = "UserProperties" - ), - default_fields = { - "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "updated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S") - } - ) - - return await create_semantic_graph(graph, graph_client) diff --git a/cognee/modules/topology/topology.py b/cognee/modules/topology/topology.py index c65a13272..d2ed8565c 100644 --- a/cognee/modules/topology/topology.py +++ b/cognee/modules/topology/topology.py @@ -10,7 +10,7 @@ from datetime import datetime from cognee import config from cognee.infrastructure import infrastructure_config -from infer_data_topology import infer_data_topology +from cognee.modules.topology.infer_data_topology import infer_data_topology @@ -31,66 +31,124 @@ from infer_data_topology import infer_data_topology # default_relationship: Relationship = Relationship(type = "has_properties") # class Relationship(BaseModel): - type: str - source: Optional[str] = None - target: Optional[str] = None - properties: Optional[Dict[str, Any]] = None + type: str = Field(..., description="The type of relationship, e.g., 'belongs_to'.") + source: Optional[str] = Field(None, description="The identifier of the source id of in the relationship being a directory or subdirectory") + target: Optional[str] = Field(None, description="The identifier of the target id in the relationship being the directory, subdirectory or file") + properties: Optional[Dict[str, Any]] = Field(None, description="A dictionary of additional properties and values related to the relationship.") class Document(BaseModel): - id: str + node_id: str title: str description: Optional[str] = None - default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + default_relationship: Relationship class DirectoryModel(BaseModel): - name: str + node_id: str path: str summary: str documents: List[Document] = [] subdirectories: List['DirectoryModel'] = [] - default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + default_relationship: Relationship DirectoryModel.update_forward_refs() -class RepositoryMetadata(BaseModel): - name: str +class DirMetadata(BaseModel): + node_id: str summary: str owner: str description: Optional[str] = None directories: List[DirectoryModel] = [] documents: List[Document] = [] - default_relationship: Relationship = Field(default_factory=lambda: Relationship(type="belongs_to")) + default_relationship: Relationship class GitHubRepositoryModel(BaseModel): - metadata: RepositoryMetadata + node_id: str + metadata: DirMetadata root_directory: DirectoryModel + class TopologyEngine: def __init__(self): self.models: Dict[str, Type[BaseModel]] = {} - async def infer(self, repository: str): + async def populate_model(self, directory_path, file_structure, parent_id=None): + directory_id = os.path.basename(directory_path) or "root" + directory = DirectoryModel( + node_id=directory_id, + path=directory_path, + summary=f"Contents of {directory_id}", + default_relationship=Relationship(type="contains", source=parent_id, target=directory_id) + ) + + for key, value in file_structure.items(): + if isinstance(value, dict): + # Recurse into subdirectory + subdirectory_path = os.path.join(directory_path, key) + subdirectory = await self.populate_model(subdirectory_path, value, parent_id=directory_id) + directory.subdirectories.append(subdirectory) + elif isinstance(value, tuple) and value[0] == 'file': + # Handle file + document = Document( + node_id=key, + title=key, + default_relationship=Relationship(type="contained_by", source=key, target=directory_id) + ) + directory.documents.append(document) + + return directory + + async def infer_from_directory_structure(self, node_id:str, repository: str, model): + """ Infer the topology of a repository from its file structure """ path = infrastructure_config.get_config()["data_root_directory"] path = path +"/"+ str(repository) print(path) + if not os.path.exists(path): raise FileNotFoundError(f"No such directory: {path}") - file_structure = {} + root = {} for filename in glob.glob(f"{path}/**", recursive=True): + parts = os.path.relpath(filename, start=path).split(os.path.sep) + current = root + for part in parts[:-1]: # Traverse/create to the last directory + if part not in current: + current[part] = {} + current = current[part] + last_part = parts[-1] if os.path.isfile(filename): - key = os.path.relpath(filename, start=path).replace(os.path.sep, "__") - file_structure[key] = (str, ...) # Assuming content as string for simplicity + current[last_part] = ("file", ...) # Placeholder for file content or metadata + elif os.path.isdir(filename): + if last_part not in current: # Only create a new directory entry if it doesn't exist + current[last_part] = {} + root_directory = await self.populate_model('/', root) - result = await infer_data_topology(str(file_structure), GitHubRepositoryModel) + # repository_metadata = await infer_data_topology(str(root), DirMetadata) + + repository_metadata = DirMetadata( + node_id="repo1", + summary="Example repository", + owner="user1", + directories=[root_directory], + documents=[], + default_relationship=Relationship(type="contained_by", source="repo1", target=node_id) + ) + + active_model = GitHubRepositoryModel( + node_id=node_id, + metadata=repository_metadata, + root_directory=root_directory + ) + + return active_model + + # print(github_repo_model) - return result def load(self, model_name: str): return self.models.get(model_name) diff --git a/poetry.lock b/poetry.lock index 53879c375..46a96ece4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -473,13 +473,13 @@ cryptography = "*" [[package]] name = "babel" -version = "2.14.0" +version = "2.15.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, ] [package.extras] @@ -583,17 +583,17 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "boto3" -version = "1.34.93" +version = "1.34.103" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.93-py3-none-any.whl", hash = "sha256:b59355bf4a1408563969526f314611dbeacc151cf90ecb22af295dcc4fe18def"}, - {file = "boto3-1.34.93.tar.gz", hash = "sha256:e39516e4ca21612932599819662759c04485d53ca457996a913163da11f052a4"}, + {file = "boto3-1.34.103-py3-none-any.whl", hash = "sha256:59b6499f1bb423dd99de6566a20d0a7cf1a5476824be3a792290fd86600e8365"}, + {file = "boto3-1.34.103.tar.gz", hash = "sha256:58d097241f3895c4a4c80c9e606689c6e06d77f55f9f53a4cc02dee7e03938b9"}, ] [package.dependencies] -botocore = ">=1.34.93,<1.35.0" +botocore = ">=1.34.103,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -602,13 +602,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.93" +version = "1.34.103" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.93-py3-none-any.whl", hash = "sha256:6fbd5a53a2adc9b3d4ebd90ae0ede83a91a41d96231f8a5984051f75495f246d"}, - {file = "botocore-1.34.93.tar.gz", hash = "sha256:79d39b0b87e962991c6dd55e78ce15155099f6fb741be88b1b8a456a702cc150"}, + {file = "botocore-1.34.103-py3-none-any.whl", hash = "sha256:0330d139f18f78d38127e65361859e24ebd6a8bcba184f903c01bb999a3fa431"}, + {file = "botocore-1.34.103.tar.gz", hash = "sha256:5f07e2c7302c0a9f469dcd08b4ddac152e9f5888b12220242c20056255010939"}, ] [package.dependencies] @@ -989,63 +989,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.5.0" +version = "7.5.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, - {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, - {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, - {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, - {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, - {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, - {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, - {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, - {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, - {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, - {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, - {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, - {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, - {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, + {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35"}, + {file = "coverage-7.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e"}, + {file = "coverage-7.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146"}, + {file = "coverage-7.5.1-cp310-cp310-win32.whl", hash = "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228"}, + {file = "coverage-7.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428"}, + {file = "coverage-7.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2"}, + {file = "coverage-7.5.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057"}, + {file = "coverage-7.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987"}, + {file = "coverage-7.5.1-cp311-cp311-win32.whl", hash = "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136"}, + {file = "coverage-7.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206"}, + {file = "coverage-7.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa"}, + {file = "coverage-7.5.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07"}, + {file = "coverage-7.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7"}, + {file = "coverage-7.5.1-cp312-cp312-win32.whl", hash = "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19"}, + {file = "coverage-7.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7"}, + {file = "coverage-7.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5"}, + {file = "coverage-7.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4"}, + {file = "coverage-7.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d"}, + {file = "coverage-7.5.1-cp38-cp38-win32.whl", hash = "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41"}, + {file = "coverage-7.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1"}, + {file = "coverage-7.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5"}, + {file = "coverage-7.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f"}, + {file = "coverage-7.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668"}, + {file = "coverage-7.5.1-cp39-cp39-win32.whl", hash = "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981"}, + {file = "coverage-7.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f"}, + {file = "coverage-7.5.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312"}, + {file = "coverage-7.5.1.tar.gz", hash = "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c"}, ] [package.extras] @@ -1053,43 +1053,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -1151,13 +1151,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dataclasses-json" -version = "0.6.4" +version = "0.6.6" description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.6.4-py3-none-any.whl", hash = "sha256:f90578b8a3177f7552f4e1a6e535e84293cd5da421fcce0642d49c0d7bdf8df2"}, - {file = "dataclasses_json-0.6.4.tar.gz", hash = "sha256:73696ebf24936560cca79a2430cbc4f3dd23ac7bf46ed17f38e5e5e7657a6377"}, + {file = "dataclasses_json-0.6.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, + {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, ] [package.dependencies] @@ -1251,13 +1251,13 @@ files = [ [[package]] name = "deepeval" -version = "0.21.36" +version = "0.21.39" description = "The open-source evaluation framework for LLMs." optional = false python-versions = "*" files = [ - {file = "deepeval-0.21.36-py3-none-any.whl", hash = "sha256:e1c9fa0a37c74e79eb1c21a98437d04d4be964e9db0cc7ce46d2ff7c190772e6"}, - {file = "deepeval-0.21.36.tar.gz", hash = "sha256:5447512c6e60ec9840c1c11b48f697470b26c718e729e7d48b97887a5db095a3"}, + {file = "deepeval-0.21.39-py3-none-any.whl", hash = "sha256:54c688f90375968920b656b0fdb5c430da80f8c6f0e6427de5ad4ae3cc36e27f"}, + {file = "deepeval-0.21.39.tar.gz", hash = "sha256:6f51a072b4b70a68d78a42ea2a35a5f57e2fe4fb3834666b6cd2884af573098b"}, ] [package.dependencies] @@ -1266,6 +1266,9 @@ importlib-metadata = ">=6.0.2" langchain = "*" langchain-core = "*" langchain-openai = "*" +opentelemetry-api = ">=1.14.0,<2.0.0" +opentelemetry-exporter-otlp-proto-grpc = ">=1.24.0,<2.0.0" +opentelemetry-sdk = ">=1.14.0,<2.0.0" portalocker = "*" protobuf = "4.25.1" pydantic = "*" @@ -1295,6 +1298,23 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + [[package]] name = "deprecation" version = "2.1.0" @@ -1347,13 +1367,13 @@ files = [ [[package]] name = "dlt" -version = "0.4.8" +version = "0.4.10" description = "dlt is an open-source python-first scalable data loading library that does not require any backend to run." optional = false python-versions = "<3.13,>=3.8.1" files = [ - {file = "dlt-0.4.8-py3-none-any.whl", hash = "sha256:ade57b2745986c8aada7b2e28856df20164a7738a281c8a87596af62a378be06"}, - {file = "dlt-0.4.8.tar.gz", hash = "sha256:fc46d2ee61bd8d128db84a8214081f78ff642bad5677fdac210080a1f1bcbcf8"}, + {file = "dlt-0.4.10-py3-none-any.whl", hash = "sha256:f9af939f1d9196489528c6ecbdc5a618f1a897d83cc9d52a8ab3bbeada836c64"}, + {file = "dlt-0.4.10.tar.gz", hash = "sha256:e394443543f5038ba260b2932780cf9f5c82bc7ff2535e3b1752e8ca28b2cf61"}, ] [package.dependencies] @@ -1388,8 +1408,9 @@ athena = ["botocore (>=1.28)", "pyarrow (>=12.0.0)", "pyathena (>=2.9.6)", "s3fs az = ["adlfs (>=2022.4.0)"] bigquery = ["gcsfs (>=2022.4.0)", "google-cloud-bigquery (>=2.26.0)", "grpcio (>=1.50.0)", "pyarrow (>=12.0.0)"] cli = ["cron-descriptor (>=1.2.32)", "pipdeptree (>=2.9.0,<2.10)"] +clickhouse = ["adlfs (>=2022.4.0)", "clickhouse-connect (>=0.7.7)", "clickhouse-driver (>=0.2.7)", "gcsfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "s3fs (>=2022.4.0)"] databricks = ["databricks-sql-connector (>=2.9.3,<3.0.0)"] -dbt = ["dbt-athena-community (>=1.2.0)", "dbt-bigquery (>=1.2.0)", "dbt-core (>=1.2.0)", "dbt-databricks (>=1.7.3,<2.0.0)", "dbt-duckdb (>=1.2.0)", "dbt-redshift (>=1.2.0)", "dbt-snowflake (>=1.2.0)"] +dbt = ["dbt-athena-community (>=1.2.0)", "dbt-bigquery (>=1.2.0)", "dbt-core (>=1.2.0)", "dbt-databricks (>=1.7.3)", "dbt-duckdb (>=1.2.0)", "dbt-redshift (>=1.2.0)", "dbt-snowflake (>=1.2.0)"] dremio = ["pyarrow (>=12.0.0)"] duckdb = ["duckdb (>=0.10.0,<0.11.0)", "duckdb (>=0.6.1,<0.10.0)"] filesystem = ["botocore (>=1.28)", "s3fs (>=2022.4.0)"] @@ -1598,13 +1619,13 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" [[package]] name = "fastembed" -version = "0.2.6" +version = "0.2.7" description = "Fast, light, accurate library built for retrieval embedding generation" optional = false python-versions = "<3.13,>=3.8.0" files = [ - {file = "fastembed-0.2.6-py3-none-any.whl", hash = "sha256:3e18633291722087abebccccd7fcdffafef643cb22d203370d7fad4fa83c10fb"}, - {file = "fastembed-0.2.6.tar.gz", hash = "sha256:adaed5b46e19cc1bbe5f98f2b3ffecfc4d2a48d27512e28ff5bfe92a42649a66"}, + {file = "fastembed-0.2.7-py3-none-any.whl", hash = "sha256:8f21e65e6d5d06bd8727488906c6c4eda8eb86d81be8879a54846dfe8a23c9d3"}, + {file = "fastembed-0.2.7.tar.gz", hash = "sha256:f5537e3680694afcd3d806c19dd4514030fdc3144e7e9a9db0dfece771922503"}, ] [package.dependencies] @@ -1614,7 +1635,7 @@ numpy = {version = ">=1.21", markers = "python_version < \"3.12\""} onnx = ">=1.15.0,<2.0.0" onnxruntime = ">=1.17.0,<2.0.0" requests = ">=2.31,<3.0" -tokenizers = ">=0.15.1,<0.16.0" +tokenizers = ">=0.15,<0.16" tqdm = ">=4.66,<5.0" [[package]] @@ -1633,13 +1654,13 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.13.4" +version = "3.14.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, - {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, ] [package.extras] @@ -1930,15 +1951,32 @@ files = [ {file = "giturlparse-0.12.0.tar.gz", hash = "sha256:c0fff7c21acc435491b1779566e038757a205c1ffdcb47e4f81ea52ad8c3859a"}, ] +[[package]] +name = "googleapis-common-protos" +version = "1.63.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, + {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "graphistry" -version = "0.33.7" +version = "0.33.8" description = "A visual graph analytics library for extracting, transforming, displaying, and sharing big graphs with end-to-end GPU acceleration" optional = false python-versions = ">=3.7" files = [ - {file = "graphistry-0.33.7-py3-none-any.whl", hash = "sha256:622d76b50e9be2757c1eada5cd06ccfec732c4959c798abbd2c521919f9e08de"}, - {file = "graphistry-0.33.7.tar.gz", hash = "sha256:81aa63d9284a611f736e8f27efbc6d446d8806c8a15b912f44e621585621cf6a"}, + {file = "graphistry-0.33.8-py3-none-any.whl", hash = "sha256:2fdc4418603c24b203fa97b5e40694888a9403e2d98659edb838a1d90ed00feb"}, + {file = "graphistry-0.33.8.tar.gz", hash = "sha256:1d9ff9fa8b51023c8b8c9af3ba10349ab1bc637c90868b27135bf706b1530e4d"}, ] [package.dependencies] @@ -2071,69 +2109,61 @@ colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.62.2" +version = "1.63.0" description = "HTTP/2-based RPC framework" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:66344ea741124c38588a664237ac2fa16dfd226964cca23ddc96bd4accccbde5"}, - {file = "grpcio-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5dab7ac2c1e7cb6179c6bfad6b63174851102cbe0682294e6b1d6f0981ad7138"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:3ad00f3f0718894749d5a8bb0fa125a7980a2f49523731a9b1fabf2b3522aa43"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e72ddfee62430ea80133d2cbe788e0d06b12f865765cb24a40009668bd8ea05"}, - {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53d3a59a10af4c2558a8e563aed9f256259d2992ae0d3037817b2155f0341de1"}, - {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1511a303f8074f67af4119275b4f954189e8313541da7b88b1b3a71425cdb10"}, - {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b94d41b7412ef149743fbc3178e59d95228a7064c5ab4760ae82b562bdffb199"}, - {file = "grpcio-1.62.2-cp310-cp310-win32.whl", hash = "sha256:a75af2fc7cb1fe25785be7bed1ab18cef959a376cdae7c6870184307614caa3f"}, - {file = "grpcio-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:80407bc007754f108dc2061e37480238b0dc1952c855e86a4fc283501ee6bb5d"}, - {file = "grpcio-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c1624aa686d4b36790ed1c2e2306cc3498778dffaf7b8dd47066cf819028c3ad"}, - {file = "grpcio-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:1c1bb80299bdef33309dff03932264636450c8fdb142ea39f47e06a7153d3063"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:db068bbc9b1fa16479a82e1ecf172a93874540cb84be69f0b9cb9b7ac3c82670"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2cc8a308780edbe2c4913d6a49dbdb5befacdf72d489a368566be44cadaef1a"}, - {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0695ae31a89f1a8fc8256050329a91a9995b549a88619263a594ca31b76d756"}, - {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88b4f9ee77191dcdd8810241e89340a12cbe050be3e0d5f2f091c15571cd3930"}, - {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a0204532aa2f1afd467024b02b4069246320405bc18abec7babab03e2644e75"}, - {file = "grpcio-1.62.2-cp311-cp311-win32.whl", hash = "sha256:6e784f60e575a0de554ef9251cbc2ceb8790914fe324f11e28450047f264ee6f"}, - {file = "grpcio-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:112eaa7865dd9e6d7c0556c8b04ae3c3a2dc35d62ad3373ab7f6a562d8199200"}, - {file = "grpcio-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:65034473fc09628a02fb85f26e73885cf1ed39ebd9cf270247b38689ff5942c5"}, - {file = "grpcio-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d2c1771d0ee3cf72d69bb5e82c6a82f27fbd504c8c782575eddb7839729fbaad"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:3abe6838196da518863b5d549938ce3159d809218936851b395b09cad9b5d64a"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5ffeb269f10cedb4f33142b89a061acda9f672fd1357331dbfd043422c94e9e"}, - {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404d3b4b6b142b99ba1cff0b2177d26b623101ea2ce51c25ef6e53d9d0d87bcc"}, - {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:262cda97efdabb20853d3b5a4c546a535347c14b64c017f628ca0cc7fa780cc6"}, - {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17708db5b11b966373e21519c4c73e5a750555f02fde82276ea2a267077c68ad"}, - {file = "grpcio-1.62.2-cp312-cp312-win32.whl", hash = "sha256:b7ec9e2f8ffc8436f6b642a10019fc513722858f295f7efc28de135d336ac189"}, - {file = "grpcio-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:aa787b83a3cd5e482e5c79be030e2b4a122ecc6c5c6c4c42a023a2b581fdf17b"}, - {file = "grpcio-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:cfd23ad29bfa13fd4188433b0e250f84ec2c8ba66b14a9877e8bce05b524cf54"}, - {file = "grpcio-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:af15e9efa4d776dfcecd1d083f3ccfb04f876d613e90ef8432432efbeeac689d"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f4aa94361bb5141a45ca9187464ae81a92a2a135ce2800b2203134f7a1a1d479"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82af3613a219512a28ee5c95578eb38d44dd03bca02fd918aa05603c41018051"}, - {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ddaf53474e8caeb29eb03e3202f9d827ad3110475a21245f3c7712022882a9"}, - {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79b518c56dddeec79e5500a53d8a4db90da995dfe1738c3ac57fe46348be049"}, - {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5eb4844e5e60bf2c446ef38c5b40d7752c6effdee882f716eb57ae87255d20a"}, - {file = "grpcio-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aaae70364a2d1fb238afd6cc9fcb10442b66e397fd559d3f0968d28cc3ac929c"}, - {file = "grpcio-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:1bcfe5070e4406f489e39325b76caeadab28c32bf9252d3ae960c79935a4cc36"}, - {file = "grpcio-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:da6a7b6b938c15fa0f0568e482efaae9c3af31963eec2da4ff13a6d8ec2888e4"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:41955b641c34db7d84db8d306937b72bc4968eef1c401bea73081a8d6c3d8033"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c772f225483905f675cb36a025969eef9712f4698364ecd3a63093760deea1bc"}, - {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07ce1f775d37ca18c7a141300e5b71539690efa1f51fe17f812ca85b5e73262f"}, - {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:26f415f40f4a93579fd648f48dca1c13dfacdfd0290f4a30f9b9aeb745026811"}, - {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:db707e3685ff16fc1eccad68527d072ac8bdd2e390f6daa97bc394ea7de4acea"}, - {file = "grpcio-1.62.2-cp38-cp38-win32.whl", hash = "sha256:589ea8e75de5fd6df387de53af6c9189c5231e212b9aa306b6b0d4f07520fbb9"}, - {file = "grpcio-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:3c3ed41f4d7a3aabf0f01ecc70d6b5d00ce1800d4af652a549de3f7cf35c4abd"}, - {file = "grpcio-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:162ccf61499c893831b8437120600290a99c0bc1ce7b51f2c8d21ec87ff6af8b"}, - {file = "grpcio-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f27246d7da7d7e3bd8612f63785a7b0c39a244cf14b8dd9dd2f2fab939f2d7f1"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:2507006c8a478f19e99b6fe36a2464696b89d40d88f34e4b709abe57e1337467"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a90ac47a8ce934e2c8d71e317d2f9e7e6aaceb2d199de940ce2c2eb611b8c0f4"}, - {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99701979bcaaa7de8d5f60476487c5df8f27483624f1f7e300ff4669ee44d1f2"}, - {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:af7dc3f7a44f10863b1b0ecab4078f0a00f561aae1edbd01fd03ad4dcf61c9e9"}, - {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fa63245271920786f4cb44dcada4983a3516be8f470924528cf658731864c14b"}, - {file = "grpcio-1.62.2-cp39-cp39-win32.whl", hash = "sha256:c6ad9c39704256ed91a1cffc1379d63f7d0278d6a0bad06b0330f5d30291e3a3"}, - {file = "grpcio-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:16da954692fd61aa4941fbeda405a756cd96b97b5d95ca58a92547bba2c1624f"}, - {file = "grpcio-1.62.2.tar.gz", hash = "sha256:c77618071d96b7a8be2c10701a98537823b9c65ba256c0b9067e0594cdbd954d"}, + {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, + {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, + {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, + {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, + {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, + {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, + {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, + {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, + {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, + {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, + {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, + {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, + {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, + {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, + {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, + {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, + {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, + {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, + {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, + {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, + {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.62.2)"] +protobuf = ["grpcio-tools (>=1.63.0)"] [[package]] name = "grpcio-health-checking" @@ -2431,13 +2461,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.1.0" +version = "6.8.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, - {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -2446,7 +2476,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" @@ -2623,13 +2653,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -2722,13 +2752,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.22.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] [package.dependencies] @@ -2974,13 +3004,13 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v [[package]] name = "jupytext" -version = "1.16.1" +version = "1.16.2" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.1-py3-none-any.whl", hash = "sha256:796ec4f68ada663569e5d38d4ef03738a01284bfe21c943c485bc36433898bd0"}, - {file = "jupytext-1.16.1.tar.gz", hash = "sha256:68c7b68685e870e80e60fda8286fbd6269e9c74dc1df4316df6fe46eabc94c99"}, + {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, + {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, ] [package.dependencies] @@ -2989,16 +3019,16 @@ mdit-py-plugins = "*" nbformat = "*" packaging = "*" pyyaml = "*" -toml = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["jupytext[test-cov,test-external]"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] -test-cov = ["jupytext[test-integration]", "pytest-cov (>=2.6.1)"] -test-external = ["autopep8", "black", "flake8", "gitpython", "isort", "jupyter-fs (<0.4.0)", "jupytext[test-integration]", "pre-commit", "sphinx-gallery (<0.8)"] -test-functional = ["jupytext[test]"] -test-integration = ["ipykernel", "jupyter-server (!=2.11)", "jupytext[test-functional]", "nbconvert"] +test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] +test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] [[package]] @@ -3116,17 +3146,17 @@ files = [ [[package]] name = "lancedb" -version = "0.6.11" +version = "0.6.13" description = "lancedb" optional = false python-versions = ">=3.8" files = [ - {file = "lancedb-0.6.11-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:79dbc2a79dac7b843e328a3b7eecb1b42f38ad524742111a38efbeaa1f58ddfe"}, - {file = "lancedb-0.6.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:bfc6661e1fe5dd75346b4a1980243b4ccecd2b0ad991f8becc6e506a608c2d8a"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0998c2dae676c24b95d492358f80ef6e5100b86335b96bf402af3f28f7ec4f3b"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:b6b289599c4c6a61a70da89d4c3201abec7483d0e03573506014af2dcddfe0c4"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d789d5a181c4bc42650567cb63ce2772ed902046b08e8e401970df284a4df1c1"}, - {file = "lancedb-0.6.11-cp38-abi3-win_amd64.whl", hash = "sha256:ea12fc94545afb03933d080cce593491e593ab95cbfddf05ab7183bce2bc8d62"}, + {file = "lancedb-0.6.13-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:4667353ca7fa187e94cb0ca4c5f9577d65eb5160f6f3fe9e57902d86312c3869"}, + {file = "lancedb-0.6.13-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:2e22533fe6f6b2d7037dcdbbb4019a62402bbad4ce18395be68f4aa007bf8bc0"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:837eaceafb87e3ae4c261eef45c4f73715f892a36165572c3da621dbdb45afcf"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:61af2d72b2a2f0ea419874c3f32760fe5e51530da3be2d65251a0e6ded74419b"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:31b24e57ee313f4ce6255e45d42e8bee19b90ddcd13a9e07030ac04f76e7dfde"}, + {file = "lancedb-0.6.13-cp38-abi3-win_amd64.whl", hash = "sha256:b851182d8492b1e5b57a441af64c95da65ca30b045d6618dc7d203c6d60d70fa"}, ] [package.dependencies] @@ -3139,7 +3169,7 @@ pylance = "0.10.12" ratelimiter = ">=1.0,<2.0" requests = ">=2.31.0" retry = ">=0.9.2" -semver = ">=3.0" +semver = "*" tqdm = ">=4.27.0" [package.extras] @@ -3193,19 +3223,19 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-community" -version = "0.0.34" +version = "0.0.38" description = "Community contributed LangChain integrations." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.0.34-py3-none-any.whl", hash = "sha256:bc13b21a44bbfca01bff8b35c10a26d71485b57c1d284f499b577ba6e1a5d84a"}, - {file = "langchain_community-0.0.34.tar.gz", hash = "sha256:96e9a807d9b4777820df5a970996f6bf3ad5632137bf0f4d863bd832bdeb2b0f"}, + {file = "langchain_community-0.0.38-py3-none-any.whl", hash = "sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a"}, + {file = "langchain_community-0.0.38.tar.gz", hash = "sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain-core = ">=0.1.45,<0.2.0" +langchain-core = ">=0.1.52,<0.2.0" langsmith = ">=0.1.0,<0.2.0" numpy = ">=1,<2" PyYAML = ">=5.3" @@ -3215,17 +3245,17 @@ tenacity = ">=8.1.0,<9.0.0" [package.extras] cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] [[package]] name = "langchain-core" -version = "0.1.46" +version = "0.1.52" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.46-py3-none-any.whl", hash = "sha256:1c0befcd2665dd4aa153318aa9bf729071644b4c179e491769b8e583b4bf7441"}, - {file = "langchain_core-0.1.46.tar.gz", hash = "sha256:17c416349f5c7a9808e70e3725749a3a2df5088f1ecca045c883871aa95f9c9e"}, + {file = "langchain_core-0.1.52-py3-none-any.whl", hash = "sha256:62566749c92e8a1181c255c788548dc16dbc319d896cd6b9c95dc17af9b2a6db"}, + {file = "langchain_core-0.1.52.tar.gz", hash = "sha256:084c3fc452f5a6966c28ab3ec5dbc8b8d26fc3f63378073928f4e29d90b6393f"}, ] [package.dependencies] @@ -3241,13 +3271,13 @@ extended-testing = ["jinja2 (>=3,<4)"] [[package]] name = "langchain-openai" -version = "0.1.4" +version = "0.1.5" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.4-py3-none-any.whl", hash = "sha256:a349ada8724921e380aab03ee312568f5ca99adbc806f6878d79ff9cd1d6d353"}, - {file = "langchain_openai-0.1.4.tar.gz", hash = "sha256:1a3220464c270d73ea3987010617789adc2099d4d4740b15c7734ab07e1f054b"}, + {file = "langchain_openai-0.1.5-py3-none-any.whl", hash = "sha256:8789af68afe747fd05acbe5190e5f0f17cbcce4c07bc58f0584f169318ed9f1c"}, + {file = "langchain_openai-0.1.5.tar.gz", hash = "sha256:c161890f871f8675eb633dcebb53173527045996468ed9d393ed892448408ab1"}, ] [package.dependencies] @@ -3287,6 +3317,32 @@ files = [ pydantic = ">=1,<3" requests = ">=2,<3" +[[package]] +name = "litellm" +version = "1.37.3" +description = "Library to easily interface with LLM API providers" +optional = false +python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" +files = [ + {file = "litellm-1.37.3-py3-none-any.whl", hash = "sha256:d90148c9e49afedb5fb6cd76b3bf125847b4ff732270ef8af723c9a8b13c58f9"}, + {file = "litellm-1.37.3.tar.gz", hash = "sha256:93f0c849ca8f658da1f37c3aa337f39d3193fbef1de6300fc2ffb410ea3f6c93"}, +] + +[package.dependencies] +aiohttp = "*" +click = "*" +importlib-metadata = ">=6.8.0" +jinja2 = ">=3.1.2,<4.0.0" +openai = ">=1.0.0" +python-dotenv = ">=0.2.0" +requests = ">=2.31.0,<3.0.0" +tiktoken = ">=0.4.0" +tokenizers = "*" + +[package.extras] +extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4.8.0,<5.0.0)", "google-cloud-kms (>=2.21.3,<3.0.0)", "prisma (==0.11.0)", "resend (>=0.8.0,<0.9.0)"] +proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "cryptography (>=42.0.5,<43.0.0)", "fastapi (>=0.109.1,<0.110.0)", "fastapi-sso (>=0.10.0,<0.11.0)", "gunicorn (>=22.0.0,<23.0.0)", "orjson (>=3.9.7,<4.0.0)", "python-multipart (>=0.0.9,<0.0.10)", "pyyaml (>=6.0.1,<7.0.0)", "rq", "uvicorn (>=0.22.0,<0.23.0)"] + [[package]] name = "loguru" version = "0.7.2" @@ -3448,13 +3504,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.21.1" +version = "3.21.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.21.1-py3-none-any.whl", hash = "sha256:f085493f79efb0644f270a9bf2892843142d80d7174bbbd2f3713f2a589dc633"}, - {file = "marshmallow-3.21.1.tar.gz", hash = "sha256:4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3"}, + {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, + {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, ] [package.dependencies] @@ -3462,7 +3518,7 @@ packaging = ">=17.0" [package.extras] dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==4.0.0)", "sphinx-version-warning (==1.1.2)"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -3675,13 +3731,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.19" +version = "9.5.21" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.19-py3-none-any.whl", hash = "sha256:ea96e150b6c95f5e4ffe47d78bb712c7bacdd91d2a0bec47f46b6fa0705a86ec"}, - {file = "mkdocs_material-9.5.19.tar.gz", hash = "sha256:7473e06e17e23af608a30ef583fdde8f36389dd3ef56b1d503eed54c89c9618c"}, + {file = "mkdocs_material-9.5.21-py3-none-any.whl", hash = "sha256:210e1f179682cd4be17d5c641b2f4559574b9dea2f589c3f0e7c17c5bd1959bc"}, + {file = "mkdocs_material-9.5.21.tar.gz", hash = "sha256:049f82770f40559d3c2aa2259c562ea7257dbb4aaa9624323b5ef27b2d95a450"}, ] [package.dependencies] @@ -4028,13 +4084,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.16.3" +version = "7.16.4" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, - {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, ] [package.dependencies] @@ -4056,9 +4112,9 @@ tinycss2 = "*" traitlets = ">=5.1" [package.extras] -all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert[qtpng]"] +qtpdf = ["pyqtwebengine (>=5.15)"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] @@ -4354,6 +4410,99 @@ typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +[[package]] +name = "opentelemetry-api" +version = "1.24.0" +description = "OpenTelemetry Python API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_api-1.24.0-py3-none-any.whl", hash = "sha256:0f2c363d98d10d1ce93330015ca7fd3a65f60be64e05e30f557c61de52c80ca2"}, + {file = "opentelemetry_api-1.24.0.tar.gz", hash = "sha256:42719f10ce7b5a9a73b10a4baf620574fb8ad495a9cbe5c18d76b75d8689c67e"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<=7.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.24.0" +description = "OpenTelemetry Protobuf encoding" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.24.0-py3-none-any.whl", hash = "sha256:e51f2c9735054d598ad2df5d3eca830fecfb5b0bda0a2fa742c9c7718e12f641"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.24.0.tar.gz", hash = "sha256:5d31fa1ff976cacc38be1ec4e3279a3f88435c75b38b1f7a099a1faffc302461"}, +] + +[package.dependencies] +opentelemetry-proto = "1.24.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.24.0" +description = "OpenTelemetry Collector Protobuf over gRPC Exporter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0-py3-none-any.whl", hash = "sha256:f40d62aa30a0a43cc1657428e59fcf82ad5f7ea8fff75de0f9d9cb6f739e0a3b"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0.tar.gz", hash = "sha256:217c6e30634f2c9797999ea9da29f7300479a94a610139b9df17433f915e7baa"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +grpcio = ">=1.0.0,<2.0.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.24.0" +opentelemetry-proto = "1.24.0" +opentelemetry-sdk = ">=1.24.0,<1.25.0" + +[package.extras] +test = ["pytest-grpc"] + +[[package]] +name = "opentelemetry-proto" +version = "1.24.0" +description = "OpenTelemetry Python Proto" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_proto-1.24.0-py3-none-any.whl", hash = "sha256:bcb80e1e78a003040db71ccf83f2ad2019273d1e0828089d183b18a1476527ce"}, + {file = "opentelemetry_proto-1.24.0.tar.gz", hash = "sha256:ff551b8ad63c6cabb1845ce217a6709358dfaba0f75ea1fa21a61ceddc78cab8"}, +] + +[package.dependencies] +protobuf = ">=3.19,<5.0" + +[[package]] +name = "opentelemetry-sdk" +version = "1.24.0" +description = "OpenTelemetry Python SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_sdk-1.24.0-py3-none-any.whl", hash = "sha256:fa731e24efe832e98bcd90902085b359dcfef7d9c9c00eb5b9a18587dae3eb59"}, + {file = "opentelemetry_sdk-1.24.0.tar.gz", hash = "sha256:75bc0563affffa827700e0f4f4a68e1e257db0df13372344aebc6f8a64cde2e5"}, +] + +[package.dependencies] +opentelemetry-api = "1.24.0" +opentelemetry-semantic-conventions = "0.45b0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.45b0" +description = "OpenTelemetry Semantic Conventions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_semantic_conventions-0.45b0-py3-none-any.whl", hash = "sha256:a4a6fb9a7bacd9167c082aa4681009e9acdbfa28ffb2387af50c2fef3d30c864"}, + {file = "opentelemetry_semantic_conventions-0.45b0.tar.gz", hash = "sha256:7c84215a44ac846bc4b8e32d5e78935c5c43482e491812a0bb8aaf87e4d92118"}, +] + [[package]] name = "optuna" version = "3.6.1" @@ -5184,17 +5333,16 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -5350,13 +5498,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-asyncio" -version = "0.21.1" +version = "0.21.2" description = "Pytest support for asyncio" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, - {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, + {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"}, + {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"}, ] [package.dependencies] @@ -5398,18 +5546,18 @@ pytest = "*" [[package]] name = "pytest-xdist" -version = "3.5.0" +version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, - {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, ] [package.dependencies] -execnet = ">=1.1" -pytest = ">=6.2.0" +execnet = ">=2.1" +pytest = ">=7.0.0" [package.extras] psutil = ["psutil (>=3.0)"] @@ -5579,99 +5727,99 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "26.0.2" +version = "26.0.3" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a60a03b01e8c9c58932ec0cca15b1712d911c2800eb82d4281bc1ae5b6dad50"}, - {file = "pyzmq-26.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:949067079e14ea1973bd740255e0840118c163d4bce8837f539d749f145cf5c3"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e7edfa6cf96d036a403775c96afa25058d1bb940a79786a9a2fc94a783abe3"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:903cc7a84a7d4326b43755c368780800e035aa3d711deae84a533fdffa8755b0"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cb2e41af165e5f327d06fbdd79a42a4e930267fade4e9f92d17f3ccce03f3a7"}, - {file = "pyzmq-26.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:55353b8189adcfc4c125fc4ce59d477744118e9c0ec379dd0999c5fa120ac4f5"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f961423ff6236a752ced80057a20e623044df95924ed1009f844cde8b3a595f9"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ba77fe84fe4f5f3dc0ef681a6d366685c8ffe1c8439c1d7530997b05ac06a04b"}, - {file = "pyzmq-26.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:52589f0a745ef61b9c75c872cf91f8c1f7c0668eb3dd99d7abd639d8c0fb9ca7"}, - {file = "pyzmq-26.0.2-cp310-cp310-win32.whl", hash = "sha256:b7b6d2a46c7afe2ad03ec8faf9967090c8ceae85c4d8934d17d7cae6f9062b64"}, - {file = "pyzmq-26.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:86531e20de249d9204cc6d8b13d5a30537748c78820215161d8a3b9ea58ca111"}, - {file = "pyzmq-26.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:f26a05029ecd2bd306b941ff8cb80f7620b7901421052bc429d238305b1cbf2f"}, - {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:70770e296a9cb03d955540c99360aab861cbb3cba29516abbd106a15dbd91268"}, - {file = "pyzmq-26.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2740fd7161b39e178554ebf21aa5667a1c9ef0cd2cb74298fd4ef017dae7aec4"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3706c32dea077faa42b1c92d825b7f86c866f72532d342e0be5e64d14d858"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa1416876194927f7723d6b7171b95e1115602967fc6bfccbc0d2d51d8ebae1"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ef9a79a48794099c57dc2df00340b5d47c5caa1792f9ddb8c7a26b1280bd575"}, - {file = "pyzmq-26.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1c60fcdfa3229aeee4291c5d60faed3a813b18bdadb86299c4bf49e8e51e8605"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e943c39c206b04df2eb5d71305761d7c3ca75fd49452115ea92db1b5b98dbdef"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8da0ed8a598693731c76659880a668f4748b59158f26ed283a93f7f04d47447e"}, - {file = "pyzmq-26.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bf51970b11d67096bede97cdbad0f4333f7664f4708b9b2acb352bf4faa3140"}, - {file = "pyzmq-26.0.2-cp311-cp311-win32.whl", hash = "sha256:6f8e6bd5d066be605faa9fe5ec10aa1a46ad9f18fc8646f2b9aaefc8fb575742"}, - {file = "pyzmq-26.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d03da3a0ae691b361edcb39530075461202f699ce05adbb15055a0e1c9bcaa4"}, - {file = "pyzmq-26.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:f84e33321b68ff00b60e9dbd1a483e31ab6022c577c8de525b8e771bd274ce68"}, - {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:44c33ebd1c62a01db7fbc24e18bdda569d6639217d13d5929e986a2b0f69070d"}, - {file = "pyzmq-26.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ac04f904b4fce4afea9cdccbb78e24d468cb610a839d5a698853e14e2a3f9ecf"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2133de5ba9adc5f481884ccb699eac9ce789708292945c05746880f95b241c0"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7753c67c570d7fc80c2dc59b90ca1196f1224e0e2e29a548980c95fe0fe27fc1"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d4e51632e6b12e65e8d9d7612446ecda2eda637a868afa7bce16270194650dd"}, - {file = "pyzmq-26.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d6c38806f6ecd0acf3104b8d7e76a206bcf56dadd6ce03720d2fa9d9157d5718"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:48f496bbe14686b51cec15406323ae6942851e14022efd7fc0e2ecd092c5982c"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e84a3161149c75bb7a7dc8646384186c34033e286a67fec1ad1bdedea165e7f4"}, - {file = "pyzmq-26.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dabf796c67aa9f5a4fcc956d47f0d48b5c1ed288d628cf53aa1cf08e88654343"}, - {file = "pyzmq-26.0.2-cp312-cp312-win32.whl", hash = "sha256:3eee4c676af1b109f708d80ef0cf57ecb8aaa5900d1edaf90406aea7e0e20e37"}, - {file = "pyzmq-26.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:26721fec65846b3e4450dad050d67d31b017f97e67f7e0647b5f98aa47f828cf"}, - {file = "pyzmq-26.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:653955c6c233e90de128a1b8e882abc7216f41f44218056bd519969c8c413a15"}, - {file = "pyzmq-26.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:becd8d8fb068fbb5a52096efd83a2d8e54354383f691781f53a4c26aee944542"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7a15e5465e7083c12517209c9dd24722b25e9b63c49a563922922fc03554eb35"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8158ac8616941f874841f9fa0f6d2f1466178c2ff91ea08353fdc19de0d40c2"}, - {file = "pyzmq-26.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c6a53e28c7066ea7db86fcc0b71d78d01b818bb11d4a4341ec35059885295"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bdbc7dab0b0e9c62c97b732899c4242e3282ba803bad668e03650b59b165466e"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e74b6d5ef57bb65bf1b4a37453d8d86d88550dde3fb0f23b1f1a24e60c70af5b"}, - {file = "pyzmq-26.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ed4c6ee624ecbc77b18aeeb07bf0700d26571ab95b8f723f0d02e056b5bce438"}, - {file = "pyzmq-26.0.2-cp37-cp37m-win32.whl", hash = "sha256:8a98b3cb0484b83c19d8fb5524c8a469cd9f10e743f5904ac285d92678ee761f"}, - {file = "pyzmq-26.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aa5f95d71b6eca9cec28aa0a2f8310ea53dea313b63db74932879ff860c1fb8d"}, - {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:5ff56c76ce77b9805378a7a73032c17cbdb1a5b84faa1df03c5d3e306e5616df"}, - {file = "pyzmq-26.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bab697fc1574fee4b81da955678708567c43c813c84c91074e452bda5346c921"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c0fed8aa9ba0488ee1cbdaa304deea92d52fab43d373297002cfcc69c0a20c5"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:606b922699fcec472ed814dda4dc3ff7c748254e0b26762a0ba21a726eb1c107"}, - {file = "pyzmq-26.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f0fd82bad4d199fa993fbf0ac586a7ac5879addbe436a35a389df7e0eb4c91"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:166c5e41045939a52c01e6f374e493d9a6a45dfe677360d3e7026e38c42e8906"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d566e859e8b8d5bca08467c093061774924b3d78a5ba290e82735b2569edc84b"}, - {file = "pyzmq-26.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:264ee0e72b72ca59279dc320deab5ae0fac0d97881aed1875ce4bde2e56ffde0"}, - {file = "pyzmq-26.0.2-cp38-cp38-win32.whl", hash = "sha256:3152bbd3a4744cbdd83dfb210ed701838b8b0c9065cef14671d6d91df12197d0"}, - {file = "pyzmq-26.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf77601d75ca692c179154b7e5943c286a4aaffec02c491afe05e60493ce95f2"}, - {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:c770a7545b3deca2db185b59175e710a820dd4ed43619f4c02e90b0e227c6252"}, - {file = "pyzmq-26.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47175f0a380bfd051726bc5c0054036ae4a5d8caf922c62c8a172ccd95c1a2a"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bce298c1ce077837e110367c321285dc4246b531cde1abfc27e4a5bbe2bed4d"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c40b09b7e184d6e3e1be1c8af2cc320c0f9f610d8a5df3dd866e6e6e4e32b235"}, - {file = "pyzmq-26.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d420d856bf728713874cefb911398efe69e1577835851dd297a308a78c14c249"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d792d3cab987058451e55c70c5926e93e2ceb68ca5a2334863bb903eb860c9cb"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:83ec17729cf6d3464dab98a11e98294fcd50e6b17eaabd3d841515c23f6dbd3a"}, - {file = "pyzmq-26.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47c17d5ebfa88ae90f08960c97b49917098665b8cd8be31f2c24e177bcf37a0f"}, - {file = "pyzmq-26.0.2-cp39-cp39-win32.whl", hash = "sha256:d509685d1cd1d018705a811c5f9d5bc237790936ead6d06f6558b77e16cc7235"}, - {file = "pyzmq-26.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:c7cc8cc009e8f6989a6d86c96f87dae5f5fb07d6c96916cdc7719d546152c7db"}, - {file = "pyzmq-26.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:3ada31cb879cd7532f4a85b501f4255c747d4813ab76b35c49ed510ce4865b45"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0a6ceaddc830dd3ca86cb8451cf373d1f05215368e11834538c2902ed5205139"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a967681463aa7a99eb9a62bb18229b653b45c10ff0947b31cc0837a83dfb86f"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6472a73bc115bc40a2076609a90894775abe6faf19a78375675a2f889a613071"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6aea92bcccfe5e5524d3c70a6f16ffdae548390ddad26f4207d55c55a40593"}, - {file = "pyzmq-26.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e025f6351e49d48a5aa2f5a09293aa769b0ee7369c25bed551647234b7fa0c75"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:40bd7ebe4dbb37d27f0c56e2a844f360239343a99be422085e13e97da13f73f9"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dd40d586ad6f53764104df6e01810fe1b4e88fd353774629a5e6fe253813f79"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2aca15e9ad8c8657b5b3d7ae3d1724dc8c1c1059c06b4b674c3aa36305f4930"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450ec234736732eb0ebeffdb95a352450d4592f12c3e087e2a9183386d22c8bf"}, - {file = "pyzmq-26.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f43be2bebbd09360a2f23af83b243dc25ffe7b583ea8c722e6df03e03a55f02f"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:867f55e54aff254940bcec5eec068e7c0ac1e6bf360ab91479394a8bf356b0e6"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4dbc033c5ad46f8c429bf238c25a889b8c1d86bfe23a74e1031a991cb3f0000"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6e8dd2961462e337e21092ec2da0c69d814dcb1b6e892955a37444a425e9cfb8"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35391e72df6c14a09b697c7b94384947c1dd326aca883ff98ff137acdf586c33"}, - {file = "pyzmq-26.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1c3d3c92fa54eda94ab369ca5b8d35059987c326ba5e55326eb068862f64b1fc"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7aa61a9cc4f0523373e31fc9255bf4567185a099f85ca3598e64de484da3ab2"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee53a8191271f144cc20b12c19daa9f1546adc84a2f33839e3338039b55c373c"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac60a980f07fa988983f7bfe6404ef3f1e4303f5288a01713bc1266df6d18783"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88896b1b4817d7b2fe1ec7205c4bbe07bf5d92fb249bf2d226ddea8761996068"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:18dfffe23751edee917764ffa133d5d3fef28dfd1cf3adebef8c90bc854c74c4"}, - {file = "pyzmq-26.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6926dd14cfe6967d3322640b6d5c3c3039db71716a5e43cca6e3b474e73e0b36"}, - {file = "pyzmq-26.0.2.tar.gz", hash = "sha256:f0f9bb370449158359bb72a3e12c658327670c0ffe6fbcd1af083152b64f9df0"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, ] [package.dependencies] @@ -5679,13 +5827,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "qdrant-client" -version = "1.9.0" +version = "1.9.1" description = "Client library for the Qdrant vector search engine" optional = false python-versions = ">=3.8" files = [ - {file = "qdrant_client-1.9.0-py3-none-any.whl", hash = "sha256:ee02893eab1f642481b1ac1e38eb68ec30bab0f673bef7cc05c19fa5d2cbf43e"}, - {file = "qdrant_client-1.9.0.tar.gz", hash = "sha256:7b1792f616651a6f0a76312f945c13d088e9451726795b82ce0350f7df3b7981"}, + {file = "qdrant_client-1.9.1-py3-none-any.whl", hash = "sha256:b9b7e0e5c1a51410d8bb5106a869a51e12f92ab45a99030f27aba790553bd2c8"}, + {file = "qdrant_client-1.9.1.tar.gz", hash = "sha256:186b9c31d95aefe8f2db84b7746402d7365bd63b305550e530e31bde2002ce79"}, ] [package.dependencies] @@ -5761,13 +5909,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.35.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.35.0-py3-none-any.whl", hash = "sha256:8080727b30e364e5783152903672df9b6b091c926a146a759080b62ca3126cd6"}, - {file = "referencing-0.35.0.tar.gz", hash = "sha256:191e936b0c696d0af17ad7430a3dc68e88bc11be6514f4757dc890f04ab05889"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -5776,104 +5924,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.4.16" +version = "2024.5.10" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, - {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, - {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, - {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, - {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, - {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, - {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, - {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, - {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, - {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, - {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, - {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, - {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, - {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, - {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eda3dd46df535da787ffb9036b5140f941ecb91701717df91c9daf64cabef953"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d5bd666466c8f00a06886ce1397ba8b12371c1f1c6d1bef11013e9e0a1464a8"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32e5f3b8e32918bfbdd12eca62e49ab3031125c454b507127ad6ecbd86e62fca"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:534efd2653ebc4f26fc0e47234e53bf0cb4715bb61f98c64d2774a278b58c846"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193b7c6834a06f722f0ce1ba685efe80881de7c3de31415513862f601097648c"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:160ba087232c5c6e2a1e7ad08bd3a3f49b58c815be0504d8c8aacfb064491cd8"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951be1eae7b47660412dc4938777a975ebc41936d64e28081bf2e584b47ec246"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8a0f0ab5453e409586b11ebe91c672040bc804ca98d03a656825f7890cbdf88"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e6d4d6ae1827b2f8c7200aaf7501c37cf3f3896c86a6aaf2566448397c823dd"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:161a206c8f3511e2f5fafc9142a2cc25d7fe9a1ec5ad9b4ad2496a7c33e1c5d2"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b3267cea873684af022822195298501568ed44d542f9a2d9bebc0212e99069"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:560278c9975694e1f0bc50da187abf2cdc1e4890739ea33df2bc4a85eeef143e"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:70364a097437dd0a90b31cd77f09f7387ad9ac60ef57590971f43b7fca3082a5"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42be5de7cc8c1edac55db92d82b68dc8e683b204d6f5414c5a51997a323d7081"}, + {file = "regex-2024.5.10-cp310-cp310-win32.whl", hash = "sha256:9a8625849387b9d558d528e263ecc9c0fbde86cfa5c2f0eef43fff480ae24d71"}, + {file = "regex-2024.5.10-cp310-cp310-win_amd64.whl", hash = "sha256:903350bf44d7e4116b4d5898b30b15755d61dcd3161e3413a49c7db76f0bee5a"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bf9596cba92ce7b1fd32c7b07c6e3212c7eed0edc271757e48bfcd2b54646452"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45cc13d398b6359a7708986386f72bd156ae781c3e83a68a6d4cee5af04b1ce9"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad45f3bccfcb00868f2871dce02a755529838d2b86163ab8a246115e80cfb7d6"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d19f0cde6838c81acffff25c7708e4adc7dd02896c9ec25c3939b1500a1778"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9f89d7db5ef6bdf53e5cc8e6199a493d0f1374b3171796b464a74ebe8e508a"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c6c71cf92b09e5faa72ea2c68aa1f61c9ce11cb66fdc5069d712f4392ddfd00"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467ad8b0eac0b28e52679e972b9b234b3de0ea5cee12eb50091d2b68145fe36"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc0db93ad039fc2fe32ccd3dd0e0e70c4f3d6e37ae83f0a487e1aba939bd2fbd"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fa9335674d7c819674467c7b46154196c51efbaf5f5715187fd366814ba3fa39"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7dda3091838206969c2b286f9832dff41e2da545b99d1cfaea9ebd8584d02708"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:504b5116e2bd1821efd815941edff7535e93372a098e156bb9dffde30264e798"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:91b53dea84415e8115506cc62e441a2b54537359c63d856d73cb1abe05af4c9a"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a3903128f9e17a500618e80c68165c78c741ebb17dd1a0b44575f92c3c68b02"}, + {file = "regex-2024.5.10-cp311-cp311-win32.whl", hash = "sha256:236cace6c1903effd647ed46ce6dd5d76d54985fc36dafc5256032886736c85d"}, + {file = "regex-2024.5.10-cp311-cp311-win_amd64.whl", hash = "sha256:12446827f43c7881decf2c126762e11425de5eb93b3b0d8b581344c16db7047a"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14905ed75c7a6edf423eb46c213ed3f4507c38115f1ed3c00f4ec9eafba50e58"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fad420b14ae1970a1f322e8ae84a1d9d89375eb71e1b504060ab2d1bfe68f3c"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c46a76a599fcbf95f98755275c5527304cc4f1bb69919434c1e15544d7052910"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0faecb6d5779753a6066a3c7a0471a8d29fe25d9981ca9e552d6d1b8f8b6a594"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aab65121229c2ecdf4a31b793d99a6a0501225bd39b616e653c87b219ed34a49"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50e7e96a527488334379e05755b210b7da4a60fc5d6481938c1fa053e0c92184"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba034c8db4b264ef1601eb33cd23d87c5013b8fb48b8161debe2e5d3bd9156b0"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:031219782d97550c2098d9a68ce9e9eaefe67d2d81d8ff84c8354f9c009e720c"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62b5f7910b639f3c1d122d408421317c351e213ca39c964ad4121f27916631c6"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cd832bd9b6120d6074f39bdfbb3c80e416848b07ac72910f1c7f03131a6debc3"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:e91b1976358e17197157b405cab408a5f4e33310cda211c49fc6da7cffd0b2f0"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:571452362d552de508c37191b6abbbb660028b8b418e2d68c20779e0bc8eaaa8"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5253dcb0bfda7214523de58b002eb0090cb530d7c55993ce5f6d17faf953ece7"}, + {file = "regex-2024.5.10-cp312-cp312-win32.whl", hash = "sha256:2f30a5ab8902f93930dc6f627c4dd5da2703333287081c85cace0fc6e21c25af"}, + {file = "regex-2024.5.10-cp312-cp312-win_amd64.whl", hash = "sha256:3799e36d60a35162bb35b2246d8bb012192b7437dff807ef79c14e7352706306"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bbdc5db2c98ac2bf1971ffa1410c87ca7a15800415f788971e8ba8520fc0fda9"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6ccdeef4584450b6f0bddd5135354908dacad95425fcb629fe36d13e48b60f32"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:29d839829209f3c53f004e1de8c3113efce6d98029f044fa5cfee666253ee7e6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0709ba544cf50bd5cb843df4b8bb6701bae2b70a8e88da9add8386cbca5c1385"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:972b49f2fe1047b9249c958ec4fa1bdd2cf8ce305dc19d27546d5a38e57732d8"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cdbb1998da94607d5eec02566b9586f0e70d6438abf1b690261aac0edda7ab6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7c8ee4861d9ef5b1120abb75846828c811f932d63311596ad25fa168053e00"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d35d4cc9270944e95f9c88af757b0c9fc43f396917e143a5756608462c5223b"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8722f72068b3e1156a4b2e1afde6810f1fc67155a9fa30a4b9d5b4bc46f18fb0"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:696639a73ca78a380acfaa0a1f6dd8220616a99074c05bba9ba8bb916914b224"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea057306ab469130167014b662643cfaed84651c792948891d003cf0039223a5"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b43b78f9386d3d932a6ce5af4b45f393d2e93693ee18dc4800d30a8909df700e"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c43395a3b7cc9862801a65c6994678484f186ce13c929abab44fb8a9e473a55a"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bc94873ba11e34837bffd7e5006703abeffc4514e2f482022f46ce05bd25e67"}, + {file = "regex-2024.5.10-cp38-cp38-win32.whl", hash = "sha256:1118ba9def608250250f4b3e3f48c62f4562ba16ca58ede491b6e7554bfa09ff"}, + {file = "regex-2024.5.10-cp38-cp38-win_amd64.whl", hash = "sha256:458d68d34fb74b906709735c927c029e62f7d06437a98af1b5b6258025223210"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15e593386ec6331e0ab4ac0795b7593f02ab2f4b30a698beb89fbdc34f92386a"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca23b41355ba95929e9505ee04e55495726aa2282003ed9b012d86f857d3e49b"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c8982ee19ccecabbaeac1ba687bfef085a6352a8c64f821ce2f43e6d76a9298"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7117cb7d6ac7f2e985f3d18aa8a1728864097da1a677ffa69e970ca215baebf1"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66421f8878a0c82fc0c272a43e2121c8d4c67cb37429b764f0d5ad70b82993b"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224a9269f133564109ce668213ef3cb32bc72ccf040b0b51c72a50e569e9dc9e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab98016541543692a37905871a5ffca59b16e08aacc3d7d10a27297b443f572d"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d27844763c273a122e08a3e86e7aefa54ee09fb672d96a645ece0454d8425e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:853cc36e756ff673bf984e9044ccc8fad60b95a748915dddeab9488aea974c73"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e7eaf9df15423d07b6050fb91f86c66307171b95ea53e2d87a7993b6d02c7f7"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:169fd0acd7a259f58f417e492e93d0e15fc87592cd1e971c8c533ad5703b5830"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:334b79ce9c08f26b4659a53f42892793948a613c46f1b583e985fd5a6bf1c149"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f03b1dbd4d9596dd84955bb40f7d885204d6aac0d56a919bb1e0ff2fb7e1735a"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfa6d61a76c77610ba9274c1a90a453062bdf6887858afbe214d18ad41cf6bde"}, + {file = "regex-2024.5.10-cp39-cp39-win32.whl", hash = "sha256:249fbcee0a277c32a3ce36d8e36d50c27c968fdf969e0fbe342658d4e010fbc8"}, + {file = "regex-2024.5.10-cp39-cp39-win_amd64.whl", hash = "sha256:0ce56a923f4c01d7568811bfdffe156268c0a7aae8a94c902b92fe34c4bde785"}, + {file = "regex-2024.5.10.tar.gz", hash = "sha256:304e7e2418146ae4d0ef0e9ffa28f881f7874b45b4994cc2279b21b6e7ae50c8"}, ] [[package]] @@ -5971,110 +6105,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] [[package]] @@ -6233,13 +6367,13 @@ win32 = ["pywin32"] [[package]] name = "sentry-sdk" -version = "2.0.1" +version = "2.1.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.0.1-py2.py3-none-any.whl", hash = "sha256:b54c54a2160f509cf2757260d0cf3885b608c6192c2555a3857e3a4d0f84bdb3"}, - {file = "sentry_sdk-2.0.1.tar.gz", hash = "sha256:c278e0f523f6f0ee69dc43ad26dcdb1202dffe5ac326ae31472e012d941bee21"}, + {file = "sentry_sdk-2.1.1-py2.py3-none-any.whl", hash = "sha256:99aeb78fb76771513bd3b2829d12613130152620768d00cd3e45ac00cb17950f"}, + {file = "sentry_sdk-2.1.1.tar.gz", hash = "sha256:95d8c0bb41c8b0bc37ab202c2c4a295bb84398ee05f4cdce55051cd75b926ec1"}, ] [package.dependencies] @@ -6248,6 +6382,7 @@ urllib3 = ">=1.26.11" [package.extras] aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] arq = ["arq (>=0.23)"] asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] @@ -6263,6 +6398,8 @@ flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] loguru = ["loguru (>=0.5)"] openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] @@ -6458,60 +6595,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.29" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, - {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, - {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -6673,13 +6810,13 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "threadpoolctl" -version = "3.4.0" +version = "3.5.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, - {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, ] [[package]] @@ -6879,17 +7016,6 @@ dev = ["tokenizers[testing]"] docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tomli" version = "2.0.1" @@ -6903,13 +7029,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.4" +version = "0.12.5" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] @@ -6934,13 +7060,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.2" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -7184,13 +7310,13 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "validators" -version = "0.28.0" +version = "0.28.1" description = "Python Data Validation for Humans™" optional = false python-versions = ">=3.8" files = [ - {file = "validators-0.28.0-py3-none-any.whl", hash = "sha256:e0184691dea3ba82b52c161ba81d3ec1d8be8da9609f0137d1430b395b366521"}, - {file = "validators-0.28.0.tar.gz", hash = "sha256:85bc82511f6ccd0800f4c15d8c0dc546c15e369640c5ea1f24349ba0b3b17815"}, + {file = "validators-0.28.1-py3-none-any.whl", hash = "sha256:890c98789ad884037f059af6ea915ec2d667129d509180c2c590b8009a4c4219"}, + {file = "validators-0.28.1.tar.gz", hash = "sha256:5ac88e7916c3405f0ce38ac2ac82a477fcf4d90dbbeddd04c8193171fc17f7dc"}, ] [[package]] @@ -7247,13 +7373,13 @@ files = [ [[package]] name = "weaviate-client" -version = "4.5.6" +version = "4.6.0" description = "A python native Weaviate client" optional = false python-versions = ">=3.8" files = [ - {file = "weaviate_client-4.5.6-py3-none-any.whl", hash = "sha256:bdafbf94343f621ca68bc547b5c9a5272dc6ca7953ad6a228f5ad8179021de68"}, - {file = "weaviate_client-4.5.6.tar.gz", hash = "sha256:32a2b328f0a6637228c064e04aa6004c4ba733469b81754ae4598750735a9624"}, + {file = "weaviate_client-4.6.0-py3-none-any.whl", hash = "sha256:4c9608ba5d495d1fe28e451aca057086cb55242bb8432bfb0008f433eef7a6ab"}, + {file = "weaviate_client-4.6.0.tar.gz", hash = "sha256:5cc6c8b2a6f9122b34ffa688070e5060ab044fe72a4a9233eb9938c6067866b8"}, ] [package.dependencies] @@ -7261,10 +7387,10 @@ authlib = ">=1.2.1,<2.0.0" grpcio = ">=1.57.0,<2.0.0" grpcio-health-checking = ">=1.57.0,<2.0.0" grpcio-tools = ">=1.57.0,<2.0.0" -httpx = "0.27.0" +httpx = ">=0.25.0,<=0.27.0" pydantic = ">=2.5.0,<3.0.0" requests = ">=2.30.0,<3.0.0" -validators = "0.28.0" +validators = "0.28.1" [[package]] name = "webcolors" @@ -7358,6 +7484,85 @@ files = [ [package.extras] dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + [[package]] name = "xmltodict" version = "0.13.0" @@ -7632,4 +7837,4 @@ weaviate = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "0f66c0ad86b74b152f430a3ed9376bf63154eac83b12b7c3dd96f86af4399079" +content-hash = "459e5945fb184ecdc2c9a817e89b2a83b9e0c97273d1a7df8f75c9c0b355ba47" diff --git a/pyproject.toml b/pyproject.toml index 94ceb2e5b..c36abd566 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,8 +63,9 @@ tiktoken = "^0.6.0" dspy-ai = "2.4.3" posthog = "^3.5.0" lancedb = "^0.6.10" -importlib-metadata = "6.1.0" +importlib-metadata = "6.8.0" deepeval = "^0.21.36" +litellm = "^1.37.3" From 3c261ce6a192bd0bf80ce0babf02e5be1a75056d Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sun, 12 May 2024 21:58:09 +0200 Subject: [PATCH 07/21] working cognify on large dataset --- cognee/api/v1/cognify/cognify.py | 36 +++++++---- cognee/config.py | 2 + .../data/chunking/LangchainChunkingEngine.py | 4 +- .../embeddings/DefaultEmbeddingEngine.py | 21 +++++-- .../modules/cognify/graph/add_data_chunks.py | 61 ++++++++++--------- cognee/shared/GithubClassification.py | 25 ++++++++ 6 files changed, 101 insertions(+), 48 deletions(-) create mode 100644 cognee/shared/GithubClassification.py diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index b9bcf81cb..28203f7e2 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -11,7 +11,7 @@ from nltk.corpus import stopwords from cognee.api.v1.prune import prune from cognee.config import Config from cognee.infrastructure.data.chunking.LangchainChunkingEngine import LangchainChunkEngine -from cognee.infrastructure.databases.vector.embeddings.DefaultEmbeddingEngine import OpenAIEmbeddingEngine +from cognee.infrastructure.databases.vector.embeddings.DefaultEmbeddingEngine import LiteLLMEmbeddingEngine from cognee.modules.cognify.graph.add_data_chunks import add_data_chunks from cognee.modules.cognify.graph.add_document_node import add_document_node from cognee.modules.cognify.graph.add_classification_nodes import add_classification_nodes @@ -32,6 +32,7 @@ from cognee.modules.data.get_content_summary import get_content_summary from cognee.modules.data.get_cognitive_layers import get_cognitive_layers from cognee.modules.data.get_layer_graphs import get_layer_graphs from cognee.modules.topology.topology import TopologyEngine +from cognee.shared.GithubClassification import CodeContentPrediction from cognee.shared.data_models import ChunkStrategy from cognee.utils import send_telemetry @@ -94,7 +95,7 @@ async def cognify(datasets: Union[str, List[str]] = None): file_type = guess_file_type(file) text = extract_text_from_file(file, file_type) if text is None: - text = "" + text = "empty file" subchunks = chunk_engine.chunk_data(chunk_strategy, text, config.chunk_size, config.chunk_overlap) if dataset_name not in data_chunks: @@ -105,6 +106,9 @@ async def cognify(datasets: Union[str, List[str]] = None): except FileTypeException: logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) + + + added_chunks: list[tuple[str, str, dict]] = await add_data_chunks(data_chunks) await asyncio.gather( @@ -129,12 +133,12 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi # await add_label_nodes(graph_client, document_id, chunk_id, file_metadata["keywords"].split("|")) - # classified_categories = await get_content_categories(input_text) - # await add_classification_nodes( - # graph_client, - # parent_node_id = document_id, - # categories = classified_categories, - # ) + classified_categories = await get_content_categories(input_text) + await add_classification_nodes( + graph_client, + parent_node_id = document_id, + categories = classified_categories, + ) # print(f"Chunk ({chunk_id}) classified.") @@ -145,11 +149,11 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi print(f"Chunk ({chunk_id}) summarized.") - # cognitive_layers = await get_cognitive_layers(input_text, classified_categories) - # cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] + cognitive_layers = await get_cognitive_layers(input_text, classified_categories) + cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] # - # layer_graphs = await get_layer_graphs(input_text, cognitive_layers) - # await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) + layer_graphs = await get_layer_graphs(input_text, cognitive_layers) + await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) # # if infrastructure_config.get_config()["connect_documents"] is True: # db_engine = infrastructure_config.get_config()["database_engine"] @@ -196,7 +200,13 @@ if __name__ == "__main__": # # await add("data://" +data_directory_path, "example") - infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': OpenAIEmbeddingEngine()}) + infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': LiteLLMEmbeddingEngine()}) + from cognee.shared.SourceCodeGraph import SourceCodeGraph + from cognee.api.v1.config import config + + config.set_graph_model(SourceCodeGraph) + + config.set_classification_model(CodeContentPrediction) graph = await cognify() # diff --git a/cognee/config.py b/cognee/config.py index 91101334b..639a6b41e 100644 --- a/cognee/config.py +++ b/cognee/config.py @@ -63,6 +63,8 @@ class Config: openai_temperature: float = float(os.getenv("OPENAI_TEMPERATURE", 0.0)) openai_embedding_model = "text-embedding-3-large" openai_embedding_dimensions = 3072 + litellm_embedding_model = "text-embedding-3-large" + litellm_embedding_dimensions = 3072 graphistry_username = os.getenv("GRAPHISTRY_USERNAME") graphistry_password = os.getenv("GRAPHISTRY_PASSWORD") diff --git a/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py b/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py index f15d66f7e..c936bbe66 100644 --- a/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py +++ b/cognee/infrastructure/data/chunking/LangchainChunkingEngine.py @@ -46,5 +46,7 @@ class LangchainChunkEngine(): ) code_chunks = python_splitter.create_documents([data_chunks]) - return code_chunks + only_content = [chunk.page_content for chunk in code_chunks] + + return only_content diff --git a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py index 8ced98728..ac7fcc0d7 100644 --- a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py @@ -11,6 +11,9 @@ from cognee.config import Config from cognee.root_dir import get_absolute_path from cognee.infrastructure.databases.vector.embeddings.EmbeddingEngine import EmbeddingEngine from litellm import aembedding +import litellm + +litellm.set_verbose = True config = Config() config.load() @@ -25,25 +28,35 @@ class DefaultEmbeddingEngine(EmbeddingEngine): return config.embedding_dimensions -class OpenAIEmbeddingEngine(EmbeddingEngine): +class LiteLLMEmbeddingEngine(EmbeddingEngine): + async def embed_text(self, text: List[str]) -> List[float]: - response = await aembedding(config.openai_embedding_model, input=text) + + print("text", text) + try: + text = str(text[0]) + except: + text = str(text) + + + response = await aembedding(config.litellm_embedding_model, input=text) # embedding = response.data[0].embedding # embeddings_list = list(map(lambda embedding: embedding.tolist(), embedding_model.embed(text))) + print("response", type(response.data[0]['embedding'])) return response.data[0]['embedding'] def get_vector_size(self) -> int: - return config.openai_embedding_dimensions + return config.litellm_embedding_dimensions if __name__ == "__main__": async def gg(): - openai_embedding_engine = OpenAIEmbeddingEngine() + openai_embedding_engine = LiteLLMEmbeddingEngine() # print(openai_embedding_engine.embed_text(["Hello, how are you?"])) # print(openai_embedding_engine.get_vector_size()) # default_embedding_engine = DefaultEmbeddingEngine() diff --git a/cognee/modules/cognify/graph/add_data_chunks.py b/cognee/modules/cognify/graph/add_data_chunks.py index a40f6dd52..1be631815 100644 --- a/cognee/modules/cognify/graph/add_data_chunks.py +++ b/cognee/modules/cognify/graph/add_data_chunks.py @@ -1,3 +1,4 @@ +import json import logging from typing import TypedDict from cognee.infrastructure import infrastructure_config @@ -14,12 +15,12 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): identified_chunks = [] for (dataset_name, chunks) in dataset_data_chunks.items(): - try: - # if not await vector_client.collection_exists(dataset_name): - # logging.error(f"Creating collection {str(dataset_name)}") - await vector_client.create_collection(dataset_name) - except Exception: - pass + # try: + # # if not await vector_client.collection_exists(dataset_name): + # # logging.error(f"Creating collection {str(dataset_name)}") + # await vector_client.create_collection(dataset_name) + # except Exception: + # pass dataset_chunks = [ dict( @@ -32,29 +33,29 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): identified_chunks.extend(dataset_chunks) - # if not await vector_client.collection_exists(dataset_name): - try: - logging.error("Collection still not found. Creating collection again.") - await vector_client.create_collection(dataset_name) - except: - pass - - async def create_collection_retry(dataset_name, dataset_chunks): - await vector_client.create_data_points( - dataset_name, - [ - DataPoint( - id = chunk["chunk_id"], - payload = dict(text = chunk["text"]), - embed_field = "text" - ) for chunk in dataset_chunks - ], - ) - - try: - await create_collection_retry(dataset_name, dataset_chunks) - except Exception: - logging.error("Collection not found in create data points.") - await create_collection_retry(dataset_name, dataset_chunks) + # # if not await vector_client.collection_exists(dataset_name): + # try: + # logging.error("Collection still not found. Creating collection again.") + # await vector_client.create_collection(dataset_name) + # except: + # pass + # + # async def create_collection_retry(dataset_name, dataset_chunks): + # await vector_client.create_data_points( + # dataset_name, + # [ + # DataPoint( + # id = chunk["chunk_id"], + # payload = dict(text = chunk["text"]), + # embed_field = "text" + # ) for chunk in dataset_chunks + # ], + # ) + # + # try: + # await create_collection_retry(dataset_name, dataset_chunks) + # except Exception: + # logging.error("Collection not found in create data points.") + # await create_collection_retry(dataset_name, dataset_chunks) return identified_chunks diff --git a/cognee/shared/GithubClassification.py b/cognee/shared/GithubClassification.py new file mode 100644 index 000000000..66f14ec91 --- /dev/null +++ b/cognee/shared/GithubClassification.py @@ -0,0 +1,25 @@ +from enum import Enum +from typing import List + +from pydantic import BaseModel + + + +class TextSubclass(str, Enum): + SOURCE_CODE = "Source code in various programming languages" + SHELL_SCRIPTS = "Shell commands and scripts" + MARKUP_LANGUAGES = "Markup languages (HTML, XML)" + STYLESHEETS = "Stylesheets (CSS) and configuration files (YAML, JSON, INI)" + OTHER = "Other that does not fit into any of the above categories" + +class ContentType(BaseModel): + """Base class for content type, storing type of content as string.""" + type: str = "TEXT" + +class TextContent(ContentType): + """Textual content class for more specific text categories.""" + subclass: List[TextSubclass] + +class CodeContentPrediction(BaseModel): + """Model to predict the type of content.""" + label: TextContent \ No newline at end of file From d2e17dd4b7b0788d98ef92909d3e0ff02e84598a Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Fri, 17 May 2024 09:52:14 +0200 Subject: [PATCH 08/21] fix deployment --- cognee/api/v1/cognify/cognify.py | 98 +++++++++++++++---- cognee/config.py | 4 +- .../llm/generic_llm_api/adapter.py | 47 +++++---- .../modules/cognify/graph/add_data_chunks.py | 60 ++++++------ poetry.lock | 21 +++- pyproject.toml | 1 + 6 files changed, 160 insertions(+), 71 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 28203f7e2..88f09ec64 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -87,9 +87,8 @@ async def cognify(datasets: Union[str, List[str]] = None): chunk_engine = infrastructure_config.get_config()["chunk_engine"] chunk_strategy = infrastructure_config.get_config()["chunk_strategy"] - - for (dataset_name, files) in dataset_files: - for file_metadata in files: + async def process_batch(files_batch): + for dataset_name, file_metadata in files_batch: with open(file_metadata["file_path"], "rb") as file: try: file_type = guess_file_type(file) @@ -102,21 +101,68 @@ async def cognify(datasets: Union[str, List[str]] = None): data_chunks[dataset_name] = [] for subchunk in subchunks: - data_chunks[dataset_name].append(dict(text = subchunk, chunk_id = str(uuid4()), file_metadata = file_metadata)) + data_chunks[dataset_name].append( + dict(text=subchunk, chunk_id=str(uuid4()), file_metadata=file_metadata)) except FileTypeException: logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) + added_chunks = await add_data_chunks(data_chunks) + # await asyncio.gather( + # *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"]) for chunk in + # added_chunks] + # ) + batch_size = 20 + file_count = 0 + files_batch = [] - added_chunks: list[tuple[str, str, dict]] = await add_data_chunks(data_chunks) + for (dataset_name, files) in dataset_files: + for file_metadata in files: + files_batch.append((dataset_name, file_metadata)) + file_count += 1 - await asyncio.gather( - *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"]) for chunk in added_chunks] - ) + if file_count >= batch_size: + await process_batch(files_batch) + files_batch = [] + file_count = 0 + + # Process any remaining files in the last batch + if files_batch: + await process_batch(files_batch) return graph_client.graph + # + # for (dataset_name, files) in dataset_files: + # for file_metadata in files: + # with open(file_metadata["file_path"], "rb") as file: + # try: + # file_type = guess_file_type(file) + # text = extract_text_from_file(file, file_type) + # if text is None: + # text = "empty file" + # subchunks = chunk_engine.chunk_data(chunk_strategy, text, config.chunk_size, config.chunk_overlap) + # + # if dataset_name not in data_chunks: + # data_chunks[dataset_name] = [] + # + # for subchunk in subchunks: + # data_chunks[dataset_name].append(dict(text = subchunk, chunk_id = str(uuid4()), file_metadata = file_metadata)) + # except FileTypeException: + # logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) + # + # + # + # + # added_chunks: list[tuple[str, str, dict]] = await add_data_chunks(data_chunks) + # + # await asyncio.gather( + # *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"]) for chunk in added_chunks] + # ) + # + # return graph_client.graph + async def process_text(chunk_collection: str, chunk_id: str, input_text: str, file_metadata: dict): print(f"Processing chunk ({chunk_id}) from document ({file_metadata['id']}).") @@ -124,36 +170,46 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi graph_topology = infrastructure_config.get_config()["graph_topology"] + print("got here") + document_id = await add_document_node( graph_client, parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}", #make a param of defaultgraph model to make sure when user passes his stuff, it doesn't break pipeline document_metadata = file_metadata, ) + # print("got here2") + # await add_label_nodes(graph_client, document_id, chunk_id, file_metadata["keywords"].split("|")) + + # classified_categories = await get_content_categories(input_text) # - await add_label_nodes(graph_client, document_id, chunk_id, file_metadata["keywords"].split("|")) + # print("classified_categories", classified_categories) + # await add_classification_nodes( + # graph_client, + # parent_node_id = document_id, + # categories = classified_categories, + # ) - classified_categories = await get_content_categories(input_text) - await add_classification_nodes( - graph_client, - parent_node_id = document_id, - categories = classified_categories, - ) + classified_categories= [{'data_type': 'text', 'category_name': 'Source code in various programming languages'}] - # print(f"Chunk ({chunk_id}) classified.") - print("document_id", document_id) - content_summary = await get_content_summary(input_text) - await add_summary_nodes(graph_client, document_id, content_summary) + print(f"Chunk ({chunk_id}) classified.") + + # print("document_id", document_id) + # + # content_summary = await get_content_summary(input_text) + # await add_summary_nodes(graph_client, document_id, content_summary) print(f"Chunk ({chunk_id}) summarized.") - + # cognitive_layers = await get_cognitive_layers(input_text, classified_categories) cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] # layer_graphs = await get_layer_graphs(input_text, cognitive_layers) await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) + + print("got here 4444") # # if infrastructure_config.get_config()["connect_documents"] is True: # db_engine = infrastructure_config.get_config()["database_engine"] @@ -200,7 +256,7 @@ if __name__ == "__main__": # # await add("data://" +data_directory_path, "example") - infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': LiteLLMEmbeddingEngine()}) + infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': LiteLLMEmbeddingEngine() }) from cognee.shared.SourceCodeGraph import SourceCodeGraph from cognee.api.v1.config import config diff --git a/cognee/config.py b/cognee/config.py index 639a6b41e..149a72eab 100644 --- a/cognee/config.py +++ b/cognee/config.py @@ -51,13 +51,13 @@ class Config: # Model parameters llm_provider: str = os.getenv("LLM_PROVIDER","openai") #openai, or custom or ollama - custom_model: str = os.getenv("CUSTOM_LLM_MODEL", "mistralai/Mixtral-8x7B-Instruct-v0.1") #"mistralai/Mixtral-8x7B-Instruct-v0.1" + custom_model: str = os.getenv("CUSTOM_LLM_MODEL", "llama3-70b-8192") #"mistralai/Mixtral-8x7B-Instruct-v0.1" custom_endpoint: str = os.getenv("CUSTOM_ENDPOINT", "https://api.endpoints.anyscale.com/v1") #"https://api.endpoints.anyscale.com/v1" # pass claude endpoint custom_key: Optional[str] = os.getenv("CUSTOM_LLM_API_KEY") ollama_endpoint: str = os.getenv("CUSTOM_OLLAMA_ENDPOINT", "http://localhost:11434/v1") #"http://localhost:11434/v1" ollama_key: Optional[str] = "ollama" ollama_model: str = os.getenv("CUSTOM_OLLAMA_MODEL", "mistral:instruct") #"mistral:instruct" - openai_model: str = os.getenv("OPENAI_MODEL", "gpt-4-1106-preview" ) #"gpt-4-1106-preview" + openai_model: str = os.getenv("OPENAI_MODEL", "gpt-4o" ) #"gpt-4o" model_endpoint: str = "openai" openai_key: Optional[str] = os.getenv("OPENAI_API_KEY") openai_temperature: float = float(os.getenv("OPENAI_TEMPERATURE", 0.0)) diff --git a/cognee/infrastructure/llm/generic_llm_api/adapter.py b/cognee/infrastructure/llm/generic_llm_api/adapter.py index 1741b6f3c..2ee65178c 100644 --- a/cognee/infrastructure/llm/generic_llm_api/adapter.py +++ b/cognee/infrastructure/llm/generic_llm_api/adapter.py @@ -1,25 +1,37 @@ import asyncio +import os from typing import List, Type from pydantic import BaseModel import instructor from tenacity import retry, stop_after_attempt from openai import AsyncOpenAI import openai + +from cognee.infrastructure import infrastructure_config from cognee.infrastructure.llm.llm_interface import LLMInterface from cognee.infrastructure.llm.prompts import read_query_prompt - class GenericAPIAdapter(LLMInterface): - """Adapter for Ollama's API""" + """Adapter for Generic API LLM provider API """ def __init__(self, api_endpoint, api_key: str, model: str): - self.aclient = instructor.patch( - AsyncOpenAI( - base_url = api_endpoint, - api_key = api_key, # required, but unused - ), - mode = instructor.Mode.JSON, - ) + + + if infrastructure_config.get_config()["llm_provider"] == 'groq': + from groq import groq + self.aclient = instructor.from_openai(client = groq.Groq( + api_key=api_key, + ), mode=instructor.Mode.MD_JSON) + else: + self.aclient = instructor.patch( + AsyncOpenAI( + base_url = api_endpoint, + api_key = api_key, # required, but unused + ), + mode = instructor.Mode.JSON, + ) + + self.model = model @retry(stop = stop_after_attempt(5)) @@ -75,20 +87,21 @@ class GenericAPIAdapter(LLMInterface): return embeddings - @retry(stop=stop_after_attempt(5)) - async def acreate_structured_output(self, text_input: str, system_prompt: str, - response_model: Type[BaseModel]) -> BaseModel: + @retry(stop = stop_after_attempt(5)) + async def acreate_structured_output(self, text_input: str, system_prompt: str, response_model: Type[BaseModel]) -> BaseModel: """Generate a response from a user query.""" + return await self.aclient.chat.completions.create( - model=self.model, - messages=[ + model = self.model, + messages = [ { "role": "user", "content": f"""Use the given format to - extract information from the following input: {text_input}. {system_prompt} """, - } + extract information from the following input: {text_input}. """, + }, + {"role": "system", "content": system_prompt}, ], - response_model=response_model, + response_model = response_model, ) def show_prompt(self, text_input: str, system_prompt: str) -> str: diff --git a/cognee/modules/cognify/graph/add_data_chunks.py b/cognee/modules/cognify/graph/add_data_chunks.py index 1be631815..42b51170b 100644 --- a/cognee/modules/cognify/graph/add_data_chunks.py +++ b/cognee/modules/cognify/graph/add_data_chunks.py @@ -15,12 +15,12 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): identified_chunks = [] for (dataset_name, chunks) in dataset_data_chunks.items(): - # try: - # # if not await vector_client.collection_exists(dataset_name): - # # logging.error(f"Creating collection {str(dataset_name)}") - # await vector_client.create_collection(dataset_name) - # except Exception: - # pass + try: + # if not await vector_client.collection_exists(dataset_name): + # logging.error(f"Creating collection {str(dataset_name)}") + await vector_client.create_collection(dataset_name) + except Exception: + pass dataset_chunks = [ dict( @@ -33,29 +33,29 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): identified_chunks.extend(dataset_chunks) - # # if not await vector_client.collection_exists(dataset_name): - # try: - # logging.error("Collection still not found. Creating collection again.") - # await vector_client.create_collection(dataset_name) - # except: - # pass - # - # async def create_collection_retry(dataset_name, dataset_chunks): - # await vector_client.create_data_points( - # dataset_name, - # [ - # DataPoint( - # id = chunk["chunk_id"], - # payload = dict(text = chunk["text"]), - # embed_field = "text" - # ) for chunk in dataset_chunks - # ], - # ) - # - # try: - # await create_collection_retry(dataset_name, dataset_chunks) - # except Exception: - # logging.error("Collection not found in create data points.") - # await create_collection_retry(dataset_name, dataset_chunks) + # if not await vector_client.collection_exists(dataset_name): + try: + logging.error("Collection still not found. Creating collection again.") + await vector_client.create_collection(dataset_name) + except: + pass + + async def create_collection_retry(dataset_name, dataset_chunks): + await vector_client.create_data_points( + dataset_name, + [ + DataPoint( + id = chunk["chunk_id"], + payload = dict(text = chunk["text"]), + embed_field = "text" + ) for chunk in dataset_chunks + ], + ) + + try: + await create_collection_retry(dataset_name, dataset_chunks) + except Exception: + logging.error("Collection not found in create data points.") + await create_collection_retry(dataset_name, dataset_chunks) return identified_chunks diff --git a/poetry.lock b/poetry.lock index 46a96ece4..5536f45da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2107,6 +2107,25 @@ files = [ [package.dependencies] colorama = ">=0.4" +[[package]] +name = "groq" +version = "0.5.0" +description = "The official Python library for the groq API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "groq-0.5.0-py3-none-any.whl", hash = "sha256:a7e6be1118bcdfea3ed071ec00f505a34d4e6ec28c435adb5a5afd33545683a1"}, + {file = "groq-0.5.0.tar.gz", hash = "sha256:d476cdc3383b45d2a4dc1876142a9542e663ea1029f9e07a05de24f895cae48c"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +typing-extensions = ">=4.7,<5" + [[package]] name = "grpcio" version = "1.63.0" @@ -7837,4 +7856,4 @@ weaviate = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.12" -content-hash = "459e5945fb184ecdc2c9a817e89b2a83b9e0c97273d1a7df8f75c9c0b355ba47" +content-hash = "4c2e75aba3260da9e4023e5fa1c4d117b06e4f042bda9441664a0e91af4069a1" diff --git a/pyproject.toml b/pyproject.toml index c36abd566..4905a8bf4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,7 @@ lancedb = "^0.6.10" importlib-metadata = "6.8.0" deepeval = "^0.21.36" litellm = "^1.37.3" +groq = "^0.5.0" From db0b19bb30ab8c7ae537bdff2e06dd0b14e284b9 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Fri, 17 May 2024 11:13:39 +0200 Subject: [PATCH 09/21] async embeddings fix + processing fix + decouple issues with the lancedb --- cognee/api/v1/cognify/cognify.py | 25 +++++++-------- .../embeddings/DefaultEmbeddingEngine.py | 28 ++++++++-------- .../vector/lancedb/LanceDBAdapter.py | 6 ++-- .../modules/cognify/graph/add_data_chunks.py | 1 + .../cognify/graph/add_document_node.py | 3 +- .../modules/cognify/graph/add_label_nodes.py | 32 +++---------------- 6 files changed, 35 insertions(+), 60 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 38a3d6c71..ed456f5a7 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -87,26 +87,22 @@ async def cognify(datasets: Union[str, List[str]] = None): chunk_engine = infrastructure_config.get_config()["chunk_engine"] chunk_strategy = infrastructure_config.get_config()["chunk_strategy"] async def process_batch(files_batch): - for dataset_name, file_metadata in files_batch: + for dataset_name, file_metadata, document_id in files_batch: with open(file_metadata["file_path"], "rb") as file: try: - document_id = await add_document_node( - graph_client, - parent_node_id = f"DefaultGraphModel__{USER_ID}", - document_metadata = file_metadata, - ) - file_type = guess_file_type(file) text = extract_text_from_file(file, file_type) if text is None: text = "empty file" + if text == "": + text = "empty file" subchunks = chunk_engine.chunk_data(chunk_strategy, text, config.chunk_size, config.chunk_overlap) if dataset_name not in data_chunks: data_chunks[dataset_name] = [] for subchunk in subchunks: - data_chunks[dataset_name].append(dict(document_id = document_id, chunk_id = str(uuid4()), text = subchunk)) + data_chunks[dataset_name].append(dict(document_id = document_id, chunk_id = str(uuid4()), text = subchunk, file_metadata = file_metadata)) except FileTypeException: logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) @@ -124,8 +120,14 @@ async def cognify(datasets: Union[str, List[str]] = None): files_batch = [] for (dataset_name, files) in dataset_files: + for file_metadata in files: - files_batch.append((dataset_name, file_metadata)) + document_id = await add_document_node( + graph_client, + parent_node_id=f"DefaultGraphModel__{USER_ID}", + document_metadata=file_metadata, + ) + files_batch.append((dataset_name, file_metadata, document_id)) file_count += 1 if file_count >= batch_size: @@ -199,11 +201,6 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi classified_categories= [{'data_type': 'text', 'category_name': 'Source code in various programming languages'}] - await asyncio.gather( - *[process_text(chunk["document_id"], chunk["chunk_id"], chunk["collection"], chunk["text"]) for chunk in added_chunks] - ) - - return graph_client.graph # # async def process_text(document_id: str, chunk_id: str, chunk_collection: str, input_text: str): # raw_document_id = document_id.split("__")[-1] diff --git a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py index 32f6f25ce..f67d5f541 100644 --- a/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/DefaultEmbeddingEngine.py @@ -27,25 +27,23 @@ class DefaultEmbeddingEngine(EmbeddingEngine): class LiteLLMEmbeddingEngine(EmbeddingEngine): + import asyncio + from typing import List - async def embed_text(self, text: List[str]) -> List[float]: - - - - print("text", text) - try: - text = str(text[0]) - except: - text = str(text) - - - response = await aembedding(config.litellm_embedding_model, input=text) + async def embed_text(self, text: List[str]) -> List[List[float]]: + async def get_embedding(text_): + response = await aembedding(config.litellm_embedding_model, input=text_) + return response.data[0]['embedding'] + tasks = [get_embedding(text_) for text_ in text] + result = await asyncio.gather(*tasks) + return result # embedding = response.data[0].embedding - # embeddings_list = list(map(lambda embedding: embedding.tolist(), embedding_model.embed(text))) - print("response", type(response.data[0]['embedding'])) - return response.data[0]['embedding'] + # # embeddings_list = list(map(lambda embedding: embedding.tolist(), embedding_model.embed(text))) + # print("response", type(response.data[0]['embedding'])) + # print("response", response.data[0]) + # return [response.data[0]['embedding']] def get_vector_size(self) -> int: diff --git a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py index 9ffe3d8de..adb1c161d 100644 --- a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +++ b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py @@ -37,10 +37,11 @@ class LanceDBAdapter(VectorDBInterface): async def create_collection(self, collection_name: str, payload_schema: BaseModel): data_point_types = get_type_hints(DataPoint) + vector_size = self.embedding_engine.get_vector_size() class LanceDataPoint(LanceModel): id: data_point_types["id"] = Field(...) - vector: Vector(self.embedding_engine.get_vector_size()) + vector: Vector(vector_size) payload: payload_schema if not await self.collection_exists(collection_name): @@ -68,10 +69,11 @@ class LanceDBAdapter(VectorDBInterface): IdType = TypeVar("IdType") PayloadSchema = TypeVar("PayloadSchema") + vector_size = self.embedding_engine.get_vector_size() class LanceDataPoint(LanceModel, Generic[IdType, PayloadSchema]): id: IdType - vector: Vector(self.embedding_engine.get_vector_size()) + vector: Vector(vector_size) payload: PayloadSchema lance_data_points = [ diff --git a/cognee/modules/cognify/graph/add_data_chunks.py b/cognee/modules/cognify/graph/add_data_chunks.py index e283f01e5..291c15716 100644 --- a/cognee/modules/cognify/graph/add_data_chunks.py +++ b/cognee/modules/cognify/graph/add_data_chunks.py @@ -34,6 +34,7 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): collection = dataset_name, text = chunk["text"], document_id = chunk["document_id"], + file_metadata = chunk["file_metadata"], ) for chunk in chunks ] diff --git a/cognee/modules/cognify/graph/add_document_node.py b/cognee/modules/cognify/graph/add_document_node.py index 3e878dcf1..b70f700e5 100644 --- a/cognee/modules/cognify/graph/add_document_node.py +++ b/cognee/modules/cognify/graph/add_document_node.py @@ -25,6 +25,7 @@ async def add_document_node(graph_client: GraphDBInterface, parent_node_id, docu dict(relationship_name = "has_document"), ) - await add_label_nodes(graph_client, document_id, document_metadata["keywords"].split("|")) + # + # await add_label_nodes(graph_client, document_id, document_metadata["keywords"].split("|")) return document_id diff --git a/cognee/modules/cognify/graph/add_label_nodes.py b/cognee/modules/cognify/graph/add_label_nodes.py index 8d991c9d9..574b19f6c 100644 --- a/cognee/modules/cognify/graph/add_label_nodes.py +++ b/cognee/modules/cognify/graph/add_label_nodes.py @@ -19,7 +19,7 @@ async def add_label_nodes(graph_client, parent_node_id: str, keywords: List[str] id = keyword_id, name = keyword.lower().capitalize(), keyword = keyword.lower(), - type = "Keyword", + entity_type = "Keyword", created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), updated_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ), @@ -45,29 +45,6 @@ async def add_label_nodes(graph_client, parent_node_id: str, keywords: List[str] references: References # Add data to vector - - keyword_data_points = [ - DataPoint( - id = str(uuid4()), - payload = dict( - value = keyword_data["keyword"], - references = dict( - node_id = keyword_node_id, - cognitive_layer = parent_node_id, - ), - ), - embed_field = "value" - ) for (keyword_node_id, keyword_data) in keyword_nodes - ] - - try: - await vector_client.create_collection(parent_node_id) - except Exception: - # It's ok if the collection already exists. - pass - - await vector_client.create_data_points(parent_node_id, keyword_data_points) - keyword_data_points = [ DataPoint[PayloadSchema]( id = str(uuid4()), @@ -84,9 +61,8 @@ async def add_label_nodes(graph_client, parent_node_id: str, keywords: List[str] try: await vector_client.create_collection(parent_node_id, payload_schema = PayloadSchema) - except Exception: + except Exception as e: # It's ok if the collection already exists. - pass - - await vector_client.create_data_points(parent_node_id, keyword_data_points) + print(e) + await vector_client.create_data_points(parent_node_id, keyword_data_points) \ No newline at end of file From 4e6fcdec25fc134c0b9a159420de016ab754ec01 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Fri, 17 May 2024 14:21:16 +0200 Subject: [PATCH 10/21] fixes to cognee --- cognee/api/v1/cognify/cognify.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index ed456f5a7..3cf5804ce 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -32,7 +32,7 @@ from cognee.modules.data.get_cognitive_layers import get_cognitive_layers from cognee.modules.data.get_layer_graphs import get_layer_graphs from cognee.modules.topology.topology import TopologyEngine from cognee.shared.GithubClassification import CodeContentPrediction -from cognee.shared.data_models import ChunkStrategy +from cognee.shared.data_models import ChunkStrategy, DefaultGraphModel from cognee.utils import send_telemetry @@ -178,8 +178,10 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi graph_topology = infrastructure_config.get_config()["graph_topology"] - print("got here") - + if graph_topology == "default": + parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}" + elif graph_topology == DefaultGraphModel: + parent_node_id = f"DefaultGraphModel__{USER_ID}" document_id = await add_document_node( graph_client, From 57e3e2ef9029398d243cc8f706d8b36df101f191 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 18 May 2024 11:51:10 +0200 Subject: [PATCH 11/21] fix graph logic --- cognee/api/v1/cognify/cognify.py | 165 +++++------------- cognee/config.py | 1 + .../cognify/graph/add_document_node.py | 1 + 3 files changed, 48 insertions(+), 119 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 3cf5804ce..d6ae1f0b0 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -16,6 +16,7 @@ from cognee.modules.cognify.graph.add_data_chunks import add_data_chunks from cognee.modules.cognify.graph.add_document_node import add_document_node from cognee.modules.cognify.graph.add_classification_nodes import add_classification_nodes from cognee.modules.cognify.graph.add_cognitive_layer_graphs import add_cognitive_layer_graphs +from cognee.modules.cognify.graph.add_label_nodes import add_label_nodes from cognee.modules.cognify.graph.add_summary_nodes import add_summary_nodes from cognee.modules.cognify.graph.add_node_connections import group_nodes_by_layer, \ graph_ready_output, connect_nodes_in_graph @@ -32,9 +33,9 @@ from cognee.modules.data.get_cognitive_layers import get_cognitive_layers from cognee.modules.data.get_layer_graphs import get_layer_graphs from cognee.modules.topology.topology import TopologyEngine from cognee.shared.GithubClassification import CodeContentPrediction -from cognee.shared.data_models import ChunkStrategy, DefaultGraphModel +from cognee.shared.data_models import ChunkStrategy, DefaultGraphModel, KnowledgeGraph from cognee.utils import send_telemetry - +from cognee.shared.SourceCodeGraph import SourceCodeGraph config = Config() config.load() @@ -111,7 +112,7 @@ async def cognify(datasets: Union[str, List[str]] = None): await asyncio.gather( - *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"]) for chunk in + *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"],chunk['document_id']) for chunk in added_chunks] ) @@ -122,9 +123,17 @@ async def cognify(datasets: Union[str, List[str]] = None): for (dataset_name, files) in dataset_files: for file_metadata in files: + graph_topology = infrastructure_config.get_config()["graph_model"] + if graph_topology == SourceCodeGraph: + parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}" + + elif graph_topology == KnowledgeGraph: + parent_node_id = f"DefaultGraphModel__{USER_ID}" + else: + parent_node_id = f"DefaultGraphModel__{USER_ID}" document_id = await add_document_node( graph_client, - parent_node_id=f"DefaultGraphModel__{USER_ID}", + parent_node_id=parent_node_id, document_metadata=file_metadata, ) files_batch.append((dataset_name, file_metadata, document_id)) @@ -141,132 +150,48 @@ async def cognify(datasets: Union[str, List[str]] = None): return graph_client.graph - # - # for (dataset_name, files) in dataset_files: - # for file_metadata in files: - # with open(file_metadata["file_path"], "rb") as file: - # try: - # file_type = guess_file_type(file) - # text = extract_text_from_file(file, file_type) - # if text is None: - # text = "empty file" - # subchunks = chunk_engine.chunk_data(chunk_strategy, text, config.chunk_size, config.chunk_overlap) - # - # if dataset_name not in data_chunks: - # data_chunks[dataset_name] = [] - # - # for subchunk in subchunks: - # data_chunks[dataset_name].append(dict(text = subchunk, chunk_id = str(uuid4()), file_metadata = file_metadata)) - # except FileTypeException: - # logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) - # - # - # - # - # added_chunks: list[tuple[str, str, dict]] = await add_data_chunks(data_chunks) - # - # await asyncio.gather( - # *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"]) for chunk in added_chunks] - # ) - # - # return graph_client.graph -async def process_text(chunk_collection: str, chunk_id: str, input_text: str, file_metadata: dict): +async def process_text(chunk_collection: str, chunk_id: str, input_text: str, file_metadata: dict, document_id: str): print(f"Processing chunk ({chunk_id}) from document ({file_metadata['id']}).") graph_client = await get_graph_client(infrastructure_config.get_config()["graph_engine"]) - graph_topology = infrastructure_config.get_config()["graph_topology"] - if graph_topology == "default": - parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}" - elif graph_topology == DefaultGraphModel: - parent_node_id = f"DefaultGraphModel__{USER_ID}" + graph_topology = infrastructure_config.get_config()["graph_model"] + if graph_topology == SourceCodeGraph: + classified_categories = [{'data_type': 'text', 'category_name': 'Code and functions'}] + elif graph_topology == KnowledgeGraph: + classified_categories = await get_content_categories(input_text) + else: + classified_categories = [{'data_type': 'text', 'category_name': 'Unclassified text'}] - document_id = await add_document_node( - graph_client, - parent_node_id = f"{file_metadata['name']}.{file_metadata['extension']}", #make a param of defaultgraph model to make sure when user passes his stuff, it doesn't break pipeline - document_metadata = file_metadata, - ) - # print("got here2") # await add_label_nodes(graph_client, document_id, chunk_id, file_metadata["keywords"].split("|")) - # classified_categories = await get_content_categories(input_text) - # - # print("classified_categories", classified_categories) - # await add_classification_nodes( - # graph_client, - # parent_node_id = document_id, - # categories = classified_categories, - # ) + await add_classification_nodes( + graph_client, + parent_node_id = document_id, + categories = classified_categories, + ) + + print(f"Chunk ({chunk_id}) classified.") + content_summary = await get_content_summary(input_text) + await add_summary_nodes(graph_client, document_id, content_summary) + print(f"Chunk ({chunk_id}) summarized.") + cognitive_layers = await get_cognitive_layers(input_text, classified_categories) + cognitive_layers = cognitive_layers[:config.cognitive_layers_limit] + + try: + cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] + print("cognitive_layers", cognitive_layers) + layer_graphs = await get_layer_graphs(input_text, cognitive_layers) + await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) + except: + pass + + - classified_categories= [{'data_type': 'text', 'category_name': 'Source code in various programming languages'}] -# -# async def process_text(document_id: str, chunk_id: str, chunk_collection: str, input_text: str): -# raw_document_id = document_id.split("__")[-1] -# -# print(f"Processing chunk ({chunk_id}) from document ({raw_document_id}).") -# -# graph_client = await get_graph_client(infrastructure_config.get_config()["graph_engine"]) -# -# classified_categories = await get_content_categories(input_text) -# await add_classification_nodes( -# graph_client, -# parent_node_id = document_id, -# categories = classified_categories, -# ) -# >>>>>>> origin/main -# -# print(f"Chunk ({chunk_id}) classified.") -# -# # print("document_id", document_id) -# # -# # content_summary = await get_content_summary(input_text) -# # await add_summary_nodes(graph_client, document_id, content_summary) -# -# print(f"Chunk ({chunk_id}) summarized.") -# # -# cognitive_layers = await get_cognitive_layers(input_text, classified_categories) -# cognitive_layers = (await add_cognitive_layers(graph_client, document_id, cognitive_layers))[:2] -# # -# layer_graphs = await get_layer_graphs(input_text, cognitive_layers) -# await add_cognitive_layer_graphs(graph_client, chunk_collection, chunk_id, layer_graphs) -# -# <<<<<<< HEAD -# print("got here 4444") - # - # if infrastructure_config.get_config()["connect_documents"] is True: - # db_engine = infrastructure_config.get_config()["database_engine"] - # relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = file_metadata["id"]) - # - # list_of_nodes = [] - # - # relevant_documents_to_connect.append({ - # "layer_id": document_id, - # }) - # - # for document in relevant_documents_to_connect: - # node_descriptions_to_match = await graph_client.extract_node_description(document["layer_id"]) - # list_of_nodes.extend(node_descriptions_to_match) - # - # nodes_by_layer = await group_nodes_by_layer(list_of_nodes) - # - # results = await resolve_cross_graph_references(nodes_by_layer) - # - # relationships = graph_ready_output(results) - # - # await connect_nodes_in_graph( - # graph_client, - # relationships, - # score_threshold = infrastructure_config.get_config()["intra_layer_score_treshold"] - # ) - # - # send_telemetry("cognee.cognify") - # - # print(f"Chunk ({chunk_id}) cognified.") -# ======= # if infrastructure_config.get_config()["connect_documents"] is True: # db_engine = infrastructure_config.get_config()["database_engine"] # relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = raw_document_id) @@ -296,7 +221,7 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi # send_telemetry("cognee.cognify") # # print(f"Chunk ({chunk_id}) cognified.") -# >>>>>>> origin/main + if __name__ == "__main__": @@ -319,6 +244,8 @@ if __name__ == "__main__": config.set_graph_model(SourceCodeGraph) + + config.set_classification_model(CodeContentPrediction) graph = await cognify() diff --git a/cognee/config.py b/cognee/config.py index 149a72eab..c9548198b 100644 --- a/cognee/config.py +++ b/cognee/config.py @@ -77,6 +77,7 @@ class Config: # Database parameters graph_database_provider: str = os.getenv("GRAPH_DB_PROVIDER", "NETWORKX") graph_topology:str = DefaultGraphModel + cognitive_layers_limit: int = 2 if ( os.getenv("ENV") == "prod" diff --git a/cognee/modules/cognify/graph/add_document_node.py b/cognee/modules/cognify/graph/add_document_node.py index b70f700e5..af4477f8a 100644 --- a/cognee/modules/cognify/graph/add_document_node.py +++ b/cognee/modules/cognify/graph/add_document_node.py @@ -17,6 +17,7 @@ async def add_document_node(graph_client: GraphDBInterface, parent_node_id, docu document["type"] = "Document" await graph_client.add_node(document_id, document) + print(f"Added document node: {document_id}") await graph_client.add_edge( parent_node_id, From 48d21c409ad38dfb35c7c72471e0ec785e7c6c65 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 18 May 2024 16:46:15 +0200 Subject: [PATCH 12/21] test with a simple file --- cognee/api/v1/cognify/cognify.py | 77 +++++++++++++++----------- cognee/api/v1/topology/add_topology.py | 2 +- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index d6ae1f0b0..4ccfccdbd 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -192,35 +192,35 @@ async def process_text(chunk_collection: str, chunk_id: str, input_text: str, fi -# if infrastructure_config.get_config()["connect_documents"] is True: -# db_engine = infrastructure_config.get_config()["database_engine"] -# relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = raw_document_id) -# -# list_of_nodes = [] -# -# relevant_documents_to_connect.append({ -# "layer_id": document_id, -# }) -# -# for document in relevant_documents_to_connect: -# node_descriptions_to_match = await graph_client.extract_node_description(document["layer_id"]) -# list_of_nodes.extend(node_descriptions_to_match) -# -# nodes_by_layer = await group_nodes_by_layer(list_of_nodes) -# -# results = await resolve_cross_graph_references(nodes_by_layer) -# -# relationships = graph_ready_output(results) -# -# await connect_nodes_in_graph( -# graph_client, -# relationships, -# score_threshold = infrastructure_config.get_config()["intra_layer_score_treshold"] -# ) -# -# send_telemetry("cognee.cognify") -# -# print(f"Chunk ({chunk_id}) cognified.") + # if infrastructure_config.get_config()["connect_documents"] is True: + # db_engine = infrastructure_config.get_config()["database_engine"] + # relevant_documents_to_connect = db_engine.fetch_cognify_data(excluded_document_id = raw_document_id) + # + # list_of_nodes = [] + # + # relevant_documents_to_connect.append({ + # "layer_id": document_id, + # }) + # + # for document in relevant_documents_to_connect: + # node_descriptions_to_match = await graph_client.extract_node_description(document["layer_id"]) + # list_of_nodes.extend(node_descriptions_to_match) + # + # nodes_by_layer = await group_nodes_by_layer(list_of_nodes) + # + # results = await resolve_cross_graph_references(nodes_by_layer) + # + # relationships = graph_ready_output(results) + # + # await connect_nodes_in_graph( + # graph_client, + # relationships, + # score_threshold = infrastructure_config.get_config()["intra_layer_score_treshold"] + # ) + # + # send_telemetry("cognee.cognify") + # + # print(f"Chunk ({chunk_id}) cognified.") @@ -238,14 +238,27 @@ if __name__ == "__main__": # # await add("data://" +data_directory_path, "example") + text = """import subprocess + def show_all_processes(): + process = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE) + output, error = process.communicate() + + if error: + print(f"Error: {error}") + else: + print(output.decode()) + + show_all_processes()""" + + from cognee.api.v1.add import add + + await add([text], "example_dataset") + infrastructure_config.set_config( {"chunk_engine": LangchainChunkEngine() , "chunk_strategy": ChunkStrategy.CODE,'embedding_engine': LiteLLMEmbeddingEngine() }) from cognee.shared.SourceCodeGraph import SourceCodeGraph from cognee.api.v1.config import config config.set_graph_model(SourceCodeGraph) - - - config.set_classification_model(CodeContentPrediction) graph = await cognify() diff --git a/cognee/api/v1/topology/add_topology.py b/cognee/api/v1/topology/add_topology.py index 3f5ad8c12..5ba588b6a 100644 --- a/cognee/api/v1/topology/add_topology.py +++ b/cognee/api/v1/topology/add_topology.py @@ -77,7 +77,7 @@ if __name__ == "__main__": # # await add("data://" +data_directory_path, "example") - graph = await add_topology() + # graph = await add_topology() graph_db_type = infrastructure_config.get_config()["graph_engine"] From 4488339fdc35c32096c4c108fdefc10e6d4f57a7 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 18 May 2024 17:01:23 +0200 Subject: [PATCH 13/21] test with a simple file --- .github/workflows/test_common.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test_common.yml b/.github/workflows/test_common.yml index 0c9b5a653..ea6117d79 100644 --- a/.github/workflows/test_common.yml +++ b/.github/workflows/test_common.yml @@ -92,6 +92,7 @@ jobs: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} QDRANT_API_KEY: ${{ secrets.QDRANT_API_KEY }} QDRANT_URL: ${{ secrets.QDRANT_API_URL }} + ENV: 'dev' run: poetry run python ./cognee/tests/test_library.py # - run: | From d1fa826aeb41f4f08d33a4ecaa7bfb2b3e71c53e Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 18 May 2024 18:44:18 +0200 Subject: [PATCH 14/21] test with a simple file --- cognee/config.py | 5 +++++ cognee/infrastructure/InfrastructureConfig.py | 1 + cognee/infrastructure/llm/openai/adapter.py | 12 +++++++++++- cognee/shared/data_models.py | 6 ++++++ docker-compose.yml | 12 ++++++++++++ pyproject.toml | 1 + 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cognee/config.py b/cognee/config.py index c9548198b..08014e803 100644 --- a/cognee/config.py +++ b/cognee/config.py @@ -79,6 +79,11 @@ class Config: graph_topology:str = DefaultGraphModel cognitive_layers_limit: int = 2 + from cognee.shared.data_models import MonitoringTool + + # Monitoring tool + monitoring_tool: str = os.getenv("MONITORING_TOOL", MonitoringTool.LANGFUSE) + if ( os.getenv("ENV") == "prod" or os.getenv("ENV") == "dev" diff --git a/cognee/infrastructure/InfrastructureConfig.py b/cognee/infrastructure/InfrastructureConfig.py index 3ab42625c..21e6aacc6 100644 --- a/cognee/infrastructure/InfrastructureConfig.py +++ b/cognee/infrastructure/InfrastructureConfig.py @@ -33,6 +33,7 @@ class InfrastructureConfig(): chunk_strategy = config.chunk_strategy chunk_engine = None graph_topology = config.graph_topology + monitoring_tool = config.monitoring_tool def get_config(self, config_entity: str = None) -> dict: if (config_entity is None or config_entity == "database_engine") and self.database_engine is None: diff --git a/cognee/infrastructure/llm/openai/adapter.py b/cognee/infrastructure/llm/openai/adapter.py index 50a6d1529..5c45b98bc 100644 --- a/cognee/infrastructure/llm/openai/adapter.py +++ b/cognee/infrastructure/llm/openai/adapter.py @@ -2,11 +2,21 @@ import asyncio from typing import List, Type import openai import instructor -from openai import AsyncOpenAI, OpenAI from pydantic import BaseModel from tenacity import retry, stop_after_attempt + +from cognee.config import Config from cognee.infrastructure.llm.llm_interface import LLMInterface from cognee.infrastructure.llm.prompts import read_query_prompt +from cognee.shared.data_models import MonitoringTool + +config = Config() +config.load() + +if config.monitoring_tool == MonitoringTool.LANGFUSE: + from langfuse.openai import AsyncOpenAI, OpenAI +else: + from openai import AsyncOpenAI, OpenAI class OpenAIAdapter(LLMInterface): """Adapter for OpenAI's GPT-3, GPT=4 API""" diff --git a/cognee/shared/data_models.py b/cognee/shared/data_models.py index cbaabfe44..28fe72040 100644 --- a/cognee/shared/data_models.py +++ b/cognee/shared/data_models.py @@ -252,3 +252,9 @@ class ResponseSummaryModel(BaseModel): document_id: str response_summary: str + +class MonitoringTool(str, Enum): + """ Monitoring tools """ + LANGFUSE = "langfuse" + LLMLITE = "llmlite" + diff --git a/docker-compose.yml b/docker-compose.yml index 86a67b467..2ede528d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,6 +55,18 @@ services: - cognee_backend ports: - "5432:5432" + litellm: + build: + context: . + args: + target: runtime + image: ghcr.io/berriai/litellm:main-latest + ports: + - "4000:4000" # Map the container port to the host, change the host port if necessary + volumes: + - ./litellm-config.yaml:/app/config.yaml # Mount the local configuration file + # You can change the port or number of workers as per your requirements or pass any new supported CLI augument. Make sure the port passed here matches with the container port defined above in `ports` value + command: [ "--config", "/app/config.yaml", "--port", "4000", "--num_workers", "8" ] networks: cognee_backend: diff --git a/pyproject.toml b/pyproject.toml index 67cd40167..400ede490 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,7 @@ deepeval = "^0.21.36" litellm = "^1.37.3" groq = "^0.5.0" tantivy = "^0.21.0" +langfuse = "^2.32.0" [tool.poetry.extras] From 352ea257e8e2804e614c5343503183789291eb3b Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sat, 18 May 2024 19:11:05 +0200 Subject: [PATCH 15/21] test with a simple file --- .../infrastructure/llm/generic_llm_api/adapter.py | 14 ++++++++++++++ cognee/infrastructure/llm/openai/adapter.py | 4 ++++ cognee/shared/data_models.py | 1 + 3 files changed, 19 insertions(+) diff --git a/cognee/infrastructure/llm/generic_llm_api/adapter.py b/cognee/infrastructure/llm/generic_llm_api/adapter.py index 2ee65178c..03a61a742 100644 --- a/cognee/infrastructure/llm/generic_llm_api/adapter.py +++ b/cognee/infrastructure/llm/generic_llm_api/adapter.py @@ -7,9 +7,23 @@ from tenacity import retry, stop_after_attempt from openai import AsyncOpenAI import openai +from cognee.config import Config from cognee.infrastructure import infrastructure_config from cognee.infrastructure.llm.llm_interface import LLMInterface from cognee.infrastructure.llm.prompts import read_query_prompt +from cognee.shared.data_models import MonitoringTool + +config = Config() +config.load() + +if config.monitoring_tool == MonitoringTool.LANGFUSE: + from langfuse.openai import AsyncOpenAI, OpenAI +elif config.monitoring_tool == MonitoringTool.LANGSMITH: + from langsmith import wrap_openai + from openai import AsyncOpenAI + AsyncOpenAI = wrap_openai(AsyncOpenAI()) +else: + from openai import AsyncOpenAI, OpenAI class GenericAPIAdapter(LLMInterface): """Adapter for Generic API LLM provider API """ diff --git a/cognee/infrastructure/llm/openai/adapter.py b/cognee/infrastructure/llm/openai/adapter.py index 5c45b98bc..866f01357 100644 --- a/cognee/infrastructure/llm/openai/adapter.py +++ b/cognee/infrastructure/llm/openai/adapter.py @@ -15,6 +15,10 @@ config.load() if config.monitoring_tool == MonitoringTool.LANGFUSE: from langfuse.openai import AsyncOpenAI, OpenAI +elif config.monitoring_tool == MonitoringTool.LANGSMITH: + from langsmith import wrap_openai + from openai import AsyncOpenAI + AsyncOpenAI = wrap_openai(AsyncOpenAI()) else: from openai import AsyncOpenAI, OpenAI diff --git a/cognee/shared/data_models.py b/cognee/shared/data_models.py index 28fe72040..51b0124ba 100644 --- a/cognee/shared/data_models.py +++ b/cognee/shared/data_models.py @@ -257,4 +257,5 @@ class MonitoringTool(str, Enum): """ Monitoring tools """ LANGFUSE = "langfuse" LLMLITE = "llmlite" + LANGSMITH = "langsmith" From bd42cebd8b218904bffc506428f47a037501bf9a Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sun, 19 May 2024 15:48:03 +0200 Subject: [PATCH 16/21] fix qdrant poetry issue --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 400ede490..129a38798 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,11 +62,12 @@ posthog = "^3.5.0" lancedb = "^0.6.10" importlib-metadata = "6.8.0" -deepeval = "^0.21.36" litellm = "^1.37.3" groq = "^0.5.0" tantivy = "^0.21.0" langfuse = "^2.32.0" +spacy = "^3.7.4" +protobuf = "<5.0.0" [tool.poetry.extras] From 2657aa70963da78283ebb4fbbc01a4158db4f745 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sun, 19 May 2024 20:35:54 +0200 Subject: [PATCH 17/21] Add evals for cognee --- cognee/api/v1/cognify/cognify.py | 26 +++--- .../modules/cognify/graph/add_data_chunks.py | 42 ++++++++++ evals/generate_test_set.py | 46 +++++++++++ evals/natural_language_processing.txt | 2 + evals/simple_rag_vs_cognee_eval.py | 75 ++++++++++++++++++ evals/soldiers_home.pdf | Bin 0 -> 33733 bytes evals/trump.txt | 15 ++++ pyproject.toml | 5 +- 8 files changed, 199 insertions(+), 12 deletions(-) create mode 100644 evals/generate_test_set.py create mode 100644 evals/natural_language_processing.txt create mode 100644 evals/simple_rag_vs_cognee_eval.py create mode 100644 evals/soldiers_home.pdf create mode 100644 evals/trump.txt diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 4ccfccdbd..b18b88375 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -12,7 +12,7 @@ from cognee.api.v1.prune import prune from cognee.config import Config from cognee.infrastructure.data.chunking.LangchainChunkingEngine import LangchainChunkEngine from cognee.infrastructure.databases.vector.embeddings.DefaultEmbeddingEngine import LiteLLMEmbeddingEngine -from cognee.modules.cognify.graph.add_data_chunks import add_data_chunks +from cognee.modules.cognify.graph.add_data_chunks import add_data_chunks, add_data_chunks_basic_rag from cognee.modules.cognify.graph.add_document_node import add_document_node from cognee.modules.cognify.graph.add_classification_nodes import add_classification_nodes from cognee.modules.cognify.graph.add_cognitive_layer_graphs import add_cognitive_layer_graphs @@ -80,7 +80,6 @@ async def cognify(datasets: Union[str, List[str]] = None): if dataset_name in added_dataset: dataset_files.append((added_dataset, db_engine.get_files_metadata(added_dataset))) - # print("dataset_files", dataset_files) data_chunks = {} @@ -109,13 +108,14 @@ async def cognify(datasets: Union[str, List[str]] = None): logger.warning("File (%s) has an unknown file type. We are skipping it.", file_metadata["id"]) added_chunks = await add_data_chunks(data_chunks) + added__basic_rag_chunks = await add_data_chunks_basic_rag(data_chunks) - await asyncio.gather( - *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"],chunk['document_id']) for chunk in - added_chunks] - ) - + # await asyncio.gather( + # *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"],chunk['document_id']) for chunk in + # added_chunks] + # ) + # batch_size = 20 file_count = 0 files_batch = [] @@ -260,12 +260,16 @@ if __name__ == "__main__": config.set_graph_model(SourceCodeGraph) config.set_classification_model(CodeContentPrediction) - graph = await cognify() - # - from cognee.utils import render_graph + vector_client = infrastructure_config.get_config("vector_engine") - await render_graph(graph, include_color=True, include_nodes=False, include_size=False) + out = await vector_client.search(collection_name ="basic_rag", query_text="show_all_processes", limit=10) + + print("results", out) + # + # from cognee.utils import render_graph + # + # await render_graph(graph, include_color=True, include_nodes=False, include_size=False) import asyncio asyncio.run(test()) diff --git a/cognee/modules/cognify/graph/add_data_chunks.py b/cognee/modules/cognify/graph/add_data_chunks.py index 291c15716..b95db08e6 100644 --- a/cognee/modules/cognify/graph/add_data_chunks.py +++ b/cognee/modules/cognify/graph/add_data_chunks.py @@ -52,3 +52,45 @@ async def add_data_chunks(dataset_data_chunks: dict[str, list[TextChunk]]): ) return identified_chunks + + +async def add_data_chunks_basic_rag(dataset_data_chunks: dict[str, list[TextChunk]]): + vector_client = infrastructure_config.get_config("vector_engine") + + identified_chunks = [] + + class PayloadSchema(BaseModel): + text: str = Field(...) + + for (dataset_name, chunks) in dataset_data_chunks.items(): + try: + + await vector_client.create_collection("basic_rag", payload_schema = PayloadSchema) + except Exception as error: + print(error) + pass + + dataset_chunks = [ + dict( + chunk_id = chunk["chunk_id"], + collection = "basic_rag", + text = chunk["text"], + document_id = chunk["document_id"], + file_metadata = chunk["file_metadata"], + ) for chunk in chunks + ] + + identified_chunks.extend(dataset_chunks) + + await vector_client.create_data_points( + "basic_rag", + [ + DataPoint[PayloadSchema]( + id = chunk["chunk_id"], + payload = PayloadSchema.parse_obj(dict(text = chunk["text"])), + embed_field = "text", + ) for chunk in dataset_chunks + ], + ) + + return identified_chunks diff --git a/evals/generate_test_set.py b/evals/generate_test_set.py new file mode 100644 index 000000000..9099a81ed --- /dev/null +++ b/evals/generate_test_set.py @@ -0,0 +1,46 @@ +from deepeval.dataset import EvaluationDataset +from deepeval.synthesizer import Synthesizer +import dotenv +from deepeval.test_case import LLMTestCase + +dotenv.load_dotenv() + +# synthesizer = Synthesizer() +# synthesizer.generate_goldens_from_docs( +# document_paths=['natural_language_processing.txt', 'soldiers_home.pdf', 'trump.txt'], +# max_goldens_per_document=5, +# num_evolutions=5, +# include_expected_output=True, +# enable_breadth_evolve=True, +# ) +# +# synthesizer.save_as( +# file_type='json', # or 'csv' +# directory="./synthetic_data" +# ) + + +dataset = EvaluationDataset() +dataset.generate_goldens_from_docs( + document_paths=['soldiers_home.pdf'], + max_goldens_per_document=10 +) + + +print(dataset.goldens) +print(dataset) + + +import pytest +from deepeval import assert_test +from deepeval.metrics import AnswerRelevancyMetric + + +answer_relevancy_metric = AnswerRelevancyMetric(threshold=0.5) + +from deepeval import evaluate + + +# evaluate(dataset, [answer_relevancy_metric]) + + diff --git a/evals/natural_language_processing.txt b/evals/natural_language_processing.txt new file mode 100644 index 000000000..a6fad3b47 --- /dev/null +++ b/evals/natural_language_processing.txt @@ -0,0 +1,2 @@ +Natural language processing (NLP) is an interdisciplinary subfield of computer science and information retrieval. It is primarily concerned with giving computers the ability to support and manipulate human language. It involves processing natural language datasets, such as text corpora or speech corpora, using either rule-based or probabilistic (i.e. statistical and, most recently, neural network-based) machine learning approaches. The goal is a computer capable of "understanding"[citation needed] the contents of documents, including the contextual nuances of the language within them. To this end, natural language processing often borrows ideas from theoretical linguistics. The technology can then accurately extract information and insights contained in the documents as well as categorize and organize the documents themselves. +Challenges in natural language processing frequently involve speech recognition, natural-language understanding, and natural-language generation. diff --git a/evals/simple_rag_vs_cognee_eval.py b/evals/simple_rag_vs_cognee_eval.py new file mode 100644 index 000000000..87506a5b2 --- /dev/null +++ b/evals/simple_rag_vs_cognee_eval.py @@ -0,0 +1,75 @@ +from deepeval.dataset import EvaluationDataset +from pydantic import BaseModel + + +from typing import List, Type +from deepeval.test_case import LLMTestCase +from deepeval.dataset import Golden +import dotenv +dotenv.load_dotenv() + +from cognee.infrastructure.llm.get_llm_client import get_llm_client + +dataset = EvaluationDataset() +dataset.add_test_cases_from_json_file( + # file_path is the absolute path to you .json file + file_path="synthetic_data/20240519_185842.json", + input_key_name="query", + actual_output_key_name="actual_output", + expected_output_key_name="expected_output", + context_key_name="context", + retrieval_context_key_name="retrieval_context", +) + + + +import logging +from typing import List, Dict +from cognee.infrastructure import infrastructure_config + +logger = logging.getLogger(__name__) + +def AnswerModel(BaseModel): + response:str +def get_answer_base(content: str, response_model: Type[BaseModel]): + llm_client = get_llm_client() + + system_prompt = "Answer the following question: and use the context" + + return llm_client.create_structured_output(content, system_prompt, response_model) +def get_answer(content: str, model: Type[BaseModel]= AnswerModel): + + try: + return (get_answer_base( + content, + model + )) + except Exception as error: + logger.error("Error extracting cognitive layers from content: %s", error, exc_info = True) + raise error + + + + +def convert_goldens_to_test_cases(goldens: List[Golden]) -> List[LLMTestCase]: + test_cases = [] + for golden in goldens: + test_case = LLMTestCase( + input=golden.input, + # Generate actual output using the 'input' and 'additional_metadata' + actual_output= get_answer(golden.input), + expected_output=golden.expected_output, + context=golden.context, + ) + test_cases.append(test_case) + return test_cases + +# Data preprocessing before setting the dataset test cases +dataset.test_cases = convert_goldens_to_test_cases(dataset.goldens) + + +from deepeval.metrics import HallucinationMetric + + +metric = HallucinationMetric() +dataset.evaluate([metric]) \ No newline at end of file diff --git a/evals/soldiers_home.pdf b/evals/soldiers_home.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e453ca4bc64157ac078193238ce2a1f5982b557c GIT binary patch literal 33733 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

) z_lq^QJEkc{R?GA&7y*&c+W8`Wv%PC%h{N37*xmjBR-ss)QaJ@ZRTWKls$K-nTCF#O zUOYmczd{M54z-*v#nBqFpPoKPF|`uBuf(yXBX4|Rc{*$*#M;VoeOZiBxLK-nK&~DY zwRKm5qB1F?u=&9cDmq9!@HpSV9Z{8t5HZXz!i;%}Z1}nZXBV@mRS@osb%|1M3N*O1 z;$U3(I5S6*7DK={{E|l-8rcbLvdiAxAGQ1nc5?#Lw0q?Wf}`Ro)jd&%>Q>)F#kouw zleeGFvg0ak>cqmXmw_3QrFkKz{kE1YXoY6Q_f-<34NNj!fz;Y`)utkzfKoRBdl0R{AmCCcfs$ zb3P`ZzBv`JQ+h_SMcjqpECu5PC7;@aUmzSI@(QH__)J85XG>|kWQDp>M3I@{4lZa{ zA+LKJ<<=(-Po6HK#O$xim-H#+N$?8ISXIV&56K9~>@L1pb6P5}l{Y=6Sc>))vPpVJ z0ObQdM?w1*2A}$Ga*91r6~nl2_ybFTp=K-mAy0li5YuH}#VP8~{|e4c7~i7{4Ky_j zSWSr-G%9px%lw4I#|Ua3LFxjjdwe|AVw!cF+OTA}zbyK>lyqCNwEa3fioLCzJ(UC7B*p125~}Ks;nG5cw?- z%fv|`mq%3EpXSQ^&o@6c#??4kypQu(IT*xJO1T3nENmtWjR4s_&Dc8*CcrZr!`y`&=S zkJL%nfK|rX$qFvJb2x82lkKa}gZM<)Ti2GF#3MOS{6H`OIAu$4ZsC9q5p8cC;%5GLA@)2El)KJwCmKXYNnamic=aEj)y6;wm$1}}~q zFG7kS#t-Y0xAa~T&!pbH_UPQG_uBAr_fDeL<9Uby{xA;2*5w?1X>LEWbbd1Oek7-l zVX=RJeeNUUpX(^>p@)ht{P6|FJR#7X#9MAZ$Wil6x>WlJ>*8?~`Wtc;O6Oj`Xd>2n zD->59ovKnA%G)WF3kai9=GT9a=_|sbKnp1v9*6_uPvLV^#6}^3MZ0OTQl4K3g4F+jMs%bcw6aA`(j|F=i~Wp6mI$)pm{0sX=7tU#i`$O;L9_JcCobv zjyobbR@iYWiL580%lVmgiDvL=rFF8=^h)AJ#}@I5AA7a+r}V_^*FqV$C#I@hG*wDX z*|>J6kJ2#$e4e3x>a$;%6YR!I$@`Ca!EkPG*o{r>dd(x3g*~jj6c#pzIi8i-R9k-7 zXyj~MFL0)5FcI!??m|5q^w5x$y^S%4I#c(y5w1;}ut|$K-{9>t`^BkZLVvQH+$&Y2m%5WAn=3D=@K9&OG6tA$V&3OcqsIK!(Qx?w|j zf&LZ6yJY8_G0ced3?cO(mA%@VuH_>5gy)|tx54BnEe#VyEcYxI=Tv*8g#RetGPXg31o3=H<|9`S?l^ft2<^5;DxB0)> zw>jZI858?A)BCSFCf0AF_JuAzTG;eTZe4Buq+zp`(gz`rsE0D$e^bquVG|G>rn zyY075;Xm7DWc&6I{JW0zA58gwxBWI8d^<<}m3>0PS3#3Y|O%g g|Nmd|Kg7GElfHw~|J;^LjI8XeP$VS6vLaCb2SB~|TL1t6 literal 0 HcmV?d00001 diff --git a/evals/trump.txt b/evals/trump.txt new file mode 100644 index 000000000..ee35f2a60 --- /dev/null +++ b/evals/trump.txt @@ -0,0 +1,15 @@ +Donald Trump flirted with the idea of being president for three terms – a clear violation of the US constitution – during a bombastic speech for the National Rifle Association in which he vowed to reverse gun safety measures green-lighted during the Biden administration. + +“You know, FDR 16 years – almost 16 years – he was four terms. I don’t know, are we going to be considered three-term? Or two-term?” The ex-president and GOP presidential frontrunner said to the organization’s annual convention in Dallas, prompting some in the crowd to yell “three!” Politico reported. + +Trump has floated a third term in past comments, even mentioning a prolonged presidency while campaigning in 2020. He has also tried distancing himself from this idea, telling Time magazine in April: “I wouldn’t be in favor of it at all. I intend to serve four years and do a great job.” + +The 22nd amendment, which was enacted following Franklin Delano Rosevelt’s fourth term, limits the presidency to two terms. + +In his speech to the NRA, Trump spoke on abortion, immigration and criticized Robert F Kennedy Jr as being part of the “radical left”. He also complained about the multiple criminal cases against him, including a gag order that bars him from commenting about witnesses in his ongoing New York City criminal trial. + +Trump has the NRA’s endorsement, but the organization has recently been reeling from legal and financial woe and is not quite the force in US politics it once was. + +The NRA is holding its convention less than three months after its former long-serving leader Wayne LaPierre – as well as other executives of the group – were held liable in a lawsuit centered on the organization’s lavish spending. + +Trump, who said he heard that gun owners “don’t vote,” pushed NRA members to hit the polls in November: “Let’s be rebellious and vote this time, OK?” \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 129a38798..979d67a68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ greenlet = "^3.0.3" ruff = "^0.2.2" filetype = "^1.2.0" nltk = "^3.8.1" -dlt = "^0.4.7" +dlt = "0.4.10" duckdb = {version = "^0.10.0", extras = ["dlt"]} overrides = "^7.7.0" aiofiles = "^23.2.1" @@ -68,6 +68,9 @@ tantivy = "^0.21.0" langfuse = "^2.32.0" spacy = "^3.7.4" protobuf = "<5.0.0" +langchain-community = "0.0.38" +langchain ="0.1.10" +deepeval = "^0.21.42" [tool.poetry.extras] From d099cae128431897aa20dc973df9d16da46f5f5e Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Sun, 19 May 2024 22:39:47 +0200 Subject: [PATCH 18/21] Add evals for cognee --- evals/generate_test_set.py | 6 ++-- evals/simple_rag_vs_cognee_eval.py | 56 ++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/evals/generate_test_set.py b/evals/generate_test_set.py index 9099a81ed..58bf4222a 100644 --- a/evals/generate_test_set.py +++ b/evals/generate_test_set.py @@ -22,8 +22,10 @@ dotenv.load_dotenv() dataset = EvaluationDataset() dataset.generate_goldens_from_docs( - document_paths=['soldiers_home.pdf'], - max_goldens_per_document=10 + document_paths=['natural_language_processing.txt', 'soldiers_home.pdf', 'trump.txt'], + max_goldens_per_document=10, + num_evolutions=5, + enable_breadth_evolve=True, ) diff --git a/evals/simple_rag_vs_cognee_eval.py b/evals/simple_rag_vs_cognee_eval.py index 87506a5b2..cbac4ebc9 100644 --- a/evals/simple_rag_vs_cognee_eval.py +++ b/evals/simple_rag_vs_cognee_eval.py @@ -13,14 +13,32 @@ from cognee.infrastructure.llm.get_llm_client import get_llm_client dataset = EvaluationDataset() dataset.add_test_cases_from_json_file( # file_path is the absolute path to you .json file - file_path="synthetic_data/20240519_185842.json", - input_key_name="query", + file_path="./synthetic_data/20240519_185842.json", + input_key_name="input", actual_output_key_name="actual_output", expected_output_key_name="expected_output", - context_key_name="context", - retrieval_context_key_name="retrieval_context", + context_key_name="context" ) +print(dataset) +# from deepeval.synthesizer import Synthesizer +# +# synthesizer = Synthesizer(model="gpt-3.5-turbo") +# +# dataset = EvaluationDataset() +# dataset.generate_goldens_from_docs( +# synthesizer=synthesizer, +# document_paths=['natural_language_processing.txt', 'soldiers_home.pdf', 'trump.txt'], +# max_goldens_per_document=10, +# num_evolutions=5, +# enable_breadth_evolve=True, +# ) + + +print(dataset.goldens) +print(dataset) + + import logging @@ -29,43 +47,51 @@ from cognee.infrastructure import infrastructure_config logger = logging.getLogger(__name__) -def AnswerModel(BaseModel): +class AnswerModel(BaseModel): response:str -def get_answer_base(content: str, response_model: Type[BaseModel]): +def get_answer_base(content: str, context:str, response_model: Type[BaseModel]): llm_client = get_llm_client() - system_prompt = "Answer the following question: and use the context" + system_prompt = "THIS IS YOUR CONTEXT:" + str(context) return llm_client.create_structured_output(content, system_prompt, response_model) -def get_answer(content: str, model: Type[BaseModel]= AnswerModel): +def get_answer(content: str,context, model: Type[BaseModel]= AnswerModel): try: return (get_answer_base( content, + context, model )) except Exception as error: logger.error("Error extracting cognitive layers from content: %s", error, exc_info = True) raise error +def run_cognify_base_rag_and_search(): + pass + + +def run_cognify_and_search(): + pass -def convert_goldens_to_test_cases(goldens: List[Golden]) -> List[LLMTestCase]: +def convert_goldens_to_test_cases(test_cases_raw: List[LLMTestCase]) -> List[LLMTestCase]: test_cases = [] - for golden in goldens: + for case in test_cases_raw: test_case = LLMTestCase( - input=golden.input, + input=case.input, # Generate actual output using the 'input' and 'additional_metadata' - actual_output= get_answer(golden.input), - expected_output=golden.expected_output, - context=golden.context, + actual_output= str(get_answer(case.input, case.context).model_dump()['response']), + expected_output=case.expected_output, + context=case.context, + retrieval_context=["retrieval_context"], ) test_cases.append(test_case) return test_cases # Data preprocessing before setting the dataset test cases -dataset.test_cases = convert_goldens_to_test_cases(dataset.goldens) +dataset.test_cases = convert_goldens_to_test_cases(dataset.test_cases) from deepeval.metrics import HallucinationMetric From 8ef23731a31c7f791fba36f53e0e8ea35e9cc980 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Mon, 20 May 2024 14:41:08 +0200 Subject: [PATCH 19/21] Updated evals, added falkordb --- .../databases/graph/falkordb/__init__.py | 0 .../databases/graph/falkordb/adapter.py | 191 ++++++++++++++++++ docker-compose.yml | 8 + evals/simple_rag_vs_cognee_eval.py | 55 ++++- .../natural_language_processing.txt | 0 .../initial_test}/soldiers_home.pdf | Bin .../initial_test}/trump.txt | 0 pyproject.toml | 1 + 8 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 cognee/infrastructure/databases/graph/falkordb/__init__.py create mode 100644 cognee/infrastructure/databases/graph/falkordb/adapter.py rename evals/{ => test_datasets/initial_test}/natural_language_processing.txt (100%) rename evals/{ => test_datasets/initial_test}/soldiers_home.pdf (100%) rename evals/{ => test_datasets/initial_test}/trump.txt (100%) diff --git a/cognee/infrastructure/databases/graph/falkordb/__init__.py b/cognee/infrastructure/databases/graph/falkordb/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/infrastructure/databases/graph/falkordb/adapter.py b/cognee/infrastructure/databases/graph/falkordb/adapter.py new file mode 100644 index 000000000..0765fe323 --- /dev/null +++ b/cognee/infrastructure/databases/graph/falkordb/adapter.py @@ -0,0 +1,191 @@ +""" FalcorDB Adapter for Graph Database""" +import json +import logging +from typing import Optional, Any, List, Dict +from contextlib import asynccontextmanager + + +from falkordb.asyncio import FalkorDB +from cognee.infrastructure.databases.graph.graph_db_interface import GraphDBInterface + +logger = logging.getLogger("FalcorDBAdapter") + +class FalcorDBAdapter(GraphDBInterface): + def __init__( + self, + graph_database_url: str, + graph_database_username: str, + graph_database_password: str, + graph_database_port: int, + driver: Optional[Any] = None, + graph_name: str = "DefaultGraph", + ): + self.driver = FalkorDB( + host = graph_database_url, + port = graph_database_port) + self.graph_name = graph_name + + + + async def query( + self, + query: str, + params: Optional[Dict[str, Any]] = None, + ) -> List[Dict[str, Any]]: + try: + selected_graph = self.driver.select_graph(self.graph_name) + + result = await selected_graph.query(query) + return result.result_set + + except Exception as error: + logger.error("Falkor query error: %s", error, exc_info = True) + raise error + + async def graph(self): + return self.driver + + async def add_node(self, node_id: str, node_properties: Dict[str, Any] = None): + node_id = node_id.replace(":", "_") + + serialized_properties = self.serialize_properties(node_properties) + + if "name" not in serialized_properties: + serialized_properties["name"] = node_id + + # serialized_properties["created_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + # serialized_properties["updated_at"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # properties = ", ".join(f"{property_name}: ${property_name}" for property_name in serialized_properties.keys()) + + query = f"""MERGE (node:`{node_id}` {{id: $node_id}}) + ON CREATE SET node += $properties + RETURN ID(node) AS internal_id, node.id AS nodeId""" + + params = { + "node_id": node_id, + "properties": serialized_properties, + } + + return await self.query(query, params) + + async def add_nodes(self, nodes: list[tuple[str, dict[str, Any]]]) -> None: + # nodes_data = [] + + for node in nodes: + node_id, node_properties = node + node_id = node_id.replace(":", "_") + + await self.add_node( + node_id = node_id, + node_properties = node_properties, + ) + + + + async def extract_node_description(self, node_id: str): + query = """MATCH (n)-[r]->(m) + WHERE n.id = $node_id + AND NOT m.id CONTAINS 'DefaultGraphModel' + RETURN m + """ + + result = await self.query(query, dict(node_id = node_id)) + + descriptions = [] + + for node in result: + # Assuming 'm' is a consistent key in your data structure + attributes = node.get("m", {}) + + # Ensure all required attributes are present + if all(key in attributes for key in ["id", "layer_id", "description"]): + descriptions.append({ + "id": attributes["id"], + "layer_id": attributes["layer_id"], + "description": attributes["description"], + }) + + return descriptions + + async def get_layer_nodes(self): + query = """MATCH (node) WHERE node.layer_id IS NOT NULL + RETURN node""" + + return [result['node'] for result in (await self.query(query))] + + async def extract_node(self, node_id: str): + query= """ + MATCH(node {id: $node_id}) + RETURN node + """ + + results = [node['node'] for node in (await self.query(query, dict(node_id = node_id)))] + + return results[0] if len(results) > 0 else None + + async def delete_node(self, node_id: str): + node_id = id.replace(":", "_") + + query = f"MATCH (node:`{node_id}` {{id: $node_id}}) DETACH DELETE n" + params = { "node_id": node_id } + + return await self.query(query, params) + + async def add_edge(self, from_node: str, to_node: str, relationship_name: str, edge_properties: Optional[Dict[str, Any]] = {}): + serialized_properties = self.serialize_properties(edge_properties) + from_node = from_node.replace(":", "_") + to_node = to_node.replace(":", "_") + + query = f"""MATCH (from_node:`{from_node}` {{id: $from_node}}), (to_node:`{to_node}` {{id: $to_node}}) + MERGE (from_node)-[r:`{relationship_name}`]->(to_node) + SET r += $properties + RETURN r""" + + params = { + "from_node": from_node, + "to_node": to_node, + "properties": serialized_properties + } + + return await self.query(query, params) + + + async def add_edges(self, edges: list[tuple[str, str, str, dict[str, Any]]]) -> None: + # edges_data = [] + + for edge in edges: + from_node, to_node, relationship_name, edge_properties = edge + from_node = from_node.replace(":", "_") + to_node = to_node.replace(":", "_") + + await self.add_edge( + from_node = from_node, + to_node = to_node, + relationship_name = relationship_name, + edge_properties = edge_properties + ) + + + + async def filter_nodes(self, search_criteria): + query = f"""MATCH (node) + WHERE node.id CONTAINS '{search_criteria}' + RETURN node""" + + + return await self.query(query) + + + async def delete_graph(self): + query = """MATCH (node) + DETACH DELETE node;""" + + return await self.query(query) + + def serialize_properties(self, properties = dict()): + return { + property_key: json.dumps(property_value) + if isinstance(property_value, (dict, list)) + else property_value for property_key, property_value in properties.items() + } diff --git a/docker-compose.yml b/docker-compose.yml index 2ede528d2..0b0e19c34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -67,6 +67,14 @@ services: - ./litellm-config.yaml:/app/config.yaml # Mount the local configuration file # You can change the port or number of workers as per your requirements or pass any new supported CLI augument. Make sure the port passed here matches with the container port defined above in `ports` value command: [ "--config", "/app/config.yaml", "--port", "4000", "--num_workers", "8" ] + falkordb: + image: falkordb/falkordb:edge + container_name: falkordb + ports: + - "6379:6379" + - "3001:3000" + networks: + - cognee_backend networks: cognee_backend: diff --git a/evals/simple_rag_vs_cognee_eval.py b/evals/simple_rag_vs_cognee_eval.py index cbac4ebc9..28cc72013 100644 --- a/evals/simple_rag_vs_cognee_eval.py +++ b/evals/simple_rag_vs_cognee_eval.py @@ -67,12 +67,34 @@ def get_answer(content: str,context, model: Type[BaseModel]= AnswerModel): logger.error("Error extracting cognitive layers from content: %s", error, exc_info = True) raise error -def run_cognify_base_rag_and_search(): +async def run_cognify_base_rag(): + from cognee.api.v1.add import add + from cognee.api.v1.prune import prune + from cognee.api.v1.cognify.cognify import cognify + + await prune.prune_system() + + await add("data://test_datasets", "initial_test") + + graph = await cognify("initial_test") + + + pass -def run_cognify_and_search(): - pass +async def cognify_search_base_rag(content:str, context:str): + vector_client = infrastructure_config.get_config("vector_engine") + + return_ = await vector_client.search(collection_name="basic_rag", query_text="show_all_processes", limit=10) + + print("results", return_) + return return_ + +async def cognify_search_graph(content:str, context:str): + from cognee.api.v1.search.search import search + return_ = await search(content) + return return_ @@ -90,12 +112,29 @@ def convert_goldens_to_test_cases(test_cases_raw: List[LLMTestCase]) -> List[LLM test_cases.append(test_case) return test_cases -# Data preprocessing before setting the dataset test cases -dataset.test_cases = convert_goldens_to_test_cases(dataset.test_cases) +# # Data preprocessing before setting the dataset test cases +# dataset.test_cases = convert_goldens_to_test_cases(dataset.test_cases) +# +# +# from deepeval.metrics import HallucinationMetric +# +# +# metric = HallucinationMetric() +# dataset.evaluate([metric]) -from deepeval.metrics import HallucinationMetric +if __name__ == "__main__": + import asyncio -metric = HallucinationMetric() -dataset.evaluate([metric]) \ No newline at end of file + async def main(): + await run_cognify_base_rag_and_search() + + asyncio.run(main()) + # run_cognify_base_rag_and_search() + # # Data preprocessing before setting the dataset test cases + # dataset.test_cases = convert_goldens_to_test_cases(dataset.test_cases) + # from deepeval.metrics import HallucinationMetric + # metric = HallucinationMetric() + # dataset.evaluate([metric]) + pass \ No newline at end of file diff --git a/evals/natural_language_processing.txt b/evals/test_datasets/initial_test/natural_language_processing.txt similarity index 100% rename from evals/natural_language_processing.txt rename to evals/test_datasets/initial_test/natural_language_processing.txt diff --git a/evals/soldiers_home.pdf b/evals/test_datasets/initial_test/soldiers_home.pdf similarity index 100% rename from evals/soldiers_home.pdf rename to evals/test_datasets/initial_test/soldiers_home.pdf diff --git a/evals/trump.txt b/evals/test_datasets/initial_test/trump.txt similarity index 100% rename from evals/trump.txt rename to evals/test_datasets/initial_test/trump.txt diff --git a/pyproject.toml b/pyproject.toml index 979d67a68..94303a491 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,6 +71,7 @@ protobuf = "<5.0.0" langchain-community = "0.0.38" langchain ="0.1.10" deepeval = "^0.21.42" +falkordb = "^1.0.4" [tool.poetry.extras] From 63356f242a02e33be54cd6fd64d201fe8b884b09 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Tue, 21 May 2024 10:03:52 +0200 Subject: [PATCH 20/21] Fixes to search and evals --- cognee/api/v1/cognify/cognify.py | 6 +++--- cognee/infrastructure/InfrastructureConfig.py | 7 ++++++- cognee/modules/search/graph/search_categories.py | 7 +++++-- .../extraction/categorize_relevant_category.py | 2 +- evals/simple_rag_vs_cognee_eval.py | 16 +++++++++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index b18b88375..2cac909c2 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -258,9 +258,9 @@ if __name__ == "__main__": from cognee.shared.SourceCodeGraph import SourceCodeGraph from cognee.api.v1.config import config - config.set_graph_model(SourceCodeGraph) - config.set_classification_model(CodeContentPrediction) - graph = await cognify() + # config.set_graph_model(SourceCodeGraph) + # config.set_classification_model(CodeContentPrediction) + # graph = await cognify() vector_client = infrastructure_config.get_config("vector_engine") out = await vector_client.search(collection_name ="basic_rag", query_text="show_all_processes", limit=10) diff --git a/cognee/infrastructure/InfrastructureConfig.py b/cognee/infrastructure/InfrastructureConfig.py index 21e6aacc6..f33d1bf53 100644 --- a/cognee/infrastructure/InfrastructureConfig.py +++ b/cognee/infrastructure/InfrastructureConfig.py @@ -84,10 +84,12 @@ class InfrastructureConfig(): if (config_entity is None or config_entity == "llm_engine") and self.llm_engine is None: self.llm_engine = OpenAIAdapter(config.openai_key, config.openai_model) - if (config_entity is None or config_entity == "database_directory_path") and self.database_directory_path is None: self.database_directory_path = self.system_root_directory + "/" + config.db_path + if self.database_directory_path is None: + self.database_directory_path = self.system_root_directory + "/" + config.db_path + if (config_entity is None or config_entity == "database_file_path") and self.database_file_path is None: self.database_file_path = self.system_root_directory + "/" + config.db_path + "/" + config.db_name @@ -114,6 +116,9 @@ class InfrastructureConfig(): ) else: from .databases.vector.lancedb.LanceDBAdapter import LanceDBAdapter + print("Using LanceDB as vector engine", self.database_directory_path) + print("Setting system root directory to", self.system_root_directory) + lance_db_path = self.database_directory_path + "/cognee.lancedb" LocalStorage.ensure_directory_exists(lance_db_path) diff --git a/cognee/modules/search/graph/search_categories.py b/cognee/modules/search/graph/search_categories.py index 87096ad9e..7447a3998 100644 --- a/cognee/modules/search/graph/search_categories.py +++ b/cognee/modules/search/graph/search_categories.py @@ -1,4 +1,6 @@ -from typing import Union, Dict, re +from typing import Union, Dict +import re + from cognee.modules.search.llm.extraction.categorize_relevant_category import categorize_relevant_category @@ -13,7 +15,7 @@ def strip_exact_regex(s, substring): # Regex to match the exact substring at the start and end return re.sub(f"^{pattern}|{pattern}$", "", s) -async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: str, infrastructure_config: Dict): +async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: str=None, infrastructure_config: Dict=None): """ Filter nodes in the graph that contain the specified label and return their summary attributes. This function supports both NetworkX graphs and Neo4j graph databases. @@ -29,6 +31,7 @@ async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: each representing a node with 'nodeId' and 'summary'. """ # Determine which client is in use based on the configuration + from cognee.infrastructure import infrastructure_config if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: categories_and_ids = [ diff --git a/cognee/modules/search/llm/extraction/categorize_relevant_category.py b/cognee/modules/search/llm/extraction/categorize_relevant_category.py index d49c9f55b..b10781183 100644 --- a/cognee/modules/search/llm/extraction/categorize_relevant_category.py +++ b/cognee/modules/search/llm/extraction/categorize_relevant_category.py @@ -6,7 +6,7 @@ from cognee.infrastructure.llm.get_llm_client import get_llm_client async def categorize_relevant_category(query: str, summary, response_model: Type[BaseModel]): llm_client = get_llm_client() - enriched_query= render_prompt("categorize_category.txt", {"query": query, "categories": summary}) + enriched_query= render_prompt("categorize_categories.txt", {"query": query, "categories": summary}) print("enriched_query", enriched_query) diff --git a/evals/simple_rag_vs_cognee_eval.py b/evals/simple_rag_vs_cognee_eval.py index 28cc72013..247520464 100644 --- a/evals/simple_rag_vs_cognee_eval.py +++ b/evals/simple_rag_vs_cognee_eval.py @@ -84,17 +84,22 @@ async def run_cognify_base_rag(): async def cognify_search_base_rag(content:str, context:str): + infrastructure_config.set_config({"database_directory_path": "/Users/vasa/Projects/cognee/cognee/.cognee_system/databases/cognee.lancedb"}) + vector_client = infrastructure_config.get_config("vector_engine") - return_ = await vector_client.search(collection_name="basic_rag", query_text="show_all_processes", limit=10) + return_ = await vector_client.search(collection_name="basic_rag", query_text=content, limit=10) print("results", return_) return return_ async def cognify_search_graph(content:str, context:str): from cognee.api.v1.search.search import search - return_ = await search(content) - return return_ + search_type = 'CATEGORIES' + params = {'query': 'Ministarstvo'} + + results = await search(search_type, params) + return results @@ -128,8 +133,9 @@ if __name__ == "__main__": import asyncio async def main(): - await run_cognify_base_rag_and_search() - + # await run_cognify_base_rag() + # await cognify_search_base_rag("show_all_processes", "context") + await cognify_search_graph("show_all_processes", "context") asyncio.run(main()) # run_cognify_base_rag_and_search() # # Data preprocessing before setting the dataset test cases From 3fadb277cbf0a44e70bb0186feb8bcdfa8d419b9 Mon Sep 17 00:00:00 2001 From: Vasilije <8619304+Vasilije1990@users.noreply.github.com> Date: Tue, 21 May 2024 19:34:18 +0200 Subject: [PATCH 21/21] Fixes for searches --- cognee/api/v1/cognify/cognify.py | 10 ++--- cognee/api/v1/search/search.py | 9 ++++- .../modules/search/graph/search_adjacent.py | 2 +- .../modules/search/graph/search_categories.py | 20 +++++----- cognee/modules/search/graph/search_cypher.py | 24 ++++++++++++ .../modules/search/graph/search_neighbour.py | 25 ++++++------ .../categorize_relevant_category.py | 1 - cognee/modules/search/vector/bm25.py | 1 + cognee/modules/search/vector/fusion.py | 1 + .../search/vector/search_similarity.py | 38 ++++++++++++------- evals/simple_rag_vs_cognee_eval.py | 5 ++- 11 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 cognee/modules/search/graph/search_cypher.py create mode 100644 cognee/modules/search/vector/bm25.py create mode 100644 cognee/modules/search/vector/fusion.py diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index 2cac909c2..324f25ffe 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -111,11 +111,11 @@ async def cognify(datasets: Union[str, List[str]] = None): added__basic_rag_chunks = await add_data_chunks_basic_rag(data_chunks) - # await asyncio.gather( - # *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"],chunk['document_id']) for chunk in - # added_chunks] - # ) - # + await asyncio.gather( + *[process_text(chunk["collection"], chunk["chunk_id"], chunk["text"], chunk["file_metadata"],chunk['document_id']) for chunk in + added_chunks] + ) + batch_size = 20 file_count = 0 files_batch = [] diff --git a/cognee/api/v1/search/search.py b/cognee/api/v1/search/search.py index af8a7b728..4fd78e5a0 100644 --- a/cognee/api/v1/search/search.py +++ b/cognee/api/v1/search/search.py @@ -3,6 +3,8 @@ import asyncio from enum import Enum from typing import Dict, Any, Callable, List from pydantic import BaseModel, field_validator + +from cognee.modules.search.graph import search_cypher from cognee.modules.search.graph.search_adjacent import search_adjacent from cognee.modules.search.vector.search_similarity import search_similarity from cognee.modules.search.graph.search_categories import search_categories @@ -20,7 +22,8 @@ class SearchType(Enum): SUMMARY = 'SUMMARY' SUMMARY_CLASSIFICATION = 'SUMMARY_CLASSIFICATION' NODE_CLASSIFICATION = 'NODE_CLASSIFICATION' - DOCUMENT_CLASSIFICATION = 'DOCUMENT_CLASSIFICATION' + DOCUMENT_CLASSIFICATION = 'DOCUMENT_CLASSIFICATION', + CYPHER = 'CYPHER' @staticmethod def from_str(name: str): @@ -54,7 +57,9 @@ async def specific_search(query_params: List[SearchParameters]) -> List: SearchType.SIMILARITY: search_similarity, SearchType.CATEGORIES: search_categories, SearchType.NEIGHBOR: search_neighbour, - SearchType.SUMMARY: search_summary + SearchType.SUMMARY: search_summary, + SearchType.CYPHER: search_cypher + } results = [] diff --git a/cognee/modules/search/graph/search_adjacent.py b/cognee/modules/search/graph/search_adjacent.py index 8f3886305..97477a93a 100644 --- a/cognee/modules/search/graph/search_adjacent.py +++ b/cognee/modules/search/graph/search_adjacent.py @@ -22,7 +22,7 @@ async def search_adjacent(graph: Union[nx.Graph, any], query: str, infrastructur if node_id is None: return {} - + from cognee.infrastructure import infrastructure_config if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: if node_id not in graph: return {} diff --git a/cognee/modules/search/graph/search_categories.py b/cognee/modules/search/graph/search_categories.py index 7447a3998..7ff07554e 100644 --- a/cognee/modules/search/graph/search_categories.py +++ b/cognee/modules/search/graph/search_categories.py @@ -1,6 +1,7 @@ from typing import Union, Dict import re +from pydantic import BaseModel from cognee.modules.search.llm.extraction.categorize_relevant_category import categorize_relevant_category @@ -15,6 +16,10 @@ def strip_exact_regex(s, substring): # Regex to match the exact substring at the start and end return re.sub(f"^{pattern}|{pattern}$", "", s) + +class DefaultResponseModel(BaseModel): + document_id: str + async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: str=None, infrastructure_config: Dict=None): """ Filter nodes in the graph that contain the specified label and return their summary attributes. @@ -39,20 +44,15 @@ async def search_categories(query:str, graph: Union[nx.Graph, any], query_label: for _, data in graph.nodes(data=True) if 'summary' in data ] - print("summaries_and_ids", categories_and_ids) - check_relevant_category = await categorize_relevant_category(query, categories_and_ids, response_model= infrastructure_config.get_config()["classification_model"]) - print("check_relevant_summary", check_relevant_category) - + connected_nodes = [] + for id in categories_and_ids: + print("id", id) + connected_nodes.append(list(graph.neighbors(id['document_id']))) + check_relevant_category = await categorize_relevant_category(query, categories_and_ids, response_model=DefaultResponseModel ) connected_nodes = list(graph.neighbors(check_relevant_category['document_id'])) - print("connected_nodes", connected_nodes) descriptions = {node: graph.nodes[node].get('description', 'No desc available') for node in connected_nodes} - print("descs", descriptions) return descriptions - # - # # Logic for NetworkX - # return {node: data.get('content_labels') for node, data in graph.nodes(data=True) if query_label in node and 'content_labels' in data} - elif infrastructure_config.get_config()["graph_engine"] == GraphDBType.NEO4J: # Logic for Neo4j cypher_query = """ diff --git a/cognee/modules/search/graph/search_cypher.py b/cognee/modules/search/graph/search_cypher.py new file mode 100644 index 000000000..1022004c7 --- /dev/null +++ b/cognee/modules/search/graph/search_cypher.py @@ -0,0 +1,24 @@ + +from typing import Union, Dict +import re + +import networkx as nx +from pydantic import BaseModel + +from cognee.modules.search.llm.extraction.categorize_relevant_category import categorize_relevant_category +from cognee.shared.data_models import GraphDBType + + +async def search_cypher(query:str, graph: Union[nx.Graph, any]): + """ + Use a Cypher query to search the graph and return the results. + """ + + + from cognee.infrastructure import infrastructure_config + if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NEO4J: + result = await graph.run(query) + return result + + else: + raise ValueError("Unsupported graph engine type.") \ No newline at end of file diff --git a/cognee/modules/search/graph/search_neighbour.py b/cognee/modules/search/graph/search_neighbour.py index fc7b55df8..9faf5ec30 100644 --- a/cognee/modules/search/graph/search_neighbour.py +++ b/cognee/modules/search/graph/search_neighbour.py @@ -1,11 +1,13 @@ """ Fetches the context of a given node in the graph""" from typing import Union, Dict +from neo4j import AsyncSession + from cognee.infrastructure.databases.graph.get_graph_client import get_graph_client import networkx as nx from cognee.shared.data_models import GraphDBType -async def search_neighbour(graph: Union[nx.Graph, any], id: str, infrastructure_config: Dict, +async def search_neighbour(graph: Union[nx.Graph, any], node_id: str, other_param: dict = None): """ Search for nodes that share the same 'layer_uuid' as the specified node and return their descriptions. @@ -20,26 +22,23 @@ async def search_neighbour(graph: Union[nx.Graph, any], id: str, infrastructure_ Returns: - List[str]: A list of 'description' attributes of nodes that share the same 'layer_uuid' with the specified node. """ - node_id = other_param.get('node_id') if other_param else None + from cognee.infrastructure import infrastructure_config + if node_id is None: + node_id = other_param.get('node_id') if other_param else None if node_id is None: return [] if infrastructure_config.get_config()["graph_engine"] == GraphDBType.NETWORKX: - if isinstance(graph, nx.Graph): - if node_id not in graph: - return [] + relevant_context = [] + target_layer_uuid = graph.nodes[node_id].get('layer_uuid') - relevant_context = [] - target_layer_uuid = graph.nodes[node_id].get('layer_uuid') + for n, attr in graph.nodes(data=True): + if attr.get('layer_uuid') == target_layer_uuid and 'description' in attr: + relevant_context.append(attr['description']) - for n, attr in graph.nodes(data=True): - if attr.get('layer_uuid') == target_layer_uuid and 'description' in attr: - relevant_context.append(attr['description']) + return relevant_context - return relevant_context - else: - raise ValueError("Graph object does not match the specified graph engine type in the configuration.") elif infrastructure_config.get_config()["graph_engine"] == GraphDBType.NEO4J: if isinstance(graph, AsyncSession): diff --git a/cognee/modules/search/llm/extraction/categorize_relevant_category.py b/cognee/modules/search/llm/extraction/categorize_relevant_category.py index b10781183..2134780ed 100644 --- a/cognee/modules/search/llm/extraction/categorize_relevant_category.py +++ b/cognee/modules/search/llm/extraction/categorize_relevant_category.py @@ -8,7 +8,6 @@ async def categorize_relevant_category(query: str, summary, response_model: Type enriched_query= render_prompt("categorize_categories.txt", {"query": query, "categories": summary}) - print("enriched_query", enriched_query) system_prompt = " Choose the relevant categories and return appropriate output based on the model" diff --git a/cognee/modules/search/vector/bm25.py b/cognee/modules/search/vector/bm25.py new file mode 100644 index 000000000..134feb819 --- /dev/null +++ b/cognee/modules/search/vector/bm25.py @@ -0,0 +1 @@ +""" Placeholder for BM25 implementation""" \ No newline at end of file diff --git a/cognee/modules/search/vector/fusion.py b/cognee/modules/search/vector/fusion.py new file mode 100644 index 000000000..48ecb7eda --- /dev/null +++ b/cognee/modules/search/vector/fusion.py @@ -0,0 +1 @@ +"""Placeholder for fusions search implementation""" \ No newline at end of file diff --git a/cognee/modules/search/vector/search_similarity.py b/cognee/modules/search/vector/search_similarity.py index 2b288996c..309d98575 100644 --- a/cognee/modules/search/vector/search_similarity.py +++ b/cognee/modules/search/vector/search_similarity.py @@ -11,6 +11,8 @@ async def search_similarity(query: str, graph): layer_nodes = await graph_client.get_layer_nodes() unique_layer_uuids = set(node["layer_id"] for node in layer_nodes) + print("unique_layer_uuids", unique_layer_uuids) + graph_nodes = [] @@ -18,6 +20,8 @@ async def search_similarity(query: str, graph): vector_engine = infrastructure_config.get_config()["vector_engine"] results = await vector_engine.search(layer_id, query_text = query, limit = 10) + print("results", results) + print("len_rs", len(results)) if len(results) > 0: graph_nodes.extend([ @@ -25,25 +29,33 @@ async def search_similarity(query: str, graph): layer_id = result.payload["references"]["cognitive_layer"], node_id = result.payload["references"]["node_id"], score = result.score, - ) for result in results if result.score > 0.8 + ) for result in results if result.score > 0.3 ]) if len(graph_nodes) == 0: return [] - relevant_context = [] - for graph_node_data in graph_nodes: - graph_node = await graph_client.extract_node(graph_node_data["node_id"]) + return graph_nodes - if "chunk_collection" not in graph_node and "chunk_id" not in graph_node: - continue - vector_point = await vector_engine.retrieve( - graph_node["chunk_collection"], - graph_node["chunk_id"], - ) - relevant_context.append(vector_point.payload["text"]) - - return deduplicate(relevant_context) + # for graph_node_data in graph_nodes: + # if graph_node_data['score'] >0.8: + # graph_node = await graph_client.extract_node(graph_node_data["node_id"]) + # + # if "chunk_collection" not in graph_node and "chunk_id" not in graph_node: + # continue + # + # vector_point = await vector_engine.retrieve( + # graph_node["chunk_collection"], + # graph_node["chunk_id"], + # ) + # + # print("vector_point", vector_point.payload["text"]) + # + # relevant_context.append(vector_point.payload["text"]) + # + # print(relevant_context) + # + # return deduplicate(relevant_context) diff --git a/evals/simple_rag_vs_cognee_eval.py b/evals/simple_rag_vs_cognee_eval.py index 247520464..6b9b84672 100644 --- a/evals/simple_rag_vs_cognee_eval.py +++ b/evals/simple_rag_vs_cognee_eval.py @@ -95,10 +95,11 @@ async def cognify_search_base_rag(content:str, context:str): async def cognify_search_graph(content:str, context:str): from cognee.api.v1.search.search import search - search_type = 'CATEGORIES' - params = {'query': 'Ministarstvo'} + search_type = 'SIMILARITY' + params = {'query': 'Donald Trump'} results = await search(search_type, params) + print("results", results) return results