Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions aidial_client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
ParsingDataError,
ResourceNotFoundError,
)
from aidial_client.types.deployment import DeploymentConfig
from aidial_client.types.model import ModelInfo, ModelLimits, ModelPricing
from aidial_client.types.toolset import ToolsetInfo

__all__ = [
"Dial",
Expand All @@ -24,4 +27,9 @@
"ParsingDataError",
"EtagMismatchError",
"ResourceNotFoundError",
"DeploymentConfig",
"ToolsetInfo",
"ModelInfo",
"ModelPricing",
"ModelLimits",
]
10 changes: 10 additions & 0 deletions aidial_client/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ def _init_resources(self) -> None:
)
self.deployments = resources.Deployments(http_client=self._http_client)
self.application = resources.Application(http_client=self._http_client)
self.toolset = resources.Toolset(http_client=self._http_client)
self.model = resources.Model(http_client=self._http_client)
self.resource_permissions = resources.ResourcePermissions(
http_client=self._http_client
)

def _create_http_client(self) -> SyncHTTPClient:
return SyncHTTPClient(
Expand Down Expand Up @@ -189,6 +194,11 @@ def _init_resources(self) -> None:
self.application = resources.AsyncApplication(
http_client=self._http_client
)
self.toolset = resources.AsyncToolset(http_client=self._http_client)
self.model = resources.AsyncModel(http_client=self._http_client)
self.resource_permissions = resources.AsyncResourcePermissions(
http_client=self._http_client
)

def _create_http_client(self) -> AsyncHTTPClient:
return AsyncHTTPClient(
Expand Down
12 changes: 12 additions & 0 deletions aidial_client/resources/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
from aidial_client.resources.deployments import AsyncDeployments, Deployments
from aidial_client.resources.metadata import AsyncMetadata, Metadata
from aidial_client.resources.model import AsyncModel, Model
from aidial_client.resources.resource_permissions import (
AsyncResourcePermissions,
ResourcePermissions,
)
from aidial_client.resources.toolset import AsyncToolset, Toolset

from .application import Application, AsyncApplication
from .bucket import AsyncBucket, Bucket
Expand All @@ -19,4 +25,10 @@
"Metadata",
"Application",
"AsyncApplication",
"Toolset",
"AsyncToolset",
"Model",
"AsyncModel",
"ResourcePermissions",
"AsyncResourcePermissions",
]
40 changes: 39 additions & 1 deletion aidial_client/resources/deployments.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

from aidial_client._internal_types._http_request import FinalRequestOptions
from aidial_client.resources.base import AsyncResource, Resource
from aidial_client.types.deployment import Deployment, DeploymentsResponse
from aidial_client.types.deployment import (
Deployment,
DeploymentConfig,
DeploymentsResponse,
)


class Deployments(Resource):
Expand All @@ -15,6 +19,23 @@ def _list_raw(self) -> DeploymentsResponse:
def list(self) -> List[Deployment]:
return self._list_raw().data

def get(self, deployment_id: str) -> Deployment:
return self.http_client.request(
cast_to=Deployment,
options=FinalRequestOptions(
method="GET", url=f"openai/deployments/{deployment_id}"
),
)

def get_config(self, deployment_id: str) -> DeploymentConfig:
return self.http_client.request(
cast_to=DeploymentConfig,
options=FinalRequestOptions(
method="GET",
url=f"v1/deployments/{deployment_id}/configuration",
),
)


class AsyncDeployments(AsyncResource):
async def _list_raw(self) -> DeploymentsResponse:
Expand All @@ -25,3 +46,20 @@ async def _list_raw(self) -> DeploymentsResponse:

async def list(self) -> List[Deployment]:
return (await self._list_raw()).data

async def get(self, deployment_id: str) -> Deployment:
return await self.http_client.request(
cast_to=Deployment,
options=FinalRequestOptions(
method="GET", url=f"openai/deployments/{deployment_id}"
),
)

async def get_config(self, deployment_id: str) -> DeploymentConfig:
return await self.http_client.request(
cast_to=DeploymentConfig,
options=FinalRequestOptions(
method="GET",
url=f"v1/deployments/{deployment_id}/configuration",
),
)
23 changes: 23 additions & 0 deletions aidial_client/resources/model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from aidial_client._internal_types._http_request import FinalRequestOptions
from aidial_client.resources.base import AsyncResource, Resource
from aidial_client.types.model import ModelInfo


class Model(Resource):
def get(self, model_name: str) -> ModelInfo:
return self.http_client.request(
cast_to=ModelInfo,
options=FinalRequestOptions(
method="GET", url=f"openai/models/{model_name}"
),
)


class AsyncModel(AsyncResource):
async def get(self, model_name: str) -> ModelInfo:
return await self.http_client.request(
cast_to=ModelInfo,
options=FinalRequestOptions(
method="GET", url=f"openai/models/{model_name}"
),
)
53 changes: 53 additions & 0 deletions aidial_client/resources/resource_permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from typing import List

from aidial_client._internal_types._generic import NoneType
from aidial_client._internal_types._http_request import FinalRequestOptions
from aidial_client.resources.base import AsyncResource, Resource

_GRANT_URL = "v1/ops/resource/per-request-permissions/grant"


class ResourcePermissions(Resource):
def grant(
self,
resources: List[str],
receiver: str,
permissions: List[str] = ["READ"],
) -> None:
self.http_client.request(
cast_to=NoneType,
options=FinalRequestOptions(
method="POST",
url=_GRANT_URL,
json_data={
"resources": [
{"url": url, "permissions": permissions}
for url in resources
],
"receiver": receiver,
},
),
)


class AsyncResourcePermissions(AsyncResource):
async def grant(
self,
resources: List[str],
receiver: str,
permissions: List[str] = ["READ"],
) -> None:
await self.http_client.request(
cast_to=NoneType,
options=FinalRequestOptions(
method="POST",
url=_GRANT_URL,
json_data={
"resources": [
{"url": url, "permissions": permissions}
for url in resources
],
"receiver": receiver,
},
),
)
23 changes: 23 additions & 0 deletions aidial_client/resources/toolset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from aidial_client._internal_types._http_request import FinalRequestOptions
from aidial_client.resources.base import AsyncResource, Resource
from aidial_client.types.toolset import ToolsetInfo


class Toolset(Resource):
def get(self, toolset_id: str) -> ToolsetInfo:
return self.http_client.request(
cast_to=ToolsetInfo,
options=FinalRequestOptions(
method="GET", url=f"openai/toolsets/{toolset_id}"
),
)


class AsyncToolset(AsyncResource):
async def get(self, toolset_id: str) -> ToolsetInfo:
return await self.http_client.request(
cast_to=ToolsetInfo,
options=FinalRequestOptions(
method="GET", url=f"openai/toolsets/{toolset_id}"
),
)
18 changes: 18 additions & 0 deletions aidial_client/types/deployment.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ class Features(ExtraAllowModel):
folder_attachments: Optional[bool] = None
allow_resume: Optional[bool] = None
parallel_tool_calls: Optional[bool] = None
accessible_by_per_request_key: Optional[bool] = None
content_parts: Optional[bool] = None
cache: Optional[bool] = None
auto_caching: Optional[bool] = None
assistant_attachments_in_request: Optional[bool] = None


class DeploymentBase(ExtraAllowModel):
Expand Down Expand Up @@ -48,3 +53,16 @@ class Deployment(DeploymentBase):
class DeploymentsResponse(ExtraAllowModel):
data: List[Deployment]
object: Literal["list"]


class DeploymentConfig(ExtraAllowModel):
"""JSON Schema document returned by GET /v1/deployments/{id}/configuration.

No fields are pinned because the schema is entirely deployment-specific
and callers are expected to access fields dynamically (e.g. via
model.model_extra or model_dump()). The named type exists so that:
- http_client.request(cast_to=DeploymentConfig) can deserialise the response;
- the public API carries a meaningful return type rather than a bare dict;
- common top-level fields (e.g. 'type', '$schema') can be pinned here
in a future non-breaking change.
"""
48 changes: 48 additions & 0 deletions aidial_client/types/model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from typing import List, Optional

from aidial_client._internal_types._model import ExtraAllowModel


class ModelCapabilities(ExtraAllowModel):
scale_types: List[str] = []
completion: Optional[bool] = None
chat_completion: Optional[bool] = None
embeddings: Optional[bool] = None
fine_tune: Optional[bool] = None
inference: Optional[bool] = None


class ModelLimits(ExtraAllowModel):
"""Token limits for the model.

Either `max_total_tokens` is set alone, or `max_prompt_tokens` and
`max_completion_tokens` are set together (oneOf in the schema).
All fields are Optional here to accommodate both variants.
"""

max_total_tokens: Optional[int] = None
max_prompt_tokens: Optional[int] = None
max_completion_tokens: Optional[int] = None


class ModelPricing(ExtraAllowModel):
unit: str
prompt: str
completion: Optional[str] = None


class ModelInfo(ExtraAllowModel):
id: str
model: str
display_name: Optional[str] = None
description: Optional[str] = None
owner: Optional[str] = None
object: Optional[str] = None
status: Optional[str] = None
created_at: Optional[int] = None
updated_at: Optional[int] = None
lifecycle_status: Optional[str] = None
tokenizer_model: Optional[str] = None
capabilities: Optional[ModelCapabilities] = None
limits: Optional[ModelLimits] = None
pricing: Optional[ModelPricing] = None
24 changes: 24 additions & 0 deletions aidial_client/types/toolset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from typing import List, Optional

from aidial_client._internal_types._model import ExtraAllowModel
from aidial_client.types.deployment import Features


class ToolsetInfo(ExtraAllowModel):
id: str
toolset: str
display_name: Optional[str] = None
display_version: Optional[str] = None
description: Optional[str] = None
icon_url: Optional[str] = None
owner: Optional[str] = None
object: Optional[str] = None
status: Optional[str] = None
created_at: Optional[int] = None
updated_at: Optional[int] = None
reference: Optional[str] = None
description_keywords: List[str] = []
max_retry_attempts: Optional[int] = None
transport: Optional[str] = None
allowed_tools: List[str] = []
features: Optional[Features] = None
Loading
Loading