spore-commons/node/spore_node/config.py

80 lines
2.2 KiB
Python

"""Configuration for Spore Agent Commons node."""
import os
from pathlib import Path
from pydantic_settings import BaseSettings
from koi_net.config.full_node import FullNodeConfig
from koi_net.config.koi_net_config import KoiNetConfig, NodeContact
from koi_net.config.server_config import ServerConfig
from koi_net.protocol.node import NodeProfile, NodeType, NodeProvides
from rid_lib.core import RID
from .rid_types import SPORE_RID_TYPES, SporeHolon
class SporeConfig(BaseSettings):
"""App-level config loaded from env vars."""
node_name: str = "spore-commons"
node_port: int = 8351
root_dir: Path = Path("/data")
# Database
postgres_host: str = "spore-db"
postgres_port: int = 5432
postgres_user: str = "spore"
postgres_password: str = ""
postgres_db: str = "spore_commons"
# Redis
redis_url: str = "redis://spore-redis:6379"
# Federation
bkc_node_url: str = ""
# AI
embedding_api_url: str = "http://litellm:4000"
@property
def database_url(self) -> str:
return (
f"postgresql://{self.postgres_user}:{self.postgres_password}"
f"@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}"
)
model_config = {"env_prefix": "", "case_sensitive": False}
def build_node_config(cfg: SporeConfig) -> FullNodeConfig:
"""Build koi-net FullNodeConfig from our SporeConfig."""
koi_net = KoiNetConfig(
node_name=cfg.node_name,
node_profile=NodeProfile(
node_type=NodeType.FULL,
provides=NodeProvides(
event=list(SPORE_RID_TYPES),
state=list(SPORE_RID_TYPES),
),
),
rid_types_of_interest=list(SPORE_RID_TYPES),
cache_directory_path=cfg.root_dir / ".rid_cache",
private_key_pem_path=cfg.root_dir / "priv_key.pem",
)
# Add BKC as first contact if configured
if cfg.bkc_node_url:
koi_net.first_contact = NodeContact(
rid=None,
url=cfg.bkc_node_url,
)
return FullNodeConfig(
koi_net=koi_net,
server=ServerConfig(
host="0.0.0.0",
port=cfg.node_port,
path="/koi-net",
),
)