lmnr 0.6.13__tar.gz → 0.6.15__tar.gz

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 (59) hide show
  1. {lmnr-0.6.13 → lmnr-0.6.15}/PKG-INFO +1 -1
  2. {lmnr-0.6.13 → lmnr-0.6.15}/pyproject.toml +1 -1
  3. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/pw_utils.py +7 -26
  4. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/evals.py +7 -3
  5. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/evals.py +7 -3
  6. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/evaluations.py +7 -1
  7. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/version.py +1 -1
  8. {lmnr-0.6.13 → lmnr-0.6.15}/LICENSE +0 -0
  9. {lmnr-0.6.13 → lmnr-0.6.15}/README.md +0 -0
  10. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/__init__.py +0 -0
  11. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/cli.py +0 -0
  12. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/.flake8 +0 -0
  13. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/__init__.py +0 -0
  14. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/decorators/__init__.py +0 -0
  15. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/litellm/__init__.py +0 -0
  16. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/litellm/utils.py +0 -0
  17. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +0 -0
  18. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py +0 -0
  19. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +0 -0
  20. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +0 -0
  21. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +0 -0
  22. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/__init__.py +0 -0
  23. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +0 -0
  24. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/attributes.py +0 -0
  25. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/context_properties.py +0 -0
  26. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/exporter.py +0 -0
  27. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/instruments.py +0 -0
  28. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/processor.py +0 -0
  29. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/tracing/tracer.py +0 -0
  30. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/utils/__init__.py +0 -0
  31. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/utils/json_encoder.py +0 -0
  32. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/opentelemetry_lib/utils/package_check.py +0 -0
  33. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/py.typed +0 -0
  34. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/__init__.py +0 -0
  35. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/__init__.py +0 -0
  36. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/browser_use_otel.py +0 -0
  37. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/patchright_otel.py +0 -0
  38. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/playwright_otel.py +0 -0
  39. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -0
  40. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/browser/utils.py +0 -0
  41. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/async_client.py +0 -0
  42. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/__init__.py +0 -0
  43. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/agent.py +0 -0
  44. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/base.py +0 -0
  45. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/browser_events.py +0 -0
  46. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/asynchronous/resources/tags.py +0 -0
  47. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/__init__.py +0 -0
  48. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/agent.py +0 -0
  49. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/base.py +0 -0
  50. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/browser_events.py +0 -0
  51. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/resources/tags.py +0 -0
  52. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/client/synchronous/sync_client.py +0 -0
  53. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/datasets.py +0 -0
  54. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/decorators.py +0 -0
  55. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/eval_control.py +0 -0
  56. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/laminar.py +0 -0
  57. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/log.py +0 -0
  58. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/types.py +0 -0
  59. {lmnr-0.6.13 → lmnr-0.6.15}/src/lmnr/sdk/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lmnr
3
- Version: 0.6.13
3
+ Version: 0.6.15
4
4
  Summary: Python SDK for Laminar
5
5
  License: Apache-2.0
6
6
  Author: lmnr.ai
@@ -6,7 +6,7 @@
6
6
 
7
7
  [project]
8
8
  name = "lmnr"
9
- version = "0.6.13"
9
+ version = "0.6.15"
10
10
  description = "Python SDK for Laminar"
