66``Authorization: Bearer <admin/master key>``, which is distinct from the
77``Otari-Key`` virtual key used for inference. Obtain an instance via
88:attr:`otari.OtariClient.control_plane`.
9+
10+ Each resource accessor (``keys``, ``users``, ``budgets``, ``pricing``,
11+ ``usage``) exposes ergonomic aliases (``create``, ``get``, ``list``,
12+ ``update``, ``delete``, ...) that delegate to the generator-derived methods.
13+ The raw generated API object stays reachable via the ``raw`` attribute on each
14+ resource (for example
15+ ``client.control_plane.keys.raw.create_key_v1_keys_post(...)``), so the full
16+ generated surface remains available as an escape hatch.
917"""
1018
1119from __future__ import annotations
1220
1321from functools import cached_property
14- from typing import Any , cast
22+ from typing import TYPE_CHECKING , Any , cast
1523
1624from otari import _client as _cp
1725from otari ._client .api .budgets_api import BudgetsApi
2028from otari ._client .api .usage_api import UsageApi
2129from otari ._client .api .users_api import UsersApi
2230
31+ if TYPE_CHECKING :
32+ from datetime import datetime
33+
34+ from otari ._client import (
35+ BudgetResponse ,
36+ CreateBudgetRequest ,
37+ CreateKeyRequest ,
38+ CreateKeyResponse ,
39+ CreateUserRequest ,
40+ KeyInfo ,
41+ PricingResponse ,
42+ SetPricingRequest ,
43+ UpdateBudgetRequest ,
44+ UpdateKeyRequest ,
45+ UpdateUserRequest ,
46+ UsageEntry ,
47+ UsageLogResponse ,
48+ UserResponse ,
49+ )
50+
51+
52+ class KeysResource :
53+ """Ergonomic accessors for the API-keys management endpoints.
54+
55+ Aliases delegate to the generated :class:`KeysApi`, which stays reachable
56+ via :attr:`raw` for the full generated surface.
57+ """
58+
59+ def __init__ (self , api : KeysApi ) -> None :
60+ self .raw = api
61+
62+ def create (self , request : CreateKeyRequest , ** kwargs : Any ) -> CreateKeyResponse :
63+ return self .raw .create_key_v1_keys_post (request , ** kwargs )
64+
65+ def get (self , key_id : str , ** kwargs : Any ) -> KeyInfo :
66+ return self .raw .get_key_v1_keys_key_id_get (key_id , ** kwargs )
67+
68+ def list (self , skip : int | None = None , limit : int | None = None , ** kwargs : Any ) -> list [KeyInfo ]:
69+ return self .raw .list_keys_v1_keys_get (skip , limit , ** kwargs )
70+
71+ def update (self , key_id : str , request : UpdateKeyRequest , ** kwargs : Any ) -> KeyInfo :
72+ return self .raw .update_key_v1_keys_key_id_patch (key_id , request , ** kwargs )
73+
74+ def delete (self , key_id : str , ** kwargs : Any ) -> None :
75+ self .raw .delete_key_v1_keys_key_id_delete (key_id , ** kwargs )
76+
77+
78+ class UsersResource :
79+ """Ergonomic accessors for the users management endpoints.
80+
81+ Aliases delegate to the generated :class:`UsersApi`, which stays reachable
82+ via :attr:`raw` for the full generated surface.
83+ """
84+
85+ def __init__ (self , api : UsersApi ) -> None :
86+ self .raw = api
87+
88+ def create (self , request : CreateUserRequest , ** kwargs : Any ) -> UserResponse :
89+ return self .raw .create_user_v1_users_post (request , ** kwargs )
90+
91+ def get (self , user_id : str , ** kwargs : Any ) -> UserResponse :
92+ return self .raw .get_user_v1_users_user_id_get (user_id , ** kwargs )
93+
94+ def update (self , user_id : str , request : UpdateUserRequest , ** kwargs : Any ) -> UserResponse :
95+ return self .raw .update_user_v1_users_user_id_patch (user_id , request , ** kwargs )
96+
97+ def delete (self , user_id : str , ** kwargs : Any ) -> None :
98+ self .raw .delete_user_v1_users_user_id_delete (user_id , ** kwargs )
99+
100+ def get_usage (self , user_id : str , ** kwargs : Any ) -> list [UsageLogResponse ]:
101+ return self .raw .get_user_usage_v1_users_user_id_usage_get (user_id , ** kwargs )
102+
103+ # Defined last: a method named ``list`` shadows the ``list`` builtin for any
104+ # ``list[...]`` annotation that follows it in this class body.
105+ def list (self , skip : int | None = None , limit : int | None = None , ** kwargs : Any ) -> list [UserResponse ]:
106+ return self .raw .list_users_v1_users_get (skip , limit , ** kwargs )
107+
108+
109+ class BudgetsResource :
110+ """Ergonomic accessors for the budgets management endpoints.
111+
112+ Aliases delegate to the generated :class:`BudgetsApi`, which stays reachable
113+ via :attr:`raw` for the full generated surface.
114+ """
115+
116+ def __init__ (self , api : BudgetsApi ) -> None :
117+ self .raw = api
118+
119+ def create (self , request : CreateBudgetRequest , ** kwargs : Any ) -> BudgetResponse :
120+ return self .raw .create_budget_v1_budgets_post (request , ** kwargs )
121+
122+ def get (self , budget_id : str , ** kwargs : Any ) -> BudgetResponse :
123+ return self .raw .get_budget_v1_budgets_budget_id_get (budget_id , ** kwargs )
124+
125+ def list (self , skip : int | None = None , limit : int | None = None , ** kwargs : Any ) -> list [BudgetResponse ]:
126+ return self .raw .list_budgets_v1_budgets_get (skip , limit , ** kwargs )
127+
128+ def update (self , budget_id : str , request : UpdateBudgetRequest , ** kwargs : Any ) -> BudgetResponse :
129+ return self .raw .update_budget_v1_budgets_budget_id_patch (budget_id , request , ** kwargs )
130+
131+ def delete (self , budget_id : str , ** kwargs : Any ) -> None :
132+ self .raw .delete_budget_v1_budgets_budget_id_delete (budget_id , ** kwargs )
133+
134+
135+ class PricingResource :
136+ """Ergonomic accessors for the model-pricing management endpoints.
137+
138+ Aliases delegate to the generated :class:`PricingApi`, which stays reachable
139+ via :attr:`raw` for the full generated surface.
140+ """
141+
142+ def __init__ (self , api : PricingApi ) -> None :
143+ self .raw = api
144+
145+ def get (self , model_key : str , ** kwargs : Any ) -> PricingResponse :
146+ return self .raw .get_pricing_v1_pricing_model_key_get (model_key , ** kwargs )
147+
148+ def set (self , request : SetPricingRequest , ** kwargs : Any ) -> PricingResponse :
149+ return self .raw .set_pricing_v1_pricing_post (request , ** kwargs )
150+
151+ def delete (self , model_key : str , ** kwargs : Any ) -> None :
152+ self .raw .delete_pricing_v1_pricing_model_key_delete (model_key , ** kwargs )
153+
154+ def get_history (self , model_key : str , ** kwargs : Any ) -> list [PricingResponse ]:
155+ return self .raw .get_pricing_history_v1_pricing_model_key_history_get (model_key , ** kwargs )
156+
157+ # Defined last: a method named ``list`` shadows the ``list`` builtin for any
158+ # ``list[...]`` annotation that follows it in this class body.
159+ def list (self , skip : int | None = None , limit : int | None = None , ** kwargs : Any ) -> list [PricingResponse ]:
160+ return self .raw .list_pricing_v1_pricing_get (skip , limit , ** kwargs )
161+
162+
163+ class UsageResource :
164+ """Ergonomic accessors for the usage-log management endpoints.
165+
166+ Aliases delegate to the generated :class:`UsageApi`, which stays reachable
167+ via :attr:`raw` for the full generated surface.
168+ """
169+
170+ def __init__ (self , api : UsageApi ) -> None :
171+ self .raw = api
172+
173+ def list (
174+ self ,
175+ start_date : datetime | None = None ,
176+ end_date : datetime | None = None ,
177+ user_id : str | None = None ,
178+ skip : int | None = None ,
179+ limit : int | None = None ,
180+ ** kwargs : Any ,
181+ ) -> list [UsageEntry ]:
182+ return self .raw .list_usage_v1_usage_get (start_date , end_date , user_id , skip , limit , ** kwargs )
183+
23184
24185class ControlPlane :
25186 """Accessors for the gateway management endpoints, sharing one authenticated client.
26187
27- Method names on the underlying API objects are generator-derived (for
28- example ``keys.create_key_v1_keys_post(...)``); friendlier aliases are a
29- planned follow-up.
188+ Each accessor returns a resource wrapper exposing ergonomic aliases (for
189+ example ``keys.create(...)``, ``users.list(...)``, ``budgets.get(...)``).
190+ The generator-derived methods stay reachable via the ``raw`` attribute on
191+ each resource (for example ``keys.raw.create_key_v1_keys_post(...)``).
30192 """
31193
32194 def __init__ (self , base_url : str , bearer_token : str ) -> None :
@@ -37,24 +199,24 @@ def __init__(self, base_url: str, bearer_token: str) -> None:
37199 self ._api_client .set_default_header ("Authorization" , f"Bearer { bearer_token } " )
38200
39201 @cached_property
40- def keys (self ) -> KeysApi :
41- return KeysApi (self ._api_client )
202+ def keys (self ) -> KeysResource :
203+ return KeysResource ( KeysApi (self ._api_client ) )
42204
43205 @cached_property
44- def users (self ) -> UsersApi :
45- return UsersApi (self ._api_client )
206+ def users (self ) -> UsersResource :
207+ return UsersResource ( UsersApi (self ._api_client ) )
46208
47209 @cached_property
48- def budgets (self ) -> BudgetsApi :
49- return BudgetsApi (self ._api_client )
210+ def budgets (self ) -> BudgetsResource :
211+ return BudgetsResource ( BudgetsApi (self ._api_client ) )
50212
51213 @cached_property
52- def pricing (self ) -> PricingApi :
53- return PricingApi (self ._api_client )
214+ def pricing (self ) -> PricingResource :
215+ return PricingResource ( PricingApi (self ._api_client ) )
54216
55217 @cached_property
56- def usage (self ) -> UsageApi :
57- return UsageApi (self ._api_client )
218+ def usage (self ) -> UsageResource :
219+ return UsageResource ( UsageApi (self ._api_client ) )
58220
59221 def close (self ) -> None :
60222 self ._api_client .__exit__ (None , None , None )
0 commit comments