Fix typing and minor issues
This commit is contained in:
parent
2db2253578
commit
72ab627a34
54 changed files with 635 additions and 589 deletions
|
|
@ -1,4 +1,7 @@
|
|||
from .bootstrap_dashboard import bootstrap_dashboard
|
||||
from .bootstrap_docs_endpoints import bootstrap_docs_endpoints
|
||||
from .bootstrap_feedback_endpoints import bootstrap_feedback_endpoints
|
||||
from .bootstrap_meta_endpoints import bootstrap_meta_endpoints
|
||||
from .bootstrap_prediction_endpoint import bootstrap_prediction_endpoint
|
||||
from .bootstrap_trace_endpoints import bootstrap_trace_endpoints
|
||||
from .route_config import RouteConfig
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from fastapi.responses import RedirectResponse
|
|||
from fastapi.staticfiles import StaticFiles
|
||||
|
||||
from ...constants import DASHBOARD_PATH
|
||||
from .dashboard import create_dash_app
|
||||
from .dashboard.create_dash_app import create_dash_app
|
||||
|
||||
PATH = Path(__file__).parent.resolve()
|
||||
|
||||
|
|
|
|||
26
great_ai/deploy/routes/bootstrap_meta_endpoints.py
Normal file
26
great_ai/deploy/routes/bootstrap_meta_endpoints.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
from typing import Any
|
||||
|
||||
from fastapi import APIRouter, FastAPI, status
|
||||
|
||||
from ...views import ApiMetadata, CacheStatistics, HealthCheckResponse
|
||||
|
||||
|
||||
def bootstrap_meta_endpoints(app: FastAPI, func: Any, metadata: ApiMetadata) -> None:
|
||||
router = APIRouter(
|
||||
tags=["meta"],
|
||||
)
|
||||
|
||||
@router.get("/health", status_code=status.HTTP_200_OK)
|
||||
def check_health() -> HealthCheckResponse:
|
||||
hits, misses, maxsize, cache_size = func.cache_info()
|
||||
cache_statistics = CacheStatistics(
|
||||
hits=hits, misses=misses, size=cache_size, max_size=maxsize
|
||||
)
|
||||
|
||||
return HealthCheckResponse(is_healthy=True, cache_statistics=cache_statistics)
|
||||
|
||||
@router.get("/version", response_model=ApiMetadata, status_code=status.HTTP_200_OK)
|
||||
def get_version() -> ApiMetadata:
|
||||
return metadata
|
||||
|
||||
app.include_router(router)
|
||||
51
great_ai/deploy/routes/bootstrap_prediction_endpoint.py
Normal file
51
great_ai/deploy/routes/bootstrap_prediction_endpoint.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import inspect
|
||||
from typing import Any, Awaitable, Callable, Type, Union, cast
|
||||
|
||||
from fastapi import APIRouter, FastAPI, HTTPException, status
|
||||
from pydantic import BaseModel, create_model
|
||||
|
||||
from ...helper import get_function_metadata_store
|
||||
from ...views import Trace
|
||||
|
||||
|
||||
def bootstrap_prediction_endpoint(
|
||||
app: FastAPI, func: Callable[..., Union[Trace, Awaitable[Trace]]]
|
||||
) -> None:
|
||||
router = APIRouter(
|
||||
tags=["predictions"],
|
||||
)
|
||||
|
||||
schema = _get_schema(func)
|
||||
|
||||
@router.post("/predict", status_code=status.HTTP_200_OK, response_model=Trace)
|
||||
async def predict(input_value: schema) -> Trace: # type: ignore
|
||||
try:
|
||||
if inspect.iscoroutinefunction(func):
|
||||
return await cast(Callable[..., Awaitable[Trace]], func)(
|
||||
**cast(BaseModel, input_value).dict()
|
||||
)
|
||||
return cast(Callable[..., Trace], func)(
|
||||
**cast(BaseModel, input_value).dict()
|
||||
)
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"The following exception has occurred: {type(e).__name__}: {e}",
|
||||
)
|
||||
|
||||
app.include_router(router)
|
||||
|
||||
|
||||
def _get_schema(func: Callable) -> Type[BaseModel]:
|
||||
signature = inspect.signature(func)
|
||||
parameters = {
|
||||
p.name: (
|
||||
p.annotation if p.annotation != inspect._empty else Any,
|
||||
p.default if p.default != inspect._empty else ...,
|
||||
)
|
||||
for p in signature.parameters.values()
|
||||
if p.name in get_function_metadata_store(func).input_parameter_names
|
||||
}
|
||||
|
||||
schema: Type[BaseModel] = create_model("InputModel", **parameters) # type: ignore
|
||||
return schema
|
||||
|
|
@ -129,13 +129,17 @@ main > header > div > h1 {
|
|||
|
||||
.version-tag {
|
||||
border-radius: var(--border-radius);
|
||||
background: #ddd;
|
||||
display: inline-block;
|
||||
font-size: 1rem;
|
||||
padding: 3px 6px;
|
||||
padding: 3px 8px;
|
||||
margin-left: var(--small-padding)
|
||||
}
|
||||
|
||||
main > header .version-tag {
|
||||
background: var(--background-color);
|
||||
vertical-align: 4px;
|
||||
}
|
||||
|
||||
main > header > *:nth-child(2) {
|
||||
min-width: 250px;
|
||||
max-width: 550px;
|
||||
|
|
|
|||
|
|
@ -21,12 +21,13 @@ from .get_traces_table import get_traces_table
|
|||
|
||||
def create_dash_app(function_name: str, version: str, function_docs: str) -> Flask:
|
||||
accent_color = text_to_hex_color(function_name)
|
||||
function_name = snake_case_to_text(function_name)
|
||||
|
||||
app = Dash(
|
||||
function_name,
|
||||
requests_pathname_prefix=DASHBOARD_PATH + "/",
|
||||
server=Flask(__name__),
|
||||
title=snake_case_to_text(function_name),
|
||||
title=function_name,
|
||||
update_title=None,
|
||||
external_stylesheets=[
|
||||
"/assets/index.css",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
from dash import html
|
||||
|
||||
from great_ai import __version__
|
||||
|
||||
from ....constants import GITHUB_LINK
|
||||
|
||||
|
||||
|
|
@ -8,7 +10,9 @@ def get_footer() -> html.Footer:
|
|||
[
|
||||
html.Div(
|
||||
[
|
||||
html.H6("GreatAI"),
|
||||
html.H6(
|
||||
["GreatAI", html.Span(__version__, className="version-tag")]
|
||||
),
|
||||
html.P(
|
||||
"A human-friendly framework for robust end-to-end AI deployments."
|
||||
),
|
||||
|
|
|
|||
10
great_ai/deploy/routes/route_config.py
Normal file
10
great_ai/deploy/routes/route_config.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class RouteConfig(BaseModel):
|
||||
prediction_endpoint_enabled: bool = True
|
||||
docs_endpoints_enabled: bool = True
|
||||
dashboard_enabled: bool = True
|
||||
feedback_endpoints_enabled: bool = True
|
||||
trace_endpoints_enabled: bool = True
|
||||
meta_endpoints_enabled: bool = True
|
||||
Loading…
Add table
Add a link
Reference in a new issue