Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ node_modules/
/benchmarks/snapshots/
/benchmarks/results/
benchmarks/baselines/locomo_baseline.json
data/
200 changes: 94 additions & 106 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
UnexpectedResponse = Exception # type: ignore[misc,assignment]

try: # Allow tests to import without full qdrant client installed
from qdrant_client.models import Distance, PayloadSchemaType, PointStruct, VectorParams
from qdrant_client.models import (Distance, PayloadSchemaType, PointStruct,
VectorParams)
except Exception: # pragma: no cover - degraded import path
try:
from qdrant_client.http import models as _qmodels
Expand Down Expand Up @@ -64,31 +65,38 @@ def __init__(self, id: str, vector: List[float], payload: Dict[str, Any]):
OpenAI = None # type: ignore

# SSE streaming for real-time observability
from automem.api.auth_helpers import extract_api_token as _extract_api_token_helper
from automem.api.auth_helpers import require_admin_token as _require_admin_token_helper
from automem.api.auth_helpers import require_api_token as _require_api_token_helper
from automem.api.runtime_bootstrap import register_blueprints as _register_blueprints_runtime
from automem.api.auth_helpers import \
extract_api_token as _extract_api_token_helper
from automem.api.auth_helpers import \
require_admin_token as _require_admin_token_helper
from automem.api.auth_helpers import \
require_api_token as _require_api_token_helper
from automem.api.runtime_bootstrap import \
register_blueprints as _register_blueprints_runtime
from automem.api.stream import emit_event
from automem.app_helper_bindings import create_app_helper_runtime
from automem.classification.memory_classifier import MemoryClassifier
from automem.consolidation.runtime_bindings import create_consolidation_runtime
from automem.embedding.runtime_bindings import create_embedding_runtime
from automem.embedding.runtime_helpers import coerce_embedding as _coerce_embedding_value
from automem.embedding.runtime_helpers import coerce_importance as _coerce_importance_value
from automem.embedding.runtime_helpers import (
generate_placeholder_embedding as _generate_placeholder_embedding_value,
)
from automem.embedding.runtime_helpers import (
generate_real_embedding as _generate_real_embedding_value,
)
from automem.embedding.runtime_helpers import (
generate_real_embeddings_batch as _generate_real_embeddings_batch_value,
)
from automem.embedding.runtime_helpers import normalize_tags as _normalize_tags_value
from automem.embedding.runtime_helpers import \
coerce_embedding as _coerce_embedding_value
from automem.embedding.runtime_helpers import \
coerce_importance as _coerce_importance_value
from automem.embedding.runtime_helpers import \
generate_placeholder_embedding as _generate_placeholder_embedding_value
from automem.embedding.runtime_helpers import \
generate_real_embedding as _generate_real_embedding_value
from automem.embedding.runtime_helpers import \
generate_real_embeddings_batch as _generate_real_embeddings_batch_value
from automem.embedding.runtime_helpers import \
normalize_tags as _normalize_tags_value
from automem.enrichment.runtime_bindings import create_enrichment_runtime
from automem.enrichment.runtime_queue_bindings import create_enrichment_queue_runtime
from automem.runtime_environment import configure_logging, ensure_local_package_importable
from automem.runtime_wiring import run_default_server, wire_recall_and_blueprints
from automem.enrichment.runtime_queue_bindings import \
create_enrichment_queue_runtime
from automem.runtime_environment import (configure_logging,
ensure_local_package_importable)
from automem.runtime_wiring import (run_default_server,
wire_recall_and_blueprints)
from automem.service_runtime_bindings import create_service_runtime
from automem.service_state import EnrichmentJob, EnrichmentStats, ServiceState

Expand Down Expand Up @@ -119,103 +127,78 @@ def _parse_viewer_allowed_origins() -> Any:
)

