lmnr 0.7.5__py3-none-any.whl → 0.7.6__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.
@@ -11,6 +11,10 @@ from lmnr.opentelemetry_lib.tracing.context import get_event_attributes_from_con
11
11
  from lmnr.opentelemetry_lib.utils.package_check import is_package_installed
12
12
  from lmnr.sdk.log import get_default_logger
13
13
 
14
+ from lmnr.opentelemetry_lib.opentelemetry.instrumentation.openai import (
15
+ OpenAIInstrumentor,
16
+ )
17
+
14
18
  logger = get_default_logger(__name__)
15
19
 
16
20
  SUPPORTED_CALL_TYPES = ["completion", "acompletion"]
@@ -41,6 +45,17 @@ try:
41
45
  if not hasattr(TracerWrapper, "instance") or TracerWrapper.instance is None:
42
46
  raise ValueError("Laminar must be initialized before LiteLLM callback")
43
47
 
48
+ if is_package_installed("openai"):
49
+ openai_instrumentor = OpenAIInstrumentor()
50
+ if (
51
+ openai_instrumentor
52
+ and openai_instrumentor.is_instrumented_by_opentelemetry
53
+ ):
54
+ logger.info(
55
+ "Disabling OpenTelemetry instrumentation for OpenAI to avoid double-instrumentation of LiteLLM."
56
+ )
57
+ openai_instrumentor.uninstrument()
58
+
44
59
  def _get_tracer(self) -> Tracer:
45
60
  if not hasattr(TracerWrapper, "instance") or TracerWrapper.instance is None:
46
61
  raise ValueError("Laminar must be initialized before LiteLLM callback")
@@ -2,6 +2,8 @@ from typing import Collection
2
2
 
3
3
  from opentelemetry._events import get_event_logger
4
4
  from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
