cognee 0.3.4.dev1__py3-none-any.whl → 0.3.4.dev3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. cognee/api/v1/cloud/routers/get_checks_router.py +1 -1
  2. cognee/api/v1/prune/prune.py +2 -2
  3. cognee/api/v1/sync/sync.py +16 -5
  4. cognee/base_config.py +15 -0
  5. cognee/infrastructure/databases/graph/kuzu/remote_kuzu_adapter.py +4 -1
  6. cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +4 -1
  7. cognee/infrastructure/files/storage/LocalFileStorage.py +50 -0
  8. cognee/infrastructure/files/storage/S3FileStorage.py +56 -9
  9. cognee/infrastructure/files/storage/StorageManager.py +18 -0
  10. cognee/modules/cloud/operations/check_api_key.py +4 -1
  11. cognee/modules/data/deletion/prune_system.py +5 -1
  12. cognee/modules/notebooks/methods/create_notebook.py +32 -0
  13. cognee/modules/notebooks/models/Notebook.py +206 -1
  14. cognee/modules/retrieval/temporal_retriever.py +2 -2
  15. cognee/modules/users/methods/create_user.py +5 -23
  16. cognee/root_dir.py +5 -0
  17. cognee/shared/cache.py +346 -0
  18. cognee/shared/utils.py +12 -0
  19. cognee/tasks/ingestion/save_data_item_to_storage.py +1 -0
  20. cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py +399 -0
  21. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/METADATA +2 -1
  22. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/RECORD +26 -24
  23. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/WHEEL +0 -0
  24. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/entry_points.txt +0 -0
  25. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/licenses/LICENSE +0 -0
  26. {cognee-0.3.4.dev1.dist-info → cognee-0.3.4.dev3.dist-info}/licenses/NOTICE.md +0 -0
@@ -0,0 +1,399 @@
1
+ import json
2
+ import pytest
3
+ from unittest.mock import AsyncMock, patch, MagicMock
4
+ import hashlib
5
+ import time
6
+ from uuid import uuid4
7
+ from sqlalchemy.ext.asyncio import AsyncSession
8
+ from pathlib import Path
9
+ import zipfile
10
+ from cognee.shared.cache import get_tutorial_data_dir
11
+
12
+ from cognee.modules.notebooks.methods.create_notebook import _create_tutorial_notebook
13
+ from cognee.modules.notebooks.models.Notebook import Notebook
14
+ import cognee
15
+ from cognee.shared.logging_utils import get_logger
16
+
17
+ logger = get_logger()
18
+
19
+
20
+ # Module-level fixtures available to all test classes
21
+ @pytest.fixture
22
+ def mock_session():
23
+ """Mock database session."""
24
+ session = AsyncMock(spec=AsyncSession)
25
+ session.add = MagicMock()
26
+ session.commit = AsyncMock()
27
+ return session
28
+
29
+
30
+ @pytest.fixture
31
+ def sample_jupyter_notebook():
32
+ """Sample Jupyter notebook content for testing."""
33
+ return {
34
+ "cells": [
35
+ {
36
+ "cell_type": "markdown",
37
+ "metadata": {},
38
+ "source": ["# Tutorial Introduction\n", "\n", "This is a tutorial notebook."],
39
+ },
40
+ {
41
+ "cell_type": "code",
42
+ "execution_count": None,
43
+ "metadata": {},
44
+ "outputs": [],
45
+ "source": ["import cognee\n", "print('Hello, Cognee!')"],
46
+ },
47
+ {
48
+ "cell_type": "markdown",
49
+ "metadata": {},
50
+ "source": ["## Step 1: Data Ingestion\n", "\n", "Let's add some data."],
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": None,
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": ["# Add your data here\n", "# await cognee.add('data.txt')"],
58
+ },
59
+ {
60
+ "cell_type": "raw",
61
+ "metadata": {},
62
+ "source": ["This is a raw cell that should be skipped"],
63
+ },
64
+ ],
65
+ "metadata": {
66
+ "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}
67
+ },
68
+ "nbformat": 4,
69
+ "nbformat_minor": 4,
70
+ }
71
+
72
+
73
+ class TestTutorialNotebookCreation:
74
+ """Test cases for tutorial notebook creation functionality."""
75
+
76
+ @pytest.mark.asyncio
77
+ async def test_notebook_from_ipynb_string_success(self, sample_jupyter_notebook):
78
+ """Test successful creation of notebook from JSON string."""
79
+ notebook_json = json.dumps(sample_jupyter_notebook)
80
+ user_id = uuid4()
81
+
82
+ notebook = Notebook.from_ipynb_string(
83
+ notebook_content=notebook_json, owner_id=user_id, name="String Test Notebook"
84
+ )
85
+
86
+ assert notebook.owner_id == user_id
87
+ assert notebook.name == "String Test Notebook"
88
+ assert len(notebook.cells) == 4 # Should skip the raw cell
89
+ assert notebook.cells[0].type == "markdown"
90
+ assert notebook.cells[1].type == "code"
91
+
92
+ @pytest.mark.asyncio
93
+ async def test_notebook_cell_name_generation(self, sample_jupyter_notebook):
94
+ """Test that cell names are generated correctly from markdown headers."""
95
+ user_id = uuid4()
96
+ notebook_json = json.dumps(sample_jupyter_notebook)
97
+
98
+ notebook = Notebook.from_ipynb_string(notebook_content=notebook_json, owner_id=user_id)
99
+
100
+ # Check markdown header extraction
101
+ assert notebook.cells[0].name == "Tutorial Introduction"
102
+ assert notebook.cells[2].name == "Step 1: Data Ingestion"
103
+
104
+ # Check code cell naming
105
+ assert notebook.cells[1].name == "Code Cell"
106
+ assert notebook.cells[3].name == "Code Cell"
107
+
108
+ @pytest.mark.asyncio
109
+ async def test_notebook_from_ipynb_string_with_default_name(self, sample_jupyter_notebook):
110
+ """Test notebook creation uses kernelspec display_name when no name provided."""
111
+ user_id = uuid4()
112
+ notebook_json = json.dumps(sample_jupyter_notebook)
113
+
114
+ notebook = Notebook.from_ipynb_string(notebook_content=notebook_json, owner_id=user_id)
115
+
116
+ assert notebook.name == "Python 3" # From kernelspec.display_name
117
+
118
+ @pytest.mark.asyncio
119
+ async def test_notebook_from_ipynb_string_fallback_name(self):
120
+ """Test fallback naming when kernelspec is missing."""
121
+ minimal_notebook = {
122
+ "cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Test"]}],
123
+ "metadata": {}, # No kernelspec
124
+ "nbformat": 4,
125
+ "nbformat_minor": 4,
126
+ }
127
+
128
+ user_id = uuid4()
129
+ notebook_json = json.dumps(minimal_notebook)
130
+
131
+ notebook = Notebook.from_ipynb_string(notebook_content=notebook_json, owner_id=user_id)
132
+
133
+ assert notebook.name == "Imported Notebook" # Fallback name
134
+
135
+ @pytest.mark.asyncio
136
+ async def test_notebook_from_ipynb_string_invalid_json(self):
137
+ """Test error handling for invalid JSON."""
138
+ user_id = uuid4()
139
+ invalid_json = "{ invalid json content"
140
+
141
+ from nbformat.reader import NotJSONError
142
+
143
+ with pytest.raises(NotJSONError):
144
+ Notebook.from_ipynb_string(notebook_content=invalid_json, owner_id=user_id)
145
+
146
+ @pytest.mark.asyncio
147
+ @patch.object(Notebook, "from_ipynb_zip_url")
148
+ async def test_create_tutorial_notebook_error_propagated(self, mock_from_zip_url, mock_session):
149
+ """Test that errors are propagated when zip fetch fails."""
150
+ user_id = uuid4()
151
+ mock_from_zip_url.side_effect = Exception("Network error")
152
+
153
+ # Should raise the exception (not catch it)
154
+ with pytest.raises(Exception, match="Network error"):
155
+ await _create_tutorial_notebook(user_id, mock_session)
156
+
157
+ # Verify error handling path was taken
158
+ mock_from_zip_url.assert_called_once()
159
+ mock_session.add.assert_not_called()
160
+ mock_session.commit.assert_not_called()
161
+
162
+ def test_generate_cell_name_code_cell(self):
163
+ """Test cell name generation for code cells."""
164
+ from nbformat.notebooknode import NotebookNode
165
+
166
+ mock_cell = NotebookNode(
167
+ {"cell_type": "code", "source": 'import pandas as pd\nprint("Hello world")'}
168
+ )
169
+
170
+ result = Notebook._generate_cell_name(mock_cell)
171
+ assert result == "Code Cell"
172
+
173
+
174
+ class TestTutorialNotebookZipFunctionality:
175
+ """Test cases for zip-based tutorial functionality."""
176
+
177
+ @pytest.mark.asyncio
178
+ async def test_notebook_from_ipynb_zip_url_missing_notebook(
179
+ self,
180
+ ):
181
+ """Test error handling when notebook file is missing from zip."""
182
+ user_id = uuid4()
183
+
184
+ with pytest.raises(
185
+ FileNotFoundError,
186
+ match="Notebook file 'super_random_tutorial_name.ipynb' not found in zip",
187
+ ):
188
+ await Notebook.from_ipynb_zip_url(
189
+ zip_url="https://github.com/topoteretes/cognee/raw/notebook_tutorial/notebooks/starter_tutorial.zip",
190
+ owner_id=user_id,
191
+ notebook_filename="super_random_tutorial_name.ipynb",
192
+ )
193
+
194
+ @pytest.mark.asyncio
195
+ async def test_notebook_from_ipynb_zip_url_download_failure(self):
196
+ """Test error handling when zip download fails."""
197
+ user_id = uuid4()
198
+ with pytest.raises(RuntimeError, match="Failed to download tutorial zip"):
199
+ await Notebook.from_ipynb_zip_url(
200
+ zip_url="https://github.com/topoteretes/cognee/raw/notebook_tutorial/notebooks/nonexistent_tutorial_name.zip",
201
+ owner_id=user_id,
202
+ )
203
+
204
+ @pytest.mark.asyncio
205
+ async def test_create_tutorial_notebook_zip_success(self, mock_session):
206
+ """Test successful tutorial notebook creation with zip."""
207
+ await cognee.prune.prune_data()
208
+ await cognee.prune.prune_system(metadata=True)
209
+
210
+ user_id = uuid4()
211
+
212
+ # Check that tutorial data directory is empty using storage-aware method
213
+ tutorial_data_dir_path = await get_tutorial_data_dir()
214
+ tutorial_data_dir = Path(tutorial_data_dir_path)
215
+ if tutorial_data_dir.exists():
216
+ assert not any(tutorial_data_dir.iterdir()), "Tutorial data directory should be empty"
217
+
218
+ await _create_tutorial_notebook(user_id, mock_session)
219
+
220
+ items = list(tutorial_data_dir.iterdir())
221
+ assert len(items) == 1, "Tutorial data directory should contain exactly one item"
222
+ assert items[0].is_dir(), "Tutorial data directory item should be a directory"
223
+
224
+ # Verify the structure inside the tutorial directory
225
+ tutorial_dir = items[0]
226
+
227
+ # Check for tutorial.ipynb file
228
+ notebook_file = tutorial_dir / "tutorial.ipynb"
229
+ assert notebook_file.exists(), f"tutorial.ipynb should exist in {tutorial_dir}"
230
+ assert notebook_file.is_file(), "tutorial.ipynb should be a file"
231
+
232
+ # Check for data subfolder with contents
233
+ data_folder = tutorial_dir / "data"
234
+ assert data_folder.exists(), f"data subfolder should exist in {tutorial_dir}"
235
+ assert data_folder.is_dir(), "data should be a directory"
236
+
237
+ data_items = list(data_folder.iterdir())
238
+ assert len(data_items) > 0, (
239
+ f"data folder should contain files, but found {len(data_items)} items"
240
+ )
241
+
242
+ @pytest.mark.asyncio
243
+ async def test_create_tutorial_notebook_with_force_refresh(self, mock_session):
244
+ """Test tutorial notebook creation with force refresh."""
245
+ await cognee.prune.prune_data()
246
+ await cognee.prune.prune_system(metadata=True)
247
+
248
+ user_id = uuid4()
249
+
250
+ # Check that tutorial data directory is empty using storage-aware method
251
+ tutorial_data_dir_path = await get_tutorial_data_dir()
252
+ tutorial_data_dir = Path(tutorial_data_dir_path)
253
+ if tutorial_data_dir.exists():
254
+ assert not any(tutorial_data_dir.iterdir()), "Tutorial data directory should be empty"
255
+
256
+ # First creation (without force refresh)
257
+ await _create_tutorial_notebook(user_id, mock_session, force_refresh=False)
258
+
259
+ items_first = list(tutorial_data_dir.iterdir())
260
+ assert len(items_first) == 1, (
261
+ "Tutorial data directory should contain exactly one item after first creation"
262
+ )
263
+ first_dir = items_first[0]
264
+ assert first_dir.is_dir(), "Tutorial data directory item should be a directory"
265
+
266
+ # Verify the structure inside the tutorial directory (first creation)
267
+ notebook_file = first_dir / "tutorial.ipynb"
268
+ assert notebook_file.exists(), f"tutorial.ipynb should exist in {first_dir}"
269
+ assert notebook_file.is_file(), "tutorial.ipynb should be a file"
270
+
271
+ data_folder = first_dir / "data"
272
+ assert data_folder.exists(), f"data subfolder should exist in {first_dir}"
273
+ assert data_folder.is_dir(), "data should be a directory"
274
+
275
+ data_items = list(data_folder.iterdir())
276
+ assert len(data_items) > 0, (
277
+ f"data folder should contain files, but found {len(data_items)} items"
278
+ )
279
+
280
+ # Capture metadata from first creation
281
+
282
+ first_creation_metadata = {}
283
+
284
+ for file_path in first_dir.rglob("*"):
285
+ if file_path.is_file():
286
+ relative_path = file_path.relative_to(first_dir)
287
+ stat = file_path.stat()
288
+
289
+ # Store multiple metadata points
290
+ with open(file_path, "rb") as f:
291
+ content = f.read()
292
+
293
+ first_creation_metadata[str(relative_path)] = {
294
+ "mtime": stat.st_mtime,
295
+ "size": stat.st_size,
296
+ "hash": hashlib.md5(content).hexdigest(),
297
+ "first_bytes": content[:100]
298
+ if content
299
+ else b"", # First 100 bytes as fingerprint
300
+ }
301
+
302
+ # Wait a moment to ensure different timestamps
303
+ time.sleep(0.1)
304
+
305
+ # Force refresh - should create new files with different metadata
306
+ await _create_tutorial_notebook(user_id, mock_session, force_refresh=True)
307
+
308
+ items_second = list(tutorial_data_dir.iterdir())
309
+ assert len(items_second) == 1, (
310
+ "Tutorial data directory should contain exactly one item after force refresh"
311
+ )
312
+ second_dir = items_second[0]
313
+
314
+ # Verify the structure is maintained after force refresh
315
+ notebook_file_second = second_dir / "tutorial.ipynb"
316
+ assert notebook_file_second.exists(), (
317
+ f"tutorial.ipynb should exist in {second_dir} after force refresh"
318
+ )
319
+ assert notebook_file_second.is_file(), "tutorial.ipynb should be a file after force refresh"
320
+
321
+ data_folder_second = second_dir / "data"
322
+ assert data_folder_second.exists(), (
323
+ f"data subfolder should exist in {second_dir} after force refresh"
324
+ )
325
+ assert data_folder_second.is_dir(), "data should be a directory after force refresh"
326
+
327
+ data_items_second = list(data_folder_second.iterdir())
328
+ assert len(data_items_second) > 0, (
329
+ f"data folder should still contain files after force refresh, but found {len(data_items_second)} items"
330
+ )
331
+
332
+ # Compare metadata to ensure files are actually different
333
+ files_with_changed_metadata = 0
334
+
335
+ for file_path in second_dir.rglob("*"):
336
+ if file_path.is_file():
337
+ relative_path = file_path.relative_to(second_dir)
338
+ relative_path_str = str(relative_path)
339
+
340
+ # File should exist from first creation
341
+ assert relative_path_str in first_creation_metadata, (
342
+ f"File {relative_path_str} missing from first creation"
343
+ )
344
+
345
+ old_metadata = first_creation_metadata[relative_path_str]
346
+
347
+ # Get new metadata
348
+ stat = file_path.stat()
349
+ with open(file_path, "rb") as f:
350
+ new_content = f.read()
351
+
352
+ new_metadata = {
353
+ "mtime": stat.st_mtime,
354
+ "size": stat.st_size,
355
+ "hash": hashlib.md5(new_content).hexdigest(),
356
+ "first_bytes": new_content[:100] if new_content else b"",
357
+ }
358
+
359
+ # Check if any metadata changed (indicating file was refreshed)
360
+ metadata_changed = (
361
+ new_metadata["mtime"] > old_metadata["mtime"] # Newer modification time
362
+ or new_metadata["hash"] != old_metadata["hash"] # Different content hash
363
+ or new_metadata["size"] != old_metadata["size"] # Different file size
364
+ or new_metadata["first_bytes"]
365
+ != old_metadata["first_bytes"] # Different content
366
+ )
367
+
368
+ if metadata_changed:
369
+ files_with_changed_metadata += 1
370
+
371
+ # Assert that force refresh actually updated files
372
+ assert files_with_changed_metadata > 0, (
373
+ f"Force refresh should have updated at least some files, but all {len(first_creation_metadata)} "
374
+ f"files appear to have identical metadata. This suggests force refresh didn't work."
375
+ )
376
+
377
+ mock_session.commit.assert_called()
378
+
379
+ @pytest.mark.asyncio
380
+ async def test_tutorial_zip_url_accessibility(self):
381
+ """Test that the actual tutorial zip URL is accessible (integration test)."""
382
+ try:
383
+ import requests
384
+
385
+ response = requests.get(
386
+ "https://github.com/topoteretes/cognee/raw/notebook_tutorial/notebooks/starter_tutorial.zip",
387
+ timeout=10,
388
+ )
389
+ response.raise_for_status()
390
+
391
+ # Verify it's a valid zip file by checking headers
392
+ assert response.headers.get("content-type") in [
393
+ "application/zip",
394
+ "application/octet-stream",
395
+ "application/x-zip-compressed",
396
+ ] or response.content.startswith(b"PK") # Zip file signature
397
+
398
+ except Exception:
399
+ pytest.skip("Network request failed or zip not available - skipping integration test")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognee
3
- Version: 0.3.4.dev1
3
+ Version: 0.3.4.dev3
4
4
  Summary: Cognee - is a library for enriching LLM context with a semantic layer for better understanding and reasoning.
