diff --git a/DockerfileConnector b/DockerfileConnector index 0abfdf1..e45c4e6 100644 --- a/DockerfileConnector +++ b/DockerfileConnector @@ -1,20 +1,14 @@ -FROM quay.ocp.banorte.com/golden/python-312:latest AS builder +FROM quay.ocp.banorte.com/golden/python-312:latest COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/ WORKDIR /app COPY pyproject.toml uv.lock ./ -RUN uv sync --no-dev --frozen --no-install-project +RUN uv sync --no-dev --frozen COPY main.py . -FROM quay.ocp.banorte.com/golden/python-312:latest - -WORKDIR /app - -COPY --from=builder /app /app - ENV PATH="/app/.venv/bin:$PATH" -CMD python main.py --transport sse --port 8000 +CMD ["uv", "run", "python", "main.py", "--transport", "sse", "--port", "8000"] diff --git a/main.py b/main.py index d445db8..dfb5d96 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,7 @@ import argparse import asyncio import io import logging +import os from collections.abc import AsyncIterator, Sequence from contextlib import asynccontextmanager from dataclasses import dataclass @@ -16,7 +17,7 @@ from gcloud.aio.storage import Storage from google import genai from google.genai import types as genai_types from mcp.server.fastmcp import Context, FastMCP -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, YamlConfigSettingsSource logger = logging.getLogger(__name__) @@ -282,10 +283,29 @@ class GoogleCloudVectorSearch: # --------------------------------------------------------------------------- -class Settings(BaseSettings): - """Server configuration populated from environment variables.""" +def _parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument( + "--transport", + choices=["stdio", "sse"], + default="stdio", + ) + parser.add_argument("--host", default="0.0.0.0") + parser.add_argument("--port", type=int, default=8080) + parser.add_argument( + "--config", + default=os.environ.get("CONFIG_FILE", "config.yaml"), + ) + return parser.parse_args() - model_config = {"env_file": ".env"} + +_args = _parse_args() + + +class Settings(BaseSettings): + """Server configuration populated from env vars and a YAML config file.""" + + model_config = {"env_file": ".env", "yaml_file": _args.config} project_id: str location: str @@ -297,6 +317,23 @@ class Settings(BaseSettings): embedding_model: str = "gemini-embedding-001" search_limit: int = 10 + @classmethod + def settings_customise_sources( + cls, + settings_cls: type[BaseSettings], + init_settings: PydanticBaseSettingsSource, + env_settings: PydanticBaseSettingsSource, + dotenv_settings: PydanticBaseSettingsSource, + file_secret_settings: PydanticBaseSettingsSource, + ) -> tuple[PydanticBaseSettingsSource, ...]: + return ( + init_settings, + env_settings, + dotenv_settings, + YamlConfigSettingsSource(settings_cls), + file_secret_settings, + ) + @dataclass class AppContext: @@ -334,19 +371,6 @@ async def lifespan(_server: FastMCP) -> AsyncIterator[AppContext]: ) -def _parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser() - parser.add_argument( - "--transport", - choices=["stdio", "sse"], - default="stdio", - ) - parser.add_argument("--host", default="0.0.0.0") - parser.add_argument("--port", type=int, default=8080) - return parser.parse_args() - - -_args = _parse_args() cfg = Settings.model_validate({}) mcp = FastMCP( diff --git a/pyproject.toml b/pyproject.toml index fe0946b..6e3683b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ dependencies = [ "google-genai>=1.64.0", "mcp[cli]>=1.26.0", "pydantic-settings>=2.9.1", + "pyyaml>=6.0", ] [dependency-groups] diff --git a/uv.lock b/uv.lock index 9fa5699..f114202 100644 --- a/uv.lock +++ b/uv.lock @@ -1356,6 +1356,7 @@ dependencies = [ { name = "google-genai" }, { name = "mcp", extra = ["cli"] }, { name = "pydantic-settings" }, + { name = "pyyaml" }, ] [package.dev-dependencies] @@ -1374,6 +1375,7 @@ requires-dist = [ { name = "google-genai", specifier = ">=1.64.0" }, { name = "mcp", extras = ["cli"], specifier = ">=1.26.0" }, { name = "pydantic-settings", specifier = ">=2.9.1" }, + { name = "pyyaml", specifier = ">=6.0" }, ] [package.metadata.requires-dev]