cognee 0.3.1__py3-none-any.whl → 0.3.3__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 (41) hide show
  1. cognee/api/v1/notebooks/routers/get_notebooks_router.py +2 -1
  2. cognee/api/v1/search/routers/get_search_router.py +3 -3
  3. cognee/api/v1/ui/ui.py +116 -21
  4. cognee/cli/_cognee.py +27 -18
  5. cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +2 -2
  6. cognee/infrastructure/databases/vector/config.py +1 -1
  7. cognee/infrastructure/utils/run_async.py +9 -4
  8. cognee/infrastructure/utils/run_sync.py +4 -3
  9. cognee/modules/notebooks/methods/create_tutorial_notebook.py +92 -0
  10. cognee/modules/notebooks/methods/get_notebook.py +2 -2
  11. cognee/modules/notebooks/methods/update_notebook.py +0 -1
  12. cognee/modules/notebooks/operations/run_in_local_sandbox.py +8 -5
  13. cognee/modules/retrieval/graph_completion_context_extension_retriever.py +2 -2
  14. cognee/modules/retrieval/graph_completion_cot_retriever.py +2 -2
  15. cognee/modules/retrieval/graph_completion_retriever.py +2 -2
  16. cognee/modules/retrieval/insights_retriever.py +12 -11
  17. cognee/modules/retrieval/temporal_retriever.py +2 -2
  18. cognee/modules/retrieval/user_qa_feedback.py +1 -1
  19. cognee/modules/search/methods/search.py +31 -8
  20. cognee/modules/search/utils/prepare_search_result.py +4 -4
  21. cognee/tests/test_permissions.py +3 -3
  22. cognee/tests/test_relational_db_migration.py +3 -5
  23. cognee/tests/test_search_db.py +10 -7
  24. cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +12 -6
  25. cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +12 -6
  26. cognee/tests/unit/modules/retrieval/insights_retriever_test.py +2 -4
  27. {cognee-0.3.1.dist-info → cognee-0.3.3.dist-info}/METADATA +1 -1
  28. {cognee-0.3.1.dist-info → cognee-0.3.3.dist-info}/RECORD +40 -39
  29. cognee-0.3.3.dist-info/entry_points.txt +2 -0
  30. cognee-0.3.1.dist-info/entry_points.txt +0 -2
  31. /cognee/tests/{integration/cli → cli_tests/cli_integration_tests}/__init__.py +0 -0
  32. /cognee/tests/{integration/cli → cli_tests/cli_integration_tests}/test_cli_integration.py +0 -0
  33. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/__init__.py +0 -0
  34. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/test_cli_commands.py +0 -0
  35. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/test_cli_edge_cases.py +0 -0
  36. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/test_cli_main.py +0 -0
  37. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/test_cli_runner.py +0 -0
  38. /cognee/tests/{unit/cli → cli_tests/cli_unit_tests}/test_cli_utils.py +0 -0
  39. {cognee-0.3.1.dist-info → cognee-0.3.3.dist-info}/WHEEL +0 -0
  40. {cognee-0.3.1.dist-info → cognee-0.3.3.dist-info}/licenses/LICENSE +0 -0
  41. {cognee-0.3.1.dist-info → cognee-0.3.3.dist-info}/licenses/NOTICE.md +0 -0
@@ -31,7 +31,8 @@ def get_notebooks_router():
31
31
 
32
32
  @router.get("")
33
33
  async def get_notebooks_endpoint(user: User = Depends(get_authenticated_user)):
34
- return await get_notebooks(user.id)
34
+ async with get_async_session() as session:
35
+ return await get_notebooks(user.id, session)
35
36
 
36
37
  @router.post("")
