beamlit 0.0.28rc24__py3-none-any.whl → 0.0.29__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,186 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, Optional, Union
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.get_trace_logs_response_200 import GetTraceLogsResponse200
9
+ from ...types import UNSET, Response, Unset
10
+
11
+
12
+ def _get_kwargs(
13
+ trace_id: str,
14
+ *,
15
+ span_id: Union[Unset, str] = UNSET,
16
+ limit: Union[Unset, str] = UNSET,
17
+ ) -> dict[str, Any]:
18
+ params: dict[str, Any] = {}
19
+
20
+ params["spanId"] = span_id
21
+
22
+ params["limit"] = limit
23
+
24
+ params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
25
+
26
+ _kwargs: dict[str, Any] = {
27
+ "method": "get",
28
+ "url": f"/traces/{trace_id}/logs",
29
+ "params": params,
30
+ }
31
+
32
+ return _kwargs
33
+
34
+
35
+ def _parse_response(
36
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
37
+ ) -> Optional[GetTraceLogsResponse200]:
38
+ if response.status_code == 200:
39
+ response_200 = GetTraceLogsResponse200.from_dict(response.json())
40
+
41
+ return response_200
42
+ if client.raise_on_unexpected_status:
43
+ raise errors.UnexpectedStatus(response.status_code, response.content)
44
+ else:
45
+ return None
46
+
47
+
48
+ def _build_response(
49
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
50
+ ) -> Response[GetTraceLogsResponse200]:
51
+ return Response(
52
+ status_code=HTTPStatus(response.status_code),
53
+ content=response.content,
54
+ headers=response.headers,
55
+ parsed=_parse_response(client=client, response=response),
56
+ )
57
+
58
+
59
+ def sync_detailed(
60
+ trace_id: str,
61
+ *,
62
+ client: AuthenticatedClient,
63
+ span_id: Union[Unset, str] = UNSET,
64
+ limit: Union[Unset, str] = UNSET,
65
+ ) -> Response[GetTraceLogsResponse200]:
66
+ """Get trace logs
67
+
68
+ Args:
69
+ trace_id (str):
70
+ span_id (Union[Unset, str]):
71
+ limit (Union[Unset, str]):
72
+
73
+ Raises:
74
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
75
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
76
+
77
+ Returns:
78
+ Response[GetTraceLogsResponse200]
79
+ """
80
+
81
+ kwargs = _get_kwargs(
82
+ trace_id=trace_id,
83
+ span_id=span_id,
84
+ limit=limit,
85
+ )
86
+
87
+ response = client.get_httpx_client().request(
88
+ **kwargs,
89
+ )
90
+
91
+ return _build_response(client=client, response=response)
92
+
93
+
94
+ def sync(
95
+ trace_id: str,
96
+ *,
97
+ client: AuthenticatedClient,
98
+ span_id: Union[Unset, str] = UNSET,
99
+ limit: Union[Unset, str] = UNSET,
100
+ ) -> Optional[GetTraceLogsResponse200]:
101
+ """Get trace logs
102
+
103
+ Args:
104
+ trace_id (str):
105
+ span_id (Union[Unset, str]):
106
+ limit (Union[Unset, str]):
107
+
108
+ Raises:
109
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
110
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
111
+
112
+ Returns:
113
+ GetTraceLogsResponse200
114
+ """
115
+
116
+ return sync_detailed(
117
+ trace_id=trace_id,
118
+ client=client,
119
+ span_id=span_id,
120
+ limit=limit,
121
+ ).parsed
122
+
123
+
124
+ async def asyncio_detailed(
125
+ trace_id: str,
126
+ *,
127
+ client: AuthenticatedClient,
128
+ span_id: Union[Unset, str] = UNSET,
129
+ limit: Union[Unset, str] = UNSET,
130
+ ) -> Response[GetTraceLogsResponse200]:
131
+ """Get trace logs
132
+
133
+ Args:
134
+ trace_id (str):
135
+ span_id (Union[Unset, str]):
136
+ limit (Union[Unset, str]):
137
+
138
+ Raises:
139
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
140
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
141
+
142
+ Returns:
143
+ Response[GetTraceLogsResponse200]
144
+ """
145
+
146
+ kwargs = _get_kwargs(
147
+ trace_id=trace_id,
148
+ span_id=span_id,
149
+ limit=limit,
150
+ )
151
+
152
+ response = await client.get_async_httpx_client().request(**kwargs)
153
+
154
+ return _build_response(client=client, response=response)
155
+
156
+
157
+ async def asyncio(
158
+ trace_id: str,
159
+ *,
160
+ client: AuthenticatedClient,
161
+ span_id: Union[Unset, str] = UNSET,
162
+ limit: Union[Unset, str] = UNSET,
163
+ ) -> Optional[GetTraceLogsResponse200]:
164
+ """Get trace logs
165
+
166
+ Args:
167
+ trace_id (str):
168
+ span_id (Union[Unset, str]):
169
+ limit (Union[Unset, str]):
170
+
171
+ Raises:
172
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
173
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
174
+
175
+ Returns:
176
+ GetTraceLogsResponse200
177
+ """
178
+
179
+ return (
180
+ await asyncio_detailed(
181
+ trace_id=trace_id,
182
+ client=client,
183
+ span_id=span_id,
184
+ limit=limit,
185
+ )
186
+ ).parsed
@@ -0,0 +1,171 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, Optional, Union
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.trace_ids_response import TraceIdsResponse
9
+ from ...types import UNSET, Response, Unset
10
+
11
+
12
+ def _get_kwargs(
13
+ function_name: str,
14
+ *,
15
+ environment: Union[Unset, str] = UNSET,
16
+ ) -> dict[str, Any]:
17
+ params: dict[str, Any] = {}
18
+
19
+ params["environment"] = environment
20
+
21
+ params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
22
+
23
+ _kwargs: dict[str, Any] = {
24
+ "method": "get",
25
+ "url": f"/functions/{function_name}/traces",
26
+ "params": params,
27
+ }
28
+
29
+ return _kwargs
30
+
31
+
32
+ def _parse_response(
33
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
34
+ ) -> Optional[TraceIdsResponse]:
35
+ if response.status_code == 200:
36
+ response_200 = TraceIdsResponse.from_dict(response.json())
37
+
38
+ return response_200
39
+ if client.raise_on_unexpected_status:
40
+ raise errors.UnexpectedStatus(response.status_code, response.content)
41
+ else:
42
+ return None
43
+
44
+
45
+ def _build_response(
46
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
47
+ ) -> Response[TraceIdsResponse]:
48
+ return Response(
49
+ status_code=HTTPStatus(response.status_code),
50
+ content=response.content,
51
+ headers=response.headers,
52
+ parsed=_parse_response(client=client, response=response),
53
+ )
54
+
55
+
56
+ def sync_detailed(
57
+ function_name: str,
58
+ *,
59
+ client: AuthenticatedClient,
60
+ environment: Union[Unset, str] = UNSET,
61
+ ) -> Response[TraceIdsResponse]:
62
+ """Get function trace IDs
63
+
64
+ Args:
65
+ function_name (str):
66
+ environment (Union[Unset, str]):
67
+
68
+ Raises:
69
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
70
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
71
+
72
+ Returns:
73
+ Response[TraceIdsResponse]
74
+ """
75
+
76
+ kwargs = _get_kwargs(
77
+ function_name=function_name,
78
+ environment=environment,
79
+ )
80
+
81
+ response = client.get_httpx_client().request(
82
+ **kwargs,
83
+ )
84
+
85
+ return _build_response(client=client, response=response)
86
+
87
+
88
+ def sync(
89
+ function_name: str,
90
+ *,
91
+ client: AuthenticatedClient,
92
+ environment: Union[Unset, str] = UNSET,
93
+ ) -> Optional[TraceIdsResponse]:
94
+ """Get function trace IDs
95
+
96
+ Args:
97
+ function_name (str):
98
+ environment (Union[Unset, str]):
99
+
100
+ Raises:
101
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
102
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
103
+
104
+ Returns:
105
+ TraceIdsResponse
106
+ """
107
+
108
+ return sync_detailed(
109
+ function_name=function_name,
110
+ client=client,
111
+ environment=environment,
112
+ ).parsed
113
+
114
+
115
+ async def asyncio_detailed(
116
+ function_name: str,
117
+ *,
118
+ client: AuthenticatedClient,
119
+ environment: Union[Unset, str] = UNSET,
120
+ ) -> Response[TraceIdsResponse]:
121
+ """Get function trace IDs
122
+
123
+ Args:
124
+ function_name (str):
125
+ environment (Union[Unset, str]):
126
+
127
+ Raises:
128
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
129
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
130
+
131
+ Returns:
132
+ Response[TraceIdsResponse]
133
+ """
134
+
135
+ kwargs = _get_kwargs(
136
+ function_name=function_name,
137
+ environment=environment,
138
+ )
139
+
140
+ response = await client.get_async_httpx_client().request(**kwargs)
141
+
142
+ return _build_response(client=client, response=response)
143
+
144
+
145
+ async def asyncio(
146
+ function_name: str,
147
+ *,
148
+ client: AuthenticatedClient,
149
+ environment: Union[Unset, str] = UNSET,
150
+ ) -> Optional[TraceIdsResponse]:
151
+ """Get function trace IDs
152
+
153
+ Args:
154
+ function_name (str):
155
+ environment (Union[Unset, str]):
156
+
157
+ Raises:
158
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
159
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
160
+
161
+ Returns:
162
+ TraceIdsResponse
163
+ """
164
+
165
+ return (
166
+ await asyncio_detailed(
167
+ function_name=function_name,
168
+ client=client,
169
+ environment=environment,
170
+ )
171
+ ).parsed
@@ -0,0 +1,171 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, Optional, Union
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.trace_ids_response import TraceIdsResponse
9
+ from ...types import UNSET, Response, Unset
10
+
11
+
12
+ def _get_kwargs(
13
+ model_name: str,
14
+ *,
15
+ environment: Union[Unset, str] = UNSET,
16
+ ) -> dict[str, Any]:
17
+ params: dict[str, Any] = {}
18
+
19
+ params["environment"] = environment
20
+
21
+ params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
22
+
23
+ _kwargs: dict[str, Any] = {
24
+ "method": "get",
25
+ "url": f"/models/{model_name}/traces",
26
+ "params": params,
27
+ }
28
+
29
+ return _kwargs
30
+
31
+
32
+ def _parse_response(
33
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
34
+ ) -> Optional[TraceIdsResponse]:
35
+ if response.status_code == 200:
36
+ response_200 = TraceIdsResponse.from_dict(response.json())
37
+
38
+ return response_200
39
+ if client.raise_on_unexpected_status:
40
+ raise errors.UnexpectedStatus(response.status_code, response.content)
41
+ else:
42
+ return None
43
+
44
+
45
+ def _build_response(
46
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
47
+ ) -> Response[TraceIdsResponse]:
48
+ return Response(
49
+ status_code=HTTPStatus(response.status_code),
50
+ content=response.content,
51
+ headers=response.headers,
52
+ parsed=_parse_response(client=client, response=response),
53
+ )
54
+
55
+
56
+ def sync_detailed(
57
+ model_name: str,
58
+ *,
59
+ client: AuthenticatedClient,
60
+ environment: Union[Unset, str] = UNSET,
61
+ ) -> Response[TraceIdsResponse]:
62
+ """Get model trace IDs
63
+
64
+ Args:
65
+ model_name (str):
66
+ environment (Union[Unset, str]):
67
+
68
+ Raises:
69
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
70
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
71
+
72
+ Returns:
73
+ Response[TraceIdsResponse]
74
+ """
75
+
76
+ kwargs = _get_kwargs(
77
+ model_name=model_name,
78
+ environment=environment,
79
+ )
80
+
81
+ response = client.get_httpx_client().request(
82
+ **kwargs,
83
+ )
84
+
85
+ return _build_response(client=client, response=response)
86
+
87
+
88
+ def sync(
89
+ model_name: str,
90
+ *,
91
+ client: AuthenticatedClient,
92
+ environment: Union[Unset, str] = UNSET,
93
+ ) -> Optional[TraceIdsResponse]:
94
+ """Get model trace IDs
95
+
96
+ Args:
97
+ model_name (str):
98
+ environment (Union[Unset, str]):
99
+
100
+ Raises:
101
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
102
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
103
+
104
+ Returns:
105
+ TraceIdsResponse
106
+ """
107
+
108
+ return sync_detailed(
109
+ model_name=model_name,
110
+ client=client,
111
+ environment=environment,
112
+ ).parsed
113
+
114
+
115
+ async def asyncio_detailed(
116
+ model_name: str,
117
+ *,
118
+ client: AuthenticatedClient,
119
+ environment: Union[Unset, str] = UNSET,
120
+ ) -> Response[TraceIdsResponse]:
121
+ """Get model trace IDs
122
+
123
+ Args:
124
+ model_name (str):
125
+ environment (Union[Unset, str]):
126
+
127
+ Raises:
128
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
129
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
130
+
131
+ Returns:
132
+ Response[TraceIdsResponse]
133
+ """
134
+
135
+ kwargs = _get_kwargs(
136
+ model_name=model_name,
137
+ environment=environment,
138
+ )
139
+
140
+ response = await client.get_async_httpx_client().request(**kwargs)
141
+
142
+ return _build_response(client=client, response=response)
143
+
144
+
145
+ async def asyncio(
146
+ model_name: str,
147
+ *,
148
+ client: AuthenticatedClient,
149
+ environment: Union[Unset, str] = UNSET,
150
+ ) -> Optional[TraceIdsResponse]:
151
+ """Get model trace IDs
152
+
153
+ Args:
154
+ model_name (str):
155
+ environment (Union[Unset, str]):
156
+
157
+ Raises:
158
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
159
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
160
+
161
+ Returns:
162
+ TraceIdsResponse
163
+ """
164
+
165
+ return (
166
+ await asyncio_detailed(
167
+ model_name=model_name,
168
+ client=client,
169
+ environment=environment,
170
+ )
171
+ ).parsed
@@ -1,19 +1,15 @@
1
+ import os
1
2
  from dataclasses import dataclass
2
3
  from typing import Dict, Generator
3
4
 
4
- from httpx import Auth, Request, Response
5
-
6
5
  from beamlit.common.settings import Settings, get_settings
6
+ from httpx import Auth, Request, Response
7
7
 
8
8
  from ..client import AuthenticatedClient
9
9
  from .apikey import ApiKeyProvider
10
10
  from .clientcredentials import ClientCredentials
11
- from .credentials import (
12
- Credentials,
13
- current_context,
14
- load_credentials,
15
- load_credentials_from_settings,
16
- )
11
+ from .credentials import (Credentials, current_context, load_credentials,
12
+ load_credentials_from_settings)
17
13
  from .device_mode import BearerToken
18
14
 
19
15
 
@@ -26,8 +22,15 @@ class PublicProvider(Auth):
26
22
  class RunClientWithCredentials:
27
23
  credentials: Credentials
28
24
  workspace: str
29
- api_url: str = "https://api.beamlit.dev/v0"
30
- run_url: str = "https://run.beamlit.dev/v0"
25
+ api_url: str = ""
26
+ run_url: str = ""
27
+
28
+ def __post_init__(self):
29
+ from ..common.settings import get_settings
30
+
31
+ settings = get_settings()
32
+ self.api_url = settings.base_url
33
+ self.run_url = settings.run_url
31
34
 
