feat(sentiment): register_source upsert fix + connector factory fix for web:telegram:
This commit is contained in:
@@ -39,6 +39,12 @@ class CatalogueManager:
|
|||||||
# Load connector configs from settings
|
# Load connector configs from settings
|
||||||
await self._sync_connectors_from_settings()
|
await self._sync_connectors_from_settings()
|
||||||
|
|
||||||
|
# Force checkpoint to clear WAL and avoid locking issues
|
||||||
|
try:
|
||||||
|
self.catalogue._conn.execute("PRAGMA force_checkpoint")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to checkpoint database: {e}")
|
||||||
|
|
||||||
async def _upsert_from_credibility(self, item: Dict) -> None:
|
async def _upsert_from_credibility(self, item: Dict) -> None:
|
||||||
"""Create/update source from credibility registry entry"""
|
"""Create/update source from credibility registry entry"""
|
||||||
source_id = item.get("source_id", "")
|
source_id = item.get("source_id", "")
|
||||||
@@ -156,7 +162,7 @@ class CatalogueManager:
|
|||||||
cadence_seconds: int = 300,
|
cadence_seconds: int = 300,
|
||||||
tags: List[str] = None
|
tags: List[str] = None
|
||||||
) -> SourceDefinition:
|
) -> SourceDefinition:
|
||||||
"""Register a new source with validation"""
|
"""Register a new source with validation (upsert if exists)"""
|
||||||
schema = self.catalogue.get_schema(connector_type)
|
schema = self.catalogue.get_schema(connector_type)
|
||||||
if schema:
|
if schema:
|
||||||
# Validate cadence against schema
|
# Validate cadence against schema
|
||||||
@@ -166,7 +172,28 @@ class CatalogueManager:
|
|||||||
if cred not in (config.get("credentials", {}) if "credentials" in config else {}):
|
if cred not in (config.get("credentials", {}) if "credentials" in config else {}):
|
||||||
print(f"⚠️ Missing required credential: {cred}")
|
print(f"⚠️ Missing required credential: {cred}")
|
||||||
|
|
||||||
|
# Check if source already exists
|
||||||
|
existing = self.catalogue.get_source(name)
|
||||||
|
if existing:
|
||||||
|
# Update existing source
|
||||||
|
updates = {
|
||||||
|
"connector_type": connector_type.value,
|
||||||
|
"base_url": base_url,
|
||||||
|
"config": config,
|
||||||
|
"base_credibility": base_credibility,
|
||||||
|
"relevance": relevance,
|
||||||
|
"credentials_ref": credentials_ref,
|
||||||
|
"cadence_seconds": cadence_seconds,
|
||||||
|
"config_schema": schema.config_schema if schema else {},
|
||||||
|
"tags": tags or [],
|
||||||
|
"updated_ts": datetime.now().timestamp(),
|
||||||
|
}
|
||||||
|
self.catalogue.update_source(name, updates)
|
||||||
|
return self.catalogue.get_source(name)
|
||||||
|
else:
|
||||||
|
# Create new source
|
||||||
source = SourceDefinition(
|
source = SourceDefinition(
|
||||||
|
source_id=name,
|
||||||
name=name,
|
name=name,
|
||||||
connector_type=connector_type,
|
connector_type=connector_type,
|
||||||
base_url=base_url,
|
base_url=base_url,
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ class ConnectorType(str, Enum):
|
|||||||
REDDIT = "reddit"
|
REDDIT = "reddit"
|
||||||
DISCORD = "discord"
|
DISCORD = "discord"
|
||||||
TELEGRAM = "telegram"
|
TELEGRAM = "telegram"
|
||||||
|
EXCHANGE_ANN = "exchange_ann"
|
||||||
|
REGULATORY = "regulatory"
|
||||||
|
CORPORATE = "corporate"
|
||||||
WEB_CRAWL = "web_crawl"
|
WEB_CRAWL = "web_crawl"
|
||||||
|
|
||||||
|
|
||||||
@@ -329,6 +332,90 @@ DEFAULT_SCHEMAS = {
|
|||||||
min_rate_limit_rps=0.01,
|
min_rate_limit_rps=0.01,
|
||||||
max_rate_limit_rps=2.0
|
max_rate_limit_rps=2.0
|
||||||
),
|
),
|
||||||
|
ConnectorType.EXCHANGE_ANN: SourceSchema(
|
||||||
|
connector_type=ConnectorType.EXCHANGE_ANN,
|
||||||
|
version=1,
|
||||||
|
config_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"feed_urls": {"type": "array", "items": {"type": "string"}},
|
||||||
|
"max_items_per_feed": {"type": "integer"},
|
||||||
|
"poll_interval_seconds": {"type": "integer"}
|
||||||
|
},
|
||||||
|
"required": ["feed_urls"]
|
||||||
|
},
|
||||||
|
payload_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"title": {"type": "string"},
|
||||||
|
"summary": {"type": "string"},
|
||||||
|
"link": {"type": "string"},
|
||||||
|
"published_parsed": {"type": "array"},
|
||||||
|
"author": {"type": "string"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required_credentials=[],
|
||||||
|
min_cadence_seconds=60,
|
||||||
|
max_cadence_seconds=3600,
|
||||||
|
min_rate_limit_rps=0.01,
|
||||||
|
max_rate_limit_rps=1.0
|
||||||
|
),
|
||||||
|
ConnectorType.REGULATORY: SourceSchema(
|
||||||
|
connector_type=ConnectorType.REGULATORY,
|
||||||
|
version=1,
|
||||||
|
config_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"feed_urls": {"type": "array", "items": {"type": "string"}},
|
||||||
|
"max_items_per_feed": {"type": "integer"},
|
||||||
|
"poll_interval_seconds": {"type": "integer"}
|
||||||
|
},
|
||||||
|
"required": ["feed_urls"]
|
||||||
|
},
|
||||||
|
payload_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"title": {"type": "string"},
|
||||||
|
"summary": {"type": "string"},
|
||||||
|
"link": {"type": "string"},
|
||||||
|
"published_parsed": {"type": "array"},
|
||||||
|
"author": {"type": "string"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required_credentials=[],
|
||||||
|
min_cadence_seconds=60,
|
||||||
|
max_cadence_seconds=3600,
|
||||||
|
min_rate_limit_rps=0.01,
|
||||||
|
max_rate_limit_rps=1.0
|
||||||
|
),
|
||||||
|
ConnectorType.CORPORATE: SourceSchema(
|
||||||
|
connector_type=ConnectorType.CORPORATE,
|
||||||
|
version=1,
|
||||||
|
config_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"feed_urls": {"type": "array", "items": {"type": "string"}},
|
||||||
|
"max_items_per_feed": {"type": "integer"},
|
||||||
|
"poll_interval_seconds": {"type": "integer"}
|
||||||
|
},
|
||||||
|
"required": ["feed_urls"]
|
||||||
|
},
|
||||||
|
payload_schema={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"title": {"type": "string"},
|
||||||
|
"summary": {"type": "string"},
|
||||||
|
"link": {"type": "string"},
|
||||||
|
"published_parsed": {"type": "array"},
|
||||||
|
"author": {"type": "string"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required_credentials=[],
|
||||||
|
min_cadence_seconds=60,
|
||||||
|
max_cadence_seconds=3600,
|
||||||
|
min_rate_limit_rps=0.01,
|
||||||
|
max_rate_limit_rps=1.0
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user