lmnr 0.4.29b4__py3-none-any.whl → 0.4.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.
lmnr/__init__.py CHANGED
@@ -11,3 +11,4 @@ from .sdk.types import (
11
11
  from .sdk.decorators import observe
12
12
  from .traceloop_sdk import Instruments
13
13
  from .traceloop_sdk.tracing.attributes import Attributes
14
+ from opentelemetry.trace import use_span
lmnr/sdk/laminar.py CHANGED
@@ -1,17 +1,17 @@
1
- import re
2
- from lmnr.traceloop_sdk.instruments import Instruments
3
- from opentelemetry import context
4
- from opentelemetry.trace import (
5
- INVALID_SPAN,
6
- get_current_span,
7
- )
1
+ from contextlib import contextmanager
2
+ from contextvars import Context
3
+ from opentelemetry import context, trace
8
4
  from opentelemetry.util.types import AttributeValue
9
5
  from opentelemetry.context import set_value, attach, detach
10
6
  from lmnr.traceloop_sdk import Traceloop
7
+ from lmnr.traceloop_sdk.instruments import Instruments
11
8
  from lmnr.traceloop_sdk.tracing import get_tracer
12
- from lmnr.traceloop_sdk.tracing.attributes import Attributes, SPAN_TYPE
9
+ from lmnr.traceloop_sdk.tracing.attributes import (
10
+ Attributes,
11
+ SPAN_TYPE,
12
+ OVERRIDE_PARENT_SPAN,
13
+ )
13
14
  from lmnr.traceloop_sdk.decorators.base import json_dumps
14
- from contextlib import contextmanager
15
15
  from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
16
16
 
17
17
  from pydantic.alias_generators import to_snake
@@ -23,6 +23,8 @@ import dotenv
23
23
  import json
24
24
  import logging
25
25
  import os
26
+ import random
27
+ import re
26
28
  import requests
27
29
  import urllib.parse
28
30
  import uuid
@@ -196,8 +198,8 @@ class Laminar:
196
198
  "API key or set the LMNR_PROJECT_API_KEY environment variable"
197
199
  )
198
200
  try:
199
- current_span = get_current_span()
200
- if current_span != INVALID_SPAN:
201
+ current_span = trace.get_current_span()
202
+ if current_span != trace.INVALID_SPAN:
201
203
  parent_span_id = parent_span_id or uuid.UUID(
202
204
  int=current_span.get_span_context().span_id
203
205
  )
@@ -276,8 +278,8 @@ class Laminar:
276
278
  if value is not None:
277
279
  event["lmnr.event.value"] = value
278
280
 
279
- current_span = get_current_span()
280
- if current_span == INVALID_SPAN:
281
+ current_span = trace.get_current_span()
282
+ if current_span == trace.INVALID_SPAN:
281
283
  cls.__logger.warning(
282
284
  "`Laminar().event()` called outside of span context. "
283
285
  f"Event '{name}' will not be recorded in the trace. "
@@ -294,6 +296,8 @@ class Laminar:
294
296
  name: str,
295
297
  input: Any = None,
296
298
  span_type: Union[Literal["DEFAULT"], Literal["LLM"]] = "DEFAULT",
299
+ context: Optional[Context] = None,
300
+ trace_id: Optional[uuid.UUID] = None,
297
301
  ):
298
302
  """Start a new span as the current span. Useful for manual
299
303
  instrumentation. If `span_type` is set to `"LLM"`, you should report
@@ -314,30 +318,139 @@ class Laminar:
314
318
  span_type (Union[Literal["DEFAULT"], Literal["LLM"]], optional):\
315
319
  type of the span. If you use `"LLM"`, you should report usage\
316
320
  and response attributes manually. Defaults to "DEFAULT".
321
+ context (Optional[Context], optional): raw OpenTelemetry context\
322
+ to attach the span to. Defaults to None.
323
+ trace_id (Optional[uuid.UUID], optional): [EXPERIMENTAL] override\
324
+ the trace id for the span. If not provided, use the current\
325
+ trace id. Defaults to None.
317
326
  """
