beamlit 0.0.30rc36__py3-none-any.whl → 0.0.31__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.
beamlit/agents/chain.py CHANGED
@@ -1,17 +1,17 @@
1
1
  import asyncio
2
- from dataclasses import dataclass
3
2
  import warnings
4
- from typing import Any, Callable
3
+ from dataclasses import dataclass
4
+ from typing import Callable
5
5
 
6
6
  import pydantic
7
7
  import typing_extensions as t
8
+ from langchain_core.tools.base import BaseTool, ToolException
9
+
8
10
  from beamlit.api.agents import list_agents
9
11
  from beamlit.authentication.authentication import AuthenticatedClient
12
+ from beamlit.common.settings import get_settings
10
13
  from beamlit.models import Agent, AgentChain
11
14
  from beamlit.run import RunClient
12
- from beamlit.common.settings import get_settings
13
- from langchain_core.tools.base import BaseTool, ToolException
14
-
15
15
 
16
16
 
17
17
  class ChainTool(BaseTool):
@@ -6,6 +6,10 @@ import importlib
6
6
  import os
7
7
  from logging import getLogger
8
8
 
9
+ from langchain_core.tools import Tool
10
+ from langgraph.checkpoint.memory import MemorySaver
11
+ from langgraph.prebuilt import create_react_agent
12
+
9
13
  from beamlit.api.models import get_model
10
14
  from beamlit.authentication import new_client
11
15
  from beamlit.common.settings import init
@@ -13,9 +17,6 @@ from beamlit.errors import UnexpectedStatus
13
17
  from beamlit.functions.mcp.mcp import MCPClient, MCPToolkit
14
18
  from beamlit.functions.remote.remote import RemoteToolkit
15
19
  from beamlit.models import Agent, AgentMetadata, AgentSpec
16
- from langchain_core.tools import Tool
17
- from langgraph.checkpoint.memory import MemorySaver
18
- from langgraph.prebuilt import create_react_agent
19
20
 
20
21
  from .chain import ChainToolkit
21
22
  from .chat import get_chat_model
@@ -6,7 +6,9 @@ import httpx
6
6
  from ... import errors
7
7
  from ...client import AuthenticatedClient, Client
8
8
  from ...models.create_workspace_service_account_body import CreateWorkspaceServiceAccountBody
9
- from ...models.create_workspace_service_account_response_200 import CreateWorkspaceServiceAccountResponse200
9
+ from ...models.create_workspace_service_account_response_200 import (
10
+ CreateWorkspaceServiceAccountResponse200,
11
+ )
10
12
  from ...types import Response
11
13
 
12
14
 
@@ -5,7 +5,9 @@ import httpx
5
5
 
6
6
  from ... import errors
7
7
  from ...client import AuthenticatedClient, Client
8
- from ...models.delete_workspace_service_account_response_200 import DeleteWorkspaceServiceAccountResponse200
8
+ from ...models.delete_workspace_service_account_response_200 import (
9
+ DeleteWorkspaceServiceAccountResponse200,
10
+ )
9
11
  from ...types import Response
10
12
 
11
13
 
@@ -5,7 +5,9 @@ import httpx
5
5
 
6
6
  from ... import errors
7
7
  from ...client import AuthenticatedClient, Client
8
- from ...models.get_workspace_service_accounts_response_200_item import GetWorkspaceServiceAccountsResponse200Item
8
+ from ...models.get_workspace_service_accounts_response_200_item import (
9
+ GetWorkspaceServiceAccountsResponse200Item,
10
+ )
9
11
  from ...types import Response
10
12
 
11
13
 
@@ -6,7 +6,9 @@ import httpx
6
6
  from ... import errors
7
7
  from ...client import AuthenticatedClient, Client
8
8
  from ...models.update_workspace_service_account_body import UpdateWorkspaceServiceAccountBody
9
- from ...models.update_workspace_service_account_response_200 import UpdateWorkspaceServiceAccountResponse200
9
+ from ...models.update_workspace_service_account_response_200 import (
10
+ UpdateWorkspaceServiceAccountResponse200,
11
+ )
10
12
  from ...types import Response
11
13
 
12
14
 
@@ -1,15 +1,19 @@
1
- import os
2
1
  from dataclasses import dataclass
3
2
  from typing import Dict, Generator
4
3
 
5
- from beamlit.common.settings import Settings, get_settings
6
4
  from httpx import Auth, Request, Response
7
5
 
6
+ from beamlit.common.settings import Settings, get_settings
7
+
8
8
  from ..client import AuthenticatedClient
9
9
  from .apikey import ApiKeyProvider
10
10
  from .clientcredentials import ClientCredentials
11
- from .credentials import (Credentials, current_context, load_credentials,
12
- load_credentials_from_settings)
11
+ from .credentials import (
12
+ Credentials,
13
+ current_context,
14
+ load_credentials,
15
+ load_credentials_from_settings,
16
+ )
13
17
  from .device_mode import BearerToken
14
18
 
15
19
 
@@ -8,22 +8,16 @@ from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
8
8
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
9
9
  OTLPSpanExporter,
10
10
  )
11
- from opentelemetry.instrumentation.fastapi import ( # type: ignore
12
- FastAPIInstrumentor,
13
- )
14
- from opentelemetry.instrumentation.httpx import ( # type: ignore
15
- HTTPXClientInstrumentor,
16
- )
17
- from opentelemetry.instrumentation.logging import ( # type: ignore
18
- LoggingInstrumentor,
19
- )
11
+ from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
12
+ from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
13
+ from opentelemetry.instrumentation.logging import LoggingInstrumentor
14
+ from opentelemetry.metrics import NoOpMeterProvider
20
15
  from opentelemetry.sdk.metrics import MeterProvider
21
- from opentelemetry.sdk.metrics.export import (
22
- PeriodicExportingMetricReader,
23
- )
16
+ from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
24
17
  from opentelemetry.sdk.resources import Resource
25
18
  from opentelemetry.sdk.trace import TracerProvider
26
19
  from opentelemetry.sdk.trace.export import BatchSpanProcessor
20
+ from opentelemetry.trace import NoOpTracerProvider
27
21
  from typing_extensions import Dict
28
22
 
29
23
  from .settings import get_settings
@@ -57,11 +51,20 @@ def get_resource_attributes() -> Dict[str, Any]:
57
51
  return resources_dict
58
52
 
59
53
 
60
- def get_metrics_exporter() -> OTLPMetricExporter:
54
+ def get_metrics_exporter() -> OTLPMetricExporter | None:
55
+ settings = get_settings()
56
+ if settings is None:
57
+ raise Exception("Settings are not initialized")
58
+ if not settings.enable_opentelemetry:
59
+ # Return None or a NoOpExporter equivalent
60
+ return None
61
61
  return OTLPMetricExporter()
62
62
 
63
63
 
64
- def get_span_exporter() -> OTLPSpanExporter:
64
+ def get_span_exporter() -> OTLPSpanExporter | None:
65
+ settings = get_settings()
66
+ if not settings.enable_opentelemetry:
67
+ return None
65
68
  return OTLPSpanExporter()
66
69
 
67
70
 
@@ -71,6 +74,16 @@ def instrument_app(app: FastAPI):
71
74
  settings = get_settings()
72
75
  if settings is None:
73
76
  raise Exception("Settings are not initialized")
77
+
78
+ if not settings.enable_opentelemetry:
79
+ # Use NoOp implementations to stub tracing and metrics
80
+ trace.set_tracer_provider(NoOpTracerProvider())
81
+ tracer = trace.get_tracer(__name__)
82
+
83
+ metrics.set_meter_provider(NoOpMeterProvider())
84
+ meter = metrics.get_meter(__name__)
85
+ return
86
+
74
87
  resource = Resource.create(
75
88
  {
76
89
  "service.name": settings.name,
@@ -78,24 +91,33 @@ def instrument_app(app: FastAPI):
78
91
  "service.workspace": settings.workspace,
79
92
  }
80
93
  )
81
- # Set up the TracerProvider
82
- trace_provider = TracerProvider(resource=resource)
83
- span_processor = BatchSpanProcessor(get_span_exporter())
84
- trace_provider.add_span_processor(span_processor)
85
- trace.set_tracer_provider(trace_provider)
86
- tracer = trace_provider.get_tracer(__name__)
87
-
88
- metrics_exporter = PeriodicExportingMetricReader(get_metrics_exporter())
89
- meter_provider = MeterProvider(
90
- resource=resource, metric_readers=[metrics_exporter]
91
- )
92
- metrics.set_meter_provider(meter_provider)
93
- meter = meter_provider.get_meter(__name__)
94
94
 
