remdb 0.3.103__py3-none-any.whl → 0.3.141__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.

Potentially problematic release.


This version of remdb might be problematic. Click here for more details.

Files changed (74) hide show
  1. rem/agentic/agents/sse_simulator.py +2 -0
  2. rem/agentic/context.py +51 -27
  3. rem/agentic/mcp/tool_wrapper.py +155 -18
  4. rem/agentic/otel/setup.py +93 -4
  5. rem/agentic/providers/phoenix.py +371 -108
  6. rem/agentic/providers/pydantic_ai.py +195 -46
  7. rem/agentic/schema.py +361 -21
  8. rem/agentic/tools/rem_tools.py +3 -3
  9. rem/api/main.py +85 -16
  10. rem/api/mcp_router/resources.py +1 -1
  11. rem/api/mcp_router/server.py +18 -4
  12. rem/api/mcp_router/tools.py +394 -16
  13. rem/api/routers/admin.py +218 -1
  14. rem/api/routers/chat/completions.py +280 -7
  15. rem/api/routers/chat/models.py +81 -7
  16. rem/api/routers/chat/otel_utils.py +33 -0
  17. rem/api/routers/chat/sse_events.py +17 -1
  18. rem/api/routers/chat/streaming.py +177 -3
  19. rem/api/routers/feedback.py +142 -329
  20. rem/api/routers/query.py +360 -0
  21. rem/api/routers/shared_sessions.py +13 -13
  22. rem/cli/commands/README.md +237 -64
  23. rem/cli/commands/cluster.py +1808 -0
  24. rem/cli/commands/configure.py +4 -7
  25. rem/cli/commands/db.py +354 -143
  26. rem/cli/commands/experiments.py +436 -30
  27. rem/cli/commands/process.py +14 -8
  28. rem/cli/commands/schema.py +92 -45
  29. rem/cli/commands/session.py +336 -0
  30. rem/cli/dreaming.py +2 -2
  31. rem/cli/main.py +29 -6
  32. rem/config.py +8 -1
  33. rem/models/core/experiment.py +54 -0
  34. rem/models/core/rem_query.py +5 -2
  35. rem/models/entities/ontology.py +1 -1
  36. rem/models/entities/ontology_config.py +1 -1
  37. rem/models/entities/shared_session.py +2 -28
  38. rem/registry.py +10 -4
  39. rem/schemas/agents/examples/contract-analyzer.yaml +1 -1
  40. rem/schemas/agents/examples/contract-extractor.yaml +1 -1
  41. rem/schemas/agents/examples/cv-parser.yaml +1 -1
  42. rem/services/content/service.py +30 -8
  43. rem/services/embeddings/api.py +4 -4
  44. rem/services/embeddings/worker.py +16 -16
  45. rem/services/phoenix/client.py +59 -18
  46. rem/services/postgres/README.md +151 -26
  47. rem/services/postgres/__init__.py +2 -1
  48. rem/services/postgres/diff_service.py +531 -0
  49. rem/services/postgres/pydantic_to_sqlalchemy.py +427 -129
  50. rem/services/postgres/schema_generator.py +205 -4
  51. rem/services/postgres/service.py +6 -6
  52. rem/services/rem/parser.py +44 -9
  53. rem/services/rem/service.py +36 -2
  54. rem/services/session/compression.py +7 -0
  55. rem/services/session/reload.py +1 -1
  56. rem/settings.py +288 -16
  57. rem/sql/background_indexes.sql +19 -24
  58. rem/sql/migrations/001_install.sql +252 -69
  59. rem/sql/migrations/002_install_models.sql +2197 -619
  60. rem/sql/migrations/003_optional_extensions.sql +326 -0
  61. rem/sql/migrations/004_cache_system.sql +548 -0
  62. rem/utils/__init__.py +18 -0
  63. rem/utils/date_utils.py +2 -2
  64. rem/utils/schema_loader.py +110 -15
  65. rem/utils/sql_paths.py +146 -0
  66. rem/utils/vision.py +1 -1
  67. rem/workers/__init__.py +3 -1
  68. rem/workers/db_listener.py +579 -0
  69. rem/workers/unlogged_maintainer.py +463 -0
  70. {remdb-0.3.103.dist-info → remdb-0.3.141.dist-info}/METADATA +300 -215
  71. {remdb-0.3.103.dist-info → remdb-0.3.141.dist-info}/RECORD +73 -64
  72. rem/sql/migrations/003_seed_default_user.sql +0 -48
  73. {remdb-0.3.103.dist-info → remdb-0.3.141.dist-info}/WHEEL +0 -0
  74. {remdb-0.3.103.dist-info → remdb-0.3.141.dist-info}/entry_points.txt +0 -0
