lmnr 0.6.20__py3-none-any.whl → 0.7.0__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.
Files changed (46) hide show
  1. lmnr/__init__.py +0 -4
  2. lmnr/opentelemetry_lib/decorators/__init__.py +211 -151
  3. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/__init__.py +678 -0
  4. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/config.py +13 -0
  5. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_emitter.py +211 -0
  6. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/event_models.py +41 -0
  7. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/span_utils.py +256 -0
  8. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/streaming.py +295 -0
  9. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/utils.py +179 -0
  10. lmnr/opentelemetry_lib/opentelemetry/instrumentation/anthropic/version.py +1 -0
  11. lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +4 -0
  12. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/__init__.py +488 -0
  13. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/config.py +8 -0
  14. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_emitter.py +143 -0
  15. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/event_models.py +41 -0
  16. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/span_utils.py +229 -0
  17. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/utils.py +92 -0
  18. lmnr/opentelemetry_lib/opentelemetry/instrumentation/groq/version.py +1 -0
  19. lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +16 -16
  20. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +3 -0
  21. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +3 -0
  22. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +3 -3
  23. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +3 -0
  24. lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +7 -0
  25. lmnr/opentelemetry_lib/opentelemetry/instrumentation/threading/__init__.py +190 -0
  26. lmnr/opentelemetry_lib/tracing/__init__.py +90 -2
  27. lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +12 -7
  28. lmnr/opentelemetry_lib/tracing/context.py +109 -0
  29. lmnr/opentelemetry_lib/tracing/processor.py +6 -7
  30. lmnr/opentelemetry_lib/tracing/tracer.py +29 -0
  31. lmnr/opentelemetry_lib/utils/package_check.py +9 -0
  32. lmnr/sdk/browser/browser_use_otel.py +9 -7
  33. lmnr/sdk/browser/patchright_otel.py +14 -26
  34. lmnr/sdk/browser/playwright_otel.py +72 -73
  35. lmnr/sdk/browser/pw_utils.py +436 -119
  36. lmnr/sdk/client/asynchronous/resources/browser_events.py +1 -0
  37. lmnr/sdk/decorators.py +39 -4
  38. lmnr/sdk/evaluations.py +23 -9
  39. lmnr/sdk/laminar.py +181 -209
  40. lmnr/sdk/types.py +0 -6
  41. lmnr/version.py +1 -1
  42. {lmnr-0.6.20.dist-info → lmnr-0.7.0.dist-info}/METADATA +10 -8
  43. {lmnr-0.6.20.dist-info → lmnr-0.7.0.dist-info}/RECORD +45 -29
  44. {lmnr-0.6.20.dist-info → lmnr-0.7.0.dist-info}/WHEEL +1 -1
  45. lmnr/opentelemetry_lib/tracing/context_properties.py +0 -65
  46. {lmnr-0.6.20.dist-info → lmnr-0.7.0.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from lmnr.sdk.browser.playwright_otel import (
2
- _wrap_new_page,
3
- _wrap_new_page_async,
2
+ _wrap_bring_to_front_async,
3
+ _wrap_bring_to_front_sync,
4
4
  _wrap_new_browser_sync,
5
5
  _wrap_new_browser_async,
6
6
  _wrap_new_context_sync,
@@ -18,18 +18,6 @@ from wrapt import wrap_function_wrapper
18
18
  _instruments = ("patchright >= 1.9.0",)
19
19
 
20
20
  WRAPPED_METHODS = [
21
- {
22
- "package": "patchright.sync_api",
23
- "object": "BrowserContext",
24
- "method": "new_page",
25
- "wrapper": _wrap_new_page,
26
- },
27
- {
28
- "package": "patchright.sync_api",
29
- "object": "Browser",
30
- "method": "new_page",
31
- "wrapper": _wrap_new_page,
32
- },
33
21
  {
34
22
  "package": "patchright.sync_api",
35
23
  "object": "BrowserType",
@@ -60,21 +48,15 @@ WRAPPED_METHODS = [
60
48
  "method": "launch_persistent_context",
61
49
  "wrapper": _wrap_new_context_sync,
62
50
  },
51
+ {
52
+ "package": "patchright.sync_api",
53
+ "object": "Page",
54
+ "method": "bring_to_front",
55
+ "wrapper": _wrap_bring_to_front_sync,
56
+ },
63
57
  ]
64
58
 
65
59
  WRAPPED_METHODS_ASYNC = [
66
- {
67
- "package": "patchright.async_api",
68
- "object": "BrowserContext",
69
- "method": "new_page",
70
- "wrapper": _wrap_new_page_async,
71
- },
72
- {
73
- "package": "patchright.async_api",
74
- "object": "Browser",
75
- "method": "new_page",
76
- "wrapper": _wrap_new_page_async,
77
- },
78
60
  {
79
61
  "package": "patchright.async_api",
80
62
  "object": "BrowserType",
@@ -105,6 +87,12 @@ WRAPPED_METHODS_ASYNC = [
105
87
  "method": "launch_persistent_context",
106
88
  "wrapper": _wrap_new_context_async,
107
89
  },
90
+ {
91
+ "package": "patchright.async_api",
92
+ "object": "Page",
93
+ "method": "bring_to_front",
94
+ "wrapper": _wrap_bring_to_front_async,
95
+ },
108
96
  ]
109
97
 
110
98
 
@@ -2,7 +2,12 @@ import logging
2
2
  import uuid
3
3
 
4
4
  from lmnr.opentelemetry_lib.utils.package_check import is_package_installed
5
- from lmnr.sdk.browser.pw_utils import handle_navigation_async, handle_navigation_sync
5
+ from lmnr.sdk.browser.pw_utils import (
6
+ start_recording_events_async,
7
+ start_recording_events_sync,
8
+ take_full_snapshot,
9
+ take_full_snapshot_async,
10
+ )
6
11
  from lmnr.sdk.browser.utils import with_tracer_and_client_wrapper
7
12
  from lmnr.sdk.client.asynchronous.async_client import AsyncLaminarClient
8
13
  from lmnr.sdk.client.synchronous.sync_client import LaminarClient
@@ -19,18 +24,16 @@ from wrapt import wrap_function_wrapper
19
24
 
20
25
  try:
21
26
  if is_package_installed("playwright"):
22
- from playwright.async_api import Browser, BrowserContext, Page
27
+ from playwright.async_api import Browser, BrowserContext
23
28
  from playwright.sync_api import (
24
29
  Browser as SyncBrowser,
25
30
  BrowserContext as SyncBrowserContext,
26
- Page as SyncPage,
27
31
  )
28
32
  elif is_package_installed("patchright"):
29
- from patchright.async_api import Browser, BrowserContext, Page
33
+ from patchright.async_api import Browser, BrowserContext
30
34
  from patchright.sync_api import (
31
35
  Browser as SyncBrowser,
32
36
  BrowserContext as SyncBrowserContext,
33
- Page as SyncPage,
34
37
  )
35
38
  else:
36
39
  raise ImportError(
@@ -50,44 +53,25 @@ _instruments = ("playwright >= 1.9.0",)
50
53
  logger = logging.getLogger(__name__)
51
54
 
52
55
 
53
- @with_tracer_and_client_wrapper
54
- def _wrap_new_page(
55
- tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
56
- ):
57
- page = wrapped(*args, **kwargs)
58
- session_id = str(uuid.uuid4().hex)
59
- handle_navigation_sync(page, session_id, client)
60
- return page
61
-
62
-
63
- @with_tracer_and_client_wrapper
64
- async def _wrap_new_page_async(
65
- tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
66
- ):
67
- page = await wrapped(*args, **kwargs)
68
- session_id = str(uuid.uuid4().hex)
69
- await handle_navigation_async(page, session_id, client)
70
- return page
71
-
72
-
73
56
  @with_tracer_and_client_wrapper
74
57
  def _wrap_new_browser_sync(
75
58
  tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
76
59
  ):
77
60
  browser: SyncBrowser = wrapped(*args, **kwargs)
78
61
  session_id = str(uuid.uuid4().hex)
79
- for context in browser.contexts:
80
62
 
81
- def handle_page_navigation(page: SyncPage):
82
- return handle_navigation_sync(page, session_id, client)
63
+ def create_page_handler(session_id, client):
64
+ def page_handler(page):
65
+ start_recording_events_sync(page, session_id, client)
83
66
 
84
- context.on(
85
- "page",
86
- handle_page_navigation,
87
- )
67
+ return page_handler
88
68
 
69
+ for context in browser.contexts:
70
+ page_handler = create_page_handler(session_id, client)
71
+ context.on("page", page_handler)
89
72
  for page in context.pages:
90
- handle_navigation_sync(page, session_id, client)
73
+ start_recording_events_sync(page, session_id, client)
74
+
91
75
  return browser
92
76
 
93
77
 
@@ -97,14 +81,18 @@ async def _wrap_new_browser_async(
97
81
  ):
98
82
  browser: Browser = await wrapped(*args, **kwargs)
99
83
  session_id = str(uuid.uuid4().hex)
100
- for context in browser.contexts:
101
84
 
102
- async def handle_page_navigation(page: Page):
103
- return await handle_navigation_async(page, session_id, client)
85
+ def create_page_handler(session_id, client):
86
+ async def page_handler(page):
87
+ await start_recording_events_async(page, session_id, client)
104
88
 
105
- context.on("page", handle_page_navigation)
89
+ return page_handler
90
+
91
+ for context in browser.contexts:
92
+ page_handler = create_page_handler(session_id, client)
93
+ context.on("page", page_handler)
106
94
  for page in context.pages:
107
- await handle_navigation_async(page, session_id, client)
95
+ await start_recording_events_async(page, session_id, client)
108
96
  return browser
109
97
 
110
98
 
@@ -115,15 +103,17 @@ def _wrap_new_context_sync(
115
103
  context: SyncBrowserContext = wrapped(*args, **kwargs)
116
104
  session_id = str(uuid.uuid4().hex)
117
105
 
118
- def handle_page_navigation(page: SyncPage):
119
- return handle_navigation_sync(page, session_id, client)
106
+ def create_page_handler(session_id, client):
107
+ def page_handler(page):
108
+ start_recording_events_sync(page, session_id, client)
109
+
110
+ return page_handler
120
111
 
121
- context.on(
122
- "page",
123
- handle_page_navigation,
124
- )
112
+ page_handler = create_page_handler(session_id, client)
113
+ context.on("page", page_handler)
125
114
  for page in context.pages:
126
- handle_navigation_sync(page, session_id, client)
115
+ start_recording_events_sync(page, session_id, client)
116
+
127
117
  return context
128
118
 
129
119
 
@@ -134,28 +124,37 @@ async def _wrap_new_context_async(
134
124
  context: BrowserContext = await wrapped(*args, **kwargs)
135
125
  session_id = str(uuid.uuid4().hex)
136
126
 
137
- async def handle_page_navigation(page):
138
- return await handle_navigation_async(page, session_id, client)
127
+ def create_page_handler(session_id, client):
128
+ async def page_handler(page):
129
+ await start_recording_events_async(page, session_id, client)
130
+
131
+ return page_handler
139
132
 
140
- context.on("page", handle_page_navigation)
133
+ page_handler = create_page_handler(session_id, client)
134
+ context.on("page", page_handler)
141
135
  for page in context.pages:
142
- await handle_navigation_async(page, session_id, client)
136
+ await start_recording_events_async(page, session_id, client)
137
+
143
138
  return context
144
139
 
145
140
 
141
+ @with_tracer_and_client_wrapper
142
+ def _wrap_bring_to_front_sync(
143
+ tracer: Tracer, client: LaminarClient, to_wrap, wrapped, instance, args, kwargs
144
+ ):
145
+ wrapped(*args, **kwargs)
146
+ take_full_snapshot(instance)
147
+
148
+
149
+ @with_tracer_and_client_wrapper
150
+ async def _wrap_bring_to_front_async(
151
+ tracer: Tracer, client: AsyncLaminarClient, to_wrap, wrapped, instance, args, kwargs
152
+ ):
153
+ await wrapped(*args, **kwargs)
154
+ await take_full_snapshot_async(instance)
155
+
156
+
146
157
  WRAPPED_METHODS = [
147
- {
148
- "package": "playwright.sync_api",
149
- "object": "BrowserContext",
150
- "method": "new_page",
151
- "wrapper": _wrap_new_page,
152
- },
153
- {
154
- "package": "playwright.sync_api",
155
- "object": "Browser",
156
- "method": "new_page",
157
- "wrapper": _wrap_new_page,
158
- },
159
158
  {
160
159
  "package": "playwright.sync_api",
161
160
  "object": "BrowserType",
@@ -186,21 +185,15 @@ WRAPPED_METHODS = [
186
185
  "method": "launch_persistent_context",
187
186
  "wrapper": _wrap_new_context_sync,
188
187
  },
188
+ {
189
+ "package": "playwright.sync_api",
190
+ "object": "Page",
191
+ "method": "bring_to_front",
192
+ "wrapper": _wrap_bring_to_front_sync,
193
+ },
189
194
  ]
190
195
 
191
196
  WRAPPED_METHODS_ASYNC = [
192
- {
193
- "package": "playwright.async_api",
194
- "object": "BrowserContext",
195
- "method": "new_page",
196
- "wrapper": _wrap_new_page_async,
197
- },
198
- {
199
- "package": "playwright.async_api",
200
- "object": "Browser",
201
- "method": "new_page",
202
- "wrapper": _wrap_new_page_async,
203
- },
204
197
  {
205
198
  "package": "playwright.async_api",
206
199
  "object": "BrowserType",
@@ -231,6 +224,12 @@ WRAPPED_METHODS_ASYNC = [
231
224
  "method": "launch_persistent_context",
232
225
  "wrapper": _wrap_new_context_async,
233
226
  },
227
+ {
228
+ "package": "playwright.async_api",
229
+ "object": "Page",
230
+ "method": "bring_to_front",
231
+ "wrapper": _wrap_bring_to_front_async,
232
+ },
234
233
  ]
235
234
 
236
235