lmnr 0.5.1__py3-none-any.whl → 0.5.1a0__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.
@@ -2,9 +2,7 @@ import logging
2
2
  import uuid
3
3
 
4
4
  from lmnr.sdk.browser.pw_utils import handle_navigation_async, handle_navigation_sync
5
- from lmnr.sdk.browser.utils import with_tracer_and_client_wrapper
6
- from lmnr.sdk.client.asynchronous.async_client import AsyncLaminarClient
7
- from lmnr.sdk.client.synchronous.sync_client import LaminarClient
5
+ from lmnr.sdk.browser.utils import with_tracer_wrapper
8
6
  from lmnr.version import __version__
9
7
 
10
8
  from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
@@ -18,11 +16,11 @@ from opentelemetry.trace import (
18
16
  set_span_in_context,
19
17
  )
20
18
  from opentelemetry.context import get_current
21
- from typing import Collection
19
+ from typing import Collection, Optional
22
20
  from wrapt import wrap_function_wrapper
23
21
 
24
22
  try:
25
- from playwright.async_api import Browser, BrowserContext
23
+ from playwright.async_api import Browser
26
24
  from playwright.sync_api import (
27
25
  Browser as SyncBrowser,
28
26
  BrowserContext as SyncBrowserContext,
@@ -39,12 +37,12 @@ _instruments = ("playwright >= 1.9.0",)
39
37
  logger = logging.getLogger(__name__)
40
38
 
41
39
  _context_spans: dict[str, Span] = {}
40
+ _project_api_key: Optional[str] = None
41
+ _base_http_url: Optional[str] = None
42
42
 
43
43
 
44
- @with_tracer_and_client_wrapper
45
- def _wrap_new_page(
46
- tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
47
- ):
44
+ @with_tracer_wrapper
45
+ def _wrap_new_page(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
48
46
  with tracer.start_as_current_span(
49
47
  f"{to_wrap.get('object')}.{to_wrap.get('method')}"
50
48
  ) as span:
@@ -52,13 +50,15 @@ def _wrap_new_page(
52
50
  session_id = str(uuid.uuid4().hex)
53
51
  trace_id = format(get_current_span().get_span_context().trace_id, "032x")
54
52
  span.set_attribute("lmnr.internal.has_browser_session", True)
55
- handle_navigation_sync(page, session_id, trace_id, client)
53
+ handle_navigation_sync(
54
+ page, session_id, trace_id, _project_api_key, _base_http_url
55
+ )
56
56
  return page
57
57
 
58
58
 
59
- @with_tracer_and_client_wrapper
59
+ @with_tracer_wrapper
60
60
  async def _wrap_new_page_async(
61
- tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
61
+ tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
62
62
  ):
63
63
  with tracer.start_as_current_span(
64
64
  f"{to_wrap.get('object')}.{to_wrap.get('method')}"
@@ -67,14 +67,14 @@ async def _wrap_new_page_async(
67
67
  session_id = str(uuid.uuid4().hex)
68
68
  trace_id = format(span.get_span_context().trace_id, "032x")
69
69
  span.set_attribute("lmnr.internal.has_browser_session", True)
70
- await handle_navigation_async(page, session_id, trace_id, client)
70
+ await handle_navigation_async(
71
+ page, session_id, trace_id, _project_api_key, _base_http_url
72
+ )
71
73
  return page
72
74
 
73
75
 
74
- @with_tracer_and_client_wrapper
75
- def _wrap_new_browser_sync(
76
- tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
77
- ):
76
+ @with_tracer_wrapper
77
+ def _wrap_new_browser_sync(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
78
78
  global _context_spans
79
79
  browser: SyncBrowser = wrapped(*args, **kwargs)
80
80
  session_id = str(uuid.uuid4().hex)
@@ -90,16 +90,20 @@ def _wrap_new_browser_sync(
90
90
  trace_id = format(span.get_span_context().trace_id, "032x")
91
91
  context.on(
92
92
  "page",
93
- lambda page: handle_navigation_sync(page, session_id, trace_id, client),
93
+ lambda page: handle_navigation_sync(
94
+ page, session_id, trace_id, _project_api_key, _base_http_url
95
+ ),
94
96
  )
95
97
  for page in context.pages:
96
- handle_navigation_sync(page, session_id, trace_id, client)
98
+ handle_navigation_sync(
99
+ page, session_id, trace_id, _project_api_key, _base_http_url
100
+ )
97
101
  return browser
98
102
 
99
103
 
100
- @with_tracer_and_client_wrapper
104
+ @with_tracer_wrapper
101
105
  async def _wrap_new_browser_async(
102
- tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
106
+ tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
103
107
  ):
104
108
  global _context_spans
105
109
  browser: Browser = await wrapped(*args, **kwargs)
@@ -116,18 +120,20 @@ async def _wrap_new_browser_async(
116
120
  trace_id = format(span.get_span_context().trace_id, "032x")
117
121
 
118
122
  async def handle_page_navigation(page):
119
- return await handle_navigation_async(page, session_id, trace_id, client)
123
+ return await handle_navigation_async(
124
+ page, session_id, trace_id, _project_api_key, _base_http_url
125
+ )
120
126
 
121
127
  context.on("page", handle_page_navigation)
122
128
  for page in context.pages:
123
- await handle_navigation_async(page, session_id, trace_id, client)
129
+ await handle_navigation_async(
130
+ page, session_id, trace_id, _project_api_key, _base_http_url
131
+ )
124
132
  return browser
125
133
 
126
134
 
127
- @with_tracer_and_client_wrapper
128
- def _wrap_new_context_sync(
129
- tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
130
- ):
135
+ @with_tracer_wrapper
136
+ def _wrap_new_context_sync(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
131
137
  context: SyncBrowserContext = wrapped(*args, **kwargs)
132
138
  session_id = str(uuid.uuid4().hex)
133
139
  span = get_current_span()
@@ -142,16 +148,20 @@ def _wrap_new_context_sync(
142
148
 
143
149
  context.on(
144
150
  "page",
145
- lambda page: handle_navigation_sync(page, session_id, trace_id, client),
151
+ lambda page: handle_navigation_sync(
152
+ page, session_id, trace_id, _project_api_key, _base_http_url
153
+ ),
146
154
  )
147
155
  for page in context.pages:
148
- handle_navigation_sync(page, session_id, trace_id, client)
156
+ handle_navigation_sync(
157
+ page, session_id, trace_id, _project_api_key, _base_http_url
158
+ )
149
159
  return context
150
160
 
151
161
 
152
- @with_tracer_and_client_wrapper
162
+ @with_tracer_wrapper
153
163
  async def _wrap_new_context_async(
154
- tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
164
+ tracer: Tracer, to_wrap, wrapped, instance, args, kwargs
155
165
  ):
156
166
  context: SyncBrowserContext = await wrapped(*args, **kwargs)
157
167
  session_id = str(uuid.uuid4().hex)
@@ -166,18 +176,21 @@ async def _wrap_new_context_async(
166
176
  trace_id = format(span.get_span_context().trace_id, "032x")
167
177
 
168
178
  async def handle_page_navigation(page):
169
- return await handle_navigation_async(page, session_id, trace_id, client)
179
+ return await handle_navigation_async(
180
+ page, session_id, trace_id, _project_api_key, _base_http_url
181
+ )
170
182
 
171
183
  context.on("page", handle_page_navigation)
172
184
  for page in context.pages:
173
- await handle_navigation_async(page, session_id, trace_id, client)
185
+ await handle_navigation_async(
186
+ page, session_id, trace_id, _project_api_key, _base_http_url
187
+ )
174
188
  return context
175
189
 
176
190
 
177
- @with_tracer_and_client_wrapper
191
+ @with_tracer_wrapper
178
192
  def _wrap_close_browser_sync(
179
193
  tracer: Tracer,
180
- client: LaminarClient,
181
194
  to_wrap,
182
195
  wrapped,
183
196
  instance: SyncBrowser,
@@ -195,10 +208,9 @@ def _wrap_close_browser_sync(
195
208
  return wrapped(*args, **kwargs)
196
209
 
197
210
 
198
- @with_tracer_and_client_wrapper
211
+ @with_tracer_wrapper
199
212
  async def _wrap_close_browser_async(
200
213
  tracer: Tracer,
201
- client: AsyncLaminarClient,
202
214
  to_wrap,
203
215
  wrapped,
204
216
  instance: Browser,
@@ -320,18 +332,24 @@ WRAPPED_METHODS_ASYNC = [
320
332
 
321
333
 
322
334
  class PlaywrightInstrumentor(BaseInstrumentor):
323
- def __init__(self, client: LaminarClient, async_client: AsyncLaminarClient):
335
+ def __init__(self):
324
336
  super().__init__()
325
- self.client = client
326
- self.async_client = async_client
327
337
 
328
338
  def instrumentation_dependencies(self) -> Collection[str]:
329
339
  return _instruments
330
340
 
331
341
  def _instrument(self, **kwargs):
342
+ global _project_api_key, _base_http_url
343
+
332
344
  tracer_provider = kwargs.get("tracer_provider")
333
345
  tracer = get_tracer(__name__, __version__, tracer_provider)
334
346
 
347
+ if kwargs.get("project_api_key"):
348
+ _project_api_key = kwargs.get("project_api_key")
349
+
350
+ if kwargs.get("base_http_url"):
351
+ _base_http_url = kwargs.get("base_http_url")
352
+
335
353
  for wrapped_method in WRAPPED_METHODS:
336
354
  wrap_package = wrapped_method.get("package")
337
355
  wrap_object = wrapped_method.get("object")
@@ -342,7 +360,6 @@ class PlaywrightInstrumentor(BaseInstrumentor):
342
360
  f"{wrap_object}.{wrap_method}",
343
361
  wrapped_method.get("wrapper")(
344
362
  tracer,
345
- self.client,
346
363
  wrapped_method,
347
364
  ),
348
365
  )
@@ -360,7 +377,6 @@ class PlaywrightInstrumentor(BaseInstrumentor):
360
377
  f"{wrap_object}.{wrap_method}",
361
378
  wrapped_method.get("wrapper")(
362
379
  tracer,
363
- self.async_client,
364
380
  wrapped_method,
365
381
  ),
366
382
  )
@@ -3,6 +3,7 @@ import logging
3
3
  import os
4
4
  import time
5
5
  import threading
6
+ from typing import Optional
6
7
 
7
8
  from opentelemetry import trace
8
9
 
@@ -26,6 +27,8 @@ logger = logging.getLogger(__name__)
26
27
  # Track pages we've already instrumented to avoid double-instrumentation
27
28
  instrumented_pages = set()
28
29
  async_instrumented_pages = set()
30
+ client: Optional[LaminarClient] = None
31
+ async_client: Optional[AsyncLaminarClient] = None
29
32
 
30
33
 
31
34
  current_dir = os.path.dirname(os.path.abspath(__file__))
@@ -220,8 +223,21 @@ async def inject_rrweb_async(page: Page):
220
223
 
221
224
  @observe(name="playwright.page", ignore_input=True, ignore_output=True)
222
225
  def handle_navigation_sync(
223
- page: SyncPage, session_id: str, trace_id: str, client: LaminarClient
226
+ page: SyncPage,
227
+ session_id: str,
228
+ trace_id: str,
229
+ project_api_key: Optional[str] = None,
230
+ base_http_url: Optional[str] = None,
224
231
  ):
232
+ global client
233
+ if client is None:
234
+ client = LaminarClient(base_url=base_http_url, project_api_key=project_api_key)
235
+ if (base_http_url is not None and base_http_url != client.base_url) or (
236
+ project_api_key is not None and project_api_key != client.project_api_key
237
+ ):
238
+ if client is not None:
239
+ client.close()
240
+ client = LaminarClient(base_url=base_http_url, project_api_key=project_api_key)
225
241
  trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
226
242
  # Check if we've already instrumented this page
227
243
  page_id = id(page)
@@ -239,11 +255,10 @@ def handle_navigation_sync(
239
255
  inject_rrweb_sync(page)
240
256
 
241
257
  def collection_loop():
242
- while not page.is_closed(): # Stop when page closes
258
+ while not page.is_closed():
243
259
  send_events_sync(page, session_id, trace_id, client)
244
260
  time.sleep(2)
245
261
 
246
- # Clean up when page closes
247
262
  if page_id in instrumented_pages:
248
263
  instrumented_pages.remove(page_id)
249
264
 
@@ -253,8 +268,25 @@ def handle_navigation_sync(
253
268
 
254
269
  @observe(name="playwright.page", ignore_input=True, ignore_output=True)
255
270
  async def handle_navigation_async(
256
- page: Page, session_id: str, trace_id: str, client: AsyncLaminarClient
271
+ page: Page,
272
+ session_id: str,
273
+ trace_id: str,
274
+ project_api_key: Optional[str] = None,
275
+ base_http_url: Optional[str] = None,
257
276
  ):
277
+ global async_client
278
+ if async_client is None:
279
+ async_client = AsyncLaminarClient(
280
+ base_url=base_http_url, project_api_key=project_api_key
281
+ )
282
+ if (base_http_url is not None and base_http_url != async_client.base_url) or (
283
+ project_api_key is not None and project_api_key != async_client.project_api_key
284
+ ):
285
+ if async_client is not None:
286
+ await async_client.close()
287
+ async_client = AsyncLaminarClient(
288
+ base_url=base_http_url, project_api_key=project_api_key
289
+ )
258
290
  trace.get_current_span().set_attribute("lmnr.internal.has_browser_session", True)
259
291
  # Check if we've already instrumented this page
260
292
  page_id = id(page)
@@ -271,19 +303,19 @@ async def handle_navigation_async(
271
303
  page.on("load", lambda: asyncio.create_task(on_load()))
272
304
  await inject_rrweb_async(page)
273
305
 
274
- async def collection_loop():
306
+ async def collection_loop(client: AsyncLaminarClient):
275
307
  try:
276
- while not page.is_closed(): # Stop when page closes
308
+ while not page.is_closed():
277
309
  await send_events_async(page, session_id, trace_id, client)
278
310
  await asyncio.sleep(2)
279
- # Clean up when page closes
311
+
280
312
  async_instrumented_pages.remove(page_id)
281
313
  logger.info("Event collection stopped")
282
314
  except Exception as e:
283
315
  logger.error(f"Event collection stopped: {e}")
284
316
 
285
317
  # Create and store task
286
- task = asyncio.create_task(collection_loop())
318
+ task = asyncio.create_task(collection_loop(async_client))
287
319
 
288
320
  # Clean up task when page closes
289
321
  page.on("close", lambda: task.cancel())
@@ -137,6 +137,14 @@ class AsyncLaminarClient:
137
137
  """
138
138
  await self.__client.aclose()
139
139
 
140
+ @property
141
+ def base_url(self) -> str:
142
+ return self.__base_url
143
+
144
+ @property
145
+ def project_api_key(self) -> str:
146
+ return self.__project_api_key
147
+
140
148
  async def __aenter__(self: _T) -> _T:
141
149
  return self
142
150
 
@@ -150,6 +150,14 @@ class LaminarClient:
150
150
  if hasattr(self, "_client"):
151
151
  self.__client.close()
152
152
 
153
+ @property
154
+ def base_url(self) -> str:
155
+ return self.__base_url
156
+
157
+ @property
158
+ def project_api_key(self) -> str:
159
+ return self.__project_api_key
160
+
153
161
  def __enter__(self: _T) -> _T:
154
162
  return self
155
163
 
lmnr/sdk/laminar.py CHANGED
@@ -2,7 +2,7 @@ from contextlib import contextmanager
2
2
  from contextvars import Context
3
3
  from lmnr.openllmetry_sdk import TracerManager
4
4
  from lmnr.openllmetry_sdk.instruments import Instruments
5
- from lmnr.openllmetry_sdk.tracing import get_tracer
5
+ from lmnr.openllmetry_sdk import get_tracer
6
6
  from lmnr.openllmetry_sdk.tracing.attributes import (
7
7
  ASSOCIATION_PROPERTIES,
8
8
  Attributes,
@@ -652,8 +652,8 @@ class Laminar:
652
652
 
653
653
  @classmethod
654
654
  def shutdown(cls):
655
- # other shutdown logic could be added here
656
- cls.flush()
655
+ cls.__initialized = False
656
+ return TracerManager.shutdown()
657
657
 
658
658
  @classmethod
659
659
  def set_session(
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.5.1"
6
+ __version__ = "0.5.1a0"
7
7
  PYTHON_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}"
8
8
 
9
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lmnr
3
- Version: 0.5.1
3
+ Version: 0.5.1a0
4
4
  Summary: Python SDK for Laminar
5
5
  License: Apache-2.0
6
6
  Author: lmnr.ai
@@ -1,16 +1,15 @@
1
1
  lmnr/__init__.py,sha256=q_LvkFcUKZCxrCap4Mr4cewyNg1vh-t2tX-kaOUdWos,1186
2
2
  lmnr/cli.py,sha256=4J2RZQhHM3jJcjFvBC4PChQTS-ukxykVvI0X6lTkK-o,2918
3
3
  lmnr/openllmetry_sdk/.flake8,sha256=bCxuDlGx3YQ55QHKPiGJkncHanh9qGjQJUujcFa3lAU,150
4
- lmnr/openllmetry_sdk/__init__.py,sha256=dCZF_pImihR5lt7hkM0ezKNyxShTuO2yMO2v2dQMAzs,2443
4
+ lmnr/openllmetry_sdk/__init__.py,sha256=3zDqa-NEDEwdaxYv9Lcg39IpOnl-CWhGvU3fP17GwTk,3325
5
5
  lmnr/openllmetry_sdk/config/__init__.py,sha256=5aGdIdo1LffBkNwIBUbqzN6OUCMCrURU4b0rf5LBSI0,300
6
6
  lmnr/openllmetry_sdk/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- lmnr/openllmetry_sdk/decorators/base.py,sha256=RNyvSreGBwwh8EWaa3O9samrnmKoZHK7eBzGOPT3lHc,7132
7
+ lmnr/openllmetry_sdk/decorators/base.py,sha256=Wrr6r7nsPyNl8fE1w7BcTLeaE965kON8LvwOcwMfTRI,7100
8
8
  lmnr/openllmetry_sdk/instruments.py,sha256=9KoJ19Qar1dBrmO1wikNEkKxRfus8znQTj-g_maRTTM,1098
9
- lmnr/openllmetry_sdk/tracing/__init__.py,sha256=xT73L1t2si2CM6QmMiTZ7zn-dKKYBLNrpBBWq6WfVBw,68
9
+ lmnr/openllmetry_sdk/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  lmnr/openllmetry_sdk/tracing/attributes.py,sha256=BEMMGrX_7kPu4PNCV7Bz1uaclY4DNhlaLT0bWwFQnRE,1366
11
11
  lmnr/openllmetry_sdk/tracing/content_allow_list.py,sha256=3feztm6PBWNelc8pAZUcQyEGyeSpNiVKjOaDk65l2ps,846
12
- lmnr/openllmetry_sdk/tracing/context_manager.py,sha256=rdSus-p-TaevQ8hIAhfbnZr5dTqRvACDkzXGDpflncY,306
13
- lmnr/openllmetry_sdk/tracing/tracing.py,sha256=V0A6bP_SCU6r58sFtb62CcYtkLgwEFnANkLxYQ55I-k,35985
12
+ lmnr/openllmetry_sdk/tracing/tracing.py,sha256=eX2Fwmu6iiRxOSjH3KyCjmZNH3rVXhlbYef1vauJijc,38839
14
13
  lmnr/openllmetry_sdk/utils/__init__.py,sha256=pNhf0G3vTd5ccoc03i1MXDbricSaiqCbi1DLWhSekK8,604
15
14
  lmnr/openllmetry_sdk/utils/in_memory_span_exporter.py,sha256=H_4TRaThMO1H6vUQ0OpQvzJk_fZH0OOsRAM1iZQXsR8,2112
16
15
  lmnr/openllmetry_sdk/utils/json_encoder.py,sha256=dK6b_axr70IYL7Vv-bu4wntvDDuyntoqsHaddqX7P58,463
@@ -19,11 +18,11 @@ lmnr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
18
  lmnr/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
19
  lmnr/sdk/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
20
  lmnr/sdk/browser/browser_use_otel.py,sha256=wKFe07XTUUCuPDwFD9gqGrcaaj82BRg-kLLZQM_KshM,3915
22
- lmnr/sdk/browser/playwright_otel.py,sha256=kvGk7qXbbWjnawrlhQ8lTD72h95Tp_VpdFFp9dkfADY,12478
23
- lmnr/sdk/browser/pw_utils.py,sha256=YVIdIsQnnV2DwO-7oVUdm0hBFSozxaTaW7vOuZ2M_mQ,9335
21
+ lmnr/sdk/browser/playwright_otel.py,sha256=en91IZxuHFgFHbmssbdJZejtBIlma7gJ9NCv3_RLXzk,12636
22
+ lmnr/sdk/browser/pw_utils.py,sha256=Lh0pJ3sb_NC8roZnQppBtK8VV-AHXchPUxISEm5SkF4,10490
24
23
  lmnr/sdk/browser/rrweb/rrweb.min.js,sha256=X5pgaoX1j_OjKTqGQgKB-83xUSuydNLQa-Kkh1AAZYM,140485
25
24
  lmnr/sdk/browser/utils.py,sha256=xPpMRP2y9aJIsdIDNg2wN4PSa_4w0LSsra-GIMx9VXc,2366
26
- lmnr/sdk/client/asynchronous/async_client.py,sha256=zj5YbDik5Uc30iRMzeU-CeIXirSssPPS6OZg8XqlxMc,4785
25
+ lmnr/sdk/client/asynchronous/async_client.py,sha256=9QqeYIsHPCS23kAUhwTqBmSxGKJ6j_M0AUicOI3KoM8,4953
27
26
  lmnr/sdk/client/asynchronous/resources/__init__.py,sha256=ul1K_uvLmN5pw1Z_NZojdZ_CDp7om4RYV78pkgx6-2M,507
28
27
  lmnr/sdk/client/asynchronous/resources/agent.py,sha256=95m72mNL1ScCkaoHg204h7evNbgtm1hkoHf9Pe6f0X4,8940
29
28
  lmnr/sdk/client/asynchronous/resources/base.py,sha256=aJ43Q1rltg23IQaI4eeaZKckxVTgDUbCJrChhQCUEoE,986
@@ -38,18 +37,18 @@ lmnr/sdk/client/synchronous/resources/browser_events.py,sha256=9rFYWZesXQomnFgbZ
38
37
  lmnr/sdk/client/synchronous/resources/evals.py,sha256=sMMAai7_IW842z_J0W9OpthDhGQPCkTVJZamIkKq0wk,3496
39
38
  lmnr/sdk/client/synchronous/resources/pipeline.py,sha256=MJLF7HICjB7kS1-DvtJPAneIO1aMRl8fGG1QZjCsPl4,2974
40
39
  lmnr/sdk/client/synchronous/resources/semantic_search.py,sha256=oFH5r3bWJEvoZrC_a4jAtZko9tdpuUzCX1M0yvj8MMw,2046
41
- lmnr/sdk/client/synchronous/sync_client.py,sha256=e6eNQlpPHck6va3-gbQbBWWAtMJuZYFeZnRkFy_BIEk,5212
40
+ lmnr/sdk/client/synchronous/sync_client.py,sha256=jLX-hZMwm6m9urajg1HrpDuaRdNs9_M11DnJ6-HV3EY,5380
42
41
  lmnr/sdk/datasets.py,sha256=jl5Wj5nEI9pww4Jwn4XKF8h0gXBU4TOIrhqNjTJsHZQ,1709
43
42
  lmnr/sdk/decorators.py,sha256=g0VBqUEMCPRbgjgGHauVuKK1wHEd9rkiGzlYUYrcml4,2336
44
43
  lmnr/sdk/eval_control.py,sha256=G6Fg3Xx_KWv72iBaWlNMdyRTF2bZFQnwJ68sJNSpIcY,177
45
44
  lmnr/sdk/evaluations.py,sha256=kjzc257BKhq3z_vMeHD96pJ_xBoiWzW8e0lkVaNJ2jY,20555
46
- lmnr/sdk/laminar.py,sha256=sRbM_yESeOIGmrOMQyUrD-AZ8aj-Bf3RmtJ1QA67noQ,27981
45
+ lmnr/sdk/laminar.py,sha256=0FRgGT7SWw4mwGY525EXUHAf_Qj5swaeg3RewUYPyAA,27976
47
46
  lmnr/sdk/log.py,sha256=nt_YMmPw1IRbGy0b7q4rTtP4Yo3pQfNxqJPXK3nDSNQ,2213
48
47
  lmnr/sdk/types.py,sha256=wtSiq7KqdvQ5k7URdDnGoWwX3ucDNMabNfVnbKBXfhs,13940
49
48
  lmnr/sdk/utils.py,sha256=o9MybEMM0Tp_xxCMFpzEYDsOAn2I7g1t7MrazOQAxAs,3692
50
- lmnr/version.py,sha256=N0CXlGAC06GN9Ieaql9ZCVDbbT25ZPOunYhapKO7PLY,1321
51
- lmnr-0.5.1.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
52
- lmnr-0.5.1.dist-info/METADATA,sha256=nJDNApw6xj6V6_8Plx1QyhprjHnm2VxPkc_EW24HnVI,14996
53
- lmnr-0.5.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
54
- lmnr-0.5.1.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
55
- lmnr-0.5.1.dist-info/RECORD,,
49
+ lmnr/version.py,sha256=in8hiGDV28kmF2xSVRf1DEvu8z9A1snM4PoxsftIn-I,1323
50
+ lmnr-0.5.1a0.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
51
+ lmnr-0.5.1a0.dist-info/METADATA,sha256=2BpQewtLlMeR3u2OxJqzPnGwi4yvoyKs-0GP8TuzKz4,14998
52
+ lmnr-0.5.1a0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
53
+ lmnr-0.5.1a0.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
54
+ lmnr-0.5.1a0.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- from contextlib import contextmanager
2
-
3
- from lmnr.openllmetry_sdk.tracing.tracing import TracerWrapper
4
-
5
-
6
- @contextmanager
7
- def get_tracer(flush_on_exit: bool = False):
8
- wrapper = TracerWrapper()
9
- try:
10
- yield wrapper.get_tracer()
11
- finally:
12
- if flush_on_exit:
13
- wrapper.flush()
File without changes
File without changes