Merge branch 'main' into mmlu_benchmark

This commit is contained in:
Xi Yan 2024-11-11 10:22:32 -05:00
commit e690eb7ad3
85 changed files with 4761 additions and 358 deletions

View file

@ -216,7 +216,7 @@ class EmbeddingsResponse(BaseModel):
class ModelStore(Protocol):
def get_model(self, identifier: str) -> ModelDef: ...
def get_model(self, identifier: str) -> Model: ...
@runtime_checkable

View file

@ -26,16 +26,16 @@ class ModelsClient(Models):
async def shutdown(self) -> None:
pass
async def list_models(self) -> List[ModelDefWithProvider]:
async def list_models(self) -> List[Model]:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/models/list",
headers={"Content-Type": "application/json"},
)
response.raise_for_status()
return [ModelDefWithProvider(**x) for x in response.json()]
return [Model(**x) for x in response.json()]
async def register_model(self, model: ModelDefWithProvider) -> None:
async def register_model(self, model: Model) -> None:
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/models/register",
@ -46,7 +46,7 @@ class ModelsClient(Models):
)
response.raise_for_status()
async def get_model(self, identifier: str) -> Optional[ModelDefWithProvider]:
async def get_model(self, identifier: str) -> Optional[Model]:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/models/get",
@ -59,7 +59,7 @@ class ModelsClient(Models):
j = response.json()
if j is None:
return None
return ModelDefWithProvider(**j)
return Model(**j)
async def run_main(host: str, port: int, stream: bool):

View file

@ -7,37 +7,33 @@
from typing import Any, Dict, List, Literal, Optional, Protocol, runtime_checkable
from llama_models.schema_utils import json_schema_type, webmethod
from pydantic import BaseModel, Field
from pydantic import Field
from llama_stack.apis.resource import Resource, ResourceType
class ModelDef(BaseModel):
identifier: str = Field(
description="A unique name for the model type",
)
llama_model: str = Field(
description="Pointer to the underlying core Llama family model. Each model served by Llama Stack must have a core Llama model.",
)
@json_schema_type
class Model(Resource):
type: Literal[ResourceType.model.value] = ResourceType.model.value
metadata: Dict[str, Any] = Field(
default_factory=dict,
description="Any additional metadata for this model",
)
@json_schema_type
class ModelDefWithProvider(ModelDef):
type: Literal["model"] = "model"
provider_id: str = Field(
description="The provider ID for this model",
)
@runtime_checkable
class Models(Protocol):
@webmethod(route="/models/list", method="GET")
async def list_models(self) -> List[ModelDefWithProvider]: ...
async def list_models(self) -> List[Model]: ...
@webmethod(route="/models/get", method="GET")
async def get_model(self, identifier: str) -> Optional[ModelDefWithProvider]: ...
async def get_model(self, identifier: str) -> Optional[Model]: ...
@webmethod(route="/models/register", method="POST")
async def register_model(self, model: ModelDefWithProvider) -> None: ...
async def register_model(
self,
model_id: str,
provider_model_id: Optional[str] = None,
provider_id: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
) -> Model: ...

View file

@ -0,0 +1,38 @@
# 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 llama_models.schema_utils import json_schema_type
from pydantic import BaseModel, Field
@json_schema_type
class ResourceType(Enum):
model = "model"
shield = "shield"
memory_bank = "memory_bank"
dataset = "dataset"
scoring_function = "scoring_function"
class Resource(BaseModel):
"""Base class for all Llama Stack resources"""
identifier: str = Field(
description="Unique identifier for this resource in llama stack"
)
provider_resource_id: str = Field(
description="Unique identifier for this resource in the provider",
default=None,
)
provider_id: str = Field(description="ID of the provider that owns this resource")
type: ResourceType = Field(
description="Type of resource (e.g. 'model', 'shield', 'memory_bank', etc.)"
)

View file

@ -41,13 +41,13 @@ class SafetyClient(Safety):
pass
async def run_shield(
self, shield_type: str, messages: List[Message]
self, shield_id: str, messages: List[Message]
) -> RunShieldResponse:
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/safety/run_shield",
json=dict(
shield_type=shield_type,
shield_id=shield_id,
messages=[encodable_dict(m) for m in messages],
),
headers={
@ -80,7 +80,7 @@ async def run_main(host: str, port: int, image_path: str = None):
)
cprint(f"User>{message.content}", "green")
response = await client.run_shield(
shield_type="llama_guard",
shield_id="llama_guard",
messages=[message],
)
print(response)
@ -91,7 +91,7 @@ async def run_main(host: str, port: int, image_path: str = None):
]:
cprint(f"User>{message.content}", "green")
response = await client.run_shield(
shield_type="llama_guard",
shield_id="llama_guard",
messages=[message],
)
print(response)