32
35
 
33
36
  def new_client_from_settings(settings: Settings):
@@ -41,15 +44,15 @@ def new_client_from_settings(settings: Settings):
41
44
 
42
45
 
43
46
  def new_client():
47
+ settings = get_settings()
44
48
  context = current_context()
45
- if context.workspace:
49
+ if context.workspace and not settings.authentication.client.credentials:
46
50
  credentials = load_credentials(context.workspace)
47
51
  client_config = RunClientWithCredentials(
48
52
  credentials=credentials,
49
53
  workspace=context.workspace,
50
54
  )
51
55
  else:
52
- settings = get_settings()
53
56
  credentials = load_credentials_from_settings(settings)
54
57
  client_config = RunClientWithCredentials(
55
58
  credentials=credentials,
@@ -74,7 +77,7 @@ def new_client_with_credentials(config: RunClientWithCredentials):
74
77
 
75
78
  def get_authentication_headers(settings: Settings) -> Dict[str, str]:
76
79
  context = current_context()
77
- if context.workspace:
80
+ if context.workspace and not settings.authentication.client.credentials:
78
81
  credentials = load_credentials(context.workspace)
79
82
  else:
80
83
  settings = get_settings()
@@ -37,7 +37,7 @@ class ClientCredentials(Auth):
37
37
  def refresh_if_needed(self) -> Optional[Exception]:
38
38
  settings = get_settings()
39
39
  if self.credentials.client_credentials and not self.credentials.refresh_token:
40
- headers = {"Authorization": f"Basic {self.credentials.client_credentials}"}
40
+ headers = {"Authorization": f"Basic {self.credentials.client_credentials}", "Content-Type": "application/json"}
41
41
  body = {"grant_type": "client_credentials"}
42
42
  response = requests.post(f"{settings.base_url}/oauth/token", headers=headers, json=body)
43
43
  response.raise_for_status()
beamlit/client.py CHANGED
@@ -38,7 +38,7 @@ class Client:
38
38
  """
39
39
 
40
40
  raise_on_unexpected_status: bool = field(default=True, kw_only=True)
41
- _base_url: str = field(alias="base_url", default="https://api.beamlit.dev/v0")
41
+ _base_url: str = field(alias="base_url", default="")
42
42
  _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
43
43
  _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
44
44
  _provider: httpx.Auth = field(default=None, alias="provider")
@@ -49,6 +49,12 @@ class Client:
49
49
  _client: Optional[httpx.Client] = field(default=None, init=False)
50
50
  _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
51
51
 
52
+ def __post_init__(self):
53
+ from .common.settings import get_settings
54
+
55
+ settings = get_settings()
56
+ self._base_url = settings.base_url
57
+
52
58
  def with_headers(self, headers: dict[str, str]) -> "Client":
53
59
  """Get a new client matching this one with additional headers"""
54
60
  if self._client is not None:
@@ -170,7 +176,7 @@ class AuthenticatedClient:
170
176
  """
171
177
 
172
178
  raise_on_unexpected_status: bool = field(default=True, kw_only=True)
173
- _base_url: str = field(alias="base_url", default="https://api.beamlit.dev/v0")
179
+ _base_url: str = field(alias="base_url", default="")
174
180
  _cookies: dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
175
181
  _headers: dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
176
182
  _provider: httpx.Auth = field(default=None, alias="provider")
@@ -181,6 +187,12 @@ class AuthenticatedClient:
181
187
  _client: Optional[httpx.Client] = field(default=None, init=False)
182
188
  _async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
183
189
 
190
+ def __post_init__(self):
191
+ from .common.settings import get_settings
192
+
193
+ settings = get_settings()
194
+ self._base_url = settings.base_url
195
+
184
196
  def with_headers(self, headers: dict[str, str]) -> "AuthenticatedClient":
185
197
  """Get a new client matching this one with additional headers"""
186
198
  if self._client is not None:
@@ -18,11 +18,6 @@ from pydantic_settings import (BaseSettings, PydanticBaseSettingsSource,
18
18
  global SETTINGS
19
19
  SETTINGS = None
20
20
 
21
-
22
- def get_settings():
23
- return SETTINGS
24
-
25
-
26
21
  class SettingsAgent(BaseSettings):
27
22
  agent: Union[None, CompiledGraph, BaseChatModel] = None
28
23
  chain: Union[Unset, list[Agent]] = UNSET
@@ -62,15 +57,23 @@ class Settings(BaseSettings):
62
57
  remote: bool = Field(default=False)
63
58
  type: str = Field(default="agent")
64
59
  name: str = Field(default="beamlit-agent")
65
- base_url: str = Field(default="https://api.beamlit.dev/v0")
66
- run_url: str = Field(default="https://run.beamlit.dev")
67
- mcp_hub_url: str = Field(default="https://mcp-hub-server.beamlit.workers.dev")
68
- registry_url: str = Field(default="https://serverless-registry-production.beamlit.workers.dev")
60
+ base_url: str = Field(default="https://api.beamlit.com/v0")
61
+ run_url: str = Field(default="https://run.beamlit.com")
62
+ mcp_hub_url: str = Field(default="https://mcp-hub-server.beamlit.workers.com")
63
+ registry_url: str = Field(default="https://us.registry.beamlit.com")
69
64
  log_level: str = Field(default="INFO")
70
65
  agent: SettingsAgent = SettingsAgent()
71
66
  server: SettingsServer = SettingsServer()
72
67
  authentication: SettingsAuthentication = SettingsAuthentication()
73
68
 
69
+ def __init__(self, **data):
70
+ super().__init__(**data)
71
+ if os.getenv('BL_ENV') == 'dev':
72
+ self.base_url = os.getenv('BL_BASE_URL') or "https://api.beamlit.dev/v0"
73
+ self.run_url = os.getenv('BL_RUN_URL') or "https://run.beamlit.dev"
74
+ self.mcp_hub_url = os.getenv('BL_MCP_HUB_URL') or "https://mcp-hub-server.beamlit.workers.dev"
75
+ self.registry_url = os.getenv('BL_REGISTRY_URL') or "https://eu.registry.beamlit.dev"
76
+
74
77
  @classmethod
75
78
  def settings_customise_sources(
76
79
  cls,
@@ -88,6 +91,9 @@ class Settings(BaseSettings):
88
91
  init_settings,
89
92
  )
90
93
 
94
+ def get_settings() -> Settings:
95
+ return SETTINGS
96
+
91
97
 
92
98
  def init_agent(
93
99
  client: AuthenticatedClient,