lmnr 0.6.17__tar.gz → 0.6.19__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 (78) hide show
  1. {lmnr-0.6.17 → lmnr-0.6.19}/PKG-INFO +70 -80
  2. {lmnr-0.6.17 → lmnr-0.6.19}/pyproject.toml +8 -14
  3. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/__init__.py +55 -20
  4. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/schema_utils.py +23 -0
  5. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/__init__.py +61 -0
  6. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/__init__.py +442 -0
  7. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/chat_wrappers.py +1024 -0
  8. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/completion_wrappers.py +297 -0
  9. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/config.py +16 -0
  10. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/embeddings_wrappers.py +308 -0
  11. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_emitter.py +100 -0
  12. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/event_models.py +41 -0
  13. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/shared/image_gen_wrappers.py +68 -0
  14. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/utils.py +185 -0
  15. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v0/__init__.py +176 -0
  16. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/__init__.py +358 -0
  17. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/assistant_wrappers.py +319 -0
  18. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/event_handler_wrapper.py +132 -0
  19. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/v1/responses_wrappers.py +626 -0
  20. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/openai/version.py +1 -0
  21. lmnr-0.6.19/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/opentelemetry/__init__.py +69 -0
  22. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/_instrument_initializers.py +12 -3
  23. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/instruments.py +7 -0
  24. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/browser_use_otel.py +1 -1
  25. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/patchright_otel.py +0 -14
  26. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/playwright_otel.py +16 -130
  27. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/pw_utils.py +45 -31
  28. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/version.py +1 -1
  29. lmnr-0.6.17/LICENSE +0 -75
  30. {lmnr-0.6.17 → lmnr-0.6.19}/README.md +0 -0
  31. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/__init__.py +0 -0
  32. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/cli.py +0 -0
  33. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/.flake8 +0 -0
  34. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/__init__.py +0 -0
  35. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/decorators/__init__.py +0 -0
  36. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/litellm/__init__.py +0 -0
  37. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/litellm/utils.py +0 -0
  38. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/config.py +0 -0
  39. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/google_genai/utils.py +0 -0
  40. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/__init__.py +0 -0
  41. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/langgraph/utils.py +0 -0
  42. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/opentelemetry/instrumentation/skyvern/__init__.py +0 -0
  43. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/__init__.py +0 -0
  44. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/attributes.py +0 -0
  45. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/context_properties.py +0 -0
  46. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/exporter.py +0 -0
  47. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/processor.py +0 -0
  48. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/tracing/tracer.py +0 -0
  49. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/utils/__init__.py +0 -0
  50. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/utils/json_encoder.py +0 -0
  51. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/opentelemetry_lib/utils/package_check.py +0 -0
  52. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/py.typed +0 -0
  53. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/__init__.py +0 -0
  54. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/__init__.py +0 -0
  55. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/rrweb/rrweb.umd.min.cjs +0 -0
  56. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/browser/utils.py +0 -0
  57. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/async_client.py +0 -0
  58. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/__init__.py +0 -0
  59. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/agent.py +0 -0
  60. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/base.py +0 -0
  61. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/browser_events.py +0 -0
  62. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/evals.py +0 -0
  63. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/asynchronous/resources/tags.py +0 -0
  64. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/__init__.py +0 -0
  65. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/agent.py +0 -0
  66. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/base.py +0 -0
  67. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/browser_events.py +0 -0
  68. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/evals.py +0 -0
  69. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/resources/tags.py +0 -0
  70. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/client/synchronous/sync_client.py +0 -0
  71. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/datasets.py +0 -0
  72. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/decorators.py +0 -0
  73. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/eval_control.py +0 -0
  74. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/evaluations.py +0 -0
  75. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/laminar.py +0 -0
  76. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/log.py +0 -0
  77. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/types.py +0 -0
  78. {lmnr-0.6.17 → lmnr-0.6.19}/src/lmnr/sdk/utils.py +0 -0
@@ -1,17 +1,76 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: lmnr
3
- Version: 0.6.17
3
+ Version: 0.6.19
4
4
  Summary: Python SDK for Laminar
5
- License: Apache-2.0
6
5
  Author: lmnr.ai
7
- Author-email: founders@lmnr.ai
8
- Requires-Python: >=3.10,<4
9
- Classifier: License :: OSI Approved :: Apache Software License
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.10
12
- Classifier: Programming Language :: Python :: 3.11
13
- Classifier: Programming Language :: Python :: 3.12
14
- Classifier: Programming Language :: Python :: 3.13
6
+ Author-email: lmnr.ai <founders@lmnr.ai>
7
+ License-Expression: Apache-2.0
8
+ Requires-Dist: pydantic>=2.0.3,<3.0.0
9
+ Requires-Dist: python-dotenv>=1.0
10
+ Requires-Dist: opentelemetry-api>=1.33.0
11
+ Requires-Dist: opentelemetry-sdk>=1.33.0
12
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.33.0
13
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.33.0
14
+ Requires-Dist: opentelemetry-semantic-conventions>=0.54b0
15
+ Requires-Dist: opentelemetry-semantic-conventions-ai>=0.4.9
16
+ Requires-Dist: tqdm>=4.0
17
+ Requires-Dist: tenacity>=8.0
18
+ Requires-Dist: grpcio>=1
19
+ Requires-Dist: httpx>=0.25.0
20
+ Requires-Dist: opentelemetry-instrumentation-threading>=0.54b0
21
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'alephalpha'
22
+ Requires-Dist: opentelemetry-instrumentation-alephalpha>=0.40.12 ; extra == 'all'
23
+ Requires-Dist: opentelemetry-instrumentation-anthropic>=0.40.12 ; extra == 'all'
24
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'all'
25
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'all'
26
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'all'
27
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'all'
28
+ Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'all'
29
+ Requires-Dist: opentelemetry-instrumentation-groq>=0.40.12 ; extra == 'all'
30
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'all'
31
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'all'
32
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'all'
33
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.40.12 ; extra == 'all'
34
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.40.12 ; extra == 'all'
35
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'all'
36
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'all'
37
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'all'
38
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'all'
39
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'all'
40
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'all'
41
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'all'
42
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.40.12 ; extra == 'all'
43
+ Requires-Dist: opentelemetry-instrumentation-together>=0.40.12 ; extra == 'all'
44
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.40.12 ; extra == 'all'
45
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.40.12 ; extra == 'all'
46
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.40.12 ; extra == 'all'
47
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'all'
48
+ Requires-Dist: opentelemetry-instrumentation-anthropic>=0.40.12 ; extra == 'anthropic'
49
+ Requires-Dist: opentelemetry-instrumentation-bedrock>=0.40.12 ; extra == 'bedrock'
50
+ Requires-Dist: opentelemetry-instrumentation-chromadb>=0.40.12 ; extra == 'chromadb'
51
+ Requires-Dist: opentelemetry-instrumentation-cohere>=0.40.12 ; extra == 'cohere'
52
+ Requires-Dist: opentelemetry-instrumentation-crewai>=0.40.12 ; extra == 'crewai'
53
+ Requires-Dist: opentelemetry-instrumentation-google-generativeai<0.40.10 ; extra == 'google-generativeai'
54
+ Requires-Dist: opentelemetry-instrumentation-groq>=0.40.12 ; extra == 'groq'
55
+ Requires-Dist: opentelemetry-instrumentation-haystack>=0.40.12 ; extra == 'haystack'
56
+ Requires-Dist: opentelemetry-instrumentation-lancedb>=0.40.12 ; extra == 'lancedb'
57
+ Requires-Dist: opentelemetry-instrumentation-langchain>=0.40.12 ; extra == 'langchain'
58
+ Requires-Dist: opentelemetry-instrumentation-llamaindex>=0.40.12 ; extra == 'llamaindex'
59
+ Requires-Dist: opentelemetry-instrumentation-marqo>=0.40.12 ; extra == 'marqo'
60
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.12 ; extra == 'mcp'
61
+ Requires-Dist: opentelemetry-instrumentation-milvus>=0.40.12 ; extra == 'milvus'
62
+ Requires-Dist: opentelemetry-instrumentation-mistralai>=0.40.12 ; extra == 'mistralai'
63
+ Requires-Dist: opentelemetry-instrumentation-ollama>=0.40.12 ; extra == 'ollama'
64
+ Requires-Dist: opentelemetry-instrumentation-pinecone>=0.40.12 ; extra == 'pinecone'
65
+ Requires-Dist: opentelemetry-instrumentation-qdrant>=0.40.12 ; extra == 'qdrant'
66
+ Requires-Dist: opentelemetry-instrumentation-replicate>=0.40.12 ; extra == 'replicate'
67
+ Requires-Dist: opentelemetry-instrumentation-sagemaker>=0.40.12 ; extra == 'sagemaker'
68
+ Requires-Dist: opentelemetry-instrumentation-together>=0.40.12 ; extra == 'together'
69
+ Requires-Dist: opentelemetry-instrumentation-transformers>=0.40.12 ; extra == 'transformers'
70
+ Requires-Dist: opentelemetry-instrumentation-vertexai>=0.40.12 ; extra == 'vertexai'
71
+ Requires-Dist: opentelemetry-instrumentation-watsonx>=0.40.12 ; extra == 'watsonx'
72
+ Requires-Dist: opentelemetry-instrumentation-weaviate>=0.40.12 ; extra == 'weaviate'
73
+ Requires-Python: >=3.10, <4
15
74
  Provides-Extra: alephalpha
16
75
  Provides-Extra: all
17
76
  Provides-Extra: anthropic
@@ -30,7 +89,6 @@ Provides-Extra: mcp
30
89
  Provides-Extra: milvus
31
90
  Provides-Extra: mistralai
32
91
  Provides-Extra: ollama
33
- Provides-Extra: openai
34
92
  Provides-Extra: pinecone
35
93
  Provides-Extra: qdrant
36
94
  Provides-Extra: replicate
@@ -40,73 +98,6 @@ Provides-Extra: transformers
40
98
  Provides-Extra: vertexai
41
99
  Provides-Extra: watsonx
42
100
  Provides-Extra: weaviate
43
- Requires-Dist: grpcio (>=1)
44
- Requires-Dist: httpx (>=0.25.0)
45
- Requires-Dist: opentelemetry-api (>=1.33.0)
46
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.33.0)
47
- Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.33.0)
48
- Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.12) ; extra == "alephalpha"
49
- Requires-Dist: opentelemetry-instrumentation-alephalpha (>=0.40.12) ; extra == "all"
50
- Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.12) ; extra == "all"
51
- Requires-Dist: opentelemetry-instrumentation-anthropic (>=0.40.12) ; extra == "anthropic"
52
- Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.12) ; extra == "all"
53
- Requires-Dist: opentelemetry-instrumentation-bedrock (>=0.40.12) ; extra == "bedrock"
54
- Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.12) ; extra == "all"
55
- Requires-Dist: opentelemetry-instrumentation-chromadb (>=0.40.12) ; extra == "chromadb"
56
- Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.12) ; extra == "all"
57
- Requires-Dist: opentelemetry-instrumentation-cohere (>=0.40.12) ; extra == "cohere"
58
- Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.12) ; extra == "all"
59
- Requires-Dist: opentelemetry-instrumentation-crewai (>=0.40.12) ; extra == "crewai"
60
- Requires-Dist: opentelemetry-instrumentation-google-generativeai (<0.40.10) ; extra == "all"
61
- Requires-Dist: opentelemetry-instrumentation-google-generativeai (<0.40.10) ; extra == "google-generativeai"
62
- Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.12) ; extra == "all"
63
- Requires-Dist: opentelemetry-instrumentation-groq (>=0.40.12) ; extra == "groq"
64
- Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.12) ; extra == "all"
65
- Requires-Dist: opentelemetry-instrumentation-haystack (>=0.40.12) ; extra == "haystack"
66
- Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.12) ; extra == "all"
67
- Requires-Dist: opentelemetry-instrumentation-lancedb (>=0.40.12) ; extra == "lancedb"
68
- Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.12) ; extra == "all"
69
- Requires-Dist: opentelemetry-instrumentation-langchain (>=0.40.12) ; extra == "langchain"
70
- Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.12) ; extra == "all"
71
- Requires-Dist: opentelemetry-instrumentation-llamaindex (>=0.40.12) ; extra == "llamaindex"
72
- Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.12) ; extra == "all"
73
- Requires-Dist: opentelemetry-instrumentation-marqo (>=0.40.12) ; extra == "marqo"
74
- Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.12) ; extra == "all"
75
- Requires-Dist: opentelemetry-instrumentation-mcp (>=0.40.12) ; extra == "mcp"
76
- Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.12) ; extra == "all"
77
- Requires-Dist: opentelemetry-instrumentation-milvus (>=0.40.12) ; extra == "milvus"
78
- Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.12) ; extra == "all"
79
- Requires-Dist: opentelemetry-instrumentation-mistralai (>=0.40.12) ; extra == "mistralai"
80
- Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.12) ; extra == "all"
81
- Requires-Dist: opentelemetry-instrumentation-ollama (>=0.40.12) ; extra == "ollama"
82
- Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.12) ; extra == "all"
83
- Requires-Dist: opentelemetry-instrumentation-openai (>=0.40.12) ; extra == "openai"
84
- Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.12) ; extra == "all"
85
- Requires-Dist: opentelemetry-instrumentation-pinecone (>=0.40.12) ; extra == "pinecone"
86
- Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.12) ; extra == "all"
87
- Requires-Dist: opentelemetry-instrumentation-qdrant (>=0.40.12) ; extra == "qdrant"
88
- Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.12) ; extra == "all"
89
- Requires-Dist: opentelemetry-instrumentation-replicate (>=0.40.12) ; extra == "replicate"
90
- Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.12) ; extra == "all"
91
- Requires-Dist: opentelemetry-instrumentation-sagemaker (>=0.40.12) ; extra == "sagemaker"
92
- Requires-Dist: opentelemetry-instrumentation-threading (>=0.54b0)
93
- Requires-Dist: opentelemetry-instrumentation-together (>=0.40.12) ; extra == "all"
94
- Requires-Dist: opentelemetry-instrumentation-together (>=0.40.12) ; extra == "together"
95
- Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.12) ; extra == "all"
96
- Requires-Dist: opentelemetry-instrumentation-transformers (>=0.40.12) ; extra == "transformers"
97
- Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.12) ; extra == "all"
98
- Requires-Dist: opentelemetry-instrumentation-vertexai (>=0.40.12) ; extra == "vertexai"
99
- Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.12) ; extra == "all"
100
- Requires-Dist: opentelemetry-instrumentation-watsonx (>=0.40.12) ; extra == "watsonx"
101
- Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.12) ; extra == "all"
102
- Requires-Dist: opentelemetry-instrumentation-weaviate (>=0.40.12) ; extra == "weaviate"
103
- Requires-Dist: opentelemetry-sdk (>=1.33.0)
104
- Requires-Dist: opentelemetry-semantic-conventions (>=0.54b0)
105
- Requires-Dist: opentelemetry-semantic-conventions-ai (>=0.4.8)
106
- Requires-Dist: pydantic (>=2.0.3,<3.0.0)
107
- Requires-Dist: python-dotenv (>=1.0)
108
- Requires-Dist: tenacity (>=8.0)
109
- Requires-Dist: tqdm (>=4.0)
110
101
  Description-Content-Type: text/markdown
