Files
wehub-resource-sync c889a57b6b
Test Suites / Build CI Environment (push) Has been cancelled
Test Suites / Basic Tests (push) Has been cancelled
Test Suites / End-to-End Tests (push) Has been cancelled
Test Suites / CLI Tests (push) Has been cancelled
Test Suites / Slow End-to-End Tests (push) Has been cancelled
Test Suites / Graph Database Tests (push) Has been cancelled
Test Suites / Vector DB Tests (push) Has been cancelled
Test Suites / Temporal Graph Test (push) Has been cancelled
Test Suites / Search Test on Different DBs (push) Has been cancelled
Test Suites / Example Tests (push) Has been cancelled
Test Suites / Notebook Tests (push) Has been cancelled
Test Suites / OS and Python Tests Ubuntu (push) Has been cancelled
Test Suites / OS and Python Tests Extended (push) Has been cancelled
Test Suites / LLM Test Suite (push) Has been cancelled
Test Suites / S3 File Storage Test (push) Has been cancelled
Test Suites / Run Integration Tests (push) Has been cancelled
Test Suites / MCP Tests (push) Has been cancelled
Test Suites / Docker Compose Test (push) Has been cancelled
Test Suites / Docker CI test (push) Has been cancelled
Test Suites / Relational DB Migration Tests (push) Has been cancelled
Test Suites / Distributed Cognee Test (push) Has been cancelled
Test Suites / DB Examples Tests (push) Has been cancelled
Test Suites / Test Completion Status (push) Has been cancelled
Test Suites / Claude Code Review (push) Has been cancelled
Test Suites / basic checks (push) Has been cancelled
build | Build and Push Cognee MCP Docker Image to dockerhub / docker-build-and-push (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
build | Build and Push Docker Image to dockerhub / docker-build-and-push (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Core Functionality (3.11) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Core Functionality (3.12) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges with Different Graph Databases (kuzu, kuzu) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges with Different Graph Databases (neo4j, neo4j) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Examples (push) Has been cancelled
Weighted Edges Tests / Code Quality for Weighted Edges (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:02:24 +08:00

185 lines
6.1 KiB
Python

from typing import List, Optional
from cognee.context_global_variables import session_user
from cognee.exceptions import CogneeValidationError
from cognee.infrastructure.databases.cache.models import SessionQAEntry
from cognee.infrastructure.databases.exceptions import DatabaseNotCreatedError
from cognee.infrastructure.session.get_session_manager import get_session_manager
from cognee.modules.users.exceptions.exceptions import UserNotFoundError
from cognee.modules.users.methods import get_default_user
from cognee.modules.users.models import User
from cognee.shared.logging_utils import get_logger
logger = get_logger("session_api_sdk")
async def _resolve_user(user: Optional[User]) -> User:
if user is not None:
if getattr(user, "id", None) is None:
raise CogneeValidationError(
message="Session user must have an id.",
name="SessionPreconditionError",
)
return user
ctx_user = session_user.get()
if ctx_user is not None and getattr(ctx_user, "id", None) is not None:
return ctx_user
try:
return await get_default_user()
except (DatabaseNotCreatedError, UserNotFoundError) as error:
raise CogneeValidationError(
message=(
"Session prerequisites not met: no default user found. "
"Initialize Cognee before using session APIs by running "
"`await cognee.add(...)` followed by `await cognee.cognify()`."
),
name="SessionPreconditionError",
) from error
async def get_session(
session_id: str = "default_session",
last_n: Optional[int] = None,
user: Optional[User] = None,
) -> List[SessionQAEntry]:
resolved_user = await _resolve_user(user)
user_id = str(resolved_user.id)
try:
sm = get_session_manager()
raw = await sm.get_session(
user_id=user_id,
session_id=session_id,
last_n=last_n,
formatted=False,
)
except Exception as e:
logger.warning("get_session: error from SessionManager: %s", e)
return []
if not raw:
return []
result: List[SessionQAEntry] = []
for entry in raw:
if isinstance(entry, dict):
try:
result.append(SessionQAEntry.model_validate(entry))
except Exception as e:
logger.warning("get_session: skip invalid entry: %s", e)
elif isinstance(entry, SessionQAEntry):
result.append(entry)
else:
logger.warning("get_session: skip non-dict non-SessionQAEntry entry: %s", type(entry))
return result
async def add_feedback(
session_id: str,
qa_id: str,
feedback_text: Optional[str] = None,
feedback_score: Optional[int] = None,
user: Optional[User] = None,
) -> bool:
resolved_user = await _resolve_user(user)
user_id = str(resolved_user.id)
try:
sm = get_session_manager()
return await sm.add_feedback(
user_id=user_id,
session_id=session_id,
qa_id=qa_id,
feedback_text=feedback_text,
feedback_score=feedback_score,
)
except Exception as e:
logger.warning("add_feedback: error from SessionManager: %s", e)
return False
async def add_frequency_weights(
session_id: str,
qa_id: str,
node_ids: Optional[list[str]] = None,
edge_ids: Optional[list[str]] = None,
user: Optional[User] = None,
) -> bool:
"""Add or update frequency weight data for a QA entry.
This function stores the graph elements (node_ids and edge_ids) that were used
in generating the answer for a QA entry. This data is later processed by
apply_frequency_weights to increment the frequency weights of those elements.
The frequency_weights_applied flag is reset to False so the entry will be
reprocessed by the apply_frequency_weights pipeline.
Args:
session_id: Session identifier.
qa_id: QA entry identifier.
node_ids: List of node IDs used in generating the answer.
edge_ids: List of edge IDs used in generating the answer.
user: User that owns the session. If None, uses session/context user or default user.
Returns:
True if updated, False if QA not found or cache unavailable.
"""
from cognee.tasks.memify.frequency_weights_constants import (
MEMIFY_METADATA_FREQUENCY_WEIGHTS_APPLIED_KEY,
)
resolved_user = await _resolve_user(user)
user_id = str(resolved_user.id)
used_graph_element_ids: dict[str, list[str]] = {}
if node_ids:
used_graph_element_ids["node_ids"] = node_ids
if edge_ids:
used_graph_element_ids["edge_ids"] = edge_ids
try:
sm = get_session_manager()
return await sm.update_qa(
user_id=user_id,
session_id=session_id,
qa_id=qa_id,
used_graph_element_ids=used_graph_element_ids if used_graph_element_ids else None,
memify_metadata={MEMIFY_METADATA_FREQUENCY_WEIGHTS_APPLIED_KEY: False},
)
except Exception as e:
logger.warning("add_frequency_weights: error from SessionManager: %s", e)
return False
async def delete_feedback(
session_id: str,
qa_id: str,
user: Optional[User] = None,
) -> bool:
"""
Clear feedback for a QA entry (sets feedback_text and feedback_score to None).
When user is None, uses session context or default user.
Args:
session_id: Session identifier.
qa_id: QA entry identifier to clear feedback for.
user: User that owns the session. If None, uses session/context user or default user.
Returns:
True if feedback was cleared, False if QA not found or cache unavailable.
"""
resolved_user = await _resolve_user(user)
user_id = str(resolved_user.id)
try:
sm = get_session_manager()
return await sm.delete_feedback(
user_id=user_id,
session_id=session_id,
qa_id=qa_id,
)
except Exception as e:
logger.warning("delete_feedback: error from SessionManager: %s", e)
return False