View file

@ -39,7 +39,7 @@ class RunShieldResponse(BaseModel):
class ShieldStore(Protocol):
async def get_shield(self, identifier: str) -> ShieldDef: ...
async def get_shield(self, identifier: str) -> Shield: ...
@runtime_checkable
@ -48,5 +48,8 @@ class Safety(Protocol):
@webmethod(route="/safety/run_shield")
async def run_shield(
self, identifier: str, messages: List[Message], params: Dict[str, Any] = None
self,
shield_id: str,
messages: List[Message],
params: Dict[str, Any] = None,
) -> RunShieldResponse: ...

View file

@ -5,7 +5,6 @@
# the root directory of this source tree.
import asyncio
import json
from typing import List, Optional
@ -26,27 +25,38 @@ class ShieldsClient(Shields):
async def shutdown(self) -> None:
pass
async def list_shields(self) -> List[ShieldDefWithProvider]:
async def list_shields(self) -> List[Shield]:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/shields/list",
headers={"Content-Type": "application/json"},
)
response.raise_for_status()
return [ShieldDefWithProvider(**x) for x in response.json()]
return [Shield(**x) for x in response.json()]
async def register_shield(self, shield: ShieldDefWithProvider) -> None:
async def register_shield(
self,
shield_id: str,
shield_type: ShieldType,
provider_shield_id: Optional[str],
provider_id: Optional[str],
params: Optional[Dict[str, Any]],
) -> None:
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/shields/register",
json={
"shield": json.loads(shield.json()),
"shield_id": shield_id,
"shield_type": shield_type,
"provider_shield_id": provider_shield_id,
"provider_id": provider_id,
"params": params,
},
headers={"Content-Type": "application/json"},
)
response.raise_for_status()
async def get_shield(self, shield_type: str) -> Optional[ShieldDefWithProvider]:
async def get_shield(self, shield_type: str) -> Optional[Shield]:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/shields/get",
@ -61,7 +71,7 @@ class ShieldsClient(Shields):
if j is None:
return None
return ShieldDefWithProvider(**j)
return Shield(**j)
async def run_main(host: str, port: int, stream: bool):

View file

@ -8,7 +8,8 @@ from enum import Enum
from typing import Any, Dict, List, Literal, Optional, Protocol, runtime_checkable
from llama_models.schema_utils import json_schema_type, webmethod
from pydantic import BaseModel, Field
from llama_stack.apis.resource import Resource, ResourceType
@json_schema_type
@ -19,34 +20,29 @@ class ShieldType(Enum):
prompt_guard = "prompt_guard"
class ShieldDef(BaseModel):
identifier: str = Field(
description="A unique identifier for the shield type",
)
shield_type: str = Field(
description="The type of shield this is; the value is one of the ShieldType enum"
)
params: Dict[str, Any] = Field(
default_factory=dict,
description="Any additional parameters needed for this shield",
)
@json_schema_type
class ShieldDefWithProvider(ShieldDef):
type: Literal["shield"] = "shield"
provider_id: str = Field(
description="The provider ID for this shield type",
)
class Shield(Resource):
"""A safety shield resource that can be used to check content"""
type: Literal[ResourceType.shield.value] = ResourceType.shield.value
shield_type: ShieldType
params: Dict[str, Any] = {}
@runtime_checkable
class Shields(Protocol):
@webmethod(route="/shields/list", method="GET")
async def list_shields(self) -> List[ShieldDefWithProvider]: ...
async def list_shields(self) -> List[Shield]: ...
@webmethod(route="/shields/get", method="GET")
async def get_shield(self, identifier: str) -> Optional[ShieldDefWithProvider]: ...
async def get_shield(self, identifier: str) -> Optional[Shield]: ...
@webmethod(route="/shields/register", method="POST")
async def register_shield(self, shield: ShieldDefWithProvider) -> None: ...
async def register_shield(
self,
shield_id: str,
shield_type: ShieldType,
provider_shield_id: Optional[str] = None,
provider_id: Optional[str] = None,
params: Optional[Dict[str, Any]] = None,
) -> Shield: ...