11
11
  authors = [
12
12
  { name = "lmnr.ai", email = "founders@lmnr.ai" }
@@ -45,19 +45,6 @@ INJECT_PLACEHOLDER = """
45
45
 
46
46
  window.lmnrRrwebEventsBatch = new Set();
47
47
 
48
- // Track page focus state
49
- window.lmnrPageIsFocused = true;
50
-
51
- window.addEventListener('blur', () => {
52
- window.lmnrPageIsFocused = false;
53
- console.log('Page lost focus');
54
- });
55
-
56
- window.addEventListener('focus', () => {
57
- window.lmnrPageIsFocused = true;
58
- console.log('Page gained focus');
59
- });
60
-
61
48
  // Utility function to compress individual event data
62
49
  async function compressEventData(data) {
63
50
  const jsonString = JSON.stringify(data);
@@ -76,10 +63,6 @@ INJECT_PLACEHOLDER = """
76
63
 
77
64
  // Add heartbeat events
78
65
  setInterval(async () => {
79
- if (!window.lmnrPageIsFocused) {
80
- return;
81
- }
82
-
83
66
  window.lmnrRrweb.record.addCustomEvent('heartbeat', {
84
67
  title: document.title,
85
68
  url: document.URL,
@@ -88,19 +71,17 @@ INJECT_PLACEHOLDER = """
88
71
  }, 1000);
89
72
 
90
73
  window.lmnrRrweb.record({
91
- async emit(event) {
92
- // Ignore events when page is not focused
93
- if (!window.lmnrPageIsFocused) {
94
- return;
95
- }
96
-
74
+ async emit(event) {
97
75
  // Compress the data field
98
76
  const compressedEvent = {
99
77
  ...event,
100
78
  data: await compressEventData(event.data)
101
79
  };
102
80
  window.lmnrRrwebEventsBatch.add(compressedEvent);
103
- }
81
+ },
82
+ recordCanvas: true,
83
+ collectFonts: true,
84
+ recordCrossOriginIframes: true
104
85
  });
105
86
  }
106
87
  """
@@ -115,7 +96,7 @@ async def send_events_async(
115
96
  events = await page.evaluate(
116
97
  """
117
98
  () => {
118
- if (!window.lmnrPageIsFocused || typeof window.lmnrGetAndClearEvents !== 'function') {
99
+ if (typeof window.lmnrGetAndClearEvents !== 'function') {
119
100
  return [];
120
101
  }
121
102
  return window.lmnrGetAndClearEvents();
@@ -144,7 +125,7 @@ def send_events_sync(
144
125
  events = page.evaluate(
145
126
  """
146
127
  () => {
147
- if (!window.lmnrPageIsFocused || typeof window.lmnrGetAndClearEvents !== 'function') {
128
+ if (typeof window.lmnrGetAndClearEvents !== 'function') {
148
129
  return [];
149
130
  }
150
131
  return window.lmnrGetAndClearEvents();
@@ -15,13 +15,14 @@ class AsyncEvals(BaseAsyncResource):
15
15
  """Resource for interacting with Laminar evaluations API."""
16
16
 
17
17
  async def init(
18
- self, name: str | None = None, group_name: str | None = None
18
+ self, name: str | None = None, group_name: str | None = None, metadata: dict[str, Any] | None = None
19
19
  ) -> InitEvaluationResponse:
20
20
  """Initialize a new evaluation.
21
21
 
22
22
  Args:
23
23
  name (str | None, optional): Name of the evaluation. Defaults to None.
24
24
  group_name (str | None, optional): Group name for the evaluation. Defaults to None.
25
+ metadata (dict[str, Any] | None, optional): Metadata to associate with. Defaults to None.
25
26
 
26
27
  Returns:
27
28
  InitEvaluationResponse: The response from the initialization request.
@@ -31,6 +32,7 @@ class AsyncEvals(BaseAsyncResource):
31
32
  json={
32
33
  "name": name,
33
34
  "groupName": group_name,
35
+ "metadata": metadata,
34
36
  },
35
37
  headers=self._headers(),
36
38
  )
@@ -45,6 +47,7 @@ class AsyncEvals(BaseAsyncResource):
45
47
  self,
46
48
  name: str | None = None,
47
49
  group_name: str | None = None,
50
+ metadata: dict[str, Any] | None = None,
48
51
  ) -> uuid.UUID:
49
52
  """
50
53
  Create a new evaluation and return its ID.
@@ -52,11 +55,12 @@ class AsyncEvals(BaseAsyncResource):
52
55
  Parameters:
53
56
  name (str | None, optional): Optional name of the evaluation.
54
57
  group_name (str | None, optional): An identifier to group evaluations.
55
-
58
+ metadata (dict[str, Any] | None, optional): Metadata to associate with. Defaults to None.
59
+
56
60
  Returns:
57
61
  uuid.UUID: The evaluation ID.
58
62
  """
59
- evaluation = await self.init(name=name, group_name=group_name)
63
+ evaluation = await self.init(name=name, group_name=group_name, metadata=metadata)
60
64
  return evaluation.id
61
65
 
62
66
  async def create_datapoint(
@@ -17,13 +17,14 @@ class Evals(BaseResource):
17
17
  """Resource for interacting with Laminar evaluations API."""
18
18
 
19
19
  def init(
20
- self, name: str | None = None, group_name: str | None = None
20
+ self, name: str | None = None, group_name: str | None = None, metadata: dict[str, Any] | None = None
21
21
  ) -> InitEvaluationResponse:
22
22
  """Initialize a new evaluation.
23
23
 
24
24
  Args:
25
25
  name (str | None, optional): Name of the evaluation. Defaults to None.
26
26
  group_name (str | None, optional): Group name for the evaluation. Defaults to None.
27
+ metadata (dict[str, Any] | None, optional): Metadata to associate with. Defaults to None.
27
28
 
28
29
  Returns:
29
30
  InitEvaluationResponse: The response from the initialization request.
@@ -33,6 +34,7 @@ class Evals(BaseResource):
33
34
  json={
34
35
  "name": name,
35
36
  "groupName": group_name,
37
+ "metadata": metadata,
36
38
  },
37
39
  headers=self._headers(),
38
40
  )
@@ -47,6 +49,7 @@ class Evals(BaseResource):
47
49
  self,
48
50
  name: str | None = None,
49
51
  group_name: str | None = None,
52
+ metadata: dict[str, Any] | None = None,
50
53
  ) -> uuid.UUID:
51
54
  """
52
55
  Create a new evaluation and return its ID.
@@ -54,11 +57,12 @@ class Evals(BaseResource):
54
57
  Parameters:
55
58
  name (str | None, optional): Optional name of the evaluation.
56
59
  group_name (str | None, optional): An identifier to group evaluations.
57
-
60
+ metadata (dict[str, Any] | None, optional): Metadata to associate with. Defaults to None.
61
+
58
62
  Returns:
59
63
  uuid.UUID: The evaluation ID.
60
64
  """
61
- evaluation = self.init(name=name, group_name=group_name)
65
+ evaluation = self.init(name=name, group_name=group_name, metadata=metadata)
62
66
  return evaluation.id
63
67
 
64
68
  def create_datapoint(
@@ -104,6 +104,7 @@ class Evaluation:
104
104
  evaluators: dict[str, EvaluatorFunction | HumanEvaluator],
105
105
  name: str | None = None,
106
106
  group_name: str | None = None,
107
+ metadata: dict[str, Any] | None = None,
107
108
  concurrency_limit: int = DEFAULT_BATCH_SIZE,
108
109
  project_api_key: str | None = None,
109
110
  base_url: str | None = None,
@@ -143,6 +144,7 @@ class Evaluation:
143
144
  evaluations. Only evaluations within the same group_name can be\
144
145
  visually compared. If not provided, "default" is assigned.
145
146
  Defaults to None
147
+ metadata (dict[str, Any] | None): optional metadata to associate with\
146
148
  concurrency_limit (int, optional): The concurrency limit for\
147
149
  evaluation. This many data points will be evaluated in parallel\
148
150
  with a pool of workers.
@@ -192,6 +194,7 @@ class Evaluation:
192
194
  self.evaluators = evaluators
193
195
  self.group_name = group_name
194
196
  self.name = name
197
+ self.metadata = metadata
195
198
  self.concurrency_limit = concurrency_limit
196
199
  self.batch_size = concurrency_limit
197
200
  self._logger = get_default_logger(self.__class__.__name__)
@@ -242,7 +245,7 @@ class Evaluation:
242
245
  self.reporter.start(len(self.data))
243
246
  try:
244
247
  evaluation = await self.client.evals.init(
245
- name=self.name, group_name=self.group_name
248
+ name=self.name, group_name=self.group_name, metadata=self.metadata
246
249
  )
247
250
  result_datapoints = await self._evaluate_in_batches(evaluation.id)
248
251
 
@@ -409,6 +412,7 @@ def evaluate(
409
412
  evaluators: dict[str, EvaluatorFunction | HumanEvaluator],
410
413
  name: str | None = None,
411
414
  group_name: str | None = None,
415
+ metadata: dict[str, Any] | None = None,
412
416
  concurrency_limit: int = DEFAULT_BATCH_SIZE,
413
417
  project_api_key: str | None = None,
414
418
  base_url: str | None = None,
@@ -452,6 +456,7 @@ def evaluate(
452
456
  Only evaluations within the same group_name can be visually compared.\
453
457
  If not provided, set to "default".
454
458
  Defaults to None
459
+ metadata (dict[str, Any] | None, optional): Optional metadata to associate with\
455
460
  concurrency_limit (int, optional): The concurrency limit for evaluation.
456
461
  Defaults to DEFAULT_BATCH_SIZE.
457
462
  project_api_key (str | None, optional): The project API key.
@@ -478,6 +483,7 @@ def evaluate(
478
483
  executor=executor,
479
484
  evaluators=evaluators,
480
485
  group_name=group_name,
486
+ metadata=metadata,
481
487
  name=name,
482
488
  concurrency_limit=concurrency_limit,
483
489
  project_api_key=project_api_key,
@@ -3,7 +3,7 @@ import httpx
3
3
  from packaging import version
4
4
 
5
5
 
6
- __version__ = "0.6.13"
6
+ __version__ = "0.6.15"
7
7
  PYTHON_VERSION = f"{sys.version_info.major}.{sys.version_info.minor}"
8
8
 
9
9
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes