cognee 0.3.4.dev2__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.
- cognee/api/v1/prune/prune.py +2 -2
- cognee/api/v1/sync/sync.py +16 -5
- cognee/base_config.py +15 -0
- cognee/infrastructure/databases/graph/kuzu/remote_kuzu_adapter.py +4 -1
- cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +4 -1
- cognee/infrastructure/files/storage/LocalFileStorage.py +50 -0
- cognee/infrastructure/files/storage/S3FileStorage.py +56 -9
- cognee/infrastructure/files/storage/StorageManager.py +18 -0
- cognee/modules/cloud/operations/check_api_key.py +4 -1
- cognee/modules/data/deletion/prune_system.py +5 -1
- cognee/modules/notebooks/methods/create_notebook.py +32 -0
- cognee/modules/notebooks/models/Notebook.py +206 -1
- cognee/modules/users/methods/create_user.py +5 -23
- cognee/shared/cache.py +346 -0
- cognee/shared/utils.py +12 -0
- cognee/tasks/ingestion/save_data_item_to_storage.py +1 -0
- cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py +399 -0
- {cognee-0.3.4.dev2.dist-info → cognee-0.3.4.dev3.dist-info}/METADATA +2 -1
- {cognee-0.3.4.dev2.dist-info → cognee-0.3.4.dev3.dist-info}/RECORD +23 -21
- {cognee-0.3.4.dev2.dist-info → cognee-0.3.4.dev3.dist-info}/WHEEL +0 -0
- {cognee-0.3.4.dev2.dist-info → cognee-0.3.4.dev3.dist-info}/entry_points.txt +0 -0
- {cognee-0.3.4.dev2.dist-info → cognee-0.3.4.dev3.dist-info}/licenses/LICENSE +0 -0
- {cognee-0.3.4.dev2.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.
|
|
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,6 +1,6 @@
|
|
|
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=
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
231
|
-
cognee/infrastructure/files/storage/S3FileStorage.py,sha256=
|
|
232
|
-
cognee/infrastructure/files/storage/StorageManager.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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.
|
|
893
|
-
cognee-0.3.4.
|
|
894
|
-
cognee-0.3.4.
|
|
895
|
-
cognee-0.3.4.
|
|
896
|
-
cognee-0.3.4.
|
|
897
|
-
cognee-0.3.4.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|