mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-03 09:53:45 +00:00
# What does this PR do? Extract API definitions and provider specifications into a standalone llama-stack-api package that can be published to PyPI independently of the main llama-stack server. see: https://github.com/llamastack/llama-stack/pull/2978 and https://github.com/llamastack/llama-stack/pull/2978#issuecomment-3145115942 Motivation External providers currently import from llama-stack, which overrides the installed version and causes dependency conflicts. This separation allows external providers to: - Install only the type definitions they need without server dependencies - Avoid version conflicts with the installed llama-stack package - Be versioned and released independently This enables us to re-enable external provider module tests that were previously blocked by these import conflicts. Changes - Created llama-stack-api package with minimal dependencies (pydantic, jsonschema) - Moved APIs, providers datatypes, strong_typing, and schema_utils - Updated all imports from llama_stack.* to llama_stack_api.* - Configured local editable install for development workflow - Updated linting and type-checking configuration for both packages Next Steps - Publish llama-stack-api to PyPI - Update external provider dependencies - Re-enable external provider module tests Pre-cursor PRs to this one: - #4093 - #3954 - #4064 These PRs moved key pieces _out_ of the Api pkg, limiting the scope of change here. relates to #3237 ## Test Plan Package builds successfully and can be imported independently. All pre-commit hooks pass with expected exclusions maintained. --------- Signed-off-by: Charlie Doern <cdoern@redhat.com>
77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under the terms described in the LICENSE file in
|
|
# the root directory of this source tree.
|
|
|
|
from enum import Enum
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from llama_stack_api.schema_utils import json_schema_type
|
|
|
|
|
|
class Order(Enum):
|
|
"""Sort order for paginated responses.
|
|
:cvar asc: Ascending order
|
|
:cvar desc: Descending order
|
|
"""
|
|
|
|
asc = "asc"
|
|
desc = "desc"
|
|
|
|
|
|
@json_schema_type
|
|
class PaginatedResponse(BaseModel):
|
|
"""A generic paginated response that follows a simple format.
|
|
|
|
:param data: The list of items for the current page
|
|
:param has_more: Whether there are more items available after this set
|
|
:param url: The URL for accessing this list
|
|
"""
|
|
|
|
data: list[dict[str, Any]]
|
|
has_more: bool
|
|
url: str | None = None
|
|
|
|
|
|
# This is a short term solution to allow inference API to return metrics
|
|
# The ideal way to do this is to have a way for all response types to include metrics
|
|
# and all metric events logged to the telemetry API to be included with the response
|
|
# To do this, we will need to augment all response types with a metrics field.
|
|
# We have hit a blocker from stainless SDK that prevents us from doing this.
|
|
# The blocker is that if we were to augment the response types that have a data field
|
|
# in them like so
|
|
# class ListModelsResponse(BaseModel):
|
|
# metrics: Optional[List[MetricEvent]] = None
|
|
# data: List[Models]
|
|
# ...
|
|
# The client SDK will need to access the data by using a .data field, which is not
|
|
# ergonomic. Stainless SDK does support unwrapping the response type, but it
|
|
# requires that the response type to only have a single field.
|
|
|
|
# We will need a way in the client SDK to signal that the metrics are needed
|
|
# and if they are needed, the client SDK has to return the full response type
|
|
# without unwrapping it.
|
|
|
|
|
|
@json_schema_type
|
|
class MetricInResponse(BaseModel):
|
|
"""A metric value included in API responses.
|
|
:param metric: The name of the metric
|
|
:param value: The numeric value of the metric
|
|
:param unit: (Optional) The unit of measurement for the metric value
|
|
"""
|
|
|
|
metric: str
|
|
value: int | float
|
|
unit: str | None = None
|
|
|
|
|
|
class MetricResponseMixin(BaseModel):
|
|
"""Mixin class for API responses that can include metrics.
|
|
:param metrics: (Optional) List of metrics associated with the API response
|
|
"""
|
|
|
|
metrics: list[MetricInResponse] | None = None
|