5
5
  Project-URL: Homepage, https://www.cognee.ai
6
6
  Project-URL: Repository, https://github.com/topoteretes/cognee
@@ -33,6 +33,7 @@ Requires-Dist: langfuse<3,>=2.32.0
33
33
  Requires-Dist: limits<5,>=4.4.1
34
34
  Requires-Dist: litellm<2.0.0,>=1.71.0
35
35
  Requires-Dist: matplotlib<4,>=3.8.3
36
+ Requires-Dist: nbformat<6.0.0,>=5.7.0
36
37
  Requires-Dist: networkx<4,>=3.4.2
37
38
  Requires-Dist: nltk<4.0.0,>=3.9.1
38
39
  Requires-Dist: numpy<=4.0.0,>=1.26.4
@@ -1,11 +1,11 @@
1
1
  cognee/__init__.py,sha256=0KblJJ9tZI6zlsojrK9w-075uDGjDjbCGnB9tt5J0pY,1068
2
2
  cognee/__main__.py,sha256=UDwkdKir_2m9z3DtOlWKc5wdBk_8AXGyu9k6PufY9Jg,75
3
- cognee/base_config.py,sha256=safPCD_1LISzfiIl3i5TG46pXqhUgESwI0-03vPYrok,1540
3
+ cognee/base_config.py,sha256=s5syv0WwaLJzoBKqImxNAbzxwUaziZ9wCPkCIft4xyE,2451
4
4
  cognee/context_global_variables.py,sha256=X0PDjVwwB8qaDTGtdjHRzKvUo9fv4ygmxLz6g0FM9bc,2679
5
5
  cognee/get_token.py,sha256=6qrXc5P0zal6zo90gVYlZHv5g5bpic9i_J_2mAkNri0,634
6
6
  cognee/low_level.py,sha256=ffJMBQDYwXiYk_clHCCy7N7zIjJqhUUulNJ8ot4Xx0E,131
7
7
  cognee/pipelines.py,sha256=LjD3onu__-UK2v1O1UFHaJHtd6frhmZVZHKagWWu6_s,210
8
- cognee/root_dir.py,sha256=ktsvc5mjSWX2asC6uZK1PToubmREi02Sje5LQupQCVM,671
8
+ cognee/root_dir.py,sha256=hdUEVacdMOy0GBJksFciL_eW_CtXiHI6K-tL2SotHuQ,793
9
9
  cognee/version.py,sha256=isN9gXpAwkYR82cmhx-2ani8KylouByqM6iULr85Hyk,874
10
10
  cognee/api/.env.example,sha256=T3e9QDX8feK8cGBQUaRqORg1Y-1e-EFpByrvqehJqC4,265
11
11
  cognee/api/DTO.py,sha256=D-IN7PpNI6ypf7fhLif1wrsA-OV12th9B-1iTyu63qM,357
@@ -18,7 +18,7 @@ cognee/api/v1/add/add.py,sha256=cmqOlCzeRRanh1Ml6uUr5pK3LCJS-2b36E2A_Hxk3Uc,7315
18
18
  cognee/api/v1/add/routers/__init__.py,sha256=4c7wJoaUCQ7nqV_-BGYigevAL2mYORo6LFLciKtmVlU,43
19
19
  cognee/api/v1/add/routers/get_add_router.py,sha256=p1CCcinWIY7CBaFZ7NQU2HsIiv2IFHWFwthnWHiI46Q,3523
20
20
  cognee/api/v1/cloud/routers/__init__.py,sha256=eoFJLGLK0XbJdZbuX2M08OpThMxZIrmf3hT99YLBbPM,49
21
- cognee/api/v1/cloud/routers/get_checks_router.py,sha256=ymFHOKtUnl-gMKL4LQthD_oI6sl6rrxG13DgRrWtEzI,687
21
+ cognee/api/v1/cloud/routers/get_checks_router.py,sha256=IVORYxX5oG8CoESG5oyh71DQdd9EEReVdVvjpK5_AoY,686
22
22
  cognee/api/v1/cognify/__init__.py,sha256=EKVvqVlvd4MMx3dcVH3NPvxuQflcuJijo0WldrE8XqQ,29
23
23
  cognee/api/v1/cognify/code_graph_pipeline.py,sha256=gRU0GSTyYSNg-jT84pDbSH3alkFG3UNNgZOi9ZtJkCk,4107
24
24
  cognee/api/v1/cognify/cognify.py,sha256=gLLkcw1WQ1awdfoyZCdV_UzYSIaRHIBP0ltaR2W5y_w,12053
@@ -45,7 +45,7 @@ cognee/api/v1/notebooks/routers/get_notebooks_router.py,sha256=m8OH3Kw1UHF8aTP4y
45
45
  cognee/api/v1/permissions/routers/__init__.py,sha256=ljE3YnrzlMcVfThmkR5GSIxkm7sQVyibaLNtYQL4HO0,59
46
46
  cognee/api/v1/permissions/routers/get_permissions_router.py,sha256=tqd-J__UBlstTWnQocesdjVM9JnYO5rtJhhFj-Zv1_o,8316
47
47
  cognee/api/v1/prune/__init__.py,sha256=FEr5tTlX7wf3X4aFff6NPlVhNrPyqx7RBoJ71bJN1cY,25
48
- cognee/api/v1/prune/prune.py,sha256=rmH2i2k1STqxt4bsgCipqR-vgdUEgowfTzh3EgfaGsY,492
48
+ cognee/api/v1/prune/prune.py,sha256=e5Wavom90OqBoehBA4The-AUw6sCtXV2sJ1v2pdssFk,511
49
49
  cognee/api/v1/responses/__init__.py,sha256=HMs5gmses4IFGqDnadqWCkGnxIfWTRUUbJk2MolxiE4,101
50
50
  cognee/api/v1/responses/default_tools.py,sha256=6_cR9KOdN8IHMKMSMu9sT5uDL8qZzApO6TrWfkyuHrw,2309
51
51
  cognee/api/v1/responses/dispatch_function.py,sha256=LJoV618_IIqVb5JEmQKEQl6LsEgAl75P5Ejfqw0vRsU,3689
@@ -60,7 +60,7 @@ cognee/api/v1/search/routers/get_search_router.py,sha256=-5GLgHipflEblYAwl3uiPAZ
60
60
  cognee/api/v1/settings/routers/__init__.py,sha256=wj_UYAXNMPCkn6Mo1YB01dCBiV9DQwTIf6OWjnGRpf8,53
61
61
  cognee/api/v1/settings/routers/get_settings_router.py,sha256=EKVj2kw5MDKZcxAIAyi7ltz7wD6Hfs5feGrkd9R_vCA,3195
62
62
  cognee/api/v1/sync/__init__.py,sha256=hx2Af6GtX8soyHiYpWieWpAglLD05_7BK7PgdBqGbVE,313
63
- cognee/api/v1/sync/sync.py,sha256=zzCVJD1AvcSXtNsgLJr1iPMRxY6vRxGdkt7sVdJ8W2c,33905
63
+ cognee/api/v1/sync/sync.py,sha256=N-bRZJQuYeK2tffaVgRNf0hjAWFNWSFILPfuXLyvIgo,34582
64
64
  cognee/api/v1/sync/routers/__init__.py,sha256=hZArat9DDyzBll8qej0_o16QhtQRciTB37b5rc3ckGM,76
65
65
  cognee/api/v1/sync/routers/get_sync_router.py,sha256=7fD0QL0IIjyg9VBadNcLD7G7rypy_1glyWv8HVHBrao,9703
66
66
  cognee/api/v1/ui/__init__.py,sha256=SKfmAWokGT3_ZGqDkEtQihrvXCog6WTP3UdZrD20DBc,38
@@ -158,7 +158,7 @@ cognee/infrastructure/databases/graph/use_graph_adapter.py,sha256=a_T2NIhSw-cxn9
158
158
  cognee/infrastructure/databases/graph/kuzu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
159
  cognee/infrastructure/databases/graph/kuzu/adapter.py,sha256=bZav3kZwge6PEMDrgYXb3M4z8gGUuV4qIw7cv0mVIQA,68094
160
160
  cognee/infrastructure/databases/graph/kuzu/kuzu_migrate.py,sha256=SpNuvw2f8wOFVm6BXOVsiQs_5n3SZMKz4IhuuHvH2_U,10542
161
- cognee/infrastructure/databases/graph/kuzu/remote_kuzu_adapter.py,sha256=j0GOZl2yTvB_9JbulPec9gfQLoiTH-t932-uW3Ufr_0,7324
161
+ cognee/infrastructure/databases/graph/kuzu/remote_kuzu_adapter.py,sha256=lZbpkPBpqS3XbhD3v3sV1dYBolGb4iEV_1ePpl52Z6g,7517
162
162
  cognee/infrastructure/databases/graph/kuzu/show_remote_kuzu_stats.py,sha256=l5TQUORnoCusIrPNbTuNDzVvUUAMjQNak-9I8KT7N3I,1044
163
163
  cognee/infrastructure/databases/graph/memgraph/memgraph_adapter.py,sha256=eoOpDEn6lw6rVXxj00Ek3lkLjxLDLtTmQbjezMYf850,34376
164
164
  cognee/infrastructure/databases/graph/neo4j_driver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -198,7 +198,7 @@ cognee/infrastructure/databases/vector/chromadb/__init__.py,sha256=47DEQpj8HBSa-
198
198
  cognee/infrastructure/databases/vector/embeddings/EmbeddingEngine.py,sha256=boNJ55dxJQ_ImW1_DDjToQa0Hos9mkeRYwfCI7UPLn0,983
199
199
  cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py,sha256=_R3yIuDaMN2lz9JhMy6SNpZeeCRZxHA9hmSB3gOxKkA,3823
200
200
  cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py,sha256=XUZnVftE57qWlAebr99aOEg-FynMKB7IS-kmBBT8E5Y,7544
201
- cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py,sha256=uR9ItOYN0ySsnPrmHGaoLGjiKJcFF-88KMwbtH6j0DU,4173
201
+ cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py,sha256=nBA9XaKkOvDRg_ud9oFejD6FpCH0TTEVQbTxBHaRFaY,4358
202
202
  cognee/infrastructure/databases/vector/embeddings/__init__.py,sha256=Akv-ShdXjHw-BE00Gw55GgGxIMr0SZ9FHi3RlpsJmiE,55
203
203
  cognee/infrastructure/databases/vector/embeddings/config.py,sha256=s9acnhn1DLFggCNJMVcN9AxruMf3J00O_R--JVGqMNs,2221
204
204
  cognee/infrastructure/databases/vector/embeddings/embedding_rate_limiter.py,sha256=TyCoo_SipQ6JNy5eqXY2shrZnhb2JVjt9xOsJltOCdw,17598
@@ -227,9 +227,9 @@ cognee/infrastructure/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
227
227
  cognee/infrastructure/files/__init__.py,sha256=j1cLINAadEfM0yDe1Rq-klWu25jRHvEFJsaU5kqfElc,69
228
228
  cognee/infrastructure/files/exceptions.py,sha256=bXRG_AIp_bQ3uVNsyiIHoT2i43Vt8Bsk0o4nQxmhLKo,388
229
229
  cognee/infrastructure/files/storage/FileBufferedReader.py,sha256=j0NGfk4GVgCPvWHWePHmJ8cJ_Bu4AgK2BetnGX2aB0o,360
230
- cognee/infrastructure/files/storage/LocalFileStorage.py,sha256=Bd6go8qC9bXBRUT-oLo-PQmxI5I9UiIeeBqxU66BhO4,9835
231
- cognee/infrastructure/files/storage/S3FileStorage.py,sha256=Nxph8kOV_rafCB7wrfgjb4uwqWC8_wu_DosuzCKqnWM,7876
232
- cognee/infrastructure/files/storage/StorageManager.py,sha256=kYlKxEUO_21vSBcSeO0OlR9QdkPWmZcm0vuNR7Oo75A,4946
230
+ cognee/infrastructure/files/storage/LocalFileStorage.py,sha256=QGbttdjXeJkfIjhBElh7KJEytVyJFwDxSz2AzUFqEFM,11771
231
+ cognee/infrastructure/files/storage/S3FileStorage.py,sha256=2ZKUFzIyOSyM7XAZD6hs13dj-74ylR7zL6Eptp0hSbY,9904
232
+ cognee/infrastructure/files/storage/StorageManager.py,sha256=IAReStvUA5cQIaxTamSp92yFvvnaPHIpUkRZNCCiWNM,5643
233
233
  cognee/infrastructure/files/storage/__init__.py,sha256=M4QOn-jddfTWzaeZ6UxD4GMScf-DJpwDaNv80Olk0pM,141
234
234
  cognee/infrastructure/files/storage/config.py,sha256=uoI3--AEM_s82hlu8FA4anDE2WzR4Zx9bvS9BEj-CXs,107
235
235
  cognee/infrastructure/files/storage/get_file_storage.py,sha256=yf91iWBtWGAlhQ1TjR0wrs7nduytb-bLJuFL4gv7uVM,797
@@ -377,13 +377,13 @@ cognee/modules/cloud/exceptions/CloudApiKeyMissingError.py,sha256=kFmTLGSxFTfiZS
377
377
  cognee/modules/cloud/exceptions/CloudConnectionError.py,sha256=FBy-CEwitOxnQnRXlV5tT1FrKT8MzfpperivP6Pw0C0,527
378
378
  cognee/modules/cloud/exceptions/__init__.py,sha256=HpgBbUFJsSAl6-xWN6wF6c5iMdp2Gm34Nr_ThX7Mljw,116
379
379
  cognee/modules/cloud/operations/__init__.py,sha256=sg1lEtgTnNobMLqzfaMbpX4xpepeYQnEh-biEfX41WQ,41
380
- cognee/modules/cloud/operations/check_api_key.py,sha256=KkAC4egW7ZGgrWu852oGOwkCPzhXq4DpwNCQf1M_04I,824
380
+ cognee/modules/cloud/operations/check_api_key.py,sha256=qfu1WijhoNTlNRqxI1Q1MV_hrO9EDroVsShBLfr_MiU,1009
381
381
  cognee/modules/cognify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
382
382
  cognee/modules/cognify/config.py,sha256=Neh-uOnFr8WgOe3GO7NFAX65E0ZwEiSD0JoLsKEsEhg,683
383
383
  cognee/modules/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
384
384
  cognee/modules/data/deletion/__init__.py,sha256=bEOcuz1MPPd7Cqqwd7B4B22Xa81oYdUOTombamtto8g,74
385
385
  cognee/modules/data/deletion/prune_data.py,sha256=Aus7o3PDJPEaTh2u0yCHkT92rEesS0NRu12vwBE2D_s,278
386
- cognee/modules/data/deletion/prune_system.py,sha256=4o5yb5jrs6UR09-iEINB_eGOA8_0ZgUl0ZDOYYkuj4A,600
386
+ cognee/modules/data/deletion/prune_system.py,sha256=5uR75qLvy__5CX5aQZpQRfC_W9BiT7pPXE-DX3BojBI,701
387
387
  cognee/modules/data/exceptions/__init__.py,sha256=8eKBra_q0CcaShB6jca-EM1gLTMRXxc9iWAJCyoFqXs,266
388
388
  cognee/modules/data/exceptions/exceptions.py,sha256=fYdHFXwOGQAyTcJGbvrtZjTGb4ipnwh2FK5CPHxiZlE,1720
389
389
  cognee/modules/data/methods/__init__.py,sha256=o_H5bkTu626ttisr2rZzdFFepCR9RVr6lpF_GUCR7_8,869
@@ -481,12 +481,12 @@ cognee/modules/memify/memify.py,sha256=EFPaFpUm6gCz4pV3E49gUeeiuRBf28EXSeytd-aPx
481
481
  cognee/modules/metrics/operations/__init__.py,sha256=MZ3xbVdfEKqfLct8WnbyFVyZmkBfl-77GoBQgktilUM,63
482
482
  cognee/modules/metrics/operations/get_pipeline_run_metrics.py,sha256=upIWnzKeJT1_XbL_ABdGxW-Ai7mO3AqMK35BNmItIQQ,2434
483
483
  cognee/modules/notebooks/methods/__init__.py,sha256=IhY4fUVPJbuvS83QESsWzjZRC6oC1I-kJi5gr3kPTLk,215
484
- cognee/modules/notebooks/methods/create_notebook.py,sha256=S41H3Rha0pj9dEKFy1nBG9atTGHhUdOmDZgr0ckUA6M,633
484
+ cognee/modules/notebooks/methods/create_notebook.py,sha256=3gOVaEE7WOAZ6pLx1TvsjFtE1Eo3vKdA9YHQuwAc0qQ,1700
485
485
  cognee/modules/notebooks/methods/delete_notebook.py,sha256=BKxoRlPzkwXvTYh5WcF-zo_iVmaXqEiptS42JwB0KQU,309
486
486
  cognee/modules/notebooks/methods/get_notebook.py,sha256=IP4imsdt9X6GYd6i6WF6PlVhotGNH0i7XZpPqbtqMwo,554
487
487
  cognee/modules/notebooks/methods/get_notebooks.py,sha256=ee40ALHvebVORuwZVkQ271qAj260rrYy6eVGxAmfo8c,483
488
488
  cognee/modules/notebooks/methods/update_notebook.py,sha256=MnZbfh-WfEfH3ImNvyQNhDeNwpYeS7p8FPVwnmBvZVg,361
489
- cognee/modules/notebooks/models/Notebook.py,sha256=Jth47QxJQ2-VGPyIcS0ul3bS8bgGrk9vCGoJVagxanw,1690
489
+ cognee/modules/notebooks/models/Notebook.py,sha256=jr25KxLuf-P679e4TrjIQNLPjv0W0MBeV_8YHRfwljw,9740
490
490
  cognee/modules/notebooks/models/__init__.py,sha256=jldsDjwRvFMreGpe4wxxr5TlFXTZuU7rbsRkGQvTO5s,45
491
491
  cognee/modules/notebooks/operations/__init__.py,sha256=VR_2w_d0lEiJ5Xw7_mboo2qWUv0umrR_Bp58MaMoE6w,55
492
492
  cognee/modules/notebooks/operations/run_in_local_sandbox.py,sha256=17hMEQC3LZTfPvbRUrPN9SzDeJPWSTq_BAhtwRZiqT8,1338
@@ -556,7 +556,7 @@ cognee/modules/retrieval/graph_summary_completion_retriever.py,sha256=3AMisk3fOb
556
556
  cognee/modules/retrieval/insights_retriever.py,sha256=1pcYd34EfKk85MSPFQ8b-ZbSARmnauks8TxXfNOxvOw,4953
557
557
  cognee/modules/retrieval/natural_language_retriever.py,sha256=zJz35zRmBP8-pRlkoxxSxn3-jtG2lUW0xcu58bq9Ebs,5761
558
558
  cognee/modules/retrieval/summaries_retriever.py,sha256=joXYphypACm2JiCjbC8nBS61m1q2oYkzyIt9bdgALNw,3384
559
- cognee/modules/retrieval/temporal_retriever.py,sha256=EUEYN94LpoWfbPjsToe_pC3rFsUUTIPA5K6wNjv8Nds,5685
559
+ cognee/modules/retrieval/temporal_retriever.py,sha256=wqDpEdIuLkLUJcQzAhkrx3GY5lQCkilOFbBFG9WOlOM,5687
560
560
  cognee/modules/retrieval/user_qa_feedback.py,sha256=-VEOsE_t0FiTy00OpOMWAYv12YSLPieAcMsu82vm7h4,3366
561
561
  cognee/modules/retrieval/context_providers/DummyContextProvider.py,sha256=9GsvINc7ekRyRWO5IefFGyytRYqsSlhpwAOw6Q691cA,419
562
562
  cognee/modules/retrieval/context_providers/SummarizedTripletSearchContextProvider.py,sha256=ypO6yWLxvmRsj_5dyYdvXTbztJmB_ioLrgyG6bF5WGA,894
@@ -625,7 +625,7 @@ cognee/modules/users/exceptions/__init__.py,sha256=wDaNSgJtRXA8xMw3qhPX3FS8dFOz4
625
625
  cognee/modules/users/exceptions/exceptions.py,sha256=J4xBeR0VtKMpr8sQwHD2BOWSzBfPdUn700Z0bFCBxwM,1639
626
626
  cognee/modules/users/methods/__init__.py,sha256=1J0g3-WracmU-1wruczdFirpJuRmJdd-MNtMQl8tiSY,350
627
627
  cognee/modules/users/methods/create_default_user.py,sha256=MRdbYof0NJZARO6t3wUr0hw6Kk0lJ_aE3kOvGy9HbW8,555
628
- cognee/modules/users/methods/create_user.py,sha256=IJCw95rA-TlWUQkihX1YxJ7TUfDNolUjaYdFsRTQbSA,3686
628
+ cognee/modules/users/methods/create_user.py,sha256=2xA-6YngXQJVwkkatuNP3wse29EuZMy84Ul1TjTZwYY,2788
629
629
  cognee/modules/users/methods/delete_user.py,sha256=B7NJz_ar4jLhfr2QbNsruUg-LNSoT6MYYG6OF72GNcg,758
630
630
  cognee/modules/users/methods/get_authenticated_user.py,sha256=V0WdCsUK7RAMfH46sthdyOZbTtoQ-0AHP0fh868NK7A,1554
631
631
  cognee/modules/users/methods/get_default_user.py,sha256=UHxy5htJypsIQv37KrMtODiQrc-Cjp9ojzU1o8ThDRo,1771
@@ -672,10 +672,11 @@ cognee/shared/GithubClassification.py,sha256=3B-CghZ6F3hDrwoKBtJ83Zr0AyLcnLQZn6O
672
672
  cognee/shared/GithubTopology.py,sha256=eYFF4oBjqRPMnH2ufu3bo2_HGElXQTZ0aH4vQD9-l2c,975
673
673
  cognee/shared/SourceCodeGraph.py,sha256=9j3vIiatAP6tEA_0CPQ__y2huTFhvuSNKcFhGYeAm_4,2088
674
674
  cognee/shared/__init__.py,sha256=2V1IwCRt4hY5KIsnK9oMj8-MaiiK-i3QD18FJYlIjP4,154
675
+ cognee/shared/cache.py,sha256=VZEA-nEXkdkF0nRAYp_Fe1ntoL7OjyFFbyXassaJL-c,13923
675
676
  cognee/shared/data_models.py,sha256=T_Vsjy7Gvf_3_NUxS-7tSc-nRyOmLGFAaSO2w7Ns6J8,10631
676
677
  cognee/shared/encode_uuid.py,sha256=-EVtObzdnhSXKb5gz-SH1abicaaeiJ2rqcrLMr8V_cs,366
677
678
  cognee/shared/logging_utils.py,sha256=xzUo8mMfD_8t8mcJyENKxWvrtd5UGFJMltw_LW5RA2s,20368
678
- cognee/shared/utils.py,sha256=1pNTlMcrfchiAobyXdLsu6M1wm2nXPMg0qsN5yK4XqU,55185
679
+ cognee/shared/utils.py,sha256=lvhS4_IMyVIUWdNC1SYtatSP9m0tuh_unZn1YBg36lQ,55534
679
680
  cognee/shared/exceptions/__init__.py,sha256=NNi2QcqIxj8tZNuQP5FC-kJCw1e5jcRaoQAmkQEpyjM,179
680
681
  cognee/shared/exceptions/exceptions.py,sha256=-sCKV-NReNDLSa98iZqT22s2rUfk0geMGJVsYRyzy3Q,361
681
682
  cognee/tasks/chunk_naive_llm_classifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -728,7 +729,7 @@ cognee/tasks/ingestion/get_dlt_destination.py,sha256=vzky_-TFlnaREbdbndAkXwwlb-0
728
729
  cognee/tasks/ingestion/ingest_data.py,sha256=AWdQ5YKzYZB4nkra1Zm5SJ0F-bXOcsnLdpp83eAX68w,8280
729
730
  cognee/tasks/ingestion/migrate_relational_database.py,sha256=dbHu7TAMjq9zH69bT9q1ziQwXCoZ-VvJY5uY5aer0nc,10260
730
731
  cognee/tasks/ingestion/resolve_data_directories.py,sha256=Q8wDNY62S9Rutj5EHYe7nB51p6BonUIsm7E_ZBy7WpY,3251
731
- cognee/tasks/ingestion/save_data_item_to_storage.py,sha256=zJXRqe0icmSh0tL8qQ5-snMAOeifN5bD_Oqz6_YNg0g,3424
732
+ cognee/tasks/ingestion/save_data_item_to_storage.py,sha256=NHkKUPEnoyoplOO5yMcKM-L_P6_ww-2zmGs0mkd23yE,3457
732
733
  cognee/tasks/ingestion/transform_data.py,sha256=cbI1FX86-Ft3pGRRHedjarXst9TR7O9ce39bYRhbf2Y,1506
733
734
  cognee/tasks/ingestion/exceptions/__init__.py,sha256=GhFSvM6ChVsm16b-zaCkbluH9zCX72Wy-QLyMXyEAe4,240
734
735
  cognee/tasks/ingestion/exceptions/exceptions.py,sha256=3wgLiK4G77nMc95-STtqs3LPWcRtzH_bDamikG4uyD0,385
@@ -865,6 +866,7 @@ cognee/tests/unit/modules/retrieval/temporal_retriever_test.py,sha256=bvGvJgq9JF
865
866
  cognee/tests/unit/modules/retriever/test_description_to_codepart_search.py,sha256=oayCbXQtvmTnlgOuR67w_r278TGMEv-puaTR_jI6weo,4164
866
867
  cognee/tests/unit/modules/users/__init__.py,sha256=SkGMpbXemeX0834-eUj14VuNlZgtOGMxk0C-r-jSsnU,37
867
868
  cognee/tests/unit/modules/users/test_conditional_authentication.py,sha256=KfPWLMbPpbm3stg7LxIaK5cWVPZVEhMaxPX5s6grLw8,11120
869
+ cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py,sha256=M_NXBSLr-U7MqKtHiERMRzI7pWRm0CywZYzFUwKYV0w,16028
868
870
  cognee/tests/unit/modules/visualization/visualization_test.py,sha256=JuNsyqAbEWgO5QZP1lCE0_MDQDJ75WhXLXPyat0mhVw,929
869
871
  cognee/tests/unit/processing/chunks/chunk_by_paragraph_2_test.py,sha256=KGZZq1cMgn-im9hgfeNW74zobSLSOwuzQKzwNBmW6sM,2487
870
872
  cognee/tests/unit/processing/chunks/chunk_by_paragraph_test.py,sha256=GRLoeusPg-jzaSLXhZv0zNpmt8gd5vNrCYCAzR5W1TE,2658
@@ -889,9 +891,9 @@ distributed/tasks/queued_add_edges.py,sha256=kz1DHE05y-kNHORQJjYWHUi6Q1QWUp_v3Dl
889
891
  distributed/tasks/queued_add_nodes.py,sha256=aqK4Ij--ADwUWknxYpiwbYrpa6CcvFfqHWbUZW4Kh3A,452
890
892
  distributed/workers/data_point_saving_worker.py,sha256=jFmA0-P_0Ru2IUDrSug0wML-5goAKrGtlBm5BA5Ryw4,3229
891
893
  distributed/workers/graph_saving_worker.py,sha256=oUYl99CdhlrPAIsUOHbHnS3d4XhGoV0_OIbCO8wYzRg,3648
892
- cognee-0.3.4.dev1.dist-info/METADATA,sha256=6bowgjMT-6oiTpzQfG_eEjB3vtlxkwyu0bJeUmqbsYU,15097
893
- cognee-0.3.4.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
894
- cognee-0.3.4.dev1.dist-info/entry_points.txt,sha256=GCCTsNg8gzOJkolq7dR7OK1VlIAO202dGDnMI8nm8oQ,55
895
- cognee-0.3.4.dev1.dist-info/licenses/LICENSE,sha256=pHHjSQj1DD8SDppW88MMs04TPk7eAanL1c5xj8NY7NQ,11344
896
- cognee-0.3.4.dev1.dist-info/licenses/NOTICE.md,sha256=6L3saP3kSpcingOxDh-SGjMS8GY79Rlh2dBNLaO0o5c,339
897
- cognee-0.3.4.dev1.dist-info/RECORD,,
894
+ cognee-0.3.4.dev3.dist-info/METADATA,sha256=LmGc7VycRZe5MVrtkla4l4YVK62TUhY5E6vjAOZe0oI,15135
895
+ cognee-0.3.4.dev3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
896
+ cognee-0.3.4.dev3.dist-info/entry_points.txt,sha256=GCCTsNg8gzOJkolq7dR7OK1VlIAO202dGDnMI8nm8oQ,55
897
+ cognee-0.3.4.dev3.dist-info/licenses/LICENSE,sha256=pHHjSQj1DD8SDppW88MMs04TPk7eAanL1c5xj8NY7NQ,11344
898
+ cognee-0.3.4.dev3.dist-info/licenses/NOTICE.md,sha256=6L3saP3kSpcingOxDh-SGjMS8GY79Rlh2dBNLaO0o5c,339
899
+ cognee-0.3.4.dev3.dist-info/RECORD,,