5
+
6
+ from lmnr.sdk.log import get_default_logger
5
7
  from ..shared.chat_wrappers import (
6
8
  achat_wrapper,
7
9
  chat_wrapper,
@@ -44,6 +46,7 @@ from wrapt import wrap_function_wrapper
44
46
 
45
47
 
46
48
  _instruments = ("openai >= 1.0.0",)
49
+ logger = get_default_logger(__name__)
47
50
 
48
51
 
49
52
  class OpenAIV1Instrumentor(BaseInstrumentor):
@@ -63,7 +66,8 @@ class OpenAIV1Instrumentor(BaseInstrumentor):
63
66
  """
64
67
  try:
65
68
  wrap_function_wrapper(module, function, wrapper)
66
- except (AttributeError, ModuleNotFoundError):
69
+ except (AttributeError, ModuleNotFoundError, ImportError):
70
+ logger.debug(f"Failed to wrap {module}.{function}")
67
71
  pass
68
72
 
69
73
  def _instrument(self, **kwargs):
@@ -331,28 +335,34 @@ class OpenAIV1Instrumentor(BaseInstrumentor):
331
335
  )
332
336
 
333
337
  def _uninstrument(self, **kwargs):
334
- unwrap("openai.resources.chat.completions", "Completions.create")
335
- unwrap("openai.resources.completions", "Completions.create")
336
- unwrap("openai.resources.embeddings", "Embeddings.create")
337
- unwrap("openai.resources.chat.completions", "AsyncCompletions.create")
338
- unwrap("openai.resources.completions", "AsyncCompletions.create")
339
- unwrap("openai.resources.embeddings", "AsyncEmbeddings.create")
340
- unwrap("openai.resources.images", "Images.generate")
338
+ self.try_unwrap("openai.resources.chat.completions.Completions", "create")
339
+ self.try_unwrap("openai.resources.completions.Completions", "create")
340
+ self.try_unwrap("openai.resources.embeddings.Embeddings", "create")
341
+ self.try_unwrap("openai.resources.chat.completions.AsyncCompletions", "create")
342
+ self.try_unwrap("openai.resources.completions.AsyncCompletions", "create")
343
+ self.try_unwrap("openai.resources.embeddings.AsyncEmbeddings", "create")
344
+ self.try_unwrap("openai.resources.images.Images", "generate")
345
+ self.try_unwrap("openai.resources.chat.completions.Completions", "parse")
346
+ self.try_unwrap("openai.resources.chat.completions.AsyncCompletions", "parse")
347
+ self.try_unwrap("openai.resources.beta.assistants.Assistants", "create")
348
+ self.try_unwrap("openai.resources.beta.chat.completions.Completions", "parse")
349
+ self.try_unwrap(
350
+ "openai.resources.beta.chat.completions.AsyncCompletions", "parse"
351
+ )
352
+ self.try_unwrap("openai.resources.beta.threads.runs.Runs", "create")
353
+ self.try_unwrap("openai.resources.beta.threads.runs.Runs", "retrieve")
354
+ self.try_unwrap("openai.resources.beta.threads.runs.Runs", "create_and_stream")
355
+ self.try_unwrap("openai.resources.beta.threads.messages.Messages", "list")
356
+ self.try_unwrap("openai.resources.responses.Responses", "create")
357
+ self.try_unwrap("openai.resources.responses.Responses", "retrieve")
358
+ self.try_unwrap("openai.resources.responses.Responses", "cancel")
359
+ self.try_unwrap("openai.resources.responses.AsyncResponses", "create")
360
+ self.try_unwrap("openai.resources.responses.AsyncResponses", "retrieve")
361
+ self.try_unwrap("openai.resources.responses.AsyncResponses", "cancel")
341
362
 
342
- # Beta APIs may not be available consistently in all versions
363
+ def try_unwrap(self, module, function):
343
364
  try:
344
- unwrap("openai.resources.beta.assistants", "Assistants.create")
345
- unwrap("openai.resources.beta.chat.completions", "Completions.parse")
346
- unwrap("openai.resources.beta.chat.completions", "AsyncCompletions.parse")
347
- unwrap("openai.resources.beta.threads.runs", "Runs.create")
348
- unwrap("openai.resources.beta.threads.runs", "Runs.retrieve")
349
- unwrap("openai.resources.beta.threads.runs", "Runs.create_and_stream")
350
- unwrap("openai.resources.beta.threads.messages", "Messages.list")
351
- unwrap("openai.resources.responses", "Responses.create")
352
- unwrap("openai.resources.responses", "Responses.retrieve")
353
- unwrap("openai.resources.responses", "Responses.cancel")
354
- unwrap("openai.resources.responses", "AsyncResponses.create")
355
- unwrap("openai.resources.responses", "AsyncResponses.retrieve")
356
- unwrap("openai.resources.responses", "AsyncResponses.cancel")
357
- except ImportError:
365
+ unwrap(module, function)
366
+ except (AttributeError, ModuleNotFoundError, ImportError):
367
+ logger.debug(f"Failed to unwrap {module}.{function}")
358
368
  pass
@@ -65,7 +65,7 @@ class BrowserUseInstrumentorInitializer(InstrumentorInitializer):
65
65
 
66
66
  return BrowserUseLegacyInstrumentor()
67
67
 
68
- if version and parse(version) >= parse("1.0.0rc1"):
68
+ if version and parse(version) >= parse("0.6.0rc1"):
69
69
  from lmnr.sdk.browser.browser_use_cdp_otel import BrowserUseInstrumentor
70
70
 
71
71
  return BrowserUseInstrumentor(async_client)
@@ -14,8 +14,8 @@ from typing import Collection
14
14
  from wrapt import wrap_function_wrapper
15
15
  import uuid
16
16
 
17
- # Stable versions, e.g. 1.0.0, satisfy this condition too
18
- _instruments = ("browser-use >= 1.0.0rc1",)
17
+ # Stable versions, e.g. 0.6.0, satisfy this condition too
18
+ _instruments = ("browser-use >= 0.6.0rc1",)
19
19
 
20
20
  WRAPPED_METHODS = [
21
21
  {
lmnr/version.py CHANGED
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.7.5"
6
+ __version__ = "0.7.6"
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.4
2
2
  Name: lmnr
3
- Version: 0.7.5
3
+ Version: 0.7.6
4
4
  Summary: Python SDK for Laminar
5
5
  Author: lmnr.ai
6
6
  Author-email: lmnr.ai <founders@lmnr.ai>
@@ -3,7 +3,7 @@ lmnr/cli.py,sha256=b8780b51f37fe9e20db5495c41d3ad3837f6b48f408b09a58688d017850c0
3
3
  lmnr/opentelemetry_lib/.flake8,sha256=6c2c6e0e51b1dd8439e501ca3e21899277076a787da868d0254ba37056b79405,150
4
4
  lmnr/opentelemetry_lib/__init__.py,sha256=1350e8d12ea2f422751ab3a80d7d32d10c27ad8e4c2989407771dc6e544d9c65,2350
5
5
  lmnr/opentelemetry_lib/decorators/__init__.py,sha256=e2ddd9252e0f3d82601081d655342af56413e09dc827ac07f66b51d3b575156e,11814
6
- lmnr/opentelemetry_lib/litellm/__init__.py,sha256=8a3679381ca5660cf53e4b7571850906c6635264129149adebda8f3f7c248f68,15127
6
+ lmnr/opentelemetry_lib/litellm/__init__.py,sha256=c72a5d23eb14f03926e713b70acf2c67063f74678c2dfd5824f1bdbc8ce1900f,15723
7
7
  lmnr/opentelemetry_lib/litellm/utils.py,sha256=da8cf0553f82dc7203109f117a4c7b4185e8baf34caad12d7823875515201a27,539
8
8
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py,sha256=2604189b7598edb5404ddbcd0775bdf2dc506dd5e6319eef4e4724e39c420301,23276
9
9
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py,sha256=972919b821b9b7e5dc7cd191ba7e78b30b6efa5d63514e8cb301996d6386392c,369
@@ -37,7 +37,7 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.
37
37
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py,sha256=9650a0e4ad2d3bfb2a072590da189bcf4f807aca070945af26a9f9b99d779b77,2021
38
38
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py,sha256=541e94d60c94b8a8035ee74cda00ca3576a3f50a215df03d948de58665dbc25b,4649
39
39
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py,sha256=7f43421e052bd8f64d5d5b03170a3b7187c2ce038362fa15b5d1d0c43bc1a40d,6143
40
- lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py,sha256=662afd935c52b42512280614bf502554389c8854ab1256efbfde03fe364dac64,12932
40
+ lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py,sha256=7bdbf691ac89efb42ade686b7dbe69bd139a84f48482a013b7b68d3baa5b9c98,13527
41
41
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py,sha256=558036c734559b3526647c1b18cfb986699e8fb322855af72ea054c2e458f721,10404
42
42
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py,sha256=4809cde003e5892822828b373aa3e43a8adbaee4ff443f198401003f43c15e8a,4366
43
43
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py,sha256=b3853c60c58a36ba64de184211ac2d112bb8b53c4af62f0fc716fb87d168fd4b,24790
@@ -46,7 +46,7 @@ lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py,s
46
46
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py,sha256=764e4fe979fb08d7821419a3cc5c3ae89a6664b626ef928259f8f175c939eaea,6334
47
47
  lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py,sha256=90aa8558467d7e469fe1a6c75372c113da403557715f03b522b2fab94b287c40,6320
48
48
  lmnr/opentelemetry_lib/tracing/__init__.py,sha256=b96aee7590af1853fffc4c3d8ce9127a67e1ce589f695a99aabe6b37d70b0e48,10203
49
- lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=9f422e61e58045270b9deceec6bf2dd246b500cffa3540eecfa1ba809603c87e,14830
49
+ lmnr/opentelemetry_lib/tracing/_instrument_initializers.py,sha256=dfeace460aa0daceb34266f93321acdce6b61847ad2113f428a8cd9493a93a55,14830
50
50
  lmnr/opentelemetry_lib/tracing/attributes.py,sha256=a879e337ff4e8569a4454544d303ccbc3b04bd42e1cdb765eb563aeaa08f731d,1653
51
51
  lmnr/opentelemetry_lib/tracing/context.py,sha256=83f842be0fc29a96647cbf005c39ea761b0fb5913c4102f965411f47906a6135,4103
52
52
  lmnr/opentelemetry_lib/tracing/exporter.py,sha256=6af8e61fd873e8f5db315d9b9f1edbf46b860ba7e50140f0bdcc6864c6d35a03,2082
@@ -59,7 +59,7 @@ lmnr/opentelemetry_lib/utils/package_check.py,sha256=f8274186c96815c996a25fae06b
59
59
  lmnr/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
60
60
  lmnr/sdk/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
61
61
  lmnr/sdk/browser/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
62
- lmnr/sdk/browser/browser_use_cdp_otel.py,sha256=c82ac9ffddd6a406260364b9e1001364521bd15fc1906b1a0ee4c58edb2d3f7b,3210
62
+ lmnr/sdk/browser/browser_use_cdp_otel.py,sha256=aa14e3ea7bd0980a4b1fc2d9a5d40d3815479fe37f2aff989f896f0ad5a63a7d,3210
63
63
  lmnr/sdk/browser/browser_use_otel.py,sha256=e5549878c07bad451efef9f460ce52202284cff50075bce700ca61749102c5eb,5065
64
64
  lmnr/sdk/browser/cdp_utils.py,sha256=3f43e4b9958e752b1b9aa0a3ae6321ef9e1cb66b3f4ca07990584b2c60c17a97,26103
65
65
  lmnr/sdk/browser/patchright_otel.py,sha256=9d22ab1f28f1eddbcfd0032a14fe306bfe00bfc7f11128cb99836c4dd15fb7c8,4800
@@ -91,8 +91,8 @@ lmnr/sdk/laminar.py,sha256=24d680407ce694f1a7ec0e9c0524eae3deb7d638ad5caff3a591d
91
91
  lmnr/sdk/log.py,sha256=9edfd83263f0d4845b1b2d1beeae2b4ed3f8628de941f371a893d72b79c348d4,2213
92
92
  lmnr/sdk/types.py,sha256=f8a8368e225c4d2f82df54d92f029065afb60c3eff494c77c6e574963ed524ff,13454
93
93
  lmnr/sdk/utils.py,sha256=4beb884ae6fbbc7d8cf639b036b726ea6a2a658f0a6386faf5735a13d706a2d8,5039
94
- lmnr/version.py,sha256=84c9d44c77610666978c4e75e31740560d21b0faff8df95ed6df3316e8160296,1321
95
- lmnr-0.7.5.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
96
- lmnr-0.7.5.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
97
- lmnr-0.7.5.dist-info/METADATA,sha256=542b7d75c0834cabd0910070bca43bbea4f62bc8db58eb27ed5c88e437b743a6,14196
98
- lmnr-0.7.5.dist-info/RECORD,,
94
+ lmnr/version.py,sha256=d3747c091ad12262da3123ec8cd3a9ecdd8ee197c270773b4953d9fb342c6c0c,1321
95
+ lmnr-0.7.6.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
96
+ lmnr-0.7.6.dist-info/entry_points.txt,sha256=abdf3411b7dd2d7329a241f2da6669bab4e314a747a586ecdb9f888f3035003c,39
97
+ lmnr-0.7.6.dist-info/METADATA,sha256=2224332cbdca13b77e0b54b575efcc7d7923957dfabc51dfbe9f3988f8bd1ef9,14196
98
+ lmnr-0.7.6.dist-info/RECORD,,
File without changes