327
+
318
328
  with get_tracer() as tracer:
319
329
  span_path = get_span_path(name)
320
- ctx = set_value("span_path", span_path)
330
+ ctx = set_value("span_path", span_path, context)
331
+ if trace_id is not None:
332
+ if isinstance(trace_id, uuid.UUID):
333
+ span_context = trace.SpanContext(
334
+ trace_id=int(trace_id),
335
+ span_id=random.getrandbits(64),
336
+ is_remote=False,
337
+ trace_flags=trace.TraceFlags(trace.TraceFlags.SAMPLED),
338
+ )
339
+ ctx = trace.set_span_in_context(
340
+ trace.NonRecordingSpan(span_context), ctx
341
+ )
342
+ else:
343
+ cls.__logger.warning(
344
+ "trace_id provided to `Laminar.start_as_current_span`"
345
+ " is not a valid UUID"
346
+ )
321
347
  ctx_token = attach(ctx)
322
348
  with tracer.start_as_current_span(
323
349
  name,
324
350
  context=ctx,
325
- attributes={SPAN_PATH: span_path},
351
+ attributes={SPAN_PATH: span_path, SPAN_TYPE: span_type},
326
352
  ) as span:
353
+ if trace_id is not None and isinstance(trace_id, uuid.UUID):
354
+ span.set_attribute(OVERRIDE_PARENT_SPAN, True)
327
355
  if input is not None:
328
356
  span.set_attribute(
329
357
  SPAN_INPUT,
330
358
  json_dumps(input),
331
359
  )
332
- span.set_attribute(SPAN_TYPE, span_type)
333
360
  yield span
334
361
 
335
- # TODO: Figure out if this is necessary
362
+ # # TODO: Figure out if this is necessary
336
363
  try:
337
364
  detach(ctx_token)
338
365
  except Exception:
339
366
  pass
340
367
 
368
+ @classmethod
369
+ def start_span(
370
+ cls,
371
+ name: str,
372
+ input: Any = None,
373
+ span_type: Union[Literal["DEFAULT"], Literal["LLM"]] = "DEFAULT",
374
+ context: Optional[Context] = None,
375
+ trace_id: Optional[uuid.UUID] = None,
376
+ ):
377
+ """Start a new span. Useful for manual instrumentation.
378
+ If `span_type` is set to `"LLM"`, you should report usage and response
379
+ attributes manually. See `Laminar.set_span_attributes` for more
380
+ information.
381
+
382
+ Usage example:
383
+ ```python
384
+ from src.lmnr import Laminar, use_span
385
+ def foo(span):
386
+ with use_span(span):
387
+ with Laminar.start_as_current_span("foo_inner"):
388
+ some_function()
389
+
390
+ def bar():
391
+ with use_span(span):
392
+ openai_client.chat.completions.create()
393
+
394
+ span = Laminar.start_span("outer")
395
+ foo(span)
396
+ bar(span)
397
+ # IMPORTANT: End the span manually
398
+ span.end()
399
+
400
+ # Results in:
401
+ # | outer
402
+ # | | foo
403
+ # | | | foo_inner
404
+ # | | bar
405
+ # | | | openai.chat
406
+ ```
407
+
408
+ Args:
409
+ name (str): name of the span
410
+ input (Any, optional): input to the span. Will be sent as an\
411
+ attribute, so must be json serializable. Defaults to None.
412
+ span_type (Union[Literal["DEFAULT"], Literal["LLM"]], optional):\
413
+ type of the span. If you use `"LLM"`, you should report usage\
414
+ and response attributes manually. Defaults to "DEFAULT".
415
+ context (Optional[Context], optional): raw OpenTelemetry context\
416
+ to attach the span to. Defaults to None.
417
+ trace_id (Optional[uuid.UUID], optional): [EXPERIMENTAL] override\
418
+ the trace id for the span. If not provided, use the current\
419
+ trace id. Defaults to None.
420
+ """
421
+ with get_tracer() as tracer:
422
+ span_path = get_span_path(name)
423
+ ctx = set_value("span_path", span_path, context)
424
+ if trace_id is not None:
425
+ if isinstance(trace_id, uuid.UUID):
426
+ span_context = trace.SpanContext(
427
+ trace_id=int(trace_id),
428
+ span_id=random.getrandbits(64),
429
+ is_remote=False,
430
+ trace_flags=trace.TraceFlags(trace.TraceFlags.SAMPLED),
431
+ )
432
+ ctx = trace.set_span_in_context(
433
+ trace.NonRecordingSpan(span_context), ctx
434
+ )
435
+ else:
436
+ cls.__logger.warning(
437
+ "trace_id provided to `Laminar.start_span`"
438
+ " is not a valid UUID"
439
+ )
440
+ span = tracer.start_span(
441
+ name,
442
+ context=ctx,
443
+ attributes={SPAN_PATH: span_path, SPAN_TYPE: span_type},
444
+ )
445
+ if trace_id is not None and isinstance(trace_id, uuid.UUID):
446
+ span.set_attribute(OVERRIDE_PARENT_SPAN, True)
447
+ if input is not None:
448
+ span.set_attribute(
449
+ SPAN_INPUT,
450
+ json_dumps(input),
451
+ )
452
+ return span
453
+
341
454
  @classmethod
342
455
  def set_span_output(cls, output: Any = None):
343
456
  """Set the output of the current span. Useful for manual
@@ -347,8 +460,8 @@ class Laminar:
347
460
  output (Any, optional): output of the span. Will be sent as an\
348
461
  attribute, so must be json serializable. Defaults to None.
349
462
  """
350
- span = get_current_span()
351
- if output is not None and span != INVALID_SPAN:
463
+ span = trace.get_current_span()
464
+ if output is not None and span != trace.INVALID_SPAN:
352
465
  span.set_attribute(SPAN_OUTPUT, json_dumps(output))
353
466
 
354
467
  @classmethod
@@ -378,8 +491,8 @@ class Laminar:
378
491
  Args:
379
492
  attributes (dict[ATTRIBUTES, Any]): attributes to set for the span
380
493
  """
381
- span = get_current_span()
382
- if span == INVALID_SPAN:
494
+ span = trace.get_current_span()
495
+ if span == trace.INVALID_SPAN:
383
496
  return
384
497
 
385
498
  for key, value in attributes.items():
@@ -6,6 +6,7 @@ SPAN_OUTPUT = "lmnr.span.output"
6
6
  SPAN_TYPE = "lmnr.span.type"
7
7
  SPAN_PATH = "lmnr.span.path"
8
8
  SPAN_INSTRUMENTATION_SOURCE = "lmnr.span.instrumentation_source"
9
+ OVERRIDE_PARENT_SPAN = "lmnr.internal.override_parent_span"
9
10
 
10
11
  ASSOCIATION_PROPERTIES = "lmnr.association.properties"
11
12
  SESSION_ID = "session_id"
@@ -184,8 +184,6 @@ class TracerWrapper(object):
184
184
  def set_association_properties(properties: dict) -> None:
185
185
  attach(set_value("association_properties", properties))
186
186
 
187
- # TODO: When called inside observe decorator, this actually sets the properties on the parent span, not the current one
188
- # Then, processor's on_start will assign this to current span
189
187
  span = trace.get_current_span()
190
188
  _set_association_properties_attributes(span, properties)
191
189
 
@@ -197,8 +195,6 @@ def update_association_properties(properties: dict) -> None:
197
195
 
198
196
  attach(set_value("association_properties", association_properties))
199
197
 
200
- # TODO: When called inside observe decorator, this actually sets the properties on the parent span, not the current one
201
- # Then, processor's on_start will assign this to current span
202
198
  span = trace.get_current_span()
203
199
  _set_association_properties_attributes(span, properties)
204
200
 
@@ -229,15 +225,6 @@ def set_managed_prompt_tracing_context(
229
225
  attach(set_value("prompt_template_variables", template_variables))
230
226
 
231
227
 
232
- def set_external_prompt_tracing_context(
233
- template: str, variables: dict, version: int
234
- ) -> None:
235
- attach(set_value("managed_prompt", False))
236
- attach(set_value("prompt_version", version))
237
- attach(set_value("prompt_template", template))
238
- attach(set_value("prompt_template_variables", variables))
239
-
240
-
241
228
  def init_spans_exporter(api_endpoint: str, headers: Dict[str, str]) -> SpanExporter:
242
229
  if "http" in api_endpoint.lower() or "https" in api_endpoint.lower():
243
230
  return HTTPExporter(endpoint=f"{api_endpoint}/v1/traces", headers=headers)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lmnr
3
- Version: 0.4.29b4
3
+ Version: 0.4.31
4
4
  Summary: Python SDK for Laminar AI
5
5
  License: Apache-2.0
6
6
  Author: lmnr.ai
@@ -16,39 +16,39 @@ Requires-Dist: argparse (>=1.0,<2.0)
16
16
  Requires-Dist: backoff (>=2.0,<3.0)
17
17
  Requires-Dist: deprecated (>=1.0,<2.0)
18
18
  Requires-Dist: jinja2 (>=3.0,<4.0)
19
- Requires-Dist: opentelemetry-api (>=1.27.0,<2.0.0)
20
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.27.0,<2.0.0)
21
- Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.27.0,<2.0.0)
22
- Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.33.5)
23
- Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.33.5)
24
- Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.33.5)
25
- Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.33.5)
26
- Requires-Dist: opentelemetry-instrumentation-cohere (>=0.33.5)
27
- Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.33.5)
28
- Requires-Dist: opentelemetry-instrumentation-groq (>=0.33.5)
29
- Requires-Dist: opentelemetry-instrumentation-haystack (>=0.33.5)
30
- Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.33.5)
31
- Requires-Dist: opentelemetry-instrumentation-langchain (>=0.33.5)
32
- Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.33.5)
33
- Requires-Dist: opentelemetry-instrumentation-marqo (>=0.33.5)
34
- Requires-Dist: opentelemetry-instrumentation-milvus (>=0.33.5)
35
- Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.33.5)
36
- Requires-Dist: opentelemetry-instrumentation-ollama (>=0.33.5)
37
- Requires-Dist: opentelemetry-instrumentation-openai (>=0.33.5)
38
- Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.33.5)
39
- Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.33.5)
40
- Requires-Dist: opentelemetry-instrumentation-replicate (>=0.33.5)
41
- Requires-Dist: opentelemetry-instrumentation-requests (>=0.48b0,<0.49)
42
- Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.33.5)
43
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.48b0,<0.49)
44
- Requires-Dist: opentelemetry-instrumentation-threading (>=0.48b0,<0.49)
45
- Requires-Dist: opentelemetry-instrumentation-together (>=0.33.5)
46
- Requires-Dist: opentelemetry-instrumentation-transformers (>=0.33.5)
47
- Requires-Dist: opentelemetry-instrumentation-urllib3 (>=0.48b0,<0.49)
48
- Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.33.5)
49
- Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.33.5)
50
- Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.33.5)
51
- Requires-Dist: opentelemetry-sdk (>=1.27.0,<2.0.0)
19
+ Requires-Dist: opentelemetry-api (>=1.27.0)
20
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.27.0)
21
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.27.0)
22
+ Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.33.9)
23
+ Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.33.9)
24
+ Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.33.9)
25
+ Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.33.9)
26
+ Requires-Dist: opentelemetry-instrumentation-cohere (>=0.33.9)
27
+ Requires-Dist: opentelemetry-instrumentation-google-generativeai (>=0.33.9)
28
+ Requires-Dist: opentelemetry-instrumentation-groq (>=0.33.9)
29
+ Requires-Dist: opentelemetry-instrumentation-haystack (>=0.33.9)
30
+ Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.33.9)
31
+ Requires-Dist: opentelemetry-instrumentation-langchain (>=0.33.9)
32
+ Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.33.9)
33
+ Requires-Dist: opentelemetry-instrumentation-marqo (>=0.33.9)
34
+ Requires-Dist: opentelemetry-instrumentation-milvus (>=0.33.9)
35
+ Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.33.9)
36
+ Requires-Dist: opentelemetry-instrumentation-ollama (>=0.33.9)
37
+ Requires-Dist: opentelemetry-instrumentation-openai (>=0.33.9)
38
+ Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.33.9)
39
+ Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.33.9)
40
+ Requires-Dist: opentelemetry-instrumentation-replicate (>=0.33.9)
41
+ Requires-Dist: opentelemetry-instrumentation-requests (>=0.48b0)
42
+ Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.33.9)
43
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.48b0)
44
+ Requires-Dist: opentelemetry-instrumentation-threading (>=0.48b0)
45
+ Requires-Dist: opentelemetry-instrumentation-together (>=0.33.9)
46
+ Requires-Dist: opentelemetry-instrumentation-transformers (>=0.33.9)
47
+ Requires-Dist: opentelemetry-instrumentation-urllib3 (>=0.48b0)
48
+ Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.33.9)
49
+ Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.33.9)
50
+ Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.33.9)
51
+ Requires-Dist: opentelemetry-sdk (>=1.27.0)
52
52
  Requires-Dist: opentelemetry-semantic-conventions-ai (==0.4.2)
53
53
  Requires-Dist: pydantic (>=2.7,<3.0)
54
54
  Requires-Dist: python-dotenv (>=1.0,<2.0)
@@ -172,24 +172,6 @@ If you want to fully disable any kind of autoinstrumentation, pass an empty set
172
172
 
173
173
  Autoinstrumentations are provided by Traceloop's [OpenLLMetry](https://github.com/traceloop/openllmetry).
174
174
 
175
- ## Sending events
176
-
177
- You can send laminar events using `L.event(name, value)`.
178
-
179
- Read our [docs](https://docs.lmnr.ai) to learn more about events and examples.
180
-
181
- ### Example
182
-
183
- ```python
184
- from lmnr import Laminar as L
185
- # ...
186
- poem = response.choices[0].message.content
187
-
188
- # this will register True or False value with Laminar
189
- L.event("topic alignment", topic in poem)
190
-
191
- ```
192
-
193
175
  ## Evaluations
194
176
 
195
177
  ### Quickstart
@@ -1,10 +1,10 @@
1
- lmnr/__init__.py,sha256=qwI8S02jRm7QvXsyljuEurp-kUt8HOCAN_m9RKVQVtU,389
1
+ lmnr/__init__.py,sha256=bIkXw003GaigTxNfGE_gwVtTDGdSdAPUr6CS_nN51oA,430
2
2
  lmnr/cli.py,sha256=Ptvm5dsNLKUY5lwnN8XkT5GtCYjzpRNi2WvefknB3OQ,1079
3
3
  lmnr/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  lmnr/sdk/datasets.py,sha256=w8U9E6fvetAo65Cb2CbYzlfhY8CfXAR-VysrakG6-4I,1591
5
5
  lmnr/sdk/decorators.py,sha256=ZSDaEZyjo-RUzRCltsNbe6x0t9SKl2xRQ2q4uaKvXtk,2250
6
6
  lmnr/sdk/evaluations.py,sha256=5Vfyp0aIjuGpqfuM3cqsaaLpcoO7z6lcOOKxnyHCNHk,16264
7
- lmnr/sdk/laminar.py,sha256=H87fXSWb9shcPW4AeoYwvTXJ-jSTjzm2sI1A1U1Vkg8,18780
7
+ lmnr/sdk/laminar.py,sha256=2EMMeppaR8GuB29YGS3WqGssMQvneUxXeOV7w5Ahv4Q,23462
8
8
  lmnr/sdk/log.py,sha256=cZBeUoSK39LMEV-X4-eEhTWOciULRfHaKfRK8YqIM8I,1532
9
9
  lmnr/sdk/types.py,sha256=qGD1tkGszd-_sZJaZ_Zx9U_CdUYzoDkUeN2g-o48Gls,5588
10
10
  lmnr/sdk/utils.py,sha256=Uk8y15x-sd5tP2ERONahElLDJVEy_3dA_1_5g9A6auY,3358
@@ -36,17 +36,17 @@ lmnr/traceloop_sdk/tests/test_sdk_initialization.py,sha256=fRaf6lrxFzJIN94P1Tav_
36
36
  lmnr/traceloop_sdk/tests/test_tasks.py,sha256=xlEx8BKp4yG83SCjK5WkPGfyC33JSrx4h8VyjVwGbgw,906
37
37
  lmnr/traceloop_sdk/tests/test_workflows.py,sha256=RVcfY3WAFIDZC15-aSua21aoQyYeWE7KypDyUsm-2EM,9372
38
38
  lmnr/traceloop_sdk/tracing/__init__.py,sha256=Ckq7zCM26VdJVB5tIZv0GTPyMZKyfso_KWD5yPHaqdo,66
39
- lmnr/traceloop_sdk/tracing/attributes.py,sha256=QeqItpCCwUipkwgXG7J7swJCD0yk9uuI28aepPhemtE,1201
39
+ lmnr/traceloop_sdk/tracing/attributes.py,sha256=h970zmb7yTszzf2oHBfOY3cDYhE6O7LhkiHLqa_7x1k,1261
40
40
  lmnr/traceloop_sdk/tracing/content_allow_list.py,sha256=3feztm6PBWNelc8pAZUcQyEGyeSpNiVKjOaDk65l2ps,846
41
41
  lmnr/traceloop_sdk/tracing/context_manager.py,sha256=csVlB6kDmbgSPsROHwnddvGGblx55v6lJMRj0wsSMQM,304
42
- lmnr/traceloop_sdk/tracing/tracing.py,sha256=hFqTp7OGMCZnfxVtrmRq3wP3Ph5YvHq3fz9p00_Yk-Q,29433
42
+ lmnr/traceloop_sdk/tracing/tracing.py,sha256=Wo3ooDmuUiiqIA7ULpDCjxP6Z5UFu7Ai5ViSFLwYV8Q,28741
43
43
  lmnr/traceloop_sdk/utils/__init__.py,sha256=pNhf0G3vTd5ccoc03i1MXDbricSaiqCbi1DLWhSekK8,604
44
44
  lmnr/traceloop_sdk/utils/in_memory_span_exporter.py,sha256=H_4TRaThMO1H6vUQ0OpQvzJk_fZH0OOsRAM1iZQXsR8,2112
45
45
  lmnr/traceloop_sdk/utils/json_encoder.py,sha256=dK6b_axr70IYL7Vv-bu4wntvDDuyntoqsHaddqX7P58,463
46
46
  lmnr/traceloop_sdk/utils/package_check.py,sha256=TZSngzJOpFhfUZLXIs38cpMxQiZSmp0D-sCrIyhz7BA,251
47
47
  lmnr/traceloop_sdk/version.py,sha256=OlatFEFA4ttqSSIiV8jdE-sq3KG5zu2hnC4B4mzWF3s,23
48
- lmnr-0.4.29b4.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
49
- lmnr-0.4.29b4.dist-info/METADATA,sha256=53KiGgrHeSgY70axr-MDp-WIG13xjz1kR0m35BslQXY,10690
50
- lmnr-0.4.29b4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
51
- lmnr-0.4.29b4.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
52
- lmnr-0.4.29b4.dist-info/RECORD,,
48
+ lmnr-0.4.31.dist-info/LICENSE,sha256=67b_wJHVV1CBaWkrKFWU1wyqTPSdzH77Ls-59631COg,10411
49
+ lmnr-0.4.31.dist-info/METADATA,sha256=B-4622Jd4h5dX-iOELI_q8ovk30KRW4fIsdA0cGzZ3A,10273
50
+ lmnr-0.4.31.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
51
+ lmnr-0.4.31.dist-info/entry_points.txt,sha256=K1jE20ww4jzHNZLnsfWBvU3YKDGBgbOiYG5Y7ivQcq4,37
52
+ lmnr-0.4.31.dist-info/RECORD,,
File without changes