37
38
  async def create_notebook_endpoint(
@@ -1,12 +1,12 @@
1
1
  from uuid import UUID
2
- from typing import Optional
2
+ from typing import Optional, Union, List, Any
3
3
  from datetime import datetime
4
4
  from pydantic import Field
5
5
  from fastapi import Depends, APIRouter
6
6
  from fastapi.responses import JSONResponse
7
7
  from fastapi.encoders import jsonable_encoder
8
8
 
9
- from cognee.modules.search.types import SearchType
9
+ from cognee.modules.search.types import SearchType, SearchResult, CombinedSearchResult
10
10
  from cognee.api.DTO import InDTO, OutDTO
11
11
  from cognee.modules.users.exceptions.exceptions import PermissionDeniedError
12
12
  from cognee.modules.users.models import User
@@ -73,7 +73,7 @@ def get_search_router() -> APIRouter:
73
73
  except Exception as error:
74
74
  return JSONResponse(status_code=500, content={"error": str(error)})
75
75
 
76
- @router.post("", response_model=list)
76
+ @router.post("", response_model=Union[List[SearchResult], CombinedSearchResult, List])
77
77
  async def search(payload: SearchPayloadDTO, user: User = Depends(get_authenticated_user)):
78
78
  """
79
79
  Search for nodes in the graph database.
cognee/api/v1/ui/ui.py CHANGED
@@ -7,7 +7,7 @@ import webbrowser
7
7
  import zipfile
8
8
  import requests
9
9
  from pathlib import Path
10
- from typing import Optional, Tuple
10
+ from typing import Callable, Optional, Tuple
11
11
  import tempfile
12
12
  import shutil
13
13
 
@@ -326,38 +326,93 @@ def prompt_user_for_download() -> bool:
326
326
 
327
327
 
328
328
  def start_ui(
329
+ pid_callback: Callable[[int], None],
329
330
  host: str = "localhost",
330
331
  port: int = 3000,
331
332
  open_browser: bool = True,
332
333
  auto_download: bool = False,
334
+ start_backend: bool = False,
335
+ backend_host: str = "localhost",
336
+ backend_port: int = 8000,
333
337
  ) -> Optional[subprocess.Popen]:
334
338
  """
335
- Start the cognee frontend UI server.
339
+ Start the cognee frontend UI server, optionally with the backend API server.
336
340
 
337
341
  This function will:
338
- 1. Find the cognee-frontend directory (development) or download it (pip install)
339
- 2. Check if Node.js and npm are available (for development mode)
340
- 3. Install dependencies if needed (development mode)
341
- 4. Start the appropriate server
342
- 5. Optionally open the browser
342
+ 1. Optionally start the cognee backend API server
343
+ 2. Find the cognee-frontend directory (development) or download it (pip install)
344
+ 3. Check if Node.js and npm are available (for development mode)
345
+ 4. Install dependencies if needed (development mode)
346
+ 5. Start the frontend server
347
+ 6. Optionally open the browser
343
348
 
344
349
  Args:
345
- host: Host to bind the server to (default: localhost)
346
- port: Port to run the server on (default: 3000)
350
+ pid_callback: Callback to notify with PID of each spawned process
351
+ host: Host to bind the frontend server to (default: localhost)
352
+ port: Port to run the frontend server on (default: 3000)
347
353
  open_browser: Whether to open the browser automatically (default: True)
348
354
  auto_download: If True, download frontend without prompting (default: False)
355
+ start_backend: If True, also start the cognee API backend server (default: False)
356
+ backend_host: Host to bind the backend server to (default: localhost)
357
+ backend_port: Port to run the backend server on (default: 8000)
349
358
 
350
359
  Returns:
351
- subprocess.Popen object representing the running server, or None if failed
360
+ subprocess.Popen object representing the running frontend server, or None if failed
361
+ Note: If backend is started, it runs in a separate process that will be cleaned up
362
+ when the frontend process is terminated.
352
363
 
353
364
  Example:
354
365
  >>> import cognee
366
+ >>> # Start just the frontend
355
367
  >>> server = cognee.start_ui()
368
+ >>>
369
+ >>> # Start both frontend and backend
370
+ >>> server = cognee.start_ui(start_backend=True)
356
371
  >>> # UI will be available at http://localhost:3000
357
- >>> # To stop the server later:
372
+ >>> # API will be available at http://localhost:8000
373
+ >>> # To stop both servers later:
358
374
  >>> server.terminate()
359
375
  """
360
376
  logger.info("Starting cognee UI...")
377
+ backend_process = None
378
+
379
+ # Start backend server if requested
380
+ if start_backend:
381
+ logger.info("Starting cognee backend API server...")
382
+ try:
383
+ import sys
384
+
385
+ backend_process = subprocess.Popen(
386
+ [
387
+ sys.executable,
388
+ "-m",
389
+ "uvicorn",
390
+ "cognee.api.client:app",
391
+ "--host",
392
+ backend_host,
393
+ "--port",
394
+ str(backend_port),
395
+ ],
396
+ # Inherit stdout/stderr from parent process to show logs
397
+ stdout=None,
398
+ stderr=None,
399
+ preexec_fn=os.setsid if hasattr(os, "setsid") else None,
400
+ )
401
+
402
+ pid_callback(backend_process.pid)
403
+
404
+ # Give the backend a moment to start
405
+ time.sleep(2)
406
+
407
+ if backend_process.poll() is not None:
408
+ logger.error("Backend server failed to start - process exited early")
409
+ return None
410
+
411
+ logger.info(f"✓ Backend API started at http://{backend_host}:{backend_port}")
412
+
413
+ except Exception as e:
414
+ logger.error(f"Failed to start backend server: {str(e)}")
415
+ return None
361
416
 
362
417
  # Find frontend directory
363
418
  frontend_path = find_frontend_path()
@@ -406,7 +461,7 @@ def start_ui(
406
461
  logger.info("This may take a moment to compile and start...")
407
462
 
408
463
  try:
409
- # Use process group to ensure all child processes get terminated together
464
+ # Create frontend in its own process group for clean termination
410
465
  process = subprocess.Popen(
411
466
  ["npm", "run", "dev"],
412
467
  cwd=frontend_path,
@@ -414,11 +469,11 @@ def start_ui(
414
469
  stdout=subprocess.PIPE,
415
470
  stderr=subprocess.PIPE,
416
471
  text=True,
417
- preexec_fn=os.setsid
418
- if hasattr(os, "setsid")
419
- else None, # Create new process group on Unix
472
+ preexec_fn=os.setsid if hasattr(os, "setsid") else None,
420
473
  )
421
474
 
475
+ pid_callback(process.pid)
476
+
422
477
  # Give it a moment to start up
423
478
  time.sleep(3)
424
479
 
@@ -447,16 +502,32 @@ def start_ui(
447
502
  logger.info(f"✓ Open your browser to: http://{host}:{port}")
448
503
  logger.info("✓ The UI will be available once Next.js finishes compiling")
449
504
 
505
+ # Store backend process reference in the frontend process for cleanup
506
+ if backend_process:
507
+ process._cognee_backend_process = backend_process
508
+
450
509
  return process
451
510
 
452
511
  except Exception as e:
453
512
  logger.error(f"Failed to start frontend server: {str(e)}")
513
+ # Clean up backend process if it was started
514
+ if backend_process:
515
+ logger.info("Cleaning up backend process due to frontend failure...")
516
+ try:
517
+ backend_process.terminate()
518
+ backend_process.wait(timeout=5)
519
+ except (subprocess.TimeoutExpired, OSError, ProcessLookupError):
520
+ try:
521
+ backend_process.kill()
522
+ backend_process.wait()
523
+ except (OSError, ProcessLookupError):
524
+ pass
454
525
  return None
455
526
 
456
527
 
457
528
  def stop_ui(process: subprocess.Popen) -> bool:
458
529
  """
459
- Stop a running UI server process and all its children.
530
+ Stop a running UI server process and backend process (if started), along with all their children.
460
531
 
461
532
  Args:
462
533
  process: The subprocess.Popen object returned by start_ui()
@@ -467,7 +538,29 @@ def stop_ui(process: subprocess.Popen) -> bool:
467
538
  if not process:
468
539
  return False
469
540
 
541
+ success = True
542
+
470
543
  try:
544
+ # First, stop the backend process if it exists
545
+ backend_process = getattr(process, "_cognee_backend_process", None)
546
+ if backend_process:
547
+ logger.info("Stopping backend server...")
548
+ try:
549
+ backend_process.terminate()
550
+ try:
551
+ backend_process.wait(timeout=5)
552
+ logger.info("Backend server stopped gracefully")
553
+ except subprocess.TimeoutExpired:
554
+ logger.warning("Backend didn't terminate gracefully, forcing kill")
555
+ backend_process.kill()
556
+ backend_process.wait()
557
+ logger.info("Backend server stopped")
558
+ except Exception as e:
559
+ logger.error(f"Error stopping backend server: {str(e)}")
560
+ success = False
561
+
562
+ # Now stop the frontend process
563
+ logger.info("Stopping frontend server...")
471
564
  # Try to terminate the process group (includes child processes like Next.js)
472
565
  if hasattr(os, "killpg"):
473
566
  try:
@@ -484,9 +577,9 @@ def stop_ui(process: subprocess.Popen) -> bool:
484
577
 
485
578
  try:
486
579
  process.wait(timeout=10)
487
- logger.info("UI server stopped gracefully")
580
+ logger.info("Frontend server stopped gracefully")
488
581
  except subprocess.TimeoutExpired:
489
- logger.warning("Process didn't terminate gracefully, forcing kill")
582
+ logger.warning("Frontend didn't terminate gracefully, forcing kill")
490
583
 
491
584
  # Force kill the process group
492
585
  if hasattr(os, "killpg"):
@@ -502,11 +595,13 @@ def stop_ui(process: subprocess.Popen) -> bool:
502
595
 
503
596
  process.wait()
504
597
 
505
- logger.info("UI server stopped")
506
- return True
598
+ if success:
599
+ logger.info("UI servers stopped successfully")
600
+
601
+ return success
507
602
 
508
603
  except Exception as e:
509
- logger.error(f"Error stopping UI server: {str(e)}")
604
+ logger.error(f"Error stopping UI servers: {str(e)}")
510
605
  return False
511
606
 
512
607
 
cognee/cli/_cognee.py CHANGED
@@ -174,30 +174,23 @@ def main() -> int:
174
174
 
175
175
  # Handle UI flag
176
176
  if hasattr(args, "start_ui") and args.start_ui:
177
- server_process = None
177
+ spawned_pids = []
178
178
 
179
179
  def signal_handler(signum, frame):
180
180
  """Handle Ctrl+C and other termination signals"""
181
- nonlocal server_process
181
+ nonlocal spawned_pids
182
182
  fmt.echo("\nShutting down UI server...")
183
- if server_process:
183
+
184
+ for pid in spawned_pids:
184
185
  try:
185
- # Try graceful termination first
186
- server_process.terminate()
187
- try:
188
- server_process.wait(timeout=5)
189
- fmt.success("UI server stopped gracefully.")
190
- except subprocess.TimeoutExpired:
191
- # If graceful termination fails, force kill
192
- fmt.echo("Force stopping UI server...")
193
- server_process.kill()
194
- server_process.wait()
195
- fmt.success("UI server stopped.")
196
- except Exception as e:
197
- fmt.warning(f"Error stopping server: {e}")
186
+ pgid = os.getpgid(pid)
187
+ os.killpg(pgid, signal.SIGTERM)
188
+ fmt.success(f"✓ Process group {pgid} (PID {pid}) terminated.")
189
+ except (OSError, ProcessLookupError) as e:
190
+ fmt.warning(f"Could not terminate process {pid}: {e}")
191
+
198
192
  sys.exit(0)
199
193
 
200
- # Set up signal handlers
201
194
  signal.signal(signal.SIGINT, signal_handler) # Ctrl+C
202
195
  signal.signal(signal.SIGTERM, signal_handler) # Termination request
203
196
 
@@ -205,11 +198,25 @@ def main() -> int:
205
198
  from cognee import start_ui
206
199
 
207
200
  fmt.echo("Starting cognee UI...")
208
- server_process = start_ui(host="localhost", port=3000, open_browser=True)
201
+
202
+ # Callback to capture PIDs of all spawned processes
203
+ def pid_callback(pid):
204
+ nonlocal spawned_pids
205
+ spawned_pids.append(pid)
206
+
207
+ server_process = start_ui(
208
+ host="localhost",
209
+ port=3000,
210
+ open_browser=True,
211
+ start_backend=True,
212
+ auto_download=True,
213
+ pid_callback=pid_callback,
214
+ )
209
215
 
210
216
  if server_process:
211
217
  fmt.success("UI server started successfully!")
212
218
  fmt.echo("The interface is available at: http://localhost:3000")
219
+ fmt.echo("The API backend is available at: http://localhost:8000")
213
220
  fmt.note("Press Ctrl+C to stop the server...")
214
221
 
215
222
  try:
@@ -225,10 +232,12 @@ def main() -> int:
225
232
  return 0
226
233
  else:
227
234
  fmt.error("Failed to start UI server. Check the logs above for details.")
235
+ signal_handler(signal.SIGTERM, None)
228
236
  return 1
229
237
 
230
238
  except Exception as ex:
231
239
  fmt.error(f"Error starting UI: {str(ex)}")
240
+ signal_handler(signal.SIGTERM, None)
232
241
  if debug.is_debug_enabled():
233
242
  raise ex
234
243
  return 1
@@ -58,8 +58,8 @@ class SQLAlchemyAdapter:
58
58
  else:
59
59
  self.engine = create_async_engine(
60
60
  connection_string,
61
- pool_size=5,
62
- max_overflow=10,
61
+ pool_size=20,
62
+ max_overflow=20,
63
63
  pool_recycle=280,
64
64
  pool_pre_ping=True,
65
65
  pool_timeout=280,
@@ -39,7 +39,7 @@ class VectorConfig(BaseSettings):
39
39
  values.vector_db_url = ensure_absolute_path(
40
40
  values.vector_db_url,
41
41
  )
42
- else:
42
+ elif not values.vector_db_url:
43
43
  # Default path
44
44
  databases_directory_path = os.path.join(base_config.system_root_directory, "databases")
45
45
  values.vector_db_url = os.path.join(databases_directory_path, "cognee.lancedb")
@@ -1,13 +1,18 @@
1
1
  import asyncio
2
2
  from functools import partial
3
+ import inspect
3
4
 
4
5
 
5
6
  async def run_async(func, *args, loop=None, executor=None, **kwargs):
6
7
  if loop is None:
7
8
  try:
8
- running_loop = asyncio.get_running_loop()
9
+ loop = asyncio.get_running_loop()
9
10
  except RuntimeError:
10
- running_loop = asyncio.get_event_loop()
11
+ loop = asyncio.get_event_loop()
11
12
 
12
- pfunc = partial(func, *args, **kwargs)
13
- return await running_loop.run_in_executor(executor, pfunc)
13
+ if "loop" in inspect.signature(func).parameters:
14
+ pfunc = partial(func, *args, loop=loop, **kwargs)
15
+ else:
16
+ pfunc = partial(func, *args, **kwargs)
17
+
18
+ return await loop.run_in_executor(executor, pfunc)
@@ -2,16 +2,17 @@ import asyncio
2
2
  import threading
3
3
 
4
4
 
5
- def run_sync(coro, timeout=None):
5
+ def run_sync(coro, running_loop=None, timeout=None):
6
6
  result = None
7
7
  exception = None
8
8
 
9
9
  def runner():
10
- nonlocal result, exception
10
+ nonlocal result, exception, running_loop
11
11
 
12
12
  try:
13
13
  try:
14
- running_loop = asyncio.get_running_loop()
14
+ if not running_loop:
15
+ running_loop = asyncio.get_running_loop()
15
16
 
16
17
  result = asyncio.run_coroutine_threadsafe(coro, running_loop).result(timeout)
17
18
  except RuntimeError:
@@ -0,0 +1,92 @@
1
+
2
+ from uuid import UUID, uuid4
3
+ from sqlalchemy.ext.asyncio import AsyncSession
4
+
5
+ from ..models import NotebookCell
6
+ from .create_notebook import create_notebook
7
+
8
+
9
+ async def create_tutorial_notebook(user_id: UUID, session: AsyncSession):
10
+ await create_notebook(
11
+ user_id=user_id,
12
+ notebook_name="Welcome to cognee 🧠",
13
+ cells=[
14
+ NotebookCell(
15
+ id=uuid4(),
16
+ name="Welcome",
17
+ content="Cognee is your toolkit for turning text into a structured knowledge graph, optionally enhanced by ontologies, and then querying it with advanced retrieval techniques. This notebook will guide you through a simple example.",
18
+ type="markdown",
19
+ ),
20
+ NotebookCell(
21
+ id=uuid4(),
22
+ name="Example",
23
+ content="",
24
+ type="markdown",
25
+ ),
26
+ ],
27
+ deletable=False,
28
+ session=session,
29
+ )
30
+
31
+ cell_content = [
32
+ """
33
+ # Using Cognee with Python Development Data
34
+
35
+ Unite authoritative Python practice (Guido van Rossum's own contributions!), normative guidance (Zen/PEP 8), and your lived context (rules + conversations) into one *AI memory* that produces answers that are relevant, explainable, and consistent.
36
+ """,
37
+
38
+ """
39
+ ## What You'll Learn
40
+
41
+ In this comprehensive tutorial, you'll discover how to transform scattered development data into an intelligent knowledge system that enhances your coding workflow. By the end, you'll have:
42
+ - Connected disparate data sources (Guido's CPython contributions, mypy development, PEP discussions, your Python projects) into a unified AI memory graph
43
+ - Built an memory layer that understands Python design philosophy, best practice coding patterns, and your preferences and experience
44
+ - Learn how to use intelligent search capabilities that combine the diverse context
45
+ - Integrated everything with your coding environment through MCP (Model Context Protocol)
46
+
47
+ This tutorial demonstrates the power of **knowledge graphs** and **retrieval-augmented generation (RAG)** for software development, showing you how to build systems that learn from Python's creator and improve your own Python development.
48
+ """,
49
+
50
+ """
51
+ ## Cognee and its core operations
52
+
53
+ Before we dive in, let's understand the core Cognee operations we'll be working with:
54
+ - `cognee.add()` - Ingests raw data (files, text, APIs) into the system
55
+ - `cognee.cognify()` - Processes and structures data into a knowledge graph using AI
56
+ - `cognee.search()` - Queries the knowledge graph with natural language or Cypher
57
+ - `cognee.memify()` - Cognee's \"secret sauce\" that infers implicit connections and rules from your data
58
+ """,
59
+
60
+ """
61
+ ## Data used in this tutorial
62
+
63
+ Cognee can ingest many types of sources. In this tutorial, we use a small, concrete set of files that cover different perspectives:
64
+ - `guido_contributions.json` — Authoritative exemplars. Real PRs and commits from Guido van Rossum (mypy, CPython). These show how Python's creator solved problems and provide concrete anchors for patterns.
65
+ - `pep_style_guide.md` — Norms. Encodes community style and typing conventions (PEP 8 and related). Ensures that search results and inferred rules align with widely accepted standards.
66
+ - `zen_principles.md` — Philosophy. The Zen of Python. Grounds design trade-offs (simplicity, explicitness, readability) beyond syntax or mechanics.
67
+ - `my_developer_rules.md` — Local constraints. Your house rules, conventions, and project-specific requirements (scope, privacy, Spec.md). Keeps recommendations relevant to your actual workflow.
68
+ - `copilot_conversations.json` — Personal history. Transcripts of real assistant conversations, including your questions, code snippets, and discussion topics. Captures "how you code" and connects it to "how Guido codes."
69
+ """,
70
+
71
+ """
72
+ # Preliminaries
73
+
74
+ To strike the balanace between speed, cost, anc quality, we recommend using OpenAI's `4o-mini` model; make sure your `.env` file contains this line:
75
+ `
76
+ LLM_MODEL="gpt-4o-mini"
77
+ `
78
+ """,
79
+
80
+ """
81
+ import cognee
82
+
83
+ result = await cognee.add(
84
+ "file://data/guido_contributions.json",
85
+ node_set=["guido_data"]
86
+ )
87
+
88
+ await cognee.cognify(temporal_cognify=True)
89
+
90
+ results = await cognee.search("Show me commits")
91
+ """
92
+ ]
@@ -1,6 +1,6 @@
1
1
  from uuid import UUID
2
2
  from typing import Optional
3
- from sqlalchemy import select
3
+ from sqlalchemy import and_, select
4
4
  from sqlalchemy.ext.asyncio import AsyncSession
5
5
 
6
6
  from cognee.infrastructure.databases.relational import with_async_session
@@ -15,7 +15,7 @@ async def get_notebook(
15
15
  session: AsyncSession,
16
16
  ) -> Optional[Notebook]:
17
17
  result = await session.execute(
18
- select(Notebook).where(Notebook.owner_id == user_id and Notebook.id == notebook_id)
18
+ select(Notebook).where(and_(Notebook.owner_id == user_id, Notebook.id == notebook_id))
19
19
  )
20
20
 
21
21
  return result.scalar()
@@ -1,4 +1,3 @@
1
- from typing import Callable, AsyncContextManager
2
1
  from sqlalchemy.ext.asyncio import AsyncSession
3
2
 
4
3
  from cognee.infrastructure.databases.relational import with_async_session
@@ -5,16 +5,18 @@ import traceback
5
5
 
6
6
  def wrap_in_async_handler(user_code: str) -> str:
7
7
  return (
8
- "from cognee.infrastructure.utils.run_sync import run_sync\n\n"
9
- "async def __user_main__():\n"
8
+ "import asyncio\n"
9
+ + "asyncio.set_event_loop(running_loop)\n\n"
10
+ + "from cognee.infrastructure.utils.run_sync import run_sync\n\n"
11
+ + "async def __user_main__():\n"
10
12
  + "\n".join(" " + line for line in user_code.strip().split("\n"))
11
13
  + "\n"
12
- " globals().update(locals())\n\n"
13
- "run_sync(__user_main__())\n"
14
+ + " globals().update(locals())\n\n"
15
+ + "run_sync(__user_main__(), running_loop)\n"
14
16
  )
15
17
 
16
18
 
17
- def run_in_local_sandbox(code, environment=None):
19
+ def run_in_local_sandbox(code, environment=None, loop=None):
18
20
  environment = environment or {}
19
21
  code = wrap_in_async_handler(code.replace("\xa0", "\n"))
20
22
 
@@ -31,6 +33,7 @@ def run_in_local_sandbox(code, environment=None):
31
33
  printOutput.append(output)
32
34
 
33
35
  environment["print"] = customPrintFunction
36
+ environment["running_loop"] = loop
34
37
 
35
38
  try:
36
39
  exec(code, environment)
@@ -48,7 +48,7 @@ class GraphCompletionContextExtensionRetriever(GraphCompletionRetriever):
48
48
  query: str,
49
49
  context: Optional[List[Edge]] = None,
50
50
  context_extension_rounds=4,
51
- ) -> str:
51
+ ) -> List[str]:
52
52
  """
53
53
  Extends the context for a given query by retrieving related triplets and generating new
54
54
  completions based on them.
@@ -128,4 +128,4 @@ class GraphCompletionContextExtensionRetriever(GraphCompletionRetriever):
128
128
  question=query, answer=completion, context=context_text, triplets=triplets
129
129
  )
130
130
 
131
- return completion
131
+ return [completion]
@@ -58,7 +58,7 @@ class GraphCompletionCotRetriever(GraphCompletionRetriever):
58
58
  query: str,
59
59
  context: Optional[List[Edge]] = None,
60
60
  max_iter=4,
61
- ) -> str:
61
+ ) -> List[str]:
62
62
  """