# Import canonical configuration constants
from automem.config import (
ADMIN_TOKEN,
API_TOKEN,
AUTHORABLE_RELATIONS,
CLASSIFICATION_MODEL,
COLLECTION_NAME,
CONSOLIDATION_ARCHIVE_THRESHOLD,
CONSOLIDATION_BASE_DECAY_RATE,
CONSOLIDATION_CLUSTER_INTERVAL_SECONDS,
CONSOLIDATION_CONTROL_LABEL,
CONSOLIDATION_CONTROL_NODE_ID,
CONSOLIDATION_CREATIVE_INTERVAL_SECONDS,
CONSOLIDATION_DECAY_IMPORTANCE_THRESHOLD,
CONSOLIDATION_DECAY_INTERVAL_SECONDS,
CONSOLIDATION_DELETE_THRESHOLD,
CONSOLIDATION_FORGET_INTERVAL_SECONDS,
CONSOLIDATION_GRACE_PERIOD_DAYS,
CONSOLIDATION_HISTORY_LIMIT,
CONSOLIDATION_IMPORTANCE_FLOOR_FACTOR,
CONSOLIDATION_IMPORTANCE_PROTECTION_THRESHOLD,
CONSOLIDATION_PROTECTED_TYPES,
CONSOLIDATION_RUN_LABEL,
CONSOLIDATION_TASK_FIELDS,
CONSOLIDATION_TICK_SECONDS,
DEFAULT_EXPAND_RELATIONS,
EMBEDDING_MODEL,
ENRICHMENT_ENABLE_SUMMARIES,
ENRICHMENT_FAILURE_BACKOFF_SECONDS,
ENRICHMENT_IDLE_SLEEP_SECONDS,
ENRICHMENT_MAX_ATTEMPTS,
ENRICHMENT_SIMILARITY_LIMIT,
ENRICHMENT_SIMILARITY_THRESHOLD,
ENRICHMENT_SPACY_MODEL,
FALKORDB_PORT,
FILTERABLE_RELATIONS,
GRAPH_NAME,
JIT_ENRICHMENT_ENABLED,
MEMORY_TYPES,
RECALL_EXPANSION_LIMIT,
RECALL_RELATION_LIMIT,
RELATIONSHIP_TYPES,
SEARCH_WEIGHT_CONFIDENCE,
SEARCH_WEIGHT_EXACT,
SEARCH_WEIGHT_IMPORTANCE,
SEARCH_WEIGHT_KEYWORD,
SEARCH_WEIGHT_RECENCY,
SEARCH_WEIGHT_TAG,
SEARCH_WEIGHT_VECTOR,
SYNC_AUTO_REPAIR,
SYNC_CHECK_INTERVAL_SECONDS,
TYPE_ALIASES,
VECTOR_SIZE,
normalize_memory_type,
)
from automem.config import (ADMIN_TOKEN, API_TOKEN, AUTHORABLE_RELATIONS,
CLASSIFICATION_MODEL, COLLECTION_NAME,
CONSOLIDATION_ARCHIVE_THRESHOLD,
CONSOLIDATION_BASE_DECAY_RATE,
CONSOLIDATION_CLUSTER_INTERVAL_SECONDS,
CONSOLIDATION_CONTROL_LABEL,
CONSOLIDATION_CONTROL_NODE_ID,
CONSOLIDATION_CREATIVE_INTERVAL_SECONDS,
CONSOLIDATION_DECAY_IMPORTANCE_THRESHOLD,
CONSOLIDATION_DECAY_INTERVAL_SECONDS,
CONSOLIDATION_DELETE_THRESHOLD,
CONSOLIDATION_FORGET_INTERVAL_SECONDS,
CONSOLIDATION_GRACE_PERIOD_DAYS,
CONSOLIDATION_HISTORY_LIMIT,
CONSOLIDATION_IDENTITY_INTERVAL_SECONDS,
CONSOLIDATION_IMPORTANCE_FLOOR_FACTOR,
CONSOLIDATION_IMPORTANCE_PROTECTION_THRESHOLD,
CONSOLIDATION_PROTECTED_TYPES,
CONSOLIDATION_RUN_LABEL, CONSOLIDATION_TASK_FIELDS,
CONSOLIDATION_TICK_SECONDS,
DEFAULT_EXPAND_RELATIONS, EMBEDDING_MODEL,
ENRICHMENT_ENABLE_SUMMARIES,
ENRICHMENT_FAILURE_BACKOFF_SECONDS,
ENRICHMENT_IDLE_SLEEP_SECONDS,
ENRICHMENT_MAX_ATTEMPTS,
ENRICHMENT_SIMILARITY_LIMIT,
ENRICHMENT_SIMILARITY_THRESHOLD,
ENRICHMENT_SPACY_MODEL, FALKORDB_PORT,
FILTERABLE_RELATIONS, GRAPH_NAME,
JIT_ENRICHMENT_ENABLED, MEMORY_TYPES,
RECALL_EXPANSION_LIMIT, RECALL_RELATION_LIMIT,
RELATIONSHIP_TYPES, SEARCH_WEIGHT_CONFIDENCE,
SEARCH_WEIGHT_EXACT, SEARCH_WEIGHT_IMPORTANCE,
SEARCH_WEIGHT_KEYWORD, SEARCH_WEIGHT_RECENCY,
SEARCH_WEIGHT_TAG, SEARCH_WEIGHT_VECTOR,
SYNC_AUTO_REPAIR, SYNC_CHECK_INTERVAL_SECONDS,
TYPE_ALIASES, VECTOR_SIZE, normalize_memory_type)
from automem.search.runtime_keywords import load_keyword_runtime
from automem.search.runtime_recall_helpers import (
_graph_keyword_search,
_result_passes_filters,
_vector_filter_only_tag_search,
_vector_search,
configure_recall_helpers,
)
from automem.search.runtime_relations import fetch_relations as _fetch_relations_runtime
_graph_keyword_search, _result_passes_filters,
_vector_filter_only_tag_search, _vector_search, configure_recall_helpers)
from automem.search.runtime_relations import \
fetch_relations as _fetch_relations_runtime
from automem.stores.graph_store import _build_graph_tag_predicate
from automem.stores.vector_store import _build_qdrant_tag_filter
from automem.sync.runtime_bindings import create_sync_runtime
from automem.utils.entity_extraction import (
_slugify,
configure_entity_extraction,
extract_entities,
generate_summary,
)
from automem.utils.entity_extraction import (_slugify,
configure_entity_extraction,
extract_entities,
generate_summary)
from automem.utils.graph import _serialize_node, _summarize_relation_node
from automem.utils.scoring import _compute_metadata_score, _parse_metadata_field
from automem.utils.tags import (
_compute_tag_prefixes,
_expand_tag_prefixes,
_normalize_tag_list,
_prepare_tag_filters,
)

from automem.utils.scoring import (_compute_metadata_score,
_parse_metadata_field)
from automem.utils.tags import (_compute_tag_prefixes, _expand_tag_prefixes,
_normalize_tag_list, _prepare_tag_filters)
# Shared utils and helpers
from automem.utils.time import (
_normalize_timestamp,
_parse_iso_datetime,
_parse_time_expression,
utc_now,
)
from automem.utils.validation import get_effective_vector_size, validate_vector_dimensions
from automem.utils.time import (_normalize_timestamp, _parse_iso_datetime,
_parse_time_expression, utc_now)
from automem.utils.validation import (get_effective_vector_size,
validate_vector_dimensions)

# Embedding batching configuration
EMBEDDING_BATCH_SIZE = int(os.getenv("EMBEDDING_BATCH_SIZE", "20"))
EMBEDDING_BATCH_TIMEOUT_SECONDS = float(os.getenv("EMBEDDING_BATCH_TIMEOUT_SECONDS", "2.0"))
EMBEDDING_BATCH_TIMEOUT_SECONDS = float(
os.getenv("EMBEDDING_BATCH_TIMEOUT_SECONDS", "2.0")
)

"""Note: default types/relations/weights are imported from automem.config"""

SEARCH_STOPWORDS, ENTITY_STOPWORDS, ENTITY_BLOCKLIST, _extract_keywords = load_keyword_runtime()
SEARCH_STOPWORDS, ENTITY_STOPWORDS, ENTITY_BLOCKLIST, _extract_keywords = (
load_keyword_runtime()
)

# Exported for runtime wiring: the blueprint factory consumes these via module attributes.
RELATION_TAXONOMY = {
Expand Down Expand Up @@ -325,7 +308,9 @@ def require_api_token() -> None:
enrichment_max_attempts=ENRICHMENT_MAX_ATTEMPTS,
enrichment_failure_backoff_seconds=ENRICHMENT_FAILURE_BACKOFF_SECONDS,
empty_exc=Empty,
enrich_memory_fn=lambda memory_id, forced=False: enrich_memory(memory_id, forced=forced),
enrich_memory_fn=lambda memory_id, forced=False: enrich_memory(
memory_id, forced=forced
),
emit_event_fn=emit_event,
perf_counter_fn=time.perf_counter,
sleep_fn=time.sleep,
Expand Down Expand Up @@ -358,6 +343,7 @@ def require_api_token() -> None:
creative_interval_seconds=CONSOLIDATION_CREATIVE_INTERVAL_SECONDS,
cluster_interval_seconds=CONSOLIDATION_CLUSTER_INTERVAL_SECONDS,
forget_interval_seconds=CONSOLIDATION_FORGET_INTERVAL_SECONDS,
identity_interval_seconds=CONSOLIDATION_IDENTITY_INTERVAL_SECONDS,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
delete_threshold=CONSOLIDATION_DELETE_THRESHOLD,
archive_threshold=CONSOLIDATION_ARCHIVE_THRESHOLD,
grace_period_days=CONSOLIDATION_GRACE_PERIOD_DAYS,
Expand Down Expand Up @@ -393,7 +379,9 @@ def require_api_token() -> None:
point_struct_cls=PointStruct,
utc_now_fn=utc_now,
generate_real_embedding_fn=lambda content: _generate_real_embedding(content),
generate_real_embeddings_batch_fn=lambda contents: _generate_real_embeddings_batch(contents),
generate_real_embeddings_batch_fn=lambda contents: _generate_real_embeddings_batch(
contents
),
)

init_embedding_pipeline = _embedding_runtime.init_embedding_pipeline
Expand Down
Loading
Loading