lmnr 0.4.58__py3-none-any.whl → 0.4.59__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.
@@ -7,3 +7,6 @@ def is_tracing_enabled() -> bool:
7
7
 
8
8
  def is_content_tracing_enabled() -> bool:
9
9
  return (os.getenv("TRACELOOP_TRACE_CONTENT") or "true").lower() == "true"
10
+
11
+
12
+ MAX_MANUAL_SPAN_PAYLOAD_SIZE = 1024 * 1024 # 1MB
@@ -4,7 +4,7 @@ import logging
4
4
  import os
5
5
  import pydantic
6
6
  import types
7
- from typing import Any, Optional
7
+ from typing import Any, Literal, Optional, Union
8
8
 
9
9
  from opentelemetry import trace
10
10
  from opentelemetry import context as context_api
@@ -12,9 +12,10 @@ from opentelemetry.trace import Span
12
12
 
13
13
  from lmnr.sdk.utils import get_input_from_func_args, is_method
14
14
  from lmnr.openllmetry_sdk.tracing import get_tracer
15
- from lmnr.openllmetry_sdk.tracing.attributes import SPAN_INPUT, SPAN_OUTPUT
15
+ from lmnr.openllmetry_sdk.tracing.attributes import SPAN_INPUT, SPAN_OUTPUT, SPAN_TYPE
16
16
  from lmnr.openllmetry_sdk.tracing.tracing import TracerWrapper
17
17
  from lmnr.openllmetry_sdk.utils.json_encoder import JSONEncoder
18
+ from lmnr.openllmetry_sdk.config import MAX_MANUAL_SPAN_PAYLOAD_SIZE
18
19
 
19
20
 
20
21
  class CustomJSONEncoder(JSONEncoder):
@@ -38,6 +39,9 @@ def json_dumps(data: dict) -> str:
38
39
 
39
40
  def entity_method(
40
41
  name: Optional[str] = None,
42
+ ignore_input: bool = False,
43
+ ignore_output: bool = False,
44
+ span_type: Union[Literal["DEFAULT"], Literal["LLM"], Literal["TOOL"]] = "DEFAULT",
41
45
  ):
42
46
  def decorate(fn):
43
47
  @wraps(fn)