95
- FastAPIInstrumentor.instrument_app( # type: ignore
96
- app=app, tracer_provider=trace_provider, meter_provider=meter_provider
95
+ # Set up the TracerProvider if not already set
96
+ if not isinstance(trace.get_tracer_provider(), TracerProvider):
97
+ trace_provider = TracerProvider(resource=resource)
98
+ span_processor = BatchSpanProcessor(get_span_exporter())
99
+ trace_provider.add_span_processor(span_processor)
100
+ trace.set_tracer_provider(trace_provider)
101
+ tracer = trace_provider.get_tracer(__name__)
102
+ else:
103
+ tracer = trace.get_tracer(__name__)
104
+
105
+ # Set up the MeterProvider if not already set
106
+ if not isinstance(metrics.get_meter_provider(), MeterProvider):
107
+ metrics_exporter = PeriodicExportingMetricReader(get_metrics_exporter())
108
+ meter_provider = MeterProvider(
109
+ resource=resource, metric_readers=[metrics_exporter]
110
+ )
111
+ metrics.set_meter_provider(meter_provider)
112
+ meter = meter_provider.get_meter(__name__)
113
+ else:
114
+ meter = metrics.get_meter(__name__)
115
+
116
+ # Only instrument the app when OpenTelemetry is enabled
117
+ FastAPIInstrumentor.instrument_app(
118
+ app=app, tracer_provider=trace.get_tracer_provider(), meter_provider=metrics.get_meter_provider()
97
119
  )
98
- HTTPXClientInstrumentor().instrument(meter_provider=meter_provider) # type: ignore
99
- LoggingInstrumentor(tracer_provider=trace_provider).instrument(
120
+ HTTPXClientInstrumentor().instrument(meter_provider=metrics.get_meter_provider())
121
+ LoggingInstrumentor(tracer_provider=trace.get_tracer_provider()).instrument(
100
122
  set_logging_format=True
101
123
  )
beamlit/common/logger.py CHANGED
@@ -27,5 +27,5 @@ def init(log_level: str):
27
27
  logging.getLogger("httpx").propagate = False
28
28
 
29
29
  handler = logging.StreamHandler()
30
- handler.setFormatter(ColoredFormatter(f"%(levelname)s %(name)s - %(message)s"))
30
+ handler.setFormatter(ColoredFormatter("%(levelname)s %(name)s - %(message)s"))
31
31
  logging.basicConfig(level=log_level, handlers=[handler])
@@ -2,6 +2,16 @@ import os
2
2
  from logging import getLogger
3
3
  from typing import Tuple, Type, Union
4
4
 
5
+ from langchain_core.language_models.chat_models import BaseChatModel
6
+ from langgraph.graph.graph import CompiledGraph
7
+ from pydantic import Field
8
+ from pydantic_settings import (
9
+ BaseSettings,
10
+ PydanticBaseSettingsSource,
11
+ SettingsConfigDict,
12
+ YamlConfigSettingsSource,
13
+ )
14
+
5
15
  from beamlit.api.agents import get_agent
6
16
  from beamlit.api.functions import get_function
7
17
  from beamlit.api.models import get_model
@@ -9,11 +19,6 @@ from beamlit.client import AuthenticatedClient
9
19
  from beamlit.common.logger import init as init_logger
10
20
  from beamlit.models import Agent, Function, Model
11
21
  from beamlit.types import UNSET, Unset
12
- from langchain_core.language_models.chat_models import BaseChatModel
13
- from langgraph.graph.graph import CompiledGraph
14
- from pydantic import Field
15
- from pydantic_settings import (BaseSettings, PydanticBaseSettingsSource,
16
- SettingsConfigDict, YamlConfigSettingsSource)
17
22
 
18
23
  global SETTINGS
19
24
  SETTINGS = None
@@ -62,6 +67,7 @@ class Settings(BaseSettings):
62
67
  mcp_hub_url: str = Field(default="https://mcp-hub-server.beamlit.workers.com")
63
68
  registry_url: str = Field(default="https://us.registry.beamlit.com")
64
69
  log_level: str = Field(default="INFO")
70
+ enable_opentelemetry: bool = Field(default=False)
65
71
  agent: SettingsAgent = SettingsAgent()
66
72
  server: SettingsServer = SettingsServer()
67
73
  authentication: SettingsAuthentication = SettingsAuthentication()
@@ -99,7 +105,6 @@ def init_agent(
99
105
  client: AuthenticatedClient,
100
106
  destination: str = f"{os.getcwd()}/src/beamlit_generated.py",
101
107
  ):
102
- from beamlit.api.agents import get_agent_deployment
103
108
  from beamlit.common.generate import generate
104
109
 
105
110
  logger = getLogger(__name__)
beamlit/deploy/deploy.py CHANGED
@@ -2,12 +2,20 @@ import ast
2
2
  import json
3
3
  import os
4
4
  import sys
5
+ import uuid
5
6
  from logging import getLogger
6
7
  from typing import Literal
7
8
 
8
9
  from beamlit.common.settings import Settings, get_settings, init
9
- from beamlit.models import (Agent, AgentChain, AgentSpec, EnvironmentMetadata,
10
- Flavor, Function, FunctionSpec, Runtime)
10
+ from beamlit.models import (
11
+ Agent,
12
+ AgentSpec,
13
+ EnvironmentMetadata,
14
+ Flavor,
15
+ Function,
16
+ FunctionSpec,
17
+ Runtime,
18
+ )
11
19
 
12
20
  from .format import arg_to_dict, format_agent_chain, format_parameters
13
21
  from .parser import Resource, get_description, get_parameters, get_resources
@@ -15,11 +23,16 @@ from .parser import Resource, get_description, get_parameters, get_resources
15
23
  sys.path.insert(0, os.getcwd())
16
24
  sys.path.insert(0, os.path.join(os.getcwd(), "src"))
17
25
 
26
+ random_id = str(uuid.uuid4())[:8]
27
+ def slugify(name: str) -> str:
28
+ return name.lower().replace(" ", "-").replace("_", "-")
18
29
 
19
30
  def get_runtime_image(type: str, name: str) -> str:
20
31
  settings = get_settings()
21
32
  registry_url = settings.registry_url.replace("https://", "").replace("http://", "")
22
33
  image = f"{registry_url}/{settings.workspace}/{type}s/{name}"
34
+ # Generate a random ID to ensure unique image tags
35
+ image = f"{image}:{random_id}"
23
36
  return image
24
37
 
25
38
 
@@ -110,7 +123,7 @@ def get_agent_yaml(
110
123
  apiVersion: beamlit.com/v1alpha1
111
124
  kind: Agent
112
125
  metadata:
113
- name: {agent.metadata.name}
126
+ name: {slugify(agent.metadata.name)}
114
127
  displayName: {agent.metadata.display_name or agent.metadata.name}
115
128
  environment: {settings.environment}
116
129
  workspace: {settings.workspace}
@@ -144,7 +157,7 @@ def get_function_yaml(function: Function, settings: Settings) -> str:
144
157
  apiVersion: beamlit.com/v1alpha1
145
158
  kind: Function
146
159
  metadata:
147
- name: {function.metadata.name}
160
+ name: {slugify(function.metadata.name)}
148
161
  displayName: {function.metadata.display_name or function.metadata.name}
149
162
  environment: {settings.environment}
150
163
  spec:
@@ -244,29 +257,29 @@ def generate_beamlit_deployment(directory: str):
244
257
  # write deployment file
245
258
  agent_dir = os.path.join(agents_dir, agent.metadata.name)
246
259
  os.makedirs(agent_dir, exist_ok=True)
247
- with open(os.path.join(agent_dir, f"agent.yaml"), "w") as f:
260
+ with open(os.path.join(agent_dir, "agent.yaml"), "w") as f:
248
261
  content = get_agent_yaml(agent, functions, settings)
249
262
  f.write(content)
250
263
  # write dockerfile for build
251
- with open(os.path.join(agent_dir, f"Dockerfile"), "w") as f:
264
+ with open(os.path.join(agent_dir, "Dockerfile"), "w") as f:
252
265
  content = dockerfile("agent", resource, agent)
253
266
  f.write(content)
254
267
  # write destination docker
255
- with open(os.path.join(agent_dir, f"destination.txt"), "w") as f:
268
+ with open(os.path.join(agent_dir, "destination.txt"), "w") as f:
256
269
  content = agent.spec.runtime.image
257
270
  f.write(content)
258
271
  for resource, function in functions:
259
272
  # write deployment file
260
273
  function_dir = os.path.join(functions_dir, function.metadata.name)
261
274
  os.makedirs(function_dir, exist_ok=True)
262
- with open(os.path.join(function_dir, f"function.yaml"), "w") as f:
275
+ with open(os.path.join(function_dir, "function.yaml"), "w") as f:
263
276
  content = get_function_yaml(function, settings)
264
277
  f.write(content)
265
278
  # write dockerfile for build
266
- with open(os.path.join(function_dir, f"Dockerfile"), "w") as f:
279
+ with open(os.path.join(function_dir, "Dockerfile"), "w") as f:
267
280
  content = dockerfile("function", resource, function)
268
281
  f.write(content)
269
282
  # write destination docker
270
- with open(os.path.join(function_dir, f"destination.txt"), "w") as f:
283
+ with open(os.path.join(function_dir, "destination.txt"), "w") as f:
271
284
  content = function.spec.runtime.image
272
285
  f.write(content)
beamlit/deploy/format.py CHANGED
@@ -1,7 +1,9 @@
1
1
 
2
2
  import ast
3
+
3
4
  from beamlit.models import AgentChain, StoreFunctionParameter
4
5
 
6
+
5
7
  def arg_to_list(arg: ast.List):
6
8
  value = []
7
9
  for v in arg.elts:
@@ -4,11 +4,12 @@ import json
4
4
  from collections.abc import Callable
5
5
  from logging import getLogger
6
6
 
7
+ from langchain_core.tools import create_schema_from_function
8
+
7
9
  from beamlit.authentication import new_client
8
10
  from beamlit.common.settings import get_settings
9
11
  from beamlit.models import Function, FunctionKit
10
12
  from beamlit.run import RunClient
11
- from langchain_core.tools import create_schema_from_function
12
13
 
13
14
  logger = getLogger(__name__)
14
15
 
@@ -67,10 +68,16 @@ def kit(bl_kit: FunctionKit = None, **kwargs: dict) -> Callable:
67
68
  return wrapper
68
69
 
69
70
 
70
- def function(*args, function: Function = None, kit=False, **kwargs: dict) -> Callable:
71
+ def function(*args, function: Function | dict = None, kit=False, **kwargs: dict) -> Callable:
71
72
  """Create function tools with Beamlit and LangChain integration."""
72
73
  settings = get_settings()
73
-
74
+ if function is not None and not isinstance(function, dict):
75
+ raise Exception(
76
+ 'function must be a dictionary, example: @function(function={"metadata": {"name": "my_function"}})'
77
+ )
78
+ if isinstance(function, dict):
79
+ function = Function(**function)
80
+
74
81
  def wrapper(func: Callable) -> Callable:
75
82
  if function and not func.__doc__ and function.spec and function.spec.description:
76
83
  func.__doc__ = function.spec.description
@@ -7,11 +7,12 @@ import pydantic
7
7
  import pydantic_core
8
8
  import requests
9
9
  import typing_extensions as t
10
- from beamlit.authentication.authentication import AuthenticatedClient
11
- from beamlit.common.settings import get_settings
12
10
  from langchain_core.tools.base import BaseTool, BaseToolkit, ToolException
13
11
  from mcp import ListToolsResult
14
12
 
13
+ from beamlit.authentication.authentication import AuthenticatedClient
14
+ from beamlit.common.settings import get_settings
15
+
15
16
  settings = get_settings()
16
17
 
17
18
  def create_dynamic_schema(name: str, schema: dict[str, t.Any]) -> type[pydantic.BaseModel]:
@@ -1,16 +1,17 @@
1
1
  import asyncio
2
2
  import warnings
3
3
  from dataclasses import dataclass
4
- from typing import Callable, Literal
4
+ from typing import Callable
5
5
 
6
6
  import pydantic
7
7
  import typing_extensions as t
8
+ from langchain_core.tools.base import BaseTool, ToolException
9
+
8
10
  from beamlit.api.functions import get_function
9
11
  from beamlit.authentication.authentication import AuthenticatedClient
10
12
  from beamlit.common.settings import get_settings
11
13
  from beamlit.models import Function, StoreFunctionParameter
12
14
  from beamlit.run import RunClient
13
- from langchain_core.tools.base import BaseTool, ToolException
14
15
 
15
16
 
16
17
  def create_dynamic_schema(name: str, parameters: list[StoreFunctionParameter]) -> type[pydantic.BaseModel]:
@@ -32,7 +32,9 @@ from .function_spec import FunctionSpec
32
32
  from .get_trace_ids_response_200 import GetTraceIdsResponse200
33
33
  from .get_trace_logs_response_200 import GetTraceLogsResponse200
34
34
  from .get_trace_response_200 import GetTraceResponse200
35
- from .get_workspace_service_accounts_response_200_item import GetWorkspaceServiceAccountsResponse200Item
35
+ from .get_workspace_service_accounts_response_200_item import (
36
+ GetWorkspaceServiceAccountsResponse200Item,
37
+ )
36
38
  from .increase_and_rate_metric import IncreaseAndRateMetric
37
39
  from .integration_config import IntegrationConfig
38
40
  from .integration_connection import IntegrationConnection
@@ -75,8 +77,12 @@ from .resource_deployment_metrics_query_per_second_per_region_per_code import (
75
77
  ResourceDeploymentMetricsQueryPerSecondPerRegionPerCode,
76
78
  )
77
79
  from .resource_environment_metrics import ResourceEnvironmentMetrics
78
- from .resource_environment_metrics_inference_per_region import ResourceEnvironmentMetricsInferencePerRegion
79
- from .resource_environment_metrics_query_per_region_per_code import ResourceEnvironmentMetricsQueryPerRegionPerCode
80
+ from .resource_environment_metrics_inference_per_region import (
81
+ ResourceEnvironmentMetricsInferencePerRegion,
82
+ )
83
+ from .resource_environment_metrics_query_per_region_per_code import (
84
+ ResourceEnvironmentMetricsQueryPerRegionPerCode,
85
+ )
80
86
  from .resource_log import ResourceLog
81
87
  from .resource_metrics import ResourceMetrics
82
88
  from .runtime import Runtime
@@ -8,7 +8,9 @@ from ..types import UNSET, Unset
8
8
  if TYPE_CHECKING:
9
9
  from ..models.metric import Metric
10
10
  from ..models.qps import QPS
11
- from ..models.resource_environment_metrics_inference_per_region import ResourceEnvironmentMetricsInferencePerRegion
11
+ from ..models.resource_environment_metrics_inference_per_region import (
12
+ ResourceEnvironmentMetricsInferencePerRegion,
13
+ )
12
14
  from ..models.resource_environment_metrics_query_per_region_per_code import (
13
15
  ResourceEnvironmentMetricsQueryPerRegionPerCode,
14
16
  )
beamlit/run.py CHANGED
@@ -2,6 +2,7 @@ import urllib.parse
2
2
  from typing import Any
3
3
 
4
4
  import requests
5
+
5
6
  from beamlit.client import AuthenticatedClient
6
7
  from beamlit.common import HTTPError, get_settings
7
8
 
beamlit/serve/app.py CHANGED
@@ -7,14 +7,18 @@ from logging import getLogger
7
7
  from uuid import uuid4
8
8
 
9
9
  from asgi_correlation_id import CorrelationIdMiddleware
10
- from beamlit.common import HTTPError, get_settings, init
11
- from beamlit.common.instrumentation import (get_metrics_exporter,
12
- get_resource_attributes,
13
- get_span_exporter, instrument_app)
14
10
  from fastapi import FastAPI, Request, Response
15
11
  from fastapi.responses import JSONResponse
16
12
  from traceloop.sdk import Traceloop
17
13
 
14
+ from beamlit.common import HTTPError, get_settings, init
15
+ from beamlit.common.instrumentation import (
16
+ get_metrics_exporter,
17
+ get_resource_attributes,
18
+ get_span_exporter,
19
+ instrument_app,
20
+ )
21
+
18
22
  from .middlewares import AccessLogMiddleware, AddProcessTimeHeader
19
23
 
20
24
  sys.path.insert(0, os.getcwd())
@@ -37,13 +41,14 @@ logger.info(
37
41
  f" on {settings.server.host}:{settings.server.port}"
38
42
  )
39
43
 
40
- Traceloop.init(
41
- app_name=settings.name,
42
- exporter=get_span_exporter(),
43
- metrics_exporter=get_metrics_exporter(),
44
- resource_attributes=get_resource_attributes(),
45
- should_enrich_metrics=os.getenv("ENRICHED_METRICS", "false") == "true",
46
- )
44
+ if settings.enable_opentelemetry:
45
+ Traceloop.init(
46
+ app_name=settings.name,
47
+ exporter=get_span_exporter(),
48
+ metrics_exporter=get_metrics_exporter(),
49
+ resource_attributes=get_resource_attributes(),
50
+ should_enrich_metrics=os.getenv("ENRICHED_METRICS", "false") == "true",
51
+ )
47
52
 
48
53
  app = FastAPI(docs_url=None, redoc_url=None)
49
54
  app.add_middleware(
@@ -55,6 +60,7 @@ app.add_middleware(AddProcessTimeHeader)
55
60
  app.add_middleware(AccessLogMiddleware)
56
61
  instrument_app(app)
57
62
 
63
+
58
64
  @app.get("/health")
59
65
  async def health():
60
66
  return {"status": "ok"}
@@ -67,7 +73,7 @@ async def root(request: Request):
67
73
  try:
68
74
  body = await request.json()
69
75
 
70
- original_func = getattr(func, '__wrapped__', func)
76
+ original_func = getattr(func, "__wrapped__", func)
71
77
  if asyncio.iscoroutinefunction(func) or asyncio.iscoroutinefunction(original_func):
72
78
  response = await func(body)
73
79
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: beamlit
3
- Version: 0.0.30rc36
3
+ Version: 0.0.31
4
4
  Summary: Add your description here
5
5
  Author-email: cploujoux <ch.ploujoux@gmail.com>
6
6
  Requires-Python: >=3.12
@@ -2,12 +2,12 @@ beamlit/__init__.py,sha256=545gFC-wLLwUktWcOAjUWe_Glha40tBetRTOYSfHnbI,164
2
2
  beamlit/client.py,sha256=PnR6ybZk5dLIJPnDKAf2epHOeQC_7yL0fG4muvphHjA,12695
3
3
  beamlit/errors.py,sha256=gO8GBmKqmSNgAg-E5oT-oOyxztvp7V_6XG7OUTT15q0,546
4
4
  beamlit/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
5
- beamlit/run.py,sha256=BCVQXdtIzJedxqGSWttYlJphO5ru7VNDYrUAQmCNq_c,1445
5
+ beamlit/run.py,sha256=HtDYDjD7oVfQ8r3T5_t4qN5UDJOJfsQILi45Z21ArAg,1446
6
6
  beamlit/types.py,sha256=E1hhDh_zXfsSQ0NCt9-uw90_Mr5iIlsdfnfvxv5HarU,1005
7
7
  beamlit/agents/__init__.py,sha256=nf1iwQwGtCG6nDqyVhxfWoqR6dv6X3bvSpCeqkTCFaM,101
8
- beamlit/agents/chain.py,sha256=HzBs3nI4xaH86I_r-M-HGGp6roXsJxMx-qXl_GrJaY0,2831
8
+ beamlit/agents/chain.py,sha256=vfCjiFHuu02uTTGicxMlFzjyICQkIjpXrBGs-7uJEsg,2826
9
9
  beamlit/agents/chat.py,sha256=gVyv4FGBdQTDhdutX8l64OUNa6Fdqaw4eCfEDRH0IPQ,3558
10
- beamlit/agents/decorator.py,sha256=4KxPcu6hPoB__1OdzpEJVD5N3QVa_syKd_Y6n6lVEjQ,9715
10
+ beamlit/agents/decorator.py,sha256=RAhe7wHKJnjMpmU7KWKcM6EZjdm3pgUBhQQUP2T6GZY,9716
11
11
  beamlit/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
12
12
  beamlit/api/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  beamlit/api/agents/create_agent.py,sha256=t5Pr62My2EhQlcIY71MrI73-0_q5Djr3a_Ybt9MIiQQ,3587
@@ -98,12 +98,12 @@ beamlit/api/privateclusters/update_private_cluster.py,sha256=Urb5GGuVcSwQy2WBlru
98
98
  beamlit/api/privateclusters/update_private_cluster_health.py,sha256=PxCyl5ZEIqpQ_PKIr9ErqjZcoTSKlTZS1YgTT1JwhCg,2572
99
99
  beamlit/api/service_accounts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  beamlit/api/service_accounts/create_api_key_for_service_account.py,sha256=Ee9CXzYqVh9OTJeai8bKaclznuWpJiPd74aPHZYZdeQ,4525
101
- beamlit/api/service_accounts/create_workspace_service_account.py,sha256=XFAvmmjrwaenuWEPw0YBe7QeiYmXNX8WmcsYj6VYHa4,4639
101
+ beamlit/api/service_accounts/create_workspace_service_account.py,sha256=D3NkGoPZyMi6ibj29F7xbJd5aLI2jw2vLSl1qDRGhW4,4648
102
102
  beamlit/api/service_accounts/delete_api_key_for_service_account.py,sha256=bS2OWtO7Dn8FU2uaTe9h7VCxiobti8Ka2NtTUKBd31Q,2621
103
- beamlit/api/service_accounts/delete_workspace_service_account.py,sha256=_FVYHH29JKQGZqCFSih2-gU92OR-6Am1CIQX6VJ_goo,4127
104
- beamlit/api/service_accounts/get_workspace_service_accounts.py,sha256=R67By_FV4Nv8tVT2b8mgsC_Dnwy0hla353-EOupBizY,4142
103
+ beamlit/api/service_accounts/delete_workspace_service_account.py,sha256=XEz6-DkWZTmuaTOMooaywKvBsGilBYR-xG32RsXP5Mw,4136
104
+ beamlit/api/service_accounts/get_workspace_service_accounts.py,sha256=6c7T_WsXCuotQomm4zkAkAkhdLEcgVyvon9aYHPiEiI,4151
105
105
  beamlit/api/service_accounts/list_api_keys_for_service_account.py,sha256=skp0PmjxfW7EGAyRcVAye_SKfryKjvsTuhSRxeIaXDo,4066
106
- beamlit/api/service_accounts/update_workspace_service_account.py,sha256=IWVMnChlL27mOCH44GYSA6ep5AJuLXzW2oDsqs7mYIQ,4903
106
+ beamlit/api/service_accounts/update_workspace_service_account.py,sha256=Y4rQL8Yx8yRZSzTJz5-ESP5zQ0juVhuoX6xwpg5ZM00,4912
107
107
  beamlit/api/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
108
  beamlit/api/store/get_store_agent.py,sha256=UjvsRXyFsXZLf4utQjpiOiPM7KxlRj4C-x_ac5EXoLk,3624
109
109
  beamlit/api/store/get_store_function.py,sha256=kEbg91jJh0XAXmipjzwg931mxkMCZ820PxiJ89zYbso,3756
@@ -124,35 +124,35 @@ beamlit/api/workspaces/update_workspace.py,sha256=qa5DV2UJSUYuB_ibALb4E9ghKpT1Ha
124
124
  beamlit/api/workspaces/update_workspace_user_role.py,sha256=Yn9iuJ4tKtauzBiJyU4-wYUMS9g98X2Om8zs7UkzrY8,4917
125
125
  beamlit/authentication/__init__.py,sha256=wiXqRbc7E-ulrH_ueA9duOGFvXeo7-RvhSD1XbFogMo,1020
126
126
  beamlit/authentication/apikey.py,sha256=KNBTgdi0VBzBAAmSwU2X1QoB58vRbg8wkXb8-GTZCQo,657
127
- beamlit/authentication/authentication.py,sha256=8R-3WdQSykNjCbebAW2p8Glvw5nlAmSEZr6Ylo-vPuc,3377
127
+ beamlit/authentication/authentication.py,sha256=ODQCc00RvCOZNaiGG5ctylNnE-JVCugePyJedJ0NYsM,3361
128
128
  beamlit/authentication/clientcredentials.py,sha256=cxZPPu--CgizwqX0pdfFQ91gJt1EFKwyy-aBB_dXX7I,3990
129
129
  beamlit/authentication/credentials.py,sha256=p_1xenabCbQuRz7BiFk7oTK4uCxAt_zoyku5o-jcKGE,5343
130
130
  beamlit/authentication/device_mode.py,sha256=tmr22gllKOZwBRub_QjF5pYa425x-nE8tQNpZ_EGR6g,3644
131
131
  beamlit/common/__init__.py,sha256=vj4_boIBVitMsaQR8BqBqE2eupOIh6MWBAYlYyCCH98,341
132
132
  beamlit/common/error.py,sha256=f9oJDFxhoHK-vpjxBgEp0NwWIk0N_THPemUI7uQxVzU,270
133
133
  beamlit/common/generate.py,sha256=LtdCju_QayRS4lZrrb_0VHqWWvTcv4Mbf-iV1TB_Qko,7522
134
- beamlit/common/instrumentation.py,sha256=MsBDfFcMYqGDiHHj4j5hLHE4EWxZExkhmCeFS3SKzJY,3181
135
- beamlit/common/logger.py,sha256=VFRbaZh93n8ZGugeeYKe88IP2nI3g2JNa7XN4j8wVJE,1116
134
+ beamlit/common/instrumentation.py,sha256=GVYeat7qCcqzDoKSYig3s8ZCC172R9JiQIr3Evv3kik,4293
135
+ beamlit/common/logger.py,sha256=nN_dSOl4bs13QU3Rod-w3e3jYOnlSrHx3_bs-ACY6Aw,1115
136
136
  beamlit/common/secrets.py,sha256=sid81bOe3LflkMKDHwBsBs9nIju8bp5-v9qU9gkyNMc,212
137
- beamlit/common/settings.py,sha256=2V06qodZHwPBqRDdpPyZhdCO7HeMjWr2rkEePOgmHqE,5936
137
+ beamlit/common/settings.py,sha256=_4oCVrJZOMaTZoK2Zzo2DWqtUyBsspuOH3iAJ_nU0tw,5923
138
138
  beamlit/common/utils.py,sha256=jouz5igBvT37Xn_e94-foCHyQczVim-UzVcoIF6RWJ4,657
139
139
  beamlit/deploy/__init__.py,sha256=GS7l7Jtm2yKs7iNLKcfjYO-rAhUzggQ3xiYSf3oxLBY,91
140
- beamlit/deploy/deploy.py,sha256=AbQxSVGAPbwBn4wKPiMEF5GjtGa8q4u3DBuhnYdz4GI,9706
141
- beamlit/deploy/format.py,sha256=78tOoeNPJ8969AhQTeFlIwZgQ3un8gmTSMmrYbRQSds,1818
140
+ beamlit/deploy/deploy.py,sha256=xo2fAdF6jR1cG75sXMzpqsJlG_qGAKVnMwjuDa_8sk8,9936
141
+ beamlit/deploy/format.py,sha256=PJ8kU7Y1pwiS3tqqyvFaag9LO3jju-4ua574163VPk4,1820
142
142
  beamlit/deploy/parser.py,sha256=Ga0poCZkoRnuTw082QnTcNGCBJncoRAnVsn8-1FsaJE,6907
143
143
  beamlit/functions/__init__.py,sha256=_RPG1Bfg54JGdIPnViAU6n9zD7E1cDNsdXi8oYGskzE,138
144
- beamlit/functions/decorator.py,sha256=NsdIWs55Yhn-TUO855DIE2AarV-euXtl7Qt5c2W3AUo,3239
144
+ beamlit/functions/decorator.py,sha256=YNNU8MZXV2C6gIjxaYhp-FSWGLc9I_XLsIE24zQ3fr8,3541
145
145
  beamlit/functions/github/__init__.py,sha256=gYnUkeegukOfbymdabuuJkScvH-_ZJygX05BoqkPn0o,49
146
146
  beamlit/functions/github/github.py,sha256=FajzLCNkpXcwfgnC0l9rOGT2eSPLCz8-qrMzK9N_ZNc,598
147
147
  beamlit/functions/github/kit/__init__.py,sha256=jBwPqZv6C23_utukohxqXZwrlicNlI7PYPUj0Den7Cw,136
148
148
  beamlit/functions/github/kit/pull_request.py,sha256=wQVeRBakiqu-2ouflO8p1z7D5u07KNsitwyNRrp0KjM,1357
149
149
  beamlit/functions/math/__init__.py,sha256=wie4WME8jT-WpFRrtu-lDlHW31Mg6K2cwstjkUdLF3o,43
150
150
  beamlit/functions/math/math.py,sha256=CpoLJGwuvwCPGnVC8k9GYuIyvfUYPDQHKlZg3cx-z-A,1049
151
- beamlit/functions/mcp/mcp.py,sha256=gXzvUPAKmvGQPHUKTVzMiINukxpw1BV6H8M2iOWvIGU,4348
152
- beamlit/functions/remote/remote.py,sha256=x2eHh4oYkWwHuZWwg5XeylY-E9Opa6SzfN_0396ePZw,3775
151
+ beamlit/functions/mcp/mcp.py,sha256=-LL7O35vTlcYfF1MSlEY83rBKKShJTaHB-y9MRPAEiU,4349
152
+ beamlit/functions/remote/remote.py,sha256=AL8WhD7yXZ18h3iU4vE9E4JtJt0n_i-ZwlbBDoolnEs,3767
153
153
  beamlit/functions/search/__init__.py,sha256=5NAthQ9PBwrkNg1FpLRx4flauvv0HyWuwaVS589c1Pw,49
154
154
  beamlit/functions/search/search.py,sha256=8s9ECltq7YE17j6rTxb12uY2EQY4_eTLHmwlIMThI0w,515
155
- beamlit/models/__init__.py,sha256=0BldOldXzMn1A6d1bOhsU8mk7i3uRmh33_U-0IYjIRY,7803
155
+ beamlit/models/__init__.py,sha256=CfMLR86qnFW6mz2fp6t2f91Vr62HmjY7qgTuvZT79Is,7830
156
156
  beamlit/models/acl.py,sha256=tH67gsl_BMaviSbTaaIkO1g9cWZgJ6VgAnYVjQSzGZY,3952
157
157
  beamlit/models/agent.py,sha256=oGZBwd2Hy-i6q_up4WQ0IvOmxqouR5I1Gk8vXvfLKvc,3384
158
158
  beamlit/models/agent_chain.py,sha256=8PN8wVSayS-LoBN2nahZsOmr6r3t62H_LPDK_8fnkM8,2255
@@ -223,7 +223,7 @@ beamlit/models/qps.py,sha256=Us3PQTfeM5KN-QwLXkJ2XESJDIyTvD1tSJR9taClIog,1684
223
223
  beamlit/models/resource_deployment_metrics.py,sha256=TaV4-xbI79FCfzFcgDQ-A3EjJTByMKA42xgvS7pcT10,8875
224
224
  beamlit/models/resource_deployment_metrics_inference_per_second_per_region.py,sha256=phgZ9vJ3s7pYIYo14mgyav6ZrJnY3IS7y5T6To1IDjE,2624
225
225
  beamlit/models/resource_deployment_metrics_query_per_second_per_region_per_code.py,sha256=uCzjEHEy3j3j3Jcdul097N6hiKAHBhM8laQ-TxDs65c,2381
226
- beamlit/models/resource_environment_metrics.py,sha256=1HOUGH92Depu7fGpHiIEI9x2XBC6x8xotcvnTe9TnEY,7533
226
+ beamlit/models/resource_environment_metrics.py,sha256=tVbEvRXdNgcu_c6bVQAkVDYiYqK3N-TsTWMWdSB3q28,7550
227
227
  beamlit/models/resource_environment_metrics_inference_per_region.py,sha256=pIc14XdNeKq50WGWU0FnmNqtFU5S8y_q3gomLA-dOgM,2580
228
228
  beamlit/models/resource_environment_metrics_inference_per_second_per_region.py,sha256=CmJx_tjhsfHS1hMHOwOkuVPypbG3xyZ_GCG3A2uPhr4,2629
229
229
  beamlit/models/resource_environment_metrics_query_per_region_per_code.py,sha256=G2qxM4jRKavyC96K9CO6AlF_7_K6aHtV4dMqT4n4vcA,2307
@@ -252,10 +252,10 @@ beamlit/models/websocket_channel.py,sha256=jg3vN7yS_oOIwGtndtIUr1LsyEA58RXLXahqS
252
252
  beamlit/models/workspace.py,sha256=l__bIpbA4oJvxXo7UbEoCcqkvu9MiNt5aXXpZ3bgwHg,4309
253
253
  beamlit/models/workspace_labels.py,sha256=WbnUY6eCTkUNdY7hhhSF-KQCl8fWFfkCf7hzCTiNp4A,1246
254
254
  beamlit/models/workspace_user.py,sha256=70CcifQWYbeWG7TDui4pblTzUe5sVK0AS19vNCzKE8g,3423
255
- beamlit/serve/app.py,sha256=k9THiOqcPs4lcQQhZaucLcboXCR_5AKP9AFCMNRbdPI,3559
255
+ beamlit/serve/app.py,sha256=QzReZZjGFQWhNA1XBDq81rsn9zpEihtLZLrfZi9ThT0,3554
256
256
  beamlit/serve/middlewares/__init__.py,sha256=1dVmnOmhAQWvWktqHkKSIX-YoF6fmMU8xkUQuhg_rJU,148
257
257
  beamlit/serve/middlewares/accesslog.py,sha256=Mu4T4_9OvHybjA0ApzZFpgi2C8f3X1NbUk-76v634XM,631
258
258
  beamlit/serve/middlewares/processtime.py,sha256=lDAaIasZ4bwvN-HKHvZpaD9r-yrkVNZYx4abvbjbrCg,411
259
- beamlit-0.0.30rc36.dist-info/METADATA,sha256=6OtNFDOop4RWU3ATSYjTG9g94ygVfovGM9Ef6HhQejU,2405
260
- beamlit-0.0.30rc36.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
261
- beamlit-0.0.30rc36.dist-info/RECORD,,
259
+ beamlit-0.0.31.dist-info/METADATA,sha256=AiAjQ4okR_M97rDaam6B7Bw5tax6IW3MZ19lRHzqKmw,2401
260
+ beamlit-0.0.31.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
261
+ beamlit-0.0.31.dist-info/RECORD,,