rem/settings.py CHANGED
@@ -33,14 +33,15 @@ Example .env file:
33
33
  AUTH__OIDC_CLIENT_ID=your-client-id
34
34
  AUTH__SESSION_SECRET=your-secret-key
35
35
 
36
- # OpenTelemetry (disabled by default)
36
+ # OpenTelemetry (disabled by default - enable via env var when collector available)
37
+ # Standard OTLP collector ports: 4317 (gRPC), 4318 (HTTP)
37
38
  OTEL__ENABLED=false
38
39
  OTEL__SERVICE_NAME=rem-api
39
- OTEL__COLLECTOR_ENDPOINT=http://localhost:4318
40
- OTEL__PROTOCOL=http
40
+ OTEL__COLLECTOR_ENDPOINT=http://localhost:4317
41
+ OTEL__PROTOCOL=grpc
41
42
 
42
- # Arize Phoenix (disabled by default)
43
- PHOENIX__ENABLED=false
43
+ # Arize Phoenix (enabled by default - can be disabled via env var)
44
+ PHOENIX__ENABLED=true
44
45
  PHOENIX__COLLECTOR_ENDPOINT=http://localhost:6006/v1/traces
45
46
  PHOENIX__PROJECT_NAME=rem
46
47
 
@@ -58,7 +59,7 @@ Example .env file:
58
59
 
59
60
  import os
60
61
  import hashlib
61
- from pydantic import Field, field_validator, FieldValidationInfo
62
+ from pydantic import Field, field_validator, ValidationInfo
62
63
  from pydantic_settings import BaseSettings, SettingsConfigDict
63
64
  from loguru import logger
64
65
 
@@ -241,6 +242,11 @@ class OTELSettings(BaseSettings):
241
242
  description="Export timeout in milliseconds",
242
243
  )
243
244
 
245
+ insecure: bool = Field(
246
+ default=True,
247
+ description="Use insecure (non-TLS) gRPC connection (default: True for local dev)",
248
+ )
249
+
244
250
 
245
251
  class PhoenixSettings(BaseSettings):