111
102
 
112
103
  # Laminar Python
@@ -378,4 +369,3 @@ async for chunk in client.agent.run(
378
369
  elif chunk.chunk_type == 'finalOutput':
379
370
  print(chunk.content.result.content)
380
371
  ```
381
-
@@ -6,7 +6,7 @@
6
6
 
7
7
  [project]
8
8
  name = "lmnr"
9
- version = "0.6.17"
9
+ version = "0.6.19"
10
10
  description = "Python SDK for Laminar"
11
11
  authors = [
12
12
  { name = "lmnr.ai", email = "founders@lmnr.ai" }
@@ -22,7 +22,7 @@ dependencies = [
22
22
  "opentelemetry-exporter-otlp-proto-http (>=1.33.0)",
23
23
  "opentelemetry-exporter-otlp-proto-grpc (>=1.33.0)",
24
24
  "opentelemetry-semantic-conventions (>=0.54b0)",
25
- "opentelemetry-semantic-conventions-ai (>=0.4.8)",
25
+ "opentelemetry-semantic-conventions-ai (>=0.4.9)",
26
26
  "tqdm (>=4.0)",
27
27
  "tenacity (>=8.0)",
28
28
  # Since 1.68.0, grpcio writes a warning message
@@ -45,10 +45,10 @@ lmnr = "lmnr.cli:cli"
45
45
  [project.optional-dependencies]
46
46
  # List of all possible extras. You can specify one or more of these extras
47
47
  # when installing the package, using any of the following examples:
48
- # `pip install 'lmnr[anthropic,openai]'`
49
- # `uv pip install 'lmnr[anthropic,openai]'`
50
- # `uv add lmnr --extra anthropic --extra openai`
51
- # `poetry add 'lmnr[anthropic,openai]'`
48
+ # `pip install 'lmnr[anthropic,groq]'`
49
+ # `uv pip install 'lmnr[anthropic,groq]'`
50
+ # `uv add lmnr --extra anthropic --extra groq`
51
+ # `poetry add 'lmnr[anthropic,groq]'`
52
52
 
53
53
  alephalpha=["opentelemetry-instrumentation-alephalpha>=0.40.12"]
54
54
  anthropic=["opentelemetry-instrumentation-anthropic>=0.40.12"]
@@ -73,7 +73,6 @@ mcp=["opentelemetry-instrumentation-mcp>=0.40.12"]
73
73
  milvus=["opentelemetry-instrumentation-milvus>=0.40.12"]
74
74
  mistralai=["opentelemetry-instrumentation-mistralai>=0.40.12"]
75
75
  ollama=["opentelemetry-instrumentation-ollama>=0.40.12"]
76
- openai=["opentelemetry-instrumentation-openai>=0.40.12"]
77
76
  pinecone=["opentelemetry-instrumentation-pinecone>=0.40.12"]
78
77
  qdrant=["opentelemetry-instrumentation-qdrant>=0.40.12"]
79
78
  replicate=["opentelemetry-instrumentation-replicate>=0.40.12"]
@@ -106,7 +105,6 @@ all = [
106
105
  "opentelemetry-instrumentation-milvus>=0.40.12",
107
106
  "opentelemetry-instrumentation-mistralai>=0.40.12",
108
107
  "opentelemetry-instrumentation-ollama>=0.40.12",
109
- "opentelemetry-instrumentation-openai>=0.40.12",
110
108
  "opentelemetry-instrumentation-pinecone>=0.40.12",
111
109
  "opentelemetry-instrumentation-qdrant>=0.40.12",
112
110
  "opentelemetry-instrumentation-replicate>=0.40.12",
@@ -138,12 +136,8 @@ dev = [
138
136
  ]
139
137
 
140
138
  [build-system]
141
- requires = ["poetry-core"]
142
- build-backend = "poetry.core.masonry.api"
139
+ requires = ["uv_build>=0.7.19,<0.8"]
140
+ build-backend = "uv_build"
143
141
 
144
142
  [tool.uv.workspace]
145
143
  members = ["examples/fastapi-app"]
146
- # we can move to uv_build, once it's more stable
147
- # https://github.com/astral-sh/uv/issues/3957
148
- # requires = ["uv_build>=0.6.16,<0.7"]
149
- # build-backend = "uv_build"
@@ -11,6 +11,7 @@ from google.genai import types
11
11
  from .config import (
12
12
  Config,
13
13
  )
14
+ from .schema_utils import SchemaJSONEncoder, process_schema
14
15
  from .utils import (
15
16
  dont_throw,
16
17
  get_content,
@@ -24,8 +25,9 @@ from opentelemetry.trace import Tracer
24
25
  from wrapt import wrap_function_wrapper
25
26
 
26
27
  from opentelemetry import context as context_api
27
- from opentelemetry.trace import get_tracer, SpanKind, Span
28
+ from opentelemetry.trace import get_tracer, SpanKind, Span, Status, StatusCode
28
29
  from opentelemetry.semconv._incubating.attributes import gen_ai_attributes
30
+ from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
29
31
 
30
32
  from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
31
33
  from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY, unwrap
@@ -78,7 +80,7 @@ WRAPPED_METHODS = [
78
80
 
79
81
  def should_send_prompts():
80
82
  return (
81
- os.getenv("TRACELOOP_TRACE_CONTENT") or "true"
83
+ os.getenv("LAMINAR_TRACE_CONTENT") or "true"
82
84
  ).lower() == "true" or context_api.get_value("override_enable_content_tracing")
83
85
 
84
86
 
@@ -128,6 +130,29 @@ def _set_request_attributes(span, args, kwargs):
128
130
  span, gen_ai_attributes.GEN_AI_REQUEST_SEED, config_dict.get("seed")
129
131
  )
130
132
 
133
+ if schema := config_dict.get("response_schema"):
134
+ try:
135
+ set_span_attribute(
136
+ span,
137
+ # TODO: change to SpanAttributes.LLM_REQUEST_STRUCTURED_OUTPUT_SCHEMA
138
+ # when we upgrade to opentelemetry-semantic-conventions-ai>=0.4.10
139
+ "gen_ai.request.structured_output_schema",
140
+ json.dumps(process_schema(schema), cls=SchemaJSONEncoder),
141
+ )
142
+ except Exception:
143
+ pass
144
+ elif json_schema := config_dict.get("response_json_schema"):
145
+ try:
146
+ set_span_attribute(
147
+ span,
148
+ # TODO: change to SpanAttributes.LLM_REQUEST_STRUCTURED_OUTPUT_SCHEMA
149
+ # when we upgrade to opentelemetry-semantic-conventions-ai>=0.4.10
150
+ "gen_ai.request.structured_output_schema",
151
+ json.dumps(json_schema),
152
+ )
153
+ except Exception:
154
+ pass
155
+
131
156
  tools: list[types.FunctionDeclaration] = []
132
157
  arg_tools = config_dict.get("tools", kwargs.get("tools"))
133
158
  if arg_tools:
@@ -454,16 +479,20 @@ def _wrap(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
454
479
  if span.is_recording():
455
480
  _set_request_attributes(span, args, kwargs)
456
481
 
457
- if to_wrap.get("is_streaming"):
458
- return _build_from_streaming_response(span, wrapped(*args, **kwargs))
459
- else:
482
+ try:
460
483
  response = wrapped(*args, **kwargs)
461
-
462
- if span.is_recording():
463
- _set_response_attributes(span, response)
464
-
465
- span.end()
466
- return response
484
+ if to_wrap.get("is_streaming"):
485
+ return _build_from_streaming_response(span, response)
486
+ if span.is_recording():
487
+ _set_response_attributes(span, response)
488
+ span.end()
489
+ return response
490
+ except Exception as e:
491
+ span.set_attribute(ERROR_TYPE, e.__class__.__name__)
492
+ span.record_exception(e)
493
+ span.set_status(Status(StatusCode.ERROR, str(e)))
494
+ span.end()
495
+ raise e
467
496
 
468
497
 
469
498
  @with_tracer_wrapper
@@ -485,16 +514,22 @@ async def _awrap(tracer: Tracer, to_wrap, wrapped, instance, args, kwargs):
485
514
  if span.is_recording():
486
515
  _set_request_attributes(span, args, kwargs)
487
516
 
488
- if to_wrap.get("is_streaming"):
489
- return _abuild_from_streaming_response(span, await wrapped(*args, **kwargs))
490
- else:
517
+ try:
491
518
  response = await wrapped(*args, **kwargs)
492
-
493
- if span.is_recording():
494
- _set_response_attributes(span, response)
495
-
496
- span.end()
497
- return response
519
+ if to_wrap.get("is_streaming"):
520
+ return _abuild_from_streaming_response(span, response)
521
+ else:
522
+ if span.is_recording():
523
+ _set_response_attributes(span, response)
524
+
525
+ span.end()
526
+ return response
527
+ except Exception as e:
528
+ span.set_attribute(ERROR_TYPE, e.__class__.__name__)
529
+ span.record_exception(e)
530
+ span.set_status(Status(StatusCode.ERROR, str(e)))
531
+ span.end()
532
+ raise e
498
533
 
499
534
 
500
535
  class GoogleGenAiSdkInstrumentor(BaseInstrumentor):
@@ -0,0 +1,23 @@
1
+ from typing import Any
2
+ from google.genai._api_client import BaseApiClient
3
+ from google.genai._transformers import t_schema
4
+ from google.genai.types import JSONSchemaType
5
+
6
+ import json
7
+
8
+ DUMMY_CLIENT = BaseApiClient(api_key="dummy")
9
+
10
+
11
+ def process_schema(schema: Any) -> dict[str, Any]:
12
+ # The only thing we need from the client is the t_schema function
13
+ json_schema = t_schema(DUMMY_CLIENT, schema).json_schema.model_dump(
14
+ exclude_unset=True, exclude_none=True
15
+ )
16
+ return json_schema
17
+
18
+
19
+ class SchemaJSONEncoder(json.JSONEncoder):
20
+ def default(self, o: Any) -> Any:
21
+ if isinstance(o, JSONSchemaType):
22
+ return o.value
23
+ return super().default(o)
@@ -0,0 +1,61 @@
1
+ """
2
+ Initially copied over from openllmetry, commit
3
+ b3a18c9f7e6ff2368c8fb0bc35fd9123f11121c4
4
+ """
5
+
6
+ from typing import Callable, Collection, Optional
7
+
8
+ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
9
+ from .shared.config import Config
10
+ from .utils import is_openai_v1
11
+ from typing_extensions import Coroutine
12
+
13
+ _instruments = ("openai >= 0.27.0",)
14
+
15
+
16
+ class OpenAIInstrumentor(BaseInstrumentor):
17
+ """An instrumentor for OpenAI's client library."""
18
+
19
+ def __init__(
20
+ self,
21
+ enrich_assistant: bool = False,
22
+ enrich_token_usage: bool = False,
23
+ exception_logger=None,
24
+ get_common_metrics_attributes: Callable[[], dict] = lambda: {},
25
+ upload_base64_image: Optional[
26
+ Callable[[str, str, str, str], Coroutine[None, None, str]]
27
+ ] = lambda *args: "",
28
+ enable_trace_context_propagation: bool = True,
29
+ use_legacy_attributes: bool = True,
30
+ ):
31
+ super().__init__()
32
+ Config.enrich_assistant = enrich_assistant
33
+ Config.enrich_token_usage = enrich_token_usage
34
+ Config.exception_logger = exception_logger
35
+ Config.get_common_metrics_attributes = get_common_metrics_attributes
36
+ Config.upload_base64_image = upload_base64_image
37
+ Config.enable_trace_context_propagation = enable_trace_context_propagation
38
+ Config.use_legacy_attributes = use_legacy_attributes
39
+
40
+ def instrumentation_dependencies(self) -> Collection[str]:
41
+ return _instruments
42
+
43
+ def _instrument(self, **kwargs):
44
+ if is_openai_v1():
45
+ from .v1 import OpenAIV1Instrumentor
46
+
47
+ OpenAIV1Instrumentor().instrument(**kwargs)
48
+ else:
49
+ from .v0 import OpenAIV0Instrumentor
50
+
51
+ OpenAIV0Instrumentor().instrument(**kwargs)
52
+
53
+ def _uninstrument(self, **kwargs):
54
+ if is_openai_v1():
55
+ from .v1 import OpenAIV1Instrumentor
56
+
57
+ OpenAIV1Instrumentor().uninstrument(**kwargs)
58
+ else:
59
+ from .v0 import OpenAIV0Instrumentor
60
+
61
+ OpenAIV0Instrumentor().uninstrument(**kwargs)