@@ -48,21 +52,22 @@ def entity_method(
48
52
  span_name = name or fn.__name__
49
53
 
50
54
  with get_tracer() as tracer:
51
- span = tracer.start_span(span_name)
55
+ span = tracer.start_span(span_name, attributes={SPAN_TYPE: span_type})
52
56
 
53
57
  ctx = trace.set_span_in_context(span, context_api.get_current())
54
58
  ctx_token = context_api.attach(ctx)
55
59
 
56
60
  try:
57
- if _should_send_prompts():
58
- span.set_attribute(
59
- SPAN_INPUT,
60
- json_dumps(
61
- get_input_from_func_args(
62
- fn, is_method(fn), args, kwargs
63
- )
64
- ),
61
+ if _should_send_prompts() and not ignore_input:
62
+ inp = json_dumps(
63
+ get_input_from_func_args(fn, is_method(fn), args, kwargs)
65
64
  )
65
+ if len(inp) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
66
+ span.set_attribute(
67
+ SPAN_INPUT, "Laminar: input too large to record"
68
+ )
69
+ else:
70
+ span.set_attribute(SPAN_INPUT, inp)
66
71
  except TypeError:
67
72
  pass
68
73
 
@@ -78,11 +83,14 @@ def entity_method(
78
83
  return _handle_generator(span, res)
79
84
 
80
85
  try:
81
- if _should_send_prompts():
82
- span.set_attribute(
83
- SPAN_OUTPUT,
84
- json_dumps(res),
85
- )
86
+ if _should_send_prompts() and not ignore_output:
87
+ output = json_dumps(res)
88
+ if len(output) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
89
+ span.set_attribute(
90
+ SPAN_OUTPUT, "Laminar: output too large to record"
91
+ )
92
+ else:
93
+ span.set_attribute(SPAN_OUTPUT, output)
86
94
  except TypeError:
87
95
  pass
88
96
 
@@ -99,6 +107,9 @@ def entity_method(
99
107
  # Async Decorators
100
108
  def aentity_method(
101
109
  name: Optional[str] = None,
110
+ ignore_input: bool = False,
111
+ ignore_output: bool = False,
112
+ span_type: Union[Literal["DEFAULT"], Literal["LLM"], Literal["TOOL"]] = "DEFAULT",
102
113
  ):
103
114
  def decorate(fn):
104
115
  @wraps(fn)
@@ -109,21 +120,22 @@ def aentity_method(
109
120
  span_name = name or fn.__name__
110
121
 
111
122
  with get_tracer() as tracer:
112
- span = tracer.start_span(span_name)
123
+ span = tracer.start_span(span_name, attributes={SPAN_TYPE: span_type})
113
124
 
114
125
  ctx = trace.set_span_in_context(span, context_api.get_current())
115
126
  ctx_token = context_api.attach(ctx)
116
127
 
117
128
  try:
118
- if _should_send_prompts():
119
- span.set_attribute(
120
- SPAN_INPUT,
121
- json_dumps(
122
- get_input_from_func_args(
123
- fn, is_method(fn), args, kwargs
124
- )
125
- ),
129
+ if _should_send_prompts() and not ignore_input:
130
+ inp = json_dumps(
131
+ get_input_from_func_args(fn, is_method(fn), args, kwargs)
126
132
  )
133
+ if len(inp) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
134
+ span.set_attribute(
135
+ SPAN_INPUT, "Laminar: input too large to record"
136
+ )
137
+ else:
138
+ span.set_attribute(SPAN_INPUT, inp)
127
139
  except TypeError:
128
140
  pass
129
141
 
@@ -139,8 +151,14 @@ def aentity_method(
139
151
  return await _ahandle_generator(span, ctx_token, res)
140
152
 
141
153
  try:
142
- if _should_send_prompts():
143
- span.set_attribute(SPAN_OUTPUT, json_dumps(res))
154
+ if _should_send_prompts() and not ignore_output:
155
+ output = json_dumps(res)
156
+ if len(output) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
157
+ span.set_attribute(
158
+ SPAN_OUTPUT, "Laminar: output too large to record"
159
+ )
160
+ else:
161
+ span.set_attribute(SPAN_OUTPUT, output)
144
162
  except TypeError:
145
163
  pass
146
164
 
@@ -5,6 +5,7 @@ SPAN_INPUT = "lmnr.span.input"
5
5
  SPAN_OUTPUT = "lmnr.span.output"
6
6
  SPAN_TYPE = "lmnr.span.type"
7
7
  SPAN_PATH = "lmnr.span.path"
8
+ SPAN_IDS_PATH = "lmnr.span.ids_path"
8
9
  SPAN_INSTRUMENTATION_SOURCE = "lmnr.span.instrumentation_source"
9
10
  OVERRIDE_PARENT_SPAN = "lmnr.internal.override_parent_span"
10
11
 
@@ -1,7 +1,7 @@
1
1
  import atexit
2
2
  import copy
3
3
  import logging
4
-
4
+ import uuid
5
5
 
6
6
  from contextvars import Context
7
7
  from lmnr.sdk.log import VerboseColorfulFormatter
@@ -9,6 +9,7 @@ from lmnr.openllmetry_sdk.instruments import Instruments
9
9
  from lmnr.sdk.browser import init_browser_tracing
10
10
  from lmnr.openllmetry_sdk.tracing.attributes import (
11
11
  ASSOCIATION_PROPERTIES,
12
+ SPAN_IDS_PATH,
12
13
  SPAN_INSTRUMENTATION_SOURCE,
13
14
  SPAN_PATH,
14
15
  TRACING_LEVEL,
@@ -72,6 +73,7 @@ class TracerWrapper(object):
72
73
  __tracer_provider: TracerProvider = None
73
74
  __logger: logging.Logger = None
74
75
  __span_id_to_path: dict[int, list[str]] = {}
76
+ __span_id_lists: dict[int, list[str]] = {}
75
77
 
76
78
  def __new__(
77
79
  cls,
@@ -162,10 +164,18 @@ class TracerWrapper(object):
162
164
  parent_span_path = span_path_in_context or (
163
165
  self.__span_id_to_path.get(span.parent.span_id) if span.parent else None
164
166
  )
167
+ parent_span_ids_path = (
168
+ self.__span_id_lists.get(span.parent.span_id, []) if span.parent else []
169
+ )
165
170
  span_path = parent_span_path + [span.name] if parent_span_path else [span.name]
171
+ span_ids_path = parent_span_ids_path + [
172
+ str(uuid.UUID(int=span.get_span_context().span_id))
173
+ ]
166
174
  span.set_attribute(SPAN_PATH, span_path)
175
+ span.set_attribute(SPAN_IDS_PATH, span_ids_path)
167
176
  set_value("span_path", span_path, get_current())
168
177
  self.__span_id_to_path[span.get_span_context().span_id] = span_path
178
+ self.__span_id_lists[span.get_span_context().span_id] = span_ids_path
169
179
 
170
180
  span.set_attribute(SPAN_INSTRUMENTATION_SOURCE, "python")
171
181
 
@@ -203,6 +213,7 @@ class TracerWrapper(object):
203
213
  def clear(cls):
204
214
  # Any state cleanup. Now used in between tests
205
215
  cls.__span_id_to_path = {}
216
+ cls.__span_id_lists = {}
206
217
 
207
218
  def flush(self):
208
219
  self.__spans_processor.force_flush()
@@ -1,6 +1,10 @@
1
1
  import opentelemetry
2
2
  import uuid
3
3
  import asyncio
4
+ import logging
5
+ import time
6
+
7
+ logger = logging.getLogger(__name__)
4
8
 
5
9
  try:
6
10
  from playwright.async_api import BrowserContext, Page
@@ -97,9 +101,44 @@ INJECT_PLACEHOLDER = """
97
101
  def init_playwright_tracing(http_url: str, project_api_key: str):
98
102
 
99
103
  def inject_rrweb(page: SyncPage):
104
+ # Wait for the page to be in a ready state first
105
+ page.wait_for_load_state("domcontentloaded")
106
+
107
+ # First check if rrweb is already loaded
108
+ is_loaded = page.evaluate(
109
+ """
110
+ () => typeof window.rrweb !== 'undefined'
111
+ """
112
+ )
113
+
114
+ if not is_loaded:
115
+ try:
116
+ # Add retry logic for script loading
117
+ retries = 3
118
+ for attempt in range(retries):
119
+ try:
120
+ page.add_script_tag(
121
+ url="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.js"
122
+ )
123
+ # Verify script loaded successfully
124
+ page.wait_for_function(
125
+ """(() => typeof window.rrweb !== 'undefined')""",
126
+ timeout=5000,
127
+ )
128
+ break
129
+ except Exception:
130
+ if attempt == retries - 1: # Last attempt
131
+ raise
132
+ time.sleep(0.5) # Wait before retry
133
+ except Exception as script_error:
134
+ logger.error("Failed to load rrweb after all retries: %s", script_error)
135
+ return
136
+
100
137
  # Get current trace ID from active span
101
138
  current_span = opentelemetry.trace.get_current_span()
102
- current_span.set_attribute("lmnr.internal.has_browser_session", True)
139
+ if current_span.is_recording():
140
+ current_span.set_attribute("lmnr.internal.has_browser_session", True)
141
+
103
142
  trace_id = format(current_span.get_span_context().trace_id, "032x")
104
143
  session_id = str(uuid.uuid4().hex)
105
144
 
@@ -112,11 +151,6 @@ def init_playwright_tracing(http_url: str, project_api_key: str):
112
151
  [trace_id, session_id],
113
152
  )
114
153
 
115
- # Load rrweb from CDN
116
- page.add_script_tag(
117
- url="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.js"
118
- )
119
-
120
154
  # Update the recording setup to include trace ID
121
155
  page.evaluate(
122
156
  INJECT_PLACEHOLDER,
@@ -124,41 +158,61 @@ def init_playwright_tracing(http_url: str, project_api_key: str):
124
158
  )
125
159
 
126
160
  async def inject_rrweb_async(page: Page):
127
- try:
128
- # Wait for the page to be in a ready state first
129
- await page.wait_for_load_state("domcontentloaded")
130
161
 
131
- # Get current trace ID from active span
132
- current_span = opentelemetry.trace.get_current_span()
162
+ # Wait for the page to be in a ready state first
163
+ await page.wait_for_load_state("domcontentloaded")
164
+
165
+ # First check if rrweb is already loaded
166
+ is_loaded = await page.evaluate(
167
+ """
168
+ () => typeof window.rrweb !== 'undefined'
169
+ """
170
+ )
171
+
172
+ if not is_loaded:
173
+ try:
174
+ # Add retry logic for script loading
175
+ retries = 3
176
+ for attempt in range(retries):
177
+ try:
178
+ await page.add_script_tag(
179
+ url="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.js"
180
+ )
181
+ # Verify script loaded successfully
182
+ await page.wait_for_function(
183
+ """(() => typeof window.rrweb !== 'undefined')""",
184
+ timeout=5000,
185
+ )
186
+ break
187
+ except Exception:
188
+ if attempt == retries - 1: # Last attempt
189
+ raise
190
+ await asyncio.sleep(0.5) # Wait before retry
191
+ except Exception as script_error:
192
+ logger.error("Failed to load rrweb after all retries: %s", script_error)
193
+ return
194
+ # Get current trace ID from active span
195
+ current_span = opentelemetry.trace.get_current_span()
196
+ if current_span.is_recording():
133
197
  current_span.set_attribute("lmnr.internal.has_browser_session", True)
134
- trace_id = format(current_span.get_span_context().trace_id, "032x")
135
- session_id = str(uuid.uuid4().hex)
136
-
137
- # Generate UUID session ID and set trace ID
138
- await page.evaluate(
139
- """([traceId, sessionId]) => {
140
- window.rrwebSessionId = sessionId;
141
- window.traceId = traceId;
142
- }""",
143
- [trace_id, session_id],
144
- )
145
-
146
- # Load rrweb from CDN
147
- await page.add_script_tag(
148
- url="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.js"
149
- )
150
-
151
- await page.wait_for_function(
152
- """(() => window.rrweb || 'rrweb' in window)"""
153
- )
154
-
155
- # Update the recording setup to include trace ID
156
- await page.evaluate(
157
- INJECT_PLACEHOLDER,
158
- [http_url, project_api_key],
159
- )
160
- except Exception as e:
161
- print(f"Error injecting rrweb: {e}")
198
+
199
+ trace_id = format(current_span.get_span_context().trace_id, "032x")
200
+ session_id = str(uuid.uuid4().hex)
201
+
202
+ # Generate UUID session ID and set trace ID
203
+ await page.evaluate(
204
+ """([traceId, sessionId]) => {
205
+ window.rrwebSessionId = sessionId;
206
+ window.traceId = traceId;
207
+ }""",
208
+ [trace_id, session_id],
209
+ )
210
+
211
+ # Update the recording setup to include trace ID
212
+ await page.evaluate(
213
+ INJECT_PLACEHOLDER,
214
+ [http_url, project_api_key],
215
+ )
162
216
 
163
217
  def handle_navigation(page: SyncPage):
164
218
  def on_load():
lmnr/sdk/decorators.py CHANGED
@@ -4,7 +4,7 @@ from lmnr.openllmetry_sdk.decorators.base import (
4
4
  )
5
5
  from opentelemetry.trace import INVALID_SPAN, get_current_span
6
6
 
7
- from typing import Callable, Optional, TypeVar, cast
7
+ from typing import Callable, Literal, Optional, TypeVar, Union, cast
8
8
  from typing_extensions import ParamSpec
9
9
 
10
10
  from lmnr.openllmetry_sdk.tracing.attributes import SESSION_ID
@@ -21,6 +21,9 @@ def observe(
21
21
  *,
22
22
  name: Optional[str] = None,
23
23
  session_id: Optional[str] = None,
24
+ ignore_input: bool = False,
25
+ ignore_output: bool = False,
26
+ span_type: Union[Literal["DEFAULT"], Literal["LLM"], Literal["TOOL"]] = "DEFAULT",
24
27
  ) -> Callable[[Callable[P, R]], Callable[P, R]]:
25
28
  """The main decorator entrypoint for Laminar. This is used to wrap
26
29
  functions and methods to create spans.
@@ -50,9 +53,19 @@ def observe(
50
53
  association_properties["session_id"] = session_id
51
54
  update_association_properties(association_properties)
52
55
  return (
53
- aentity_method(name=name)(func)
56
+ aentity_method(
57
+ name=name,
58
+ ignore_input=ignore_input,
59
+ ignore_output=ignore_output,
60
+ span_type=span_type,
61
+ )(func)
54
62
  if is_async(func)
55
- else entity_method(name=name)(func)
63
+ else entity_method(
64
+ name=name,
65
+ ignore_input=ignore_input,
66
+ ignore_output=ignore_output,
67
+ span_type=span_type,
68
+ )(func)
56
69
  )
57
70
 
58
71
  return cast(Callable, decorator)
lmnr/sdk/evaluations.py CHANGED
@@ -339,6 +339,7 @@ def evaluate(
339
339
  http_port: Optional[int] = None,
340
340
  grpc_port: Optional[int] = None,
341
341
  instruments: Optional[Set[Instruments]] = None,
342
+ max_export_batch_size: Optional[int] = MAX_EXPORT_BATCH_SIZE,
342
343
  ) -> Optional[Awaitable[None]]:
343
344
  """
344
345
  If added to the file which is called through `lmnr eval` command, then
@@ -419,6 +420,7 @@ def evaluate(
419
420
  http_port=http_port,
420
421
  grpc_port=grpc_port,
421
422
  instruments=instruments,
423
+ max_export_batch_size=max_export_batch_size,
422
424
  )
423
425
 
424
426
  if PREPARE_ONLY.get():
lmnr/sdk/laminar.py CHANGED
@@ -9,6 +9,7 @@ from lmnr.openllmetry_sdk.tracing.attributes import (
9
9
  SPAN_TYPE,
10
10
  OVERRIDE_PARENT_SPAN,
11
11
  )
12
+ from lmnr.openllmetry_sdk.config import MAX_MANUAL_SPAN_PAYLOAD_SIZE
12
13
  from lmnr.openllmetry_sdk.decorators.base import json_dumps
13
14
  from opentelemetry import context as context_api, trace
14
15
  from opentelemetry.context import attach, detach
@@ -47,7 +48,6 @@ from lmnr.openllmetry_sdk.tracing.tracing import (
47
48
  from .log import VerboseColorfulFormatter
48
49
 
49
50
  from .types import (
50
- HumanEvaluator,
51
51
  InitEvaluationResponse,
52
52
  EvaluationResultDatapoint,
53
53
  GetDatapointsResponse,
@@ -323,7 +323,9 @@ class Laminar:
323
323
  cls,
324
324
  name: str,
325
325
  input: Any = None,
326
- span_type: Union[Literal["DEFAULT"], Literal["LLM"]] = "DEFAULT",
326
+ span_type: Union[
327
+ Literal["DEFAULT"], Literal["LLM"], Literal["TOOL"]
328
+ ] = "DEFAULT",
327
329
  context: Optional[Context] = None,
328
330
  trace_id: Optional[uuid.UUID] = None,
329
331
  labels: Optional[dict[str, str]] = None,
@@ -402,10 +404,17 @@ class Laminar:
402
404
  if trace_id is not None and isinstance(trace_id, uuid.UUID):
403
405
  span.set_attribute(OVERRIDE_PARENT_SPAN, True)
404
406
  if input is not None:
405
- span.set_attribute(
406
- SPAN_INPUT,
407
- json_dumps(input),
408
- )
407
+ serialized_input = json_dumps(input)
408
+ if len(serialized_input) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
409
+ span.set_attribute(
410
+ SPAN_INPUT,
411
+ "Laminar: input too large to record",
412
+ )
413
+ else:
414
+ span.set_attribute(
415
+ SPAN_INPUT,
416
+ serialized_input,
417
+ )
409
418
  yield span
410
419
 
411
420
  # TODO: Figure out if this is necessary
@@ -454,7 +463,9 @@ class Laminar:
454
463
  cls,
455
464
  name: str,
456
465
  input: Any = None,
457
- span_type: Union[Literal["DEFAULT"], Literal["LLM"]] = "DEFAULT",
466
+ span_type: Union[
467
+ Literal["DEFAULT"], Literal["LLM"], Literal["TOOL"]
468
+ ] = "DEFAULT",
458
469
  context: Optional[Context] = None,
459
470
  trace_id: Optional[uuid.UUID] = None,
460
471
  labels: Optional[dict[str, str]] = None,
@@ -546,10 +557,17 @@ class Laminar:
546
557
  if trace_id is not None and isinstance(trace_id, uuid.UUID):
547
558
  span.set_attribute(OVERRIDE_PARENT_SPAN, True)
548
559
  if input is not None:
549
- span.set_attribute(
550
- SPAN_INPUT,
551
- json_dumps(input),
552
- )
560
+ serialized_input = json_dumps(input)
561
+ if len(serialized_input) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
562
+ span.set_attribute(
563
+ SPAN_INPUT,
564
+ "Laminar: input too large to record",
565
+ )
566
+ else:
567
+ span.set_attribute(
568
+ SPAN_INPUT,
569
+ serialized_input,
570
+ )
553
571
  return span
554
572
 
555
573
  @classmethod
@@ -563,7 +581,14 @@ class Laminar:
563
581
  """
564
582
  span = trace.get_current_span()
565
583
  if output is not None and span != trace.INVALID_SPAN:
566
- span.set_attribute(SPAN_OUTPUT, json_dumps(output))
584
+ serialized_output = json_dumps(output)
585
+ if len(serialized_output) > MAX_MANUAL_SPAN_PAYLOAD_SIZE:
586
+ span.set_attribute(
587
+ SPAN_OUTPUT,
588
+ "Laminar: output too large to record",
589
+ )
590
+ else:
591
+ span.set_attribute(SPAN_OUTPUT, serialized_output)
567
592
 
568
593
  @classmethod
569
594
  @contextmanager
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lmnr
3
- Version: 0.4.58
3
+ Version: 0.4.59
4
4
  Summary: Python SDK for Laminar
5
5
  License: Apache-2.0
6
6
  Author: lmnr.ai
@@ -3,15 +3,15 @@ lmnr/cli.py,sha256=4J2RZQhHM3jJcjFvBC4PChQTS-ukxykVvI0X6lTkK-o,2918
3
3
  lmnr/openllmetry_sdk/.flake8,sha256=bCxuDlGx3YQ55QHKPiGJkncHanh9qGjQJUujcFa3lAU,150
4
4
  lmnr/openllmetry_sdk/.python-version,sha256=9OLQBQVbD4zE4cJsPePhnAfV_snrPSoqEQw-PXgPMOs,6
5
5
  lmnr/openllmetry_sdk/__init__.py,sha256=TpFNPrRosz-BUpWdfT9ROiZPTGA_JshNwqOfiXlR0MU,2643
6
- lmnr/openllmetry_sdk/config/__init__.py,sha256=DliMGp2NjYAqRFLKpWQPUKjGMHRO8QsVfazBA1qENQ8,248
6
+ lmnr/openllmetry_sdk/config/__init__.py,sha256=5aGdIdo1LffBkNwIBUbqzN6OUCMCrURU4b0rf5LBSI0,300
7
7
  lmnr/openllmetry_sdk/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- lmnr/openllmetry_sdk/decorators/base.py,sha256=BhfTJHjGnKXZRyug41wnmvjbg2UDq2p7eLEak7RsCXI,5779
8
+ lmnr/openllmetry_sdk/decorators/base.py,sha256=RNyvSreGBwwh8EWaa3O9samrnmKoZHK7eBzGOPT3lHc,7132
9
9
  lmnr/openllmetry_sdk/instruments.py,sha256=X1S3XbFF_RDlbxxbNxqKKJ9JNUStdTI6gLYCPWnoOTs,1066
10
10
  lmnr/openllmetry_sdk/tracing/__init__.py,sha256=xT73L1t2si2CM6QmMiTZ7zn-dKKYBLNrpBBWq6WfVBw,68
11
- lmnr/openllmetry_sdk/tracing/attributes.py,sha256=B_4KVYWAUu-6DQmsm2eCJQcTxm8pG1EByCBK3uOPkuI,1293
11
+ lmnr/openllmetry_sdk/tracing/attributes.py,sha256=v0iaz6juI-4FdLciLk_OZPNqwyST-zIkywUH0wfEdKM,1330
12
12
  lmnr/openllmetry_sdk/tracing/content_allow_list.py,sha256=3feztm6PBWNelc8pAZUcQyEGyeSpNiVKjOaDk65l2ps,846
13
13
  lmnr/openllmetry_sdk/tracing/context_manager.py,sha256=rdSus-p-TaevQ8hIAhfbnZr5dTqRvACDkzXGDpflncY,306
14
- lmnr/openllmetry_sdk/tracing/tracing.py,sha256=nKBP7KpfZE70EpfhJ9yPmtXtjy_331O0s3XwLSG2U0c,33191
14
+ lmnr/openllmetry_sdk/tracing/tracing.py,sha256=pw2OOXYo6JRBhHCmfDzmVurXI-yNaVEtF6RbDxnNQBQ,33687
15
15
  lmnr/openllmetry_sdk/utils/__init__.py,sha256=pNhf0G3vTd5ccoc03i1MXDbricSaiqCbi1DLWhSekK8,604
16
16
  lmnr/openllmetry_sdk/utils/in_memory_span_exporter.py,sha256=H_4TRaThMO1H6vUQ0OpQvzJk_fZH0OOsRAM1iZQXsR8,2112
17
17
  lmnr/openllmetry_sdk/utils/json_encoder.py,sha256=dK6b_axr70IYL7Vv-bu4wntvDDuyntoqsHaddqX7P58,463
@@ -19,17 +19,17 @@ lmnr/openllmetry_sdk/utils/package_check.py,sha256=Da4WoTX6J9naODs99DnY9BA-2MxH2
19
19
  lmnr/openllmetry_sdk/version.py,sha256=OlatFEFA4ttqSSIiV8jdE-sq3KG5zu2hnC4B4mzWF3s,23
20
20
  lmnr/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  lmnr/sdk/browser/__init__.py,sha256=NSP5sB-dm-f0FP70_GMvVrNFwc5rHf7SW0_Oisyo3cE,343
22
- lmnr/sdk/browser/playwright_patch.py,sha256=Hu0O_gJghlKeDHo5RiKoEEWnzbyO6AvoX00ITiiSmIA,8838
22
+ lmnr/sdk/browser/playwright_patch.py,sha256=wBfWelTg_rpfhOTuD6Hu6W8uvbpiTgLzFVj9XRMxluY,10883
23
23
  lmnr/sdk/datasets.py,sha256=hJcQcwTJbtA4COoVG3god4xll9TBSDMfvrhKmMfanjg,1567
24
- lmnr/sdk/decorators.py,sha256=ja2EUWUWvFOp28ER0k78PRuxNahwCVyH0TdM3U-xY7U,1856
24
+ lmnr/sdk/decorators.py,sha256=g0VBqUEMCPRbgjgGHauVuKK1wHEd9rkiGzlYUYrcml4,2336
25
25
  lmnr/sdk/eval_control.py,sha256=G6Fg3Xx_KWv72iBaWlNMdyRTF2bZFQnwJ68sJNSpIcY,177
26
- lmnr/sdk/evaluations.py,sha256=didZ1TqZKASqwaJsgXqibnGGRM37bpMjCPt66FO7tI4,18172
27
- lmnr/sdk/laminar.py,sha256=COF0bnaU8xSZAV5tRDuP7U4RMpB8AgiadbU-rz_FRq8,31846
26
+ lmnr/sdk/evaluations.py,sha256=-IwKfbo8Fb8NW37H6W0R5duqCBEL3BdlE6xzsMK-Fvo,18291
27
+ lmnr/sdk/laminar.py,sha256=UM4SP38HX1-6lwVrDJGMCwfC0V1qkkObUOko5r0TS_4,32935
28
28
  lmnr/sdk/log.py,sha256=nt_YMmPw1IRbGy0b7q4rTtP4Yo3pQfNxqJPXK3nDSNQ,2213
29
29
  lmnr/sdk/types.py,sha256=Y4msdSM_IvQ5LOfV2jvk4R0-6skW5Ilml466a6swul4,6506
30
30
  lmnr/sdk/utils.py,sha256=sD1YEqhdPaHweY2VGmjMF9MC-X7Ikdc49E01D-HF77E,3377
31
- lmnr-0.4.58.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
32
- lmnr-0.4.58.dist-info/METADATA,sha256=2lASt_slr6vqL-AMM9JgOCqWTrycELl0t_XzaASytw4,13827
33
- lmnr-0.4.58.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
34
- lmnr-0.4.58.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
35
- lmnr-0.4.58.dist-info/RECORD,,
31
+ lmnr-0.4.59.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
32
+ lmnr-0.4.59.dist-info/METADATA,sha256=meE619Q1HzTbaioQagVWPz_dxYMIDR4zAP4OZfa-uaY,13827
33
+ lmnr-0.4.59.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
34
+ lmnr-0.4.59.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
35
+ lmnr-0.4.59.dist-info/RECORD,,
File without changes
File without changes