langtrace-python-sdk 2.1.29__py3-none-any.whl → 2.2.1__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 (55) hide show
  1. examples/cohere_example/chat.py +1 -0
  2. examples/cohere_example/chat_stream.py +3 -0
  3. examples/gemini_example/__init__.py +6 -0
  4. examples/gemini_example/function_tools.py +62 -0
  5. examples/gemini_example/main.py +91 -0
  6. examples/langchain_example/__init__.py +8 -0
  7. examples/langchain_example/groq_example.py +28 -15
  8. examples/ollama_example/basic.py +1 -0
  9. examples/openai_example/__init__.py +1 -0
  10. examples/openai_example/async_tool_calling_nonstreaming.py +1 -1
  11. examples/openai_example/chat_completion.py +1 -1
  12. examples/openai_example/embeddings_create.py +1 -0
  13. examples/openai_example/images_edit.py +2 -2
  14. examples/vertexai_example/__init__.py +6 -0
  15. examples/vertexai_example/main.py +214 -0
  16. langtrace_python_sdk/constants/instrumentation/common.py +2 -0
  17. langtrace_python_sdk/constants/instrumentation/gemini.py +12 -0
  18. langtrace_python_sdk/constants/instrumentation/vertexai.py +42 -0
  19. langtrace_python_sdk/instrumentation/__init__.py +4 -0
  20. langtrace_python_sdk/instrumentation/anthropic/patch.py +68 -96
  21. langtrace_python_sdk/instrumentation/chroma/patch.py +29 -29
  22. langtrace_python_sdk/instrumentation/cohere/patch.py +143 -242
  23. langtrace_python_sdk/instrumentation/gemini/__init__.py +3 -0
  24. langtrace_python_sdk/instrumentation/gemini/instrumentation.py +36 -0
  25. langtrace_python_sdk/instrumentation/gemini/patch.py +186 -0
  26. langtrace_python_sdk/instrumentation/groq/patch.py +82 -125
  27. langtrace_python_sdk/instrumentation/ollama/patch.py +62 -65
  28. langtrace_python_sdk/instrumentation/openai/patch.py +190 -494
  29. langtrace_python_sdk/instrumentation/qdrant/patch.py +6 -6
  30. langtrace_python_sdk/instrumentation/vertexai/__init__.py +3 -0
  31. langtrace_python_sdk/instrumentation/vertexai/instrumentation.py +33 -0
  32. langtrace_python_sdk/instrumentation/vertexai/patch.py +131 -0
  33. langtrace_python_sdk/langtrace.py +5 -0
  34. langtrace_python_sdk/utils/__init__.py +14 -3
  35. langtrace_python_sdk/utils/llm.py +311 -6
  36. langtrace_python_sdk/version.py +1 -1
  37. {langtrace_python_sdk-2.1.29.dist-info → langtrace_python_sdk-2.2.1.dist-info}/METADATA +26 -19
  38. {langtrace_python_sdk-2.1.29.dist-info → langtrace_python_sdk-2.2.1.dist-info}/RECORD +55 -36
  39. tests/anthropic/test_anthropic.py +28 -27
  40. tests/cohere/test_cohere_chat.py +36 -36
  41. tests/cohere/test_cohere_embed.py +12 -9
  42. tests/cohere/test_cohere_rerank.py +18 -11
  43. tests/groq/cassettes/test_async_chat_completion.yaml +113 -0
  44. tests/groq/cassettes/test_async_chat_completion_streaming.yaml +2232 -0
  45. tests/groq/cassettes/test_chat_completion.yaml +114 -0
  46. tests/groq/cassettes/test_chat_completion_streaming.yaml +2512 -0
  47. tests/groq/conftest.py +33 -0
  48. tests/groq/test_groq.py +142 -0
  49. tests/openai/cassettes/test_async_chat_completion_streaming.yaml +28 -28
  50. tests/openai/test_chat_completion.py +53 -67
  51. tests/openai/test_image_generation.py +47 -24
  52. tests/utils.py +40 -5
  53. {langtrace_python_sdk-2.1.29.dist-info → langtrace_python_sdk-2.2.1.dist-info}/WHEEL +0 -0
  54. {langtrace_python_sdk-2.1.29.dist-info → langtrace_python_sdk-2.2.1.dist-info}/entry_points.txt +0 -0
  55. {langtrace_python_sdk-2.1.29.dist-info → langtrace_python_sdk-2.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -23,6 +23,7 @@ def chat_comp():
23
23
  "message": "The man who is widely credited with discovering gravity is Sir Isaac Newton",
24
24
  },
25
25
  ],
26
+ k=3,
26
27
  message="Tell me a story in 3 sentences or less?",
27
28
  preamble="answer like a pirate",
28
29
  # perform web search before answering the question. You can also use your own custom connector.
@@ -18,6 +18,9 @@ def chat_stream():
18
18
  message="Tell me a short story in 2 lines",
19
19
  preamble="Respond like a pirate",
20
20
  max_tokens=100,
21
+ k=3,
22
+ p=0.9,
23
+ temperature=0.5,
21
24
  ):
22
25
  if event.event_type == "text-generation":
23
26
  result.append(event.text)
@@ -0,0 +1,6 @@
1
+ from .main import basic
2
+
3
+
4
+ class GeminiRunner:
5
+ def run(self):
6
+ basic()
@@ -0,0 +1,62 @@
1
+ tools = [
2
+ {
3
+ "function_declarations": [
4
+ {
5
+ "name": "find_movies",
6
+ "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.",
7
+ "parameters": {
8
+ "type": "object",
9
+ "properties": {
10
+ "location": {
11
+ "type": "string",
12
+ "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616",
13
+ },
14
+ "description": {
15
+ "type": "string",
16
+ "description": "Any kind of description including category or genre, title words, attributes, etc.",
17
+ },
18
+ },
19
+ "required": ["description"],
20
+ },
21
+ },
22
+ {
23
+ "name": "find_theaters",
24
+ "description": "find theaters based on location and optionally movie title which is currently playing in theaters",
25
+ "parameters": {
26
+ "type": "object",
27
+ "properties": {
28
+ "location": {
29
+ "type": "string",
30
+ "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616",
31
+ },
32
+ "movie": {"type": "string", "description": "Any movie title"},
33
+ },
34
+ "required": ["location"],
35
+ },
36
+ },
37
+ {
38
+ "name": "get_showtimes",
39
+ "description": "Find the start times for movies playing in a specific theater",
40
+ "parameters": {
41
+ "type": "object",
42
+ "properties": {
43
+ "location": {
44
+ "type": "string",
45
+ "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616",
46
+ },
47
+ "movie": {"type": "string", "description": "Any movie title"},
48
+ "theater": {
49
+ "type": "string",
50
+ "description": "Name of the theater",
51
+ },
52
+ "date": {
53
+ "type": "string",
54
+ "description": "Date for requested showtime",
55
+ },
56
+ },
57
+ "required": ["location", "movie", "theater", "date"],
58
+ },
59
+ },
60
+ ]
61
+ }
62
+ ]
@@ -0,0 +1,91 @@
1
+ from langtrace_python_sdk import langtrace
2
+ import google.generativeai as genai
3
+ from dotenv import load_dotenv
4
+ import os
5
+ import asyncio
6
+ import pathlib
7
+ from .function_tools import tools
8
+
9
+ load_dotenv()
10
+
11
+ langtrace.init(write_spans_to_console=False, batch=False)
12
+ genai.configure(api_key=os.environ["GEMINI_API_KEY"])
13
+
14
+
15
+ async def async_demo():
16
+ task1 = asyncio.create_task(async_generate())
17
+ task2 = asyncio.create_task(async_generate(stream=True))
18
+ return await asyncio.gather(task1, task2)
19
+
20
+
21
+ def basic():
22
+ generate()
23
+ generate(stream=True, with_tools=True)
24
+
25
+ # image_to_text()
26
+ # audio_to_text()
27
+ asyncio.run(async_demo())
28
+
29
+
30
+ def generate(stream=False, with_tools=False):
31
+ model = genai.GenerativeModel(
32
+ "gemini-1.5-pro", system_instruction="You are a cat. Your name is Neko."
33
+ )
34
+
35
+ response = model.generate_content(
36
+ "Write a story about a AI and magic",
37
+ stream=stream,
38
+ tools=tools if with_tools else None,
39
+ )
40
+ if stream:
41
+ for res in response:
42
+ if res.text:
43
+ print(res.text)
44
+ else:
45
+ print(response.text)
46
+
47
+
48
+ async def async_generate(stream=False):
49
+ model = genai.GenerativeModel(
50
+ "gemini-1.5-pro", system_instruction="You are a cat. Your name is Neko."
51
+ )
52
+ response = await model.generate_content_async(
53
+ "Write a story about a AI and magic", stream=stream
54
+ )
55
+ if stream:
56
+ async for chunk in response:
57
+ if chunk.text:
58
+ print(chunk.text)
59
+ else:
60
+ print(response.text)
61
+
62
+
63
+ def image_to_text(stream=False):
64
+ model = genai.GenerativeModel("gemini-1.5-flash")
65
+ image1 = {
66
+ "mime_type": "image/jpeg",
67
+ "data": pathlib.Path("src/examples/gemini_example/jetpack.jpg").read_bytes(),
68
+ }
69
+
70
+ prompt = "Describe me this picture. What do you see in it."
71
+ response = model.generate_content([prompt, image1], stream=stream)
72
+ if stream:
73
+ for res in response:
74
+ print(res.text)
75
+ else:
76
+ print(response.text)
77
+
78
+
79
+ # def audio_to_text(stream=False):
80
+ # model = genai.GenerativeModel("gemini-1.5-flash")
81
+ # audio = genai.upload_file(
82
+ # pathlib.Path("src/examples/gemini_example/voice_note.mp3")
83
+ # )
84
+
85
+ # prompt = "Summarize this voice recording."
86
+ # response = model.generate_content([prompt, audio], stream=stream)
87
+ # if stream:
88
+ # for res in response:
89
+ # print(res.text)
90
+ # else:
91
+ # print(response.text)
@@ -1,6 +1,8 @@
1
1
  from .basic import basic_app, rag, load_and_split
2
2
  from langtrace_python_sdk import with_langtrace_root_span
3
3
 
4
+ from .groq_example import groq_basic, groq_streaming
5
+
4
6
 
5
7
  class LangChainRunner:
6
8
  @with_langtrace_root_span("LangChain")
@@ -8,3 +10,9 @@ class LangChainRunner:
8
10
  basic_app()
9
11
  rag()
10
12
  load_and_split()
13
+
14
+
15
+ class GroqRunner:
16
+ @with_langtrace_root_span("Groq")
17
+ def run(self):
18
+ groq_streaming()
@@ -1,6 +1,7 @@
1
1
  from dotenv import find_dotenv, load_dotenv
2
2
  from langchain_core.prompts import ChatPromptTemplate
3
3
  from langchain_groq import ChatGroq
4
+ from groq import Groq
4
5
 
5
6
  _ = load_dotenv(find_dotenv())
6
7
 
@@ -12,21 +13,33 @@ _ = load_dotenv(find_dotenv())
12
13
 
13
14
  langtrace.init()
14
15
 
16
+ client = Groq()
15
17
 
16
- def groq_example():
17
18
 
18
- chat = ChatGroq(temperature=0, model_name="mixtral-8x7b-32768")
19
-
20
- system = "You are a helpful assistant."
21
- human = "{text}"
22
- prompt = ChatPromptTemplate.from_messages([("system", system), ("human", human)])
23
-
24
- chain = prompt | chat
25
- result = chain.invoke(
26
- {"text": "Explain the importance of low latency LLMs in 2 sentences or less."}
19
+ def groq_basic():
20
+ chat_completion = client.chat.completions.create(
21
+ messages=[
22
+ {
23
+ "role": "user",
24
+ "content": "Explain the importance of low latency LLMs",
25
+ }
26
+ ],
27
+ stream=False,
28
+ model="llama3-8b-8192",
27
29
  )
28
- # print(result)
29
- return result
30
-
31
-
32
- groq_example()
30
+ return chat_completion
31
+
32
+
33
+ def groq_streaming():
34
+ chat_completion = client.chat.completions.create(
35
+ messages=[
36
+ {
37
+ "role": "user",
38
+ "content": "Explain the importance of low latency LLMs",
39
+ }
40
+ ],
41
+ stream=True,
42
+ model="llama3-8b-8192",
43
+ )
44
+ for chunk in chat_completion:
45
+ print(chunk)
@@ -17,6 +17,7 @@ def chat():
17
17
  "content": "hi",
18
18
  },