63
63
  Generate completion responses based on a user query and contextual information.
64
64
 
@@ -138,4 +138,4 @@ class GraphCompletionCotRetriever(GraphCompletionRetriever):
138
138
  question=query, answer=completion, context=context_text, triplets=triplets
139
139
  )
140
140
 
141
- return completion
141
+ return [completion]
@@ -135,7 +135,7 @@ class GraphCompletionRetriever(BaseGraphRetriever):
135
135
  self,
136
136
  query: str,
137
137
  context: Optional[List[Edge]] = None,
138
- ) -> Any:
138
+ ) -> List[str]:
139
139
  """
140
140
  Generates a completion using graph connections context based on a query.
141
141
 
@@ -171,7 +171,7 @@ class GraphCompletionRetriever(BaseGraphRetriever):
171
171
  question=query, answer=completion, context=context_text, triplets=triplets
172
172
  )
173
173
 
174
- return completion
174
+ return [completion]
175
175
 
176
176
  async def save_qa(self, question: str, answer: str, context: str, triplets: List) -> None:
177
177
  """
@@ -96,17 +96,18 @@ class InsightsRetriever(BaseGraphRetriever):
96
96
  unique_node_connections_map[unique_id] = True
97
97
  unique_node_connections.append(node_connection)
98
98
 
99
- return [
100
- Edge(
101
- node1=Node(node_id=connection[0]["id"], attributes=connection[0]),
102
- node2=Node(node_id=connection[2]["id"], attributes=connection[2]),
103
- attributes={
104
- **connection[1],
105
- "relationship_type": connection[1]["relationship_name"],
106
- },
107
- )
108
- for connection in unique_node_connections
109
- ]
99
+ return unique_node_connections
100
+ # return [
101
+ # Edge(
102
+ # node1=Node(node_id=connection[0]["id"], attributes=connection[0]),
103
+ # node2=Node(node_id=connection[2]["id"], attributes=connection[2]),
104
+ # attributes={
105
+ # **connection[1],
106
+ # "relationship_type": connection[1]["relationship_name"],
107
+ # },
108
+ # )
109
+ # for connection in unique_node_connections
110
+ # ]
110
111
 
111
112
  async def get_completion(self, query: str, context: Optional[Any] = None) -> Any:
112
113
  """
@@ -136,7 +136,7 @@ class TemporalRetriever(GraphCompletionRetriever):
136
136
 
137
137
  return self.descriptions_to_string(top_k_events)
138
138
 
139
- async def get_completion(self, query: str, context: Optional[str] = None) -> str:
139
+ async def get_completion(self, query: str, context: Optional[str] = None) -> List[str]:
140
140
  """Generates a response using the query and optional context."""
141
141
  if not context:
142
142
  context = await self.get_context(query=query)
@@ -149,4 +149,4 @@ class TemporalRetriever(GraphCompletionRetriever):
149
149
  system_prompt_path=self.system_prompt_path,
150
150
  )
151
151
 
152
- return completion
152
+ return [completion]
@@ -1,4 +1,4 @@
1
- from typing import Any, Optional, List
1
+ from typing import Optional, List
2
2
 
3
3
  from uuid import NAMESPACE_OID, uuid5, UUID
4
4
  from cognee.infrastructure.databases.graph import get_graph_engine
@@ -132,14 +132,37 @@ async def search(
132
132
  ],
133
133
  )
134
134
  else:
135
- return [
136
- SearchResult(
137
- search_result=result,
138
- dataset_id=datasets[min(index, len(datasets) - 1)].id if datasets else None,
139
- dataset_name=datasets[min(index, len(datasets) - 1)].name if datasets else None,
140
- )
141
- for index, (result, _, datasets) in enumerate(search_results)
142
- ]
135
+ # This is for maintaining backwards compatibility
136
+ if os.getenv("ENABLE_BACKEND_ACCESS_CONTROL", "false").lower() == "true":
137
+ return_value = []
138
+ for search_result in search_results:
139
+ result, context, datasets = search_result
140
+ return_value.append(
141
+ {
142
+ "search_result": result,
143
+ "dataset_id": datasets[0].id,
144
+ "dataset_name": datasets[0].name,
145
+ }
146
+ )
147
+ return return_value
148
+ else:
149
+ return_value = []
150
+ for search_result in search_results:
151
+ result, context, datasets = search_result
152
+ return_value.append(result)
153
+ # For maintaining backwards compatibility
154
+ if len(return_value) == 1 and isinstance(return_value[0], list):
155
+ return return_value[0]
156
+ else:
157
+ return return_value
158
+ # return [
159
+ # SearchResult(
160
+ # search_result=result,
161
+ # dataset_id=datasets[min(index, len(datasets) - 1)].id if datasets else None,
162
+ # dataset_name=datasets[min(index, len(datasets) - 1)].name if datasets else None,
163
+ # )
164
+ # for index, (result, _, datasets) in enumerate(search_results)
165
+ # ]
143
166
 
144
167
 
145
168
  async def authorized_search(
@@ -6,7 +6,7 @@ from cognee.modules.search.utils.transform_context_to_graph import transform_con
6
6
 
7
7
 
8
8
  async def prepare_search_result(search_result):
9
- result, context, datasets = search_result
9
+ results, context, datasets = search_result
10
10
 
11
11
  graphs = None
12
12
  result_graph = None
@@ -30,11 +30,11 @@ async def prepare_search_result(search_result):
30
30
  "*": "\n".join(cast(List[str], context)),
31
31
  }
32
32
 
33
- if isinstance(result, List) and len(result) > 0 and isinstance(result[0], Edge):
34
- result_graph = transform_context_to_graph(result)
33
+ if isinstance(results, List) and len(results) > 0 and isinstance(results[0], Edge):
34
+ result_graph = transform_context_to_graph(results)
35
35
 
36
36
  return {
37
- "result": result_graph or result,
37
+ "result": result_graph or results[0] if len(results) == 1 else results,
38
38
  "graphs": graphs,
39
39
  "context": context_texts,
40
40
  "datasets": datasets,
@@ -79,7 +79,7 @@ async def main():
79
79
  print("\n\nExtracted sentences are:\n")
80
80
  for result in search_results:
81
81
  print(f"{result}\n")
82
- assert search_results[0].dataset_name == "NLP", (
82
+ assert search_results[0]["dataset_name"] == "NLP", (
83
83
  f"Dict must contain dataset name 'NLP': {search_results[0]}"
84
84
  )
85
85
 
@@ -93,7 +93,7 @@ async def main():
93
93
  print("\n\nExtracted sentences are:\n")
94
94
  for result in search_results:
95
95
  print(f"{result}\n")
96
- assert search_results[0].dataset_name == "QUANTUM", (
96
+ assert search_results[0]["dataset_name"] == "QUANTUM", (
97
97
  f"Dict must contain dataset name 'QUANTUM': {search_results[0]}"
98
98
  )
99
99
 
@@ -170,7 +170,7 @@ async def main():
170
170
  for result in search_results:
171
171
  print(f"{result}\n")
172
172
 
173
- assert search_results[0].dataset_name == "QUANTUM", (
173
+ assert search_results[0]["dataset_name"] == "QUANTUM", (
174
174
  f"Dict must contain dataset name 'QUANTUM': {search_results[0]}"
175
175
  )
176
176
 
@@ -45,15 +45,13 @@ async def relational_db_migration():
45
45
  await migrate_relational_database(graph_engine, schema=schema)
46
46
 
47
47
  # 1. Search the graph
48
- search_results: List[SearchResult] = await cognee.search(
48
+ search_results = await cognee.search(
49
49
  query_type=SearchType.GRAPH_COMPLETION, query_text="Tell me about the artist AC/DC"
50
- ) # type: ignore
50
+ )
51
51
  print("Search results:", search_results)
52
52
 
53
53
  # 2. Assert that the search results contain "AC/DC"
54
- assert any("AC/DC" in r.search_result for r in search_results), (
55
- "AC/DC not found in search results!"
56
- )
54
+ assert any("AC/DC" in r for r in search_results), "AC/DC not found in search results!"
57
55
 
58
56
  migration_db_provider = migration_engine.engine.dialect.name
59
57
  if migration_db_provider == "postgresql":
@@ -144,13 +144,16 @@ async def main():
144
144
  ("GRAPH_COMPLETION_CONTEXT_EXTENSION", completion_ext),
145
145
  ("GRAPH_SUMMARY_COMPLETION", completion_sum),
146
146
  ]:
147
- for search_result in search_results:
148
- completion = search_result.search_result
149
- assert isinstance(completion, str), f"{name}: should return a string"
150
- assert completion.strip(), f"{name}: string should not be empty"
151
- assert "netherlands" in completion.lower(), (
152
- f"{name}: expected 'netherlands' in result, got: {completion!r}"
153
- )
147
+ assert isinstance(search_results, list), f"{name}: should return a list"
148
+ assert len(search_results) == 1, (
149
+ f"{name}: expected single-element list, got {len(search_results)}"
150
+ )
151
+ text = search_results[0]
152
+ assert isinstance(text, str), f"{name}: element should be a string"
153
+ assert text.strip(), f"{name}: string should not be empty"
154
+ assert "netherlands" in text.lower(), (
155
+ f"{name}: expected 'netherlands' in result, got: {text!r}"
156
+ )
154
157
 
155
158
  graph_engine = await get_graph_engine()
156
159
  graph = await graph_engine.get_graph_data()
@@ -59,8 +59,10 @@ class TestGraphCompletionWithContextExtensionRetriever:
59
59
 
60
60
  answer = await retriever.get_completion("Who works at Canva?")
61
61
 
62
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
63
- assert answer.strip(), "Answer must contain only non-empty strings"
62
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
63
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
64
+ "Answer must contain only non-empty strings"
65
+ )
64
66
 
65
67
  @pytest.mark.asyncio
66
68
  async def test_graph_completion_extension_context_complex(self):
@@ -140,8 +142,10 @@ class TestGraphCompletionWithContextExtensionRetriever:
140
142
 
141
143
  answer = await retriever.get_completion("Who works at Figma?")
142
144
 
143
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
144
- assert answer.strip(), "Answer must contain only non-empty strings"
145
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
146
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
147
+ "Answer must contain only non-empty strings"
148
+ )
145
149
 
146
150
  @pytest.mark.asyncio
147
151
  async def test_get_graph_completion_extension_context_on_empty_graph(self):
@@ -171,5 +175,7 @@ class TestGraphCompletionWithContextExtensionRetriever:
171
175
 
172
176
  answer = await retriever.get_completion("Who works at Figma?")
173
177
 
174
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
175
- assert answer.strip(), "Answer must contain only non-empty strings"
178
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
179
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
180
+ "Answer must contain only non-empty strings"
181
+ )
@@ -55,8 +55,10 @@ class TestGraphCompletionCoTRetriever:
55
55
 
56
56
  answer = await retriever.get_completion("Who works at Canva?")
57
57
 
58
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
59
- assert answer.strip(), "Answer must contain only non-empty strings"
58
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
59
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
60
+ "Answer must contain only non-empty strings"
61
+ )
60
62
 
61
63
  @pytest.mark.asyncio
62
64
  async def test_graph_completion_cot_context_complex(self):
@@ -133,8 +135,10 @@ class TestGraphCompletionCoTRetriever:
133
135
 
134
136
  answer = await retriever.get_completion("Who works at Figma?")
135
137
 
136
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
137
- assert answer.strip(), "Answer must contain only non-empty strings"
138
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
139
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
140
+ "Answer must contain only non-empty strings"
141
+ )
138
142
 
139
143
  @pytest.mark.asyncio
140
144
  async def test_get_graph_completion_cot_context_on_empty_graph(self):
@@ -164,5 +168,7 @@ class TestGraphCompletionCoTRetriever:
164
168
 
165
169
  answer = await retriever.get_completion("Who works at Figma?")
166
170
 
167
- assert isinstance(answer, str), f"Expected string, got {type(answer).__name__}"
168
- assert answer.strip(), "Answer must contain only non-empty strings"
171
+ assert isinstance(answer, list), f"Expected list, got {type(answer).__name__}"
172
+ assert all(isinstance(item, str) and item.strip() for item in answer), (
173
+ "Answer must contain only non-empty strings"
174
+ )
@@ -82,7 +82,7 @@ class TestInsightsRetriever:
82
82
 
83
83
  context = await retriever.get_context("Mike")
84
84
 
85
- assert context[0].node1.attributes["name"] == "Mike Broski", "Failed to get Mike Broski"
85
+ assert context[0][0]["name"] == "Mike Broski", "Failed to get Mike Broski"
86
86
 
87
87
  @pytest.mark.asyncio
88
88
  async def test_insights_context_complex(self):
@@ -222,9 +222,7 @@ class TestInsightsRetriever:
222
222
 
223
223
  context = await retriever.get_context("Christina")
224
224
 
225
- assert context[0].node1.attributes["name"] == "Christina Mayer", (
226
- "Failed to get Christina Mayer"
227
- )
225
+ assert context[0][0]["name"] == "Christina Mayer", "Failed to get Christina Mayer"
228
226
 
229
227
  @pytest.mark.asyncio
230
228
  async def test_insights_context_on_empty_graph(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognee
3
- Version: 0.3.1
3
+ Version: 0.3.3
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
@@ -41,7 +41,7 @@ cognee/api/v1/memify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
41
41
  cognee/api/v1/memify/routers/__init__.py,sha256=Uv25PVGhfjnNi1NYWOmOLIlzaeTlyMYF9m7BEfdu45Q,49
42
42
  cognee/api/v1/memify/routers/get_memify_router.py,sha256=C1Cjt9D5TxhqBPmXZGNrCS4lJqPVXIJYgxZFtWVjZNs,4599
43
43
  cognee/api/v1/notebooks/routers/__init__.py,sha256=TvQz6caluaMoXNvjbE1p_C8savypgs8rAyP5lQ8jlpc,55
44
- cognee/api/v1/notebooks/routers/get_notebooks_router.py,sha256=YFxvs3WR5RCjB-Rk4uJ8yZtlLU0vl0AcOuRNFrb-i6U,3420
44
+ cognee/api/v1/notebooks/routers/get_notebooks_router.py,sha256=m8OH3Kw1UHF8aTP4yNuSpv7gNThE4HxmLIrUnvECYGA,3484
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
@@ -56,7 +56,7 @@ cognee/api/v1/responses/routers/get_responses_router.py,sha256=ggbLhY9IXaInCgIs5
56
56
  cognee/api/v1/search/__init__.py,sha256=Sqw60DcOj4Bnvt-EWFknT31sPcvROIRKCWLr5pbkFr4,39
57
57
  cognee/api/v1/search/search.py,sha256=YQicNVi9q4FteAmt_EtY75I_EuNZ9ZjGE73wg-NcDwY,8824
58
58
  cognee/api/v1/search/routers/__init__.py,sha256=6RebeLX_2NTRxIMPH_mGuLztPxnGnMJK1y_O93CtRm8,49
59
- cognee/api/v1/search/routers/get_search_router.py,sha256=30DpoGn1ceSBaKOH1jLXodQJZCwBwSZ_OZgrKkJzGs0,6149
59
+ cognee/api/v1/search/routers/get_search_router.py,sha256=-5GLgHipflEblYAwl3uiPAZ2i3TgrLEjDuiO_cCqcB8,6252
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
@@ -64,7 +64,7 @@ cognee/api/v1/sync/sync.py,sha256=zzCVJD1AvcSXtNsgLJr1iPMRxY6vRxGdkt7sVdJ8W2c,33
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
67
- cognee/api/v1/ui/ui.py,sha256=AgH7js_34rjW7Z_19Xv-oKBA1TBH5-t2beVtIzoAMAY,19215
67
+ cognee/api/v1/ui/ui.py,sha256=CTgEmVrpeG174jTalgc8F_4hO6LsBXtTFkczMaLlNvc,23137
68
68
  cognee/api/v1/users/__init__.py,sha256=TMOZ_3puQxVqVIjWNA0yb16Tpp8yoNKAfwxIxoFpgus,37
69
69
  cognee/api/v1/users/create_user.py,sha256=PRuc7aUhOpyb-g5nUGDKSegp3cxkZy5TDeX1sxX6jjM,324
70
70
  cognee/api/v1/users/routers/__init__.py,sha256=_m3tyK2deFQCBjx6p-0t23e7qnnhAyx-2PBM7Wc6E7A,314
@@ -78,7 +78,7 @@ cognee/api/v1/visualize/__init__.py,sha256=TBk58R8cza6Qx7IP2r9RvAtE8Fmoo9vOh9VjC
78
78
  cognee/api/v1/visualize/start_visualization_server.py,sha256=3esCKYYmBx9Sb2H5JWrliT47qNyt_rGrv1OvR0LJVAg,440
79
79
  cognee/api/v1/visualize/visualize.py,sha256=xKhh1N-doIgFcnq9Tz1acwrS4fOqBFZlgif4prMBqP4,1077
80
80
  cognee/cli/__init__.py,sha256=MaKUkdFaETdbuMFoV02V8BZNuYr7tZQJKt6y25CaUhk,243
81
- cognee/cli/_cognee.py,sha256=iupokPsdRXVQYzcUBzt-GDmn_E-Ts6enoCAhm89lNCY,8739
81
+ cognee/cli/_cognee.py,sha256=v7GeAGLXaVkkkjUpbmo4Ya3ff-cycE297F41Sjx0kNA,8878
82
82
  cognee/cli/config.py,sha256=8XhUqpkmNNzCFbnIpRvNQIO2Hvw0OD44zWYM0eADozA,998
83
83
  cognee/cli/debug.py,sha256=-u3REG2xloCFLwOWQ3wVM7RpZRn06QlnfDyCRoxrrek,444
84
84
  cognee/cli/echo.py,sha256=3G4qYcYn1cShTeIKaZMPD_TgoS7LBqyUnMnTFaj5dUE,1128
@@ -181,12 +181,12 @@ cognee/infrastructure/databases/relational/get_async_session.py,sha256=qfiXSsTAA
181
181
  cognee/infrastructure/databases/relational/get_migration_relational_engine.py,sha256=5RtH281iIQo3vqgwmKT0nuiJp9jNd7vw6xRUjc5xIDM,1070
182
182
  cognee/infrastructure/databases/relational/get_relational_engine.py,sha256=De51ieg9eFhRLX08k9oNc-oszvt_9J5DHebqI1qI8_U,741
183
183
  cognee/infrastructure/databases/relational/with_async_session.py,sha256=UgQeJOvgeM6yhyNDwWdGULtTjZosTnjDlr267Losnfs,803
184
- cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py,sha256=uuX2tFPWueX0etooLFFr1PvaPQSdFtZRyCnRYSau20Q,27539
184
+ cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py,sha256=j4mnqNJAO-U-Qfveam6NgjIH5lt7WjSMLVlemBrdpYU,27540
185
185
  cognee/infrastructure/databases/relational/sqlalchemy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
186
  cognee/infrastructure/databases/utils/__init__.py,sha256=4C0ncZG-O6bOFJpKgscCHu6D5vodLWRIKpe-WT4Ijbs,75
187
187
  cognee/infrastructure/databases/utils/get_or_create_dataset_database.py,sha256=wn7pRgeX-BU0L191_6pgT9P54uhVQlGMPqxQdvIlv4Y,2101
188
188
  cognee/infrastructure/databases/vector/__init__.py,sha256=7MdGJ3Mxdh2RyDq39rcjD99liIa-yGXxDUzq--1qQZs,291
189
- cognee/infrastructure/databases/vector/config.py,sha256=cY833pGsse4_dBmacNXmsdNZJQrSWPevKcGW1f_klYU,2927
189
+ cognee/infrastructure/databases/vector/config.py,sha256=4HOmqZOEfVNmAhjxRNePMU9haTVeR35R2XbhPTcMqFg,2952
190
190
  cognee/infrastructure/databases/vector/create_vector_engine.py,sha256=ECtICkIW5QM_lX9465ZTxVXC5MCRo_h219q3GyFXxpc,4716
191
191
  cognee/infrastructure/databases/vector/get_vector_engine.py,sha256=y4TMWJ6B6DxwKF9PMfjB6WqujPnVhf0oR2j35Q-KhvA,272
192
192
  cognee/infrastructure/databases/vector/supported_databases.py,sha256=0UIYcQ15p7-rq5y_2A-E9ydcXyP6frdg8T5e5ECDDMI,25
@@ -365,8 +365,8 @@ cognee/infrastructure/loaders/external/pypdf_loader.py,sha256=nFa_h3LURBPoguRIID
365
365
  cognee/infrastructure/loaders/external/unstructured_loader.py,sha256=XCRVHwpM5XmcjRmL4Pr9ELzBU_qYDPhX_Ahn5K8w0AU,4603
366
366
  cognee/infrastructure/loaders/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
367
367
  cognee/infrastructure/utils/calculate_backoff.py,sha256=O6h4MCe357BKaECmLZPLGYpffrMol65LwQCklBj4sh4,935
368
- cognee/infrastructure/utils/run_async.py,sha256=3J0OGzh3HLO6wHQN-rjEnGitVD_mbs4AO6VFgZ47eQE,393
369
- cognee/infrastructure/utils/run_sync.py,sha256=wLhXUdopsEaIRU7CrzcfPdj1KiRBjCf83HjqvSsace8,726
368
+ cognee/infrastructure/utils/run_async.py,sha256=gZY8ZLG_86O9YVK8hciduIoDONHaEEnGOILh3EeD9LA,510
369
+ cognee/infrastructure/utils/run_sync.py,sha256=9pAXc-EmjtV03exnUMOVSC-IJq_KCslX05z62MHQjlQ,800
370
370
  cognee/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
371
  cognee/modules/chunking/Chunker.py,sha256=KezN4WBiV0KNJtx6daMg4g1-a-_oJxn_l_iQT94T1lQ,343
372
372
  cognee/modules/chunking/LangchainChunker.py,sha256=Yo9Jza-t3x3V8I8PWbxUu48vlVVdvJKxwzL2gManwDc,2351
@@ -482,14 +482,15 @@ cognee/modules/metrics/operations/__init__.py,sha256=MZ3xbVdfEKqfLct8WnbyFVyZmkB
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
484
  cognee/modules/notebooks/methods/create_notebook.py,sha256=S41H3Rha0pj9dEKFy1nBG9atTGHhUdOmDZgr0ckUA6M,633
485
+ cognee/modules/notebooks/methods/create_tutorial_notebook.py,sha256=8YPoDcMUZSNhEWSKxUcPOM61y0St2Z1Y-PC1HFRmlbk,4248
485
486
  cognee/modules/notebooks/methods/delete_notebook.py,sha256=BKxoRlPzkwXvTYh5WcF-zo_iVmaXqEiptS42JwB0KQU,309
486
- cognee/modules/notebooks/methods/get_notebook.py,sha256=O-iWX4sElOn_5EpI9_WCwdvbfPRgVQVGBev1U4tI8AA,545
487
+ cognee/modules/notebooks/methods/get_notebook.py,sha256=IP4imsdt9X6GYd6i6WF6PlVhotGNH0i7XZpPqbtqMwo,554
487
488
  cognee/modules/notebooks/methods/get_notebooks.py,sha256=ee40ALHvebVORuwZVkQ271qAj260rrYy6eVGxAmfo8c,483
488
- cognee/modules/notebooks/methods/update_notebook.py,sha256=L-WgIxEr_uPClRZQZtnBEV9iT2C7aWqs0FuSW-F5qqk,410
489
+ cognee/modules/notebooks/methods/update_notebook.py,sha256=MnZbfh-WfEfH3ImNvyQNhDeNwpYeS7p8FPVwnmBvZVg,361
489
490
  cognee/modules/notebooks/models/Notebook.py,sha256=Jth47QxJQ2-VGPyIcS0ul3bS8bgGrk9vCGoJVagxanw,1690
490
491
  cognee/modules/notebooks/models/__init__.py,sha256=jldsDjwRvFMreGpe4wxxr5TlFXTZuU7rbsRkGQvTO5s,45
491
492
  cognee/modules/notebooks/operations/__init__.py,sha256=VR_2w_d0lEiJ5Xw7_mboo2qWUv0umrR_Bp58MaMoE6w,55
492
- cognee/modules/notebooks/operations/run_in_local_sandbox.py,sha256=0Au8-bDy7S-c1eNLKInQI5HV7u3bhl7Lvvtt79c5J4Q,1186
493
+ cognee/modules/notebooks/operations/run_in_local_sandbox.py,sha256=17hMEQC3LZTfPvbRUrPN9SzDeJPWSTq_BAhtwRZiqT8,1338
493
494
  cognee/modules/observability/get_observe.py,sha256=chRw4jmpmrwEvDecF9sgApm23IOzVgCbwkKEAyz1_AI,264
494
495
  cognee/modules/observability/observers.py,sha256=SKQSWWyGDG0QY2_bqsFgfpLUb7OUL4WFf8tDZYe5JMM,157
495
496
  cognee/modules/ontology/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -549,15 +550,15 @@ cognee/modules/retrieval/code_retriever.py,sha256=cnOjgfCATzz0-XZGFrIIkuVZLc6HBh
549
550
  cognee/modules/retrieval/coding_rules_retriever.py,sha256=3GU259jTbGLqmp_A8sUdE4fyf0td06SKuxBJVW-npIQ,1134
550
551
  cognee/modules/retrieval/completion_retriever.py,sha256=Lw5sxN_UrtmWSOtcSS7Yj50Gw9p4nNBmW3dr2kV9JJ0,3754
551
552
  cognee/modules/retrieval/cypher_search_retriever.py,sha256=_3rZJ23hSZpDa8kVyOSWN3fwjMI_aLF2m5p-FtBek8k,2440
552
- cognee/modules/retrieval/graph_completion_context_extension_retriever.py,sha256=e5F12b5TSMZK7eHoaKlC3GSe69MHh80s9acc5nDcY6Y,4524
553
- cognee/modules/retrieval/graph_completion_cot_retriever.py,sha256=p4yl2w4NysShX9S2IaS1t62DYaSoEALZ0VaihkmmPiY,6132
554
- cognee/modules/retrieval/graph_completion_retriever.py,sha256=LJ9gOQkUteMboUz6GdTrWDlYevKgoDMHNBdHgxfW5Eo,8814
553
+ cognee/modules/retrieval/graph_completion_context_extension_retriever.py,sha256=-6yN8gpRlDue8d28rk-Ly-gq0T8BW-i1-Jgbp1x-Zsg,4532
554
+ cognee/modules/retrieval/graph_completion_cot_retriever.py,sha256=JU-FkikaU68v8fT8VAmG6jojwhwroKYW2RUxdlJ1R-k,6140
555
+ cognee/modules/retrieval/graph_completion_retriever.py,sha256=VnrFD4xUQewIO83mfmIUcPLA_HBGdUlDVRyA2Pm4ARo,8822
555
556
  cognee/modules/retrieval/graph_summary_completion_retriever.py,sha256=3AMisk3fObk2Vh1heY4veHkDjLsHgSSUc_ChZseJUYw,2456
556
- cognee/modules/retrieval/insights_retriever.py,sha256=CYlLrRZrVh50fbRJLAihtSt-8licb_lnNJee5vmqCA4,4892
557
+ cognee/modules/retrieval/insights_retriever.py,sha256=1pcYd34EfKk85MSPFQ8b-ZbSARmnauks8TxXfNOxvOw,4953
557
558
  cognee/modules/retrieval/natural_language_retriever.py,sha256=zJz35zRmBP8-pRlkoxxSxn3-jtG2lUW0xcu58bq9Ebs,5761
558
559
  cognee/modules/retrieval/summaries_retriever.py,sha256=joXYphypACm2JiCjbC8nBS61m1q2oYkzyIt9bdgALNw,3384
559
- cognee/modules/retrieval/temporal_retriever.py,sha256=SXYvlph0QbhelaYc2lyZxYC550L7CgU6L_mR3kMAASM,5677
560
- cognee/modules/retrieval/user_qa_feedback.py,sha256=WSMPg6WjteR-XgK0vK9f_bkZ_o0JMPb4XZ9OAcFyz9E,3371
560
+ cognee/modules/retrieval/temporal_retriever.py,sha256=EUEYN94LpoWfbPjsToe_pC3rFsUUTIPA5K6wNjv8Nds,5685
561
+ cognee/modules/retrieval/user_qa_feedback.py,sha256=-VEOsE_t0FiTy00OpOMWAYv12YSLPieAcMsu82vm7h4,3366
561
562
  cognee/modules/retrieval/context_providers/DummyContextProvider.py,sha256=9GsvINc7ekRyRWO5IefFGyytRYqsSlhpwAOw6Q691cA,419
562
563
  cognee/modules/retrieval/context_providers/SummarizedTripletSearchContextProvider.py,sha256=ypO6yWLxvmRsj_5dyYdvXTbztJmB_ioLrgyG6bF5WGA,894
563
564
  cognee/modules/retrieval/context_providers/TripletSearchContextProvider.py,sha256=8PzksHAtRw7tZarP3nZuxhi0cd1EYEDHOT4Q74mNEvc,3656
@@ -578,7 +579,7 @@ cognee/modules/search/exceptions/exceptions.py,sha256=Zc5Y0M-r-UnSSlpKzHKBplfjZ-
578
579
  cognee/modules/search/methods/__init__.py,sha256=jGfRvNwM5yIzj025gaVhcx7nCupRSXbUUnFjYVjL_Js,27
579
580
  cognee/modules/search/methods/get_search_type_tools.py,sha256=wXxOZx3uEnMhRhUO2HGswQ5iVbWvjUj17UT_qdJg6Oo,6837
580
581
  cognee/modules/search/methods/no_access_control_search.py,sha256=R08aMgaB8AkD0_XVaX15qLyC9KJ3fSVFv9zeZwuyez4,1566
581
- cognee/modules/search/methods/search.py,sha256=RhdNNpky3HEb_RDTTgQouXdc1lmU5vGV2uiQ8harz1Y,11455
582
+ cognee/modules/search/methods/search.py,sha256=Akqf4a913_nG56TMxTKU65kOwL0tWURDLHEXlwcgV1c,12459
582
583
  cognee/modules/search/models/Query.py,sha256=9WcF5Z1oCFtA4O-7An37eNAPX3iyygO4B5NSwhx7iIg,558
583
584
  cognee/modules/search/models/Result.py,sha256=U7QtoNzAtZnUDwGWhjVfcalHQd4daKtYYvJz2BeWQ4w,564
584
585
  cognee/modules/search/operations/__init__.py,sha256=AwJl6v9BTpocoefEZLk-flo1EtydYb46NSUoNFHkhX0,156
@@ -592,7 +593,7 @@ cognee/modules/search/types/SearchResult.py,sha256=blEean6PRFKcDRQugsojZPfH-Wohx
592
593
  cognee/modules/search/types/SearchType.py,sha256=-lT4bLKKunV4cL4FfF3tjNbdN7X4AsRMLpTkReNwXZM,594
593
594
  cognee/modules/search/types/__init__.py,sha256=8k6OjVrL70W1Jh-ClTbG2ETYIhOtSk3tfqjzYgEdPzA,117
594
595
  cognee/modules/search/utils/__init__.py,sha256=86mRtCN-B5-2NNChdQoU5x8_8hqTczGZjBoKVE9O7hA,124
595
- cognee/modules/search/utils/prepare_search_result.py,sha256=nfK8aqR2tRL_SYHqtkK1ssG8Ws_oflEDZZAEvQmu5F4,1293
596
+ cognee/modules/search/utils/prepare_search_result.py,sha256=FTM-tVlprL8EswIcwOy8jO1bRmKG61GZqFfM8FNJUJg,1336
596
597
  cognee/modules/search/utils/transform_context_to_graph.py,sha256=rUQeEH-Z-GqAzAZTCetRVpwgrOHlNe3mUBRLwRb0478,1238
597
598
  cognee/modules/settings/__init__.py,sha256=_SZQgCQnnnIHLJuKOMO9uWzXNBQxwYHHMUSBp0qa2uQ,210
598
599
  cognee/modules/settings/get_current_settings.py,sha256=R2lOusG5Q2PMa2-2vDndh3Lm7nXyZVkdzTV7vQHT81Y,1642
@@ -781,19 +782,25 @@ cognee/tests/test_neptune_analytics_graph.py,sha256=bZqPNk8ag_tilpRobK5RJVwTS473
781
782
  cognee/tests/test_neptune_analytics_hybrid.py,sha256=Q9mCGGqroLnHrRo3kHdhkMZnlNtvCshRG1BgU81voBc,6222
782
783
  cognee/tests/test_neptune_analytics_vector.py,sha256=h_Ofp4ZAdyGpCWzuQyoXmLO5lOycNLtliIFvJt7nXHg,8652
783
784
  cognee/tests/test_parallel_databases.py,sha256=Hhm4zh-luaXKmy7mjEHq3VkMppt6QaJ3IB2IRUVkwSk,1997
784
- cognee/tests/test_permissions.py,sha256=PFHSUOUC-zMiK9N8JOzO81fZy4q6CdSiALRaOcR9dj8,11500
785
+ cognee/tests/test_permissions.py,sha256=h2Gyug-1DI8YycYMBhfEY0XdZbG3qt7ubiK5x7EJCVc,11509
785
786
  cognee/tests/test_pgvector.py,sha256=ZAaeWcnNBSYuyciYPBnzJSrGkuIjmKYWoNu3Jj7cPOM,9568
786
- cognee/tests/test_relational_db_migration.py,sha256=jFkiLVAEpJtI8iGeR7WWRRP7Zi5TFeIn4VLiqfhl2Ms,8761
787
+ cognee/tests/test_relational_db_migration.py,sha256=QUgS40w3ZDO3fwvM0x0b1U0SxfFVJ3J6UEK5C48GVHA,8695
787
788
  cognee/tests/test_remote_kuzu.py,sha256=2GG05MtGuhOo6ST82OxjdVDetBS0GWHvKKmmmEtQO2U,7245
788
789
  cognee/tests/test_remote_kuzu_stress.py,sha256=5vgnu4Uz_NoKKqFZJeVceHwb2zNhvdTVBgpN3NjhfAE,5304
789
790
  cognee/tests/test_s3.py,sha256=rY2UDK15cdyywlyVrR8N2DRtVXWYIW5REaaz99gaQeE,2694
790
791
  cognee/tests/test_s3_file_storage.py,sha256=62tvIFyh_uTP0TFF9Ck4Y-sxWPW-cwJKYEJUJI1atPI,5654
791
- cognee/tests/test_search_db.py,sha256=7d72uJvERbp5NyIj5ouXBx7Uf_38qPrU4ms8IsnKSx8,13312
792
+ cognee/tests/test_search_db.py,sha256=4GpLx8ZJoMjkp-XqQ-LCrkf3NhAM4j_rMmlOFgmDO-A,13420
792
793
  cognee/tests/test_starter_pipelines.py,sha256=X1J8RDD0bFMKnRETyi5nyaF4TYdmUIu0EuD3WQwShNs,2475
793
794
  cognee/tests/test_telemetry.py,sha256=FIneuVofSKWFYqxNC88sT_P5GPzgfjVyqDCf2TYBE2E,4130
794
795
  cognee/tests/test_temporal_graph.py,sha256=G0PyzuvIYylwFT-3eZSzjtBik9O1g75sGLj3QK9RYTA,12624
795
- cognee/tests/integration/cli/__init__.py,sha256=xYkvpZkxv_HRWmX71pGM3NUw2KKkDQIM-V6Ehxu-f0I,39
796
- cognee/tests/integration/cli/test_cli_integration.py,sha256=3hdz1DoGeidJInqbCy1YQte6J0QeQG1_WKGs9utjAFg,11560
796
+ cognee/tests/cli_tests/cli_integration_tests/__init__.py,sha256=xYkvpZkxv_HRWmX71pGM3NUw2KKkDQIM-V6Ehxu-f0I,39
797
+ cognee/tests/cli_tests/cli_integration_tests/test_cli_integration.py,sha256=3hdz1DoGeidJInqbCy1YQte6J0QeQG1_WKGs9utjAFg,11560
798
+ cognee/tests/cli_tests/cli_unit_tests/__init__.py,sha256=U069aFvdwfKPd6YsR_FJML5LRphHHF5wx9mwug1hRh4,32
799
+ cognee/tests/cli_tests/cli_unit_tests/test_cli_commands.py,sha256=5a3vPiSFmKumq6sTfdfMyeUpJGjbZ6_5zX4TUcV0ZJQ,17625
800
+ cognee/tests/cli_tests/cli_unit_tests/test_cli_edge_cases.py,sha256=PyFCnClvbXG1GaiS16qwcuyXXDJ4sRyBCKV5WHrOUxk,23501
801
+ cognee/tests/cli_tests/cli_unit_tests/test_cli_main.py,sha256=Gsj2zYlVL80iU9EjRj4Q4QzgsYuIngUvDbA9suV99oA,6098
802
+ cognee/tests/cli_tests/cli_unit_tests/test_cli_runner.py,sha256=WZ8oZIlc_JintDq_cnEg9tmLEMZMGFPQGhU7Y_7sfgs,1497
803
+ cognee/tests/cli_tests/cli_unit_tests/test_cli_utils.py,sha256=Flej8LNYRXNkWd2tq8elMm8MkqbhCUb8RtXaPzfNYm4,4323
797
804
  cognee/tests/integration/documents/AudioDocument_test.py,sha256=0mJnlWRc7gWqOxAUfdSSIxntcUrzkPXhlsd-MFsiRoM,2790
798
805
  cognee/tests/integration/documents/ImageDocument_test.py,sha256=vrb3uti0RF6a336LLI95i8fso3hOFw9AFe1NxPnOf6k,2802
799
806
  cognee/tests/integration/documents/PdfDocument_test.py,sha256=IY0Cck8J2gEyuJHPK0HODPbZPIXQ799KhWrgkjn5feM,1798
@@ -821,12 +828,6 @@ cognee/tests/test_data/text_to_speech.mp3,sha256=h0xuFwn_ddt-q2AeBu_BdLmMJUc4QtE
821
828
  cognee/tests/test_data/text_to_speech_copy.mp3,sha256=h0xuFwn_ddt-q2AeBu_BdLmMJUc4QtEKWdBQ9ydGYXI,28173
822
829
  cognee/tests/unit/api/__init__.py,sha256=tKoksC3QC3r43L7MDdEdjE2A34r8iOD1YPv8mT-iZzk,29
823
830
  cognee/tests/unit/api/test_conditional_authentication_endpoints.py,sha256=t5HX6s8D-5pFANy9IJEtY5ht_GhlJSZK_KkpqVj8ZdI,9349
824
- cognee/tests/unit/cli/__init__.py,sha256=U069aFvdwfKPd6YsR_FJML5LRphHHF5wx9mwug1hRh4,32
825
- cognee/tests/unit/cli/test_cli_commands.py,sha256=5a3vPiSFmKumq6sTfdfMyeUpJGjbZ6_5zX4TUcV0ZJQ,17625
826
- cognee/tests/unit/cli/test_cli_edge_cases.py,sha256=PyFCnClvbXG1GaiS16qwcuyXXDJ4sRyBCKV5WHrOUxk,23501
827
- cognee/tests/unit/cli/test_cli_main.py,sha256=Gsj2zYlVL80iU9EjRj4Q4QzgsYuIngUvDbA9suV99oA,6098
828
- cognee/tests/unit/cli/test_cli_runner.py,sha256=WZ8oZIlc_JintDq_cnEg9tmLEMZMGFPQGhU7Y_7sfgs,1497
829
- cognee/tests/unit/cli/test_cli_utils.py,sha256=Flej8LNYRXNkWd2tq8elMm8MkqbhCUb8RtXaPzfNYm4,4323
830
831
  cognee/tests/unit/entity_extraction/regex_entity_extraction_test.py,sha256=3zNvSI56FBltg_lda06n93l2vl702i5O1ewoQXoo50E,10234
831
832
  cognee/tests/unit/eval_framework/answer_generation_test.py,sha256=TVrAJneOiTSztq7J6poo4GGPsow3MWnBtpBwPkDHq08,1309
832
833
  cognee/tests/unit/eval_framework/benchmark_adapters_test.py,sha256=yXmr5089j1KB5lrLs4v17JXPuUk2iwXJRJGOb_wdnqk,3382
@@ -854,10 +855,10 @@ cognee/tests/unit/modules/pipelines/run_task_from_queue_test.py,sha256=X2clLQYoP
854
855
  cognee/tests/unit/modules/pipelines/run_tasks_test.py,sha256=IJ_2NBOizC-PtW4c1asYZB-SI85dQswB0Lt5e_n-5zI,1399
855
856
  cognee/tests/unit/modules/pipelines/run_tasks_with_context_test.py,sha256=Bi5XgQWfrgCgTtRu1nrUAqraDYHUzILleOka5fpTsKE,1058
856
857
  cognee/tests/unit/modules/retrieval/chunks_retriever_test.py,sha256=jHsvi1Y-bsOVdFrGIfGaTXV4UvwI4KzQF_hV0i3oy2I,6341
857
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py,sha256=Mj2FTslG5g5mfK5jlGQ8MlwdUVq6ENpJKdwBpuOQsHI,6693
858
- cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py,sha256=_rDUE0kP0ewwuIH8iU_Jb7TLCikFhWA8DlBaiSgy3BM,6469
858
+ cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py,sha256=nVKITq5N0cOLCjvJvS6e9vAdbwFcNWxe11O1F7rEzok,6906
859
+ cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py,sha256=n5tMlsRzTsrMWpdqWS7nKOITwRnv3wNMMKFnXHTsdtU,6682
859
860
  cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py,sha256=T-WXkG9opjtlxY8R6CXcHazc2xouPOdUR9bumxxzFsY,8986
860
- cognee/tests/unit/modules/retrieval/insights_retriever_test.py,sha256=wt-JLTsRdi3A8kqEvXoQQZA5gZAauASjWPzYkYK_DQk,8644
861
+ cognee/tests/unit/modules/retrieval/insights_retriever_test.py,sha256=xkbxlNiHY6evVbBYMncllXDNs3nNC_jZeYP47oT8vG0,8592
861
862
  cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py,sha256=RQi5EAjB5ffiIcsFmfg3Hao3AVPOkTEL72xnXIxbTKM,6551
862
863
  cognee/tests/unit/modules/retrieval/summaries_retriever_test.py,sha256=IfhDyVuKUrjCEy22-Mva9w7li2mtPZT9FlNIFvpFMKw,4950
863
864
  cognee/tests/unit/modules/retrieval/temporal_retriever_test.py,sha256=bvGvJgq9JF8nxnFvBlSo2qOBc0FKjCe006Io5HityAo,7672
@@ -888,9 +889,9 @@ distributed/tasks/queued_add_edges.py,sha256=kz1DHE05y-kNHORQJjYWHUi6Q1QWUp_v3Dl
888
889
  distributed/tasks/queued_add_nodes.py,sha256=aqK4Ij--ADwUWknxYpiwbYrpa6CcvFfqHWbUZW4Kh3A,452
889
890
  distributed/workers/data_point_saving_worker.py,sha256=jFmA0-P_0Ru2IUDrSug0wML-5goAKrGtlBm5BA5Ryw4,3229
890
891
  distributed/workers/graph_saving_worker.py,sha256=oUYl99CdhlrPAIsUOHbHnS3d4XhGoV0_OIbCO8wYzRg,3648
891
- cognee-0.3.1.dist-info/METADATA,sha256=FiH8UcAy24p0Fj79WChu6lznpJ4Ikn2Wa7RXn4yK7SQ,14753
892
- cognee-0.3.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
893
- cognee-0.3.1.dist-info/entry_points.txt,sha256=4Fe5PRV0e3j5MFUo7kYyRFa3MhMNbOu69pGBazTxPps,51
894
- cognee-0.3.1.dist-info/licenses/LICENSE,sha256=pHHjSQj1DD8SDppW88MMs04TPk7eAanL1c5xj8NY7NQ,11344
895
- cognee-0.3.1.dist-info/licenses/NOTICE.md,sha256=6L3saP3kSpcingOxDh-SGjMS8GY79Rlh2dBNLaO0o5c,339
896
- cognee-0.3.1.dist-info/RECORD,,
892
+ cognee-0.3.3.dist-info/METADATA,sha256=MofBzxb-pUo59hyKjasnooG9SDbuVPsvy5UK6sjXluA,14753
893
+ cognee-0.3.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
894
+ cognee-0.3.3.dist-info/entry_points.txt,sha256=GCCTsNg8gzOJkolq7dR7OK1VlIAO202dGDnMI8nm8oQ,55
895
+ cognee-0.3.3.dist-info/licenses/LICENSE,sha256=pHHjSQj1DD8SDppW88MMs04TPk7eAanL1c5xj8NY7NQ,11344
896
+ cognee-0.3.3.dist-info/licenses/NOTICE.md,sha256=6L3saP3kSpcingOxDh-SGjMS8GY79Rlh2dBNLaO0o5c,339
897
+ cognee-0.3.3.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ cognee-cli = cognee.cli._cognee:main
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- cognee = cognee.cli._cognee:main
File without changes