feat(simulation): add portable gaussian provider connector
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
"""Read-only Mission Core projection of the external Gaussian build provider."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Callable
|
||||
from typing import Any, Literal
|
||||
|
||||
from fastapi import APIRouter
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
from k1link.simulation.gaussian_pipeline_gateway import (
|
||||
GaussianPipelineGateway,
|
||||
GaussianPipelineGatewayError,
|
||||
configured_gaussian_pipeline_gateway,
|
||||
)
|
||||
|
||||
ProviderFactory = Callable[[], GaussianPipelineGateway | None]
|
||||
|
||||
|
||||
class SimulationWorldProviderStatus(BaseModel):
|
||||
model_config = ConfigDict(extra="forbid", frozen=True)
|
||||
|
||||
schema_version: Literal["missioncore.simulation-world-provider-status/v1"] = (
|
||||
"missioncore.simulation-world-provider-status/v1"
|
||||
)
|
||||
provider_id: Literal["gaussian-pipeline"] = "gaussian-pipeline"
|
||||
configured: bool
|
||||
state: Literal["ready", "unavailable"]
|
||||
capabilities: dict[str, Any] | None
|
||||
|
||||
|
||||
def build_simulation_world_provider_router(
|
||||
provider_factory: ProviderFactory = configured_gaussian_pipeline_gateway,
|
||||
) -> APIRouter:
|
||||
router = APIRouter()
|
||||
|
||||
@router.get(
|
||||
"/api/v1/simulation-worlds/provider",
|
||||
response_model=SimulationWorldProviderStatus,
|
||||
)
|
||||
def provider_status() -> SimulationWorldProviderStatus:
|
||||
provider: GaussianPipelineGateway | None = None
|
||||
try:
|
||||
provider = provider_factory()
|
||||
if provider is None:
|
||||
return SimulationWorldProviderStatus(
|
||||
configured=False,
|
||||
state="unavailable",
|
||||
capabilities=None,
|
||||
)
|
||||
return SimulationWorldProviderStatus(
|
||||
configured=True,
|
||||
state="ready",
|
||||
capabilities=provider.capabilities(),
|
||||
)
|
||||
except GaussianPipelineGatewayError:
|
||||
return SimulationWorldProviderStatus(
|
||||
configured=True,
|
||||
state="unavailable",
|
||||
capabilities=None,
|
||||
)
|
||||
finally:
|
||||
if provider is not None:
|
||||
provider.close()
|
||||
|
||||
return router
|
||||
Reference in New Issue
Block a user