19
19
  ],
20
+ options={"temperature": 0.5},
20
21
  stream=True,
21
22
  )
22
23
 
@@ -10,6 +10,7 @@ class OpenAIRunner:
10
10
  run_conversation as run_conversation_streaming,
11
11
  )
12
12
  from .chat_completion import chat_completion as chat_completion_example
13
+
13
14
  from .embeddings_create import embeddings_create as embeddings_create_example
14
15
  from .function_calling import function_calling as function_example
15
16
  from .images_edit import image_edit
@@ -8,7 +8,7 @@ from langtrace_python_sdk import langtrace, with_langtrace_root_span
8
8
 
9
9
  _ = load_dotenv(find_dotenv())
10
10
 
11
- langtrace.init()
11
+ langtrace.init(write_spans_to_console=True)
12
12
 
13
13
  client = AsyncOpenAI()
14
14
 
@@ -9,7 +9,7 @@ from langtrace_python_sdk.utils.with_root_span import (
9
9
 
10
10
  _ = load_dotenv(find_dotenv())
11
11
 
12
- langtrace.init(write_spans_to_console=False)
12
+ langtrace.init(write_spans_to_console=True)
13
13
  client = OpenAI()
14
14
 
15
15
 
@@ -16,5 +16,6 @@ def embeddings_create():
16
16
  result = client.embeddings.create(
17
17
  model="text-embedding-ada-002",
18
18
  input="Once upon a time, there was a pirate.",
19
+ encoding_format="float",
19
20
  )
20
21
  return result
@@ -23,8 +23,8 @@ def image_edit():
23
23
 
24
24
  response = client.images.edit(
25
25
  model="dall-e-2",
26
- image=open("./resources/lounge_flamingo.png", "rb"),
27
- mask=open("./resources/mask.png", "rb"),
26
+ image=open("src/examples/openai_example/resources/lounge_flamingo.png", "rb"),
27
+ mask=open("src/examples/openai_example/resources/mask.png", "rb"),
28
28
  prompt="A sunlit indoor lounge area with a pool and duck standing in side with flamingo.",
29
29
  n=1,
30
30
  size="1024x1024",
@@ -0,0 +1,6 @@
1
+ from .main import basic
2
+
3
+
4
+ class VertexAIRunner:
5
+ def run(self):
6
+ basic()
@@ -0,0 +1,214 @@
1
+ import vertexai
2
+ import base64
3
+ import asyncio
4
+ import vertexai.preview.generative_models as generative_models
5
+ from vertexai.language_models import ChatModel, InputOutputTextPair, TextGenerationModel
6
+ from langtrace_python_sdk import langtrace
7
+ from vertexai.generative_models import GenerativeModel, Part, FinishReason
8
+ from dotenv import load_dotenv
9
+
10
+ load_dotenv()
11
+
12
+ langtrace.init(write_spans_to_console=True, batch=False)
13
+ vertexai.init(project="model-palace-429011-f5", location="us-central1")
14
+
15
+
16
+ def basic():
17
+ # chat()
18
+ # chat_streaming()
19
+ # streaming_prediction()
20
+ # asyncio.run(async_streaming_prediction())
21
+
22
+ generate()
23
+ generate(stream=True)
24
+
25
+ image_to_text()
26
+ image_to_text(stream=True)
27
+
28
+ video_to_text()
29
+ video_to_text(stream=True)
30
+
31
+ audio_to_text()
32
+ audio_to_text(stream=True)
33
+
34
+
35
+ def chat():
36
+ """Chat Example with a Large Language Model"""
37
+
38
+ chat_model = ChatModel.from_pretrained("chat-bison")
39
+
40
+ parameters = {
41
+ "temperature": 0.8,
42
+ "max_output_tokens": 256,
43
+ "top_p": 0.95,
44
+ "top_k": 40,
45
+ }
46
+
47
+ chat = chat_model.start_chat(
48
+ context="My name is Miles. You are an astronomer, knowledgeable about the solar system.",
49
+ examples=[
50
+ InputOutputTextPair(
51
+ input_text="How many moons does Mars have?",
52
+ output_text="The planet Mars has two moons, Phobos and Deimos.",
53
+ ),
54
+ ],
55
+ )
56
+
57
+ response = chat.send_message(
58
+ message="How many planets are there in the solar system?", **parameters
59
+ )
60
+
61
+ return response
62
+
63
+
64
+ def chat_streaming() -> str:
65
+ """Streaming Chat Example with a Large Language Model"""
66
+
67
+ chat_model = ChatModel.from_pretrained("chat-bison")
68
+
69
+ parameters = {
70
+ "temperature": 0.8,
71
+ "max_output_tokens": 256,
72
+ "top_p": 0.95,
73
+ "top_k": 40,
74
+ }
75
+
76
+ chat = chat_model.start_chat(
77
+ context="My name is Miles. You are an astronomer, knowledgeable about the solar system.",
78
+ examples=[
79
+ InputOutputTextPair(
80
+ input_text="How many moons does Mars have?",
81
+ output_text="The planet Mars has two moons, Phobos and Deimos.",
82
+ ),
83
+ ],
84
+ )
85
+
86
+ responses = chat.send_message_streaming(
87
+ message="How many planets are there in the solar system?", **parameters
88
+ )
89
+
90
+ result = [response for response in responses]
91
+ return result
92
+
93
+
94
+ def streaming_prediction() -> str:
95
+ """Streaming Text Example with a Large Language Model"""
96
+
97
+ text_generation_model = TextGenerationModel.from_pretrained("text-bison")
98
+ parameters = {
99
+ "max_output_tokens": 256,
100
+ "top_p": 0.8,
101
+ "top_k": 40,
102
+ }
103
+ responses = text_generation_model.predict_streaming(
104
+ prompt="Give me ten interview questions for the role of program manager.",
105
+ **parameters,
106
+ )
107
+ result = [response for response in responses]
108
+ print(result)
109
+ return result
110
+
111
+
112
+ async def async_streaming_prediction() -> str:
113
+ """Async Streaming Text Example with a Large Language Model"""
114
+
115
+ text_generation_model = TextGenerationModel.from_pretrained("text-bison")
116
+ parameters = {
117
+ "max_output_tokens": 256,
118
+ "top_p": 0.8,
119
+ "top_k": 40,
120
+ }
121
+
122
+ responses = text_generation_model.predict_streaming_async(
123
+ prompt="Give me ten interview questions for the role of program manager.",
124
+ **parameters,
125
+ )
126
+
127
+ result = [response async for response in responses]
128
+ print(result)
129
+ return result
130
+
131
+
132
+ def generate(stream=False):
133
+ generation_config = {
134
+ "max_output_tokens": 8192,
135
+ "temperature": 1,
136
+ "top_p": 0.95,
137
+ }
138
+ model = GenerativeModel(
139
+ "gemini-experimental",
140
+ )
141
+
142
+ responses = model.generate_content(
143
+ ["I am a software engineer. I enjoy playing video games and reading"],
144
+ generation_config=generation_config,
145
+ stream=stream,
146
+ )
147
+
148
+ if stream:
149
+ for res in responses:
150
+ print(res.text)
151
+ else:
152
+ print(responses.text)
153
+
154
+
155
+ def image_to_text(stream=False):
156
+ model = GenerativeModel(model_name="gemini-experimental")
157
+
158
+ response = model.generate_content(
159
+ [
160
+ Part.from_uri(
161
+ "gs://cloud-samples-data/generative-ai/image/scones.jpg",
162
+ mime_type="image/jpeg",
163
+ ),
164
+ "What is shown in this image?",
165
+ ],
166
+ stream=stream,
167
+ )
168
+ if stream:
169
+ for res in response:
170
+ print(res.text)
171
+ else:
172
+ print(response.text)
173
+
174
+
175
+ def video_to_text(stream=False):
176
+ model = GenerativeModel(model_name="gemini-experimental")
177
+
178
+ prompt = """
179
+ Provide a description of the video.
180
+ The description should also contain anything important which people say in the video.
181
+ """
182
+
183
+ video_file_uri = "gs://cloud-samples-data/generative-ai/video/pixel8.mp4"
184
+ video_file = Part.from_uri(video_file_uri, mime_type="video/mp4")
185
+
186
+ contents = [video_file, prompt]
187
+ response = model.generate_content(contents, stream=stream)
188
+ if stream:
189
+ for res in response:
190
+ print(res.text)
191
+ else:
192
+ print(response.text)
193
+
194
+
195
+ def audio_to_text(stream=False):
196
+ model = GenerativeModel(model_name="gemini-1.5-flash-001")
197
+
198
+ prompt = """
199
+ Please provide a summary for the audio.
200
+ Provide chapter titles, be concise and short, no need to provide chapter summaries.
201
+ Do not make up any information that is not part of the audio and do not be verbose.
202
+ """
203
+
204
+ audio_file_uri = "gs://cloud-samples-data/generative-ai/audio/pixel.mp3"
205
+ audio_file = Part.from_uri(audio_file_uri, mime_type="audio/mpeg")
206
+
207
+ contents = [audio_file, prompt]
208
+
209
+ response = model.generate_content(contents, stream=stream)
210
+ if stream:
211
+ for res in response:
212
+ print(res.text)
213
+ else:
214
+ print(response.text)
@@ -26,6 +26,8 @@ SERVICE_PROVIDERS = {
26
26
  "QDRANT": "Qdrant",
27
27
  "WEAVIATE": "Weaviate",
28
28
  "OLLAMA": "Ollama",
29
+ "VERTEXAI": "VertexAI",
30
+ "GEMINI": "Gemini",
29
31
  }
30
32
 
31
33
  LANGTRACE_ADDITIONAL_SPAN_ATTRIBUTES_KEY = "langtrace_additional_attributes"
@@ -0,0 +1,12 @@
1
+ APIS = {
2
+ "GENERATE_CONTENT": {
3
+ "module": "google.generativeai.generative_models",
4
+ "method": "GenerativeModel",
5
+ "operation": "generate_content",
6
+ },
7
+ "AGENERATE_CONTENT": {
8
+ "module": "google.generativeai.generative_models",
9
+ "method": "GenerativeModel",
10
+ "operation": "generate_content_async",
11
+ },
12
+ }
@@ -0,0 +1,42 @@
1
+ APIS = {
2
+ "GENERATE_CONTENT": {
3
+ "module": "vertexai.generative_models",
4
+ "method": "GenerativeModel",
5
+ "operation": "generate_content",
6
+ },
7
+ "AGENERATE_CONTENT": {
8
+ "module": "vertexai.generative_models",
9
+ "method": "GenerativeModel",
10
+ "operation": "generate_content_async",
11
+ },
12
+ "PREDICT": {
13
+ "module": "vertexai.language_models",
14
+ "method": "TextGenerationModel",
15
+ "operation": "predict",
16
+ },
17
+ "APREDICT": {
18
+ "module": "vertexai.language_models",
19
+ "method": "TextGenerationModel",
20
+ "operation": "predict_async",
21
+ },
22
+ "PREDICT_STREAM": {
23
+ "module": "vertexai.language_models",
24
+ "method": "TextGenerationModel",
25
+ "operation": "predict_streaming",
26
+ },
27
+ "APREDICT_STREAM": {
28
+ "module": "vertexai.language_models",
29
+ "method": "TextGenerationModel",
30
+ "operation": "predict_streaming_async",
31
+ },
32
+ "SEND_MESSAGE": {
33
+ "module": "vertexai.language_models",
34
+ "method": "ChatSession",
35
+ "operation": "send_message",
36
+ },
37
+ "send_message_streaming": {
38
+ "module": "vertexai.language_models",
39
+ "method": "ChatSession",
40
+ "operation": "send_message_streaming",
41
+ },
42
+ }
@@ -14,6 +14,8 @@ from .qdrant import QdrantInstrumentation
14
14
  from .weaviate import WeaviateInstrumentation
15
15
  from .ollama import OllamaInstrumentor
16
16
  from .dspy import DspyInstrumentation
17
+ from .vertexai import VertexAIInstrumentation
18
+ from .gemini import GeminiInstrumentation
17
19
 
18
20
  __all__ = [
19
21
  "AnthropicInstrumentation",
@@ -32,4 +34,6 @@ __all__ = [
32
34
  "WeaviateInstrumentation",
33
35
  "OllamaInstrumentor",
34
36
  "DspyInstrumentation",
37
+ "VertexAIInstrumentation",
38
+ "GeminiInstrumentation",
35
39
  ]