Add local config file support

This commit is contained in:
Anibal Angulo
2026-02-23 21:50:54 +00:00
parent bf2cc2f556
commit f0b9d1b27a
4 changed files with 47 additions and 26 deletions

View File

@@ -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"]

58
main.py
View File

@@ -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(

View File

@@ -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]

2
uv.lock generated
View File

@@ -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]