246
252
  """
@@ -267,8 +273,8 @@ class PhoenixSettings(BaseSettings):
267
273
  )
268
274
 
269
275
  enabled: bool = Field(
270
- default=False,
271
- description="Enable Phoenix integration (disabled by default for local dev)",
276
+ default=True,
277
+ description="Enable Phoenix integration (enabled by default)",
272
278
  )
273
279
 
274
280
  base_url: str = Field(
@@ -414,7 +420,7 @@ class AuthSettings(BaseSettings):
414
420
 
415
421
  @field_validator("session_secret", mode="before")
416
422
  @classmethod
417
- def generate_dev_secret(cls, v: str | None, info: FieldValidationInfo) -> str:
423
+ def generate_dev_secret(cls, v: str | None, info: ValidationInfo) -> str:
418
424
  # Only generate if not already set and not in production
419
425
  if not v and info.data.get("environment") != "production":
420
426
  # Deterministic secret for development
@@ -686,6 +692,91 @@ class S3Settings(BaseSettings):
686
692
  )
687
693
 
688
694
 
695
+ class DataLakeSettings(BaseSettings):
696
+ """
697
+ Data lake settings for experiment and dataset storage.
698
+
699
+ Data Lake Convention:
700
+ The data lake provides a standardized structure for storing datasets,
701
+ experiments, and calibration data in S3. Users bring their own bucket
702
+ and the version is pinned by default to v0 in the path.
703
+
704
+ S3 Path Structure:
705
+ s3://{bucket}/{version}/datasets/
706
+ ├── raw/ # Raw source data + transformers
707
+ │ └── {dataset_name}/ # e.g., cns_drugs, codes, care
708
+ ├── tables/ # Database table data (JSONL)
709
+ │ ├── resources/ # → resources table
710
+ │ │ ├── drugs/{category}/ # Psychotropic drugs
711
+ │ │ ├── care/stages/ # Treatment stages
712
+ │ │ └── crisis/ # Crisis resources
713
+ │ └── codes/ # → codes table
714
+ │ ├── icd10/{category}/ # ICD-10 codes
715
+ │ └── cpt/ # CPT codes
716
+ └── calibration/ # Agent calibration
717
+ ├── experiments/ # Experiment configs + results
718
+ │ └── {agent}/{task}/ # e.g., siggy/risk-assessment
719
+ └── datasets/ # Shared evaluation datasets
720
+
721
+ Experiment Storage:
722
+ - Local: experiments/{agent}/{task}/experiment.yaml
723
+ - S3: s3://{bucket}/{version}/datasets/calibration/experiments/{agent}/{task}/
724
+
725
+ Environment variables:
726
+ DATA_LAKE__BUCKET_NAME - S3 bucket for data lake (required)
727
+ DATA_LAKE__VERSION - Path version prefix (default: v0)
728
+ DATA_LAKE__DATASETS_PREFIX - Datasets directory (default: datasets)
729
+ DATA_LAKE__EXPERIMENTS_PREFIX - Experiments subdirectory (default: experiments)
730
+ """
731
+
732
+ model_config = SettingsConfigDict(
733
+ env_prefix="DATA_LAKE__",
734
+ env_file=".env",
735
+ env_file_encoding="utf-8",
736
+ extra="ignore",
737
+ )
738
+
739
+ bucket_name: str | None = Field(
740
+ default=None,
741
+ description="S3 bucket for data lake storage (user-provided)",
742
+ )
743
+
744
+ version: str = Field(
745
+ default="v0",
746
+ description="API version for data lake paths",
747
+ )
748
+
749
+ datasets_prefix: str = Field(
750
+ default="datasets",
751
+ description="Root directory for datasets in the bucket",
752
+ )
753
+
754
+ experiments_prefix: str = Field(
755
+ default="experiments",
756
+ description="Subdirectory within calibration for experiments",
757
+ )
758
+
759
+ def get_base_uri(self) -> str | None:
760
+ """Get the base S3 URI for the data lake."""
761
+ if not self.bucket_name:
762
+ return None
763
+ return f"s3://{self.bucket_name}/{self.version}/{self.datasets_prefix}"
764
+
765
+ def get_experiment_uri(self, agent: str, task: str = "general") -> str | None:
766
+ """Get the S3 URI for an experiment."""
767
+ base = self.get_base_uri()
768
+ if not base:
769
+ return None
770
+ return f"{base}/calibration/{self.experiments_prefix}/{agent}/{task}"
771
+
772
+ def get_tables_uri(self, table: str = "resources") -> str | None:
773
+ """Get the S3 URI for a table directory."""
774
+ base = self.get_base_uri()
775
+ if not base:
776
+ return None
777
+ return f"{base}/tables/{table}"
778
+
779
+
689
780
  class ChunkingSettings(BaseSettings):
690
781
  """
691
782
  Document chunking settings for semantic text splitting.
@@ -1004,6 +1095,75 @@ class APISettings(BaseSettings):
1004
1095
  )
1005
1096
 
1006
1097
 
1098
+ class ModelsSettings(BaseSettings):
1099
+ """
1100
+ Custom model registration settings for downstream applications.
1101
+
1102
+ Allows downstream apps to specify Python modules containing custom models
1103
+ that should be imported (and thus registered) before schema generation.
1104
+
1105
+ This enables `rem db schema generate` to discover models registered with
1106
+ `@rem.register_model` in downstream applications.
1107
+
1108
+ Environment variables:
1109
+ MODELS__IMPORT_MODULES - Semicolon-separated list of Python modules to import
1110
+ Example: "models;myapp.entities;myapp.custom_models"
1111
+
1112
+ Example:
1113
+ # In downstream app's .env
1114
+ MODELS__IMPORT_MODULES=models
1115
+
1116
+ # In downstream app's models/__init__.py
1117
+ import rem
1118
+ from rem.models.core import CoreModel
1119
+
1120
+ @rem.register_model
1121
+ class MyCustomEntity(CoreModel):
1122
+ name: str
1123
+
1124
+ # Then run schema generation
1125
+ rem db schema generate # Includes MyCustomEntity
1126
+ """
1127
+
1128
+ model_config = SettingsConfigDict(
1129
+ env_prefix="MODELS__",
1130
+ extra="ignore",
1131
+ )
1132
+
1133
+ import_modules: str = Field(
1134
+ default="",
1135
+ description=(
1136
+ "Semicolon-separated list of Python modules to import for model registration. "
1137
+ "These modules are imported before schema generation to ensure custom models "
1138
+ "decorated with @rem.register_model are discovered. "
1139
+ "Example: 'models;myapp.entities'"
1140
+ ),
1141
+ )
1142
+
1143
+ @property
1144
+ def module_list(self) -> list[str]:
1145
+ """
1146
+ Get modules as a list, filtering empty strings.
1147
+
1148
+ Auto-detects ./models folder if it exists and is importable.
1149
+ """
1150
+ modules = []
1151
+ if self.import_modules:
1152
+ modules = [m.strip() for m in self.import_modules.split(";") if m.strip()]
1153
+
1154
+ # Auto-detect ./models if it exists and is a Python package (convention over configuration)
1155
+ from pathlib import Path
1156
+
1157
+ models_path = Path("./models")
1158
+ if models_path.exists() and models_path.is_dir():
1159
+ # Check if it's a Python package (has __init__.py)
1160
+ if (models_path / "__init__.py").exists():
1161
+ if "models" not in modules:
1162
+ modules.insert(0, "models")
1163
+
1164
+ return modules
1165
+
1166
+
1007
1167
  class SchemaSettings(BaseSettings):
1008
1168
  """
1009
1169
  Schema search path settings for agent and evaluator schemas.
@@ -1187,6 +1347,110 @@ class GitSettings(BaseSettings):
1187
1347
  )
1188
1348
 
1189
1349
 
1350
+ class DBListenerSettings(BaseSettings):
1351
+ """
1352
+ PostgreSQL LISTEN/NOTIFY database listener settings.
1353
+
1354
+ The DB Listener is a lightweight worker that subscribes to PostgreSQL
1355
+ NOTIFY events and dispatches them to external systems (SQS, REST, custom).
1356
+
1357
+ Architecture:
1358
+ - Single-replica deployment (to avoid duplicate processing)
1359
+ - Dedicated connection for LISTEN (not from connection pool)
1360
+ - Automatic reconnection with exponential backoff
1361
+ - Graceful shutdown on SIGTERM
1362
+
1363
+ Use Cases:
1364
+ - Sync data changes to external systems (Phoenix, webhooks)
1365
+ - Trigger async jobs without polling
1366
+ - Event-driven architectures with PostgreSQL as event source
1367
+
1368
+ Example PostgreSQL trigger:
1369
+ CREATE OR REPLACE FUNCTION notify_feedback_insert()
1370
+ RETURNS TRIGGER AS $$
1371
+ BEGIN
1372
+ PERFORM pg_notify('feedback_sync', json_build_object(
1373
+ 'id', NEW.id,
1374
+ 'table', 'feedbacks',
1375
+ 'action', 'insert'
1376
+ )::text);
1377
+ RETURN NEW;
1378
+ END;
1379
+ $$ LANGUAGE plpgsql;
1380
+
1381
+ Environment variables:
1382
+ DB_LISTENER__ENABLED - Enable the listener worker (default: false)
1383
+ DB_LISTENER__CHANNELS - Comma-separated PostgreSQL channels to listen on
1384
+ DB_LISTENER__HANDLER_TYPE - Handler type: 'sqs', 'rest', or 'custom'
1385
+ DB_LISTENER__SQS_QUEUE_URL - SQS queue URL (for handler_type=sqs)
1386
+ DB_LISTENER__REST_ENDPOINT - REST endpoint URL (for handler_type=rest)
1387
+ DB_LISTENER__RECONNECT_DELAY - Initial reconnect delay in seconds
1388
+ DB_LISTENER__MAX_RECONNECT_DELAY - Maximum reconnect delay in seconds
1389
+
1390
+ References:
1391
+ - PostgreSQL NOTIFY: https://www.postgresql.org/docs/current/sql-notify.html
1392
+ - Brandur's Notifier: https://brandur.org/notifier
1393
+ """
1394
+
1395
+ model_config = SettingsConfigDict(
1396
+ env_prefix="DB_LISTENER__",
1397
+ env_file=".env",
1398
+ env_file_encoding="utf-8",
1399
+ extra="ignore",
1400
+ )
1401
+
1402
+ enabled: bool = Field(
1403
+ default=False,
1404
+ description="Enable the DB Listener worker (disabled by default)",
1405
+ )
1406
+
1407
+ channels: str = Field(
1408
+ default="",
1409
+ description=(
1410
+ "Comma-separated list of PostgreSQL channels to LISTEN on. "
1411
+ "Example: 'feedback_sync,entity_update,user_events'"
1412
+ ),
1413
+ )
1414
+
1415
+ handler_type: str = Field(
1416
+ default="rest",
1417
+ description=(
1418
+ "Handler type for dispatching notifications. Options: "
1419
+ "'sqs' (publish to SQS), 'rest' (POST to endpoint), 'custom' (Python handlers)"
1420
+ ),
1421
+ )
1422
+
1423
+ sqs_queue_url: str = Field(
1424
+ default="",
1425
+ description="SQS queue URL for handler_type='sqs'",
1426
+ )
1427
+
1428
+ rest_endpoint: str = Field(
1429
+ default="http://localhost:8000/api/v1/internal/events",
1430
+ description=(
1431
+ "REST endpoint URL for handler_type='rest'. "
1432
+ "Receives POST with {channel, payload, source} JSON body."
1433
+ ),
1434
+ )
1435
+
1436
+ reconnect_delay: float = Field(
1437
+ default=1.0,
1438
+ description="Initial delay (seconds) between reconnection attempts",
1439
+ )
1440
+
1441
+ max_reconnect_delay: float = Field(
1442
+ default=60.0,
1443
+ description="Maximum delay (seconds) between reconnection attempts (exponential backoff cap)",
1444
+ )
1445
+
1446
+ @property
1447
+ def channel_list(self) -> list[str]:
1448
+ """Get channels as a list, filtering empty strings."""
1449
+ if not self.channels:
1450
+ return []
1451
+ return [c.strip() for c in self.channels.split(",") if c.strip()]
1452
+
1453
+
1190
1454
  class TestSettings(BaseSettings):
1191
1455
  """
1192
1456
  Test environment settings.
@@ -1281,16 +1545,12 @@ class Settings(BaseSettings):
1281
1545
  description="Root path for reverse proxy (e.g., /rem for ALB routing)",
1282
1546
  )
1283
1547
 
1284
- sql_dir: str = Field(
1285
- default="src/rem/sql",
1286
- description="Directory for SQL files and migrations",
1287
- )
1288
-
1289
1548
  # Nested settings groups
1290
1549
  api: APISettings = Field(default_factory=APISettings)
1291
1550
  chat: ChatSettings = Field(default_factory=ChatSettings)
1292
1551
  llm: LLMSettings = Field(default_factory=LLMSettings)
1293
1552
  mcp: MCPSettings = Field(default_factory=MCPSettings)
1553
+ models: ModelsSettings = Field(default_factory=ModelsSettings)
1294
1554
  otel: OTELSettings = Field(default_factory=OTELSettings)
1295
1555
  phoenix: PhoenixSettings = Field(default_factory=PhoenixSettings)
1296
1556
  auth: AuthSettings = Field(default_factory=AuthSettings)
@@ -1298,18 +1558,30 @@ class Settings(BaseSettings):
1298
1558
  migration: MigrationSettings = Field(default_factory=MigrationSettings)
1299
1559
  storage: StorageSettings = Field(default_factory=StorageSettings)
1300
1560
  s3: S3Settings = Field(default_factory=S3Settings)
1561
+ data_lake: DataLakeSettings = Field(default_factory=DataLakeSettings)
1301
1562
  git: GitSettings = Field(default_factory=GitSettings)
1302
1563
  sqs: SQSSettings = Field(default_factory=SQSSettings)
1564
+ db_listener: DBListenerSettings = Field(default_factory=DBListenerSettings)
1303
1565
  chunking: ChunkingSettings = Field(default_factory=ChunkingSettings)
1304
1566
  content: ContentSettings = Field(default_factory=ContentSettings)
1305
1567
  schema_search: SchemaSettings = Field(default_factory=SchemaSettings)
1306
1568
  test: TestSettings = Field(default_factory=TestSettings)
1307
1569
 
1308
1570
 
1571
+ # Auto-load .env file from current directory if it exists
1572
+ # This happens BEFORE config file loading, so .env takes precedence
1573
+ from pathlib import Path
1574
+ from dotenv import load_dotenv
1575
+
1576
+ _dotenv_path = Path(".env")
1577
+ if _dotenv_path.exists():
1578
+ load_dotenv(_dotenv_path, override=False) # Don't override existing env vars
1579
+ logger.debug(f"Loaded environment from {_dotenv_path.resolve()}")
1580
+
1309
1581
  # Load configuration from ~/.rem/config.yaml before initializing settings
1310
1582
  # This allows user configuration to be merged with environment variables
1311
- # Set REM_SKIP_CONFIG_FILE=true to disable (useful for development with .env)
1312
- if not os.getenv("REM_SKIP_CONFIG_FILE", "").lower() in ("true", "1", "yes"):
1583
+ # Set REM_SKIP_CONFIG=1 to disable (useful for development with .env)
1584
+ if not os.getenv("REM_SKIP_CONFIG", "").lower() in ("true", "1", "yes"):
1313
1585
  try:
1314
1586
  from rem.config import load_config, merge_config_to_env
1315
1587
 
@@ -1,9 +1,9 @@
1
1
  -- Background index creation
2
2
  -- Run AFTER initial data load to avoid blocking writes
3
3
 
4
- -- HNSW vector index for embeddings_users
5
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_users_vector_hnsw
6
- ON embeddings_users
4
+ -- HNSW vector index for embeddings_files
5
+ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_files_vector_hnsw
6
+ ON embeddings_files
7
7
  USING hnsw (embedding vector_cosine_ops);
8
8
 
9
9
  -- HNSW vector index for embeddings_image_resources
@@ -11,29 +11,14 @@ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_image_resources_vector_hn
11
11
  ON embeddings_image_resources
12
12
  USING hnsw (embedding vector_cosine_ops);
13
13
 
14
- -- HNSW vector index for embeddings_moments
15
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_moments_vector_hnsw
16
- ON embeddings_moments
17
- USING hnsw (embedding vector_cosine_ops);
18
-
19
- -- HNSW vector index for embeddings_sessions
20
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_sessions_vector_hnsw
21
- ON embeddings_sessions
22
- USING hnsw (embedding vector_cosine_ops);
23
-
24
- -- HNSW vector index for embeddings_resources
25
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_resources_vector_hnsw
26
- ON embeddings_resources
27
- USING hnsw (embedding vector_cosine_ops);
28
-
29
14
  -- HNSW vector index for embeddings_messages
30
15
  CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_messages_vector_hnsw
31
16
  ON embeddings_messages
32
17
  USING hnsw (embedding vector_cosine_ops);
33
18
 
34
- -- HNSW vector index for embeddings_files
35
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_files_vector_hnsw
36
- ON embeddings_files
19
+ -- HNSW vector index for embeddings_moments
20
+ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_moments_vector_hnsw
21
+ ON embeddings_moments
37
22
  USING hnsw (embedding vector_cosine_ops);
38
23
 
39
24
  -- HNSW vector index for embeddings_ontology_configs
@@ -41,12 +26,22 @@ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_ontology_configs_vector_h
41
26
  ON embeddings_ontology_configs
42
27
  USING hnsw (embedding vector_cosine_ops);
43
28
 
44
- -- HNSW vector index for embeddings_domain_resources
45
- CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_domain_resources_vector_hnsw
46
- ON embeddings_domain_resources
29
+ -- HNSW vector index for embeddings_resources
30
+ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_resources_vector_hnsw
31
+ ON embeddings_resources
47
32
  USING hnsw (embedding vector_cosine_ops);
48
33
 
49
34
  -- HNSW vector index for embeddings_schemas
50
35
  CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_schemas_vector_hnsw
51
36
  ON embeddings_schemas
52
37
  USING hnsw (embedding vector_cosine_ops);
38
+
39
+ -- HNSW vector index for embeddings_sessions
40
+ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_sessions_vector_hnsw
41
+ ON embeddings_sessions
42
+ USING hnsw (embedding vector_cosine_ops);
43
+
44
+ -- HNSW vector index for embeddings_users
45
+ CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_embeddings_users_vector_hnsw
46
+ ON embeddings_users
47
+ USING hnsw (embedding vector_cosine_ops);