langtrace-python-sdk 2.3.4__py3-none-any.whl → 2.3.7__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.
@@ -0,0 +1,9 @@
1
+ from examples.azureopenai_example.completion import chat_completion
2
+ from langtrace_python_sdk import with_langtrace_root_span, langtrace
3
+
4
+ langtrace.init()
5
+
6
+ class AzureOpenAIRunner:
7
+ @with_langtrace_root_span("AzureOpenAI")
8
+ def run(self):
9
+ chat_completion()
@@ -0,0 +1,22 @@
1
+ import os
2
+ from langchain_openai import AzureChatOpenAI
3
+
4
+ from langtrace_python_sdk.utils.with_root_span import with_langtrace_root_span
5
+
6
+ model = AzureChatOpenAI(
7
+ azure_endpoint=os.environ['AZURE_OPENAI_ENDPOINT'],
8
+ azure_deployment=os.environ['AZURE_OPENAI_DEPLOYMENT_NAME'],
9
+ openai_api_version=os.environ['AZURE_OPENAI_API_VERSION'],
10
+ )
11
+
12
+ @with_langtrace_root_span()
13
+ def chat_completion():
14
+ messages = [
15
+ (
16
+ "system",
17
+ "You are a helpful assistant that translates English to French. Translate the user sentence.",
18
+ ),
19
+ ("human", "I love programming."),
20
+ ]
21
+ result = model.invoke(messages)
22
+ print(result)
@@ -2,6 +2,7 @@ from .basic import basic_app, rag, load_and_split
2
2
  from langtrace_python_sdk import with_langtrace_root_span
3
3
 
4
4
  from .groq_example import groq_basic, groq_streaming
5
+ from .langgraph_example_tools import basic_graph_tools
5
6
 
6
7
 
7
8
  class LangChainRunner:
@@ -10,6 +11,7 @@ class LangChainRunner:
10
11
  basic_app()
11
12
  rag()
12
13
  load_and_split()
14
+ basic_graph_tools()
13
15
 
14
16
 
15
17
  class GroqRunner:
@@ -0,0 +1,151 @@
1
+ from typing import Annotated
2
+
3
+ from langchain_anthropic import ChatAnthropic
4
+ from langchain_core.messages import HumanMessage
5
+ from langchain_core.pydantic_v1 import BaseModel
6
+ from typing_extensions import TypedDict
7
+ from langchain_core.pydantic_v1 import BaseModel, Field
8
+ from langchain_core.tools import Tool
9
+ from langgraph.checkpoint.memory import MemorySaver
10
+ from langgraph.graph import StateGraph
11
+ from langgraph.graph.message import add_messages
12
+ from langgraph.prebuilt import ToolNode, tools_condition
13
+ from langchain_core.messages import AIMessage, ToolMessage
14
+
15
+ from langtrace_python_sdk import langtrace
16
+
17
+ langtrace.init()
18
+
19
+ primes = {998: 7901, 999: 7907, 1000: 7919}
20
+
21
+
22
+ class PrimeInput(BaseModel):
23
+ n: int = Field()
24
+
25
+
26
+ def is_prime(n: int) -> bool:
27
+ if n <= 1 or (n % 2 == 0 and n > 2):
28
+ return False
29
+ for i in range(3, int(n**0.5) + 1, 2):
30
+ if n % i == 0:
31
+ return False
32
+ return True
33
+
34
+
35
+ def get_prime(n: int, primes: dict = primes) -> str:
36
+ return str(primes.get(int(n)))
37
+
38
+
39
+ async def aget_prime(n: int, primes: dict = primes) -> str:
40
+ return str(primes.get(int(n)))
41
+
42
+
43
+ class State(TypedDict):
44
+ messages: Annotated[list, add_messages]
45
+ # This flag is new
46
+ ask_human: bool
47
+
48
+
49
+ class RequestAssistance(BaseModel):
50
+ """Escalate the conversation to an expert. Use this if you are unable to assist directly or if the user requires support beyond your permissions.
51
+
52
+ To use this function, relay the user's 'request' so the expert can provide the right guidance.
53
+ """
54
+
55
+ request: str
56
+
57
+
58
+ llm = ChatAnthropic(model="claude-3-haiku-20240307")
59
+ # We can bind the llm to a tool definition, a pydantic model, or a json schema
60
+ llm_with_tools = llm.bind_tools([RequestAssistance])
61
+ tools = [
62
+ Tool(
63
+ name="GetPrime",
64
+ func=get_prime,
65
+ description="A tool that returns the `n`th prime number",
66
+ args_schema=PrimeInput,
67
+ coroutine=aget_prime,
68
+ ),
69
+ ]
70
+
71
+
72
+ def chatbot(state: State):
73
+ response = llm_with_tools.invoke(state["messages"])
74
+ ask_human = False
75
+ if (
76
+ response.tool_calls
77
+ and response.tool_calls[0]["name"] == RequestAssistance.__name__
78
+ ):
79
+ ask_human = True
80
+ return {"messages": [response], "ask_human": ask_human}
81
+
82
+
83
+ graph_builder = StateGraph(State)
84
+
85
+ graph_builder.add_node("chatbot", chatbot)
86
+ graph_builder.add_node("tools", ToolNode(tools=tools))
87
+
88
+
89
+ def create_response(response: str, ai_message: AIMessage):
90
+ return ToolMessage(
91
+ content=response,
92
+ tool_call_id=ai_message.tool_calls[0]["id"],
93
+ )
94
+
95
+
96
+ def human_node(state: State):
97
+ new_messages = []
98
+ if not isinstance(state["messages"][-1], ToolMessage):
99
+ # Typically, the user will have updated the state during the interrupt.
100
+ # If they choose not to, we will include a placeholder ToolMessage to
101
+ # let the LLM continue.
102
+ new_messages.append(
103
+ create_response("No response from human.", state["messages"][-1])
104
+ )
105
+ return {
106
+ # Append the new messages
107
+ "messages": new_messages,
108
+ # Unset the flag
109
+ "ask_human": False,
110
+ }
111
+
112
+
113
+ def select_next_node(state: State):
114
+ if state["ask_human"]:
115
+ return "human"
116
+ # Otherwise, we can route as before
117
+ return tools_condition(state)
118
+
119
+
120
+ def basic_graph_tools():
121
+ graph_builder.add_node("human", human_node)
122
+ graph_builder.add_conditional_edges(
123
+ "chatbot",
124
+ select_next_node,
125
+ {"human": "human", "tools": "tools", "__end__": "__end__"},
126
+ )
127
+ graph_builder.add_edge("tools", "chatbot")
128
+ graph_builder.add_edge("human", "chatbot")
129
+ graph_builder.set_entry_point("chatbot")
130
+ memory = MemorySaver()
131
+ graph = graph_builder.compile(
132
+ checkpointer=memory,
133
+ interrupt_before=["human"],
134
+ )
135
+
136
+ config = {"configurable": {"thread_id": "1"}}
137
+ events = graph.stream(
138
+ {
139
+ "messages": [
140
+ (
141
+ "user",
142
+ "I'm learning LangGraph. Could you do some research on it for me?",
143
+ )
144
+ ]
145
+ },
146
+ config,
147
+ stream_mode="values",
148
+ )
149
+ for event in events:
150
+ if "messages" in event:
151
+ event["messages"][-1]
@@ -18,6 +18,7 @@ from typing import Any, Callable, Dict, List, Optional, Iterator, TypedDict, Uni
18
18
  from langtrace.trace_attributes import Event, SpanAttributes, LLMSpanAttributes
19
19
  from langtrace_python_sdk.utils import set_span_attribute
20
20
  from langtrace_python_sdk.utils.silently_fail import silently_fail
21
+ import json
21
22
 
22
23
  from langtrace_python_sdk.utils.llm import (
23
24
  StreamWrapper,
@@ -99,15 +100,20 @@ def messages_create(version: str, tracer: Tracer) -> Callable[..., Any]:
99
100
  set_span_attribute(
100
101
  span, SpanAttributes.LLM_RESPONSE_MODEL, result.model
101
102
  )
102
- content_item = result.content[0]
103
- completion = [
104
- {
105
- "role": result.role or "assistant",
106
- "content": content_item.text,
107
- "type": content_item.type,
108
- }
109
- ]
110
- set_event_completion(span, completion)
103
+ if hasattr(result, "content") and result.content[0] is not None:
104
+ content = result.content[0]
105
+ typ = content.type
106
+ role = result.role if result.role else "assistant"
107
+ if typ == "tool_result" or typ == "tool_use":
108
+ content = content.json() # type: ignore
109
+ set_span_attribute(
110
+ span, SpanAttributes.LLM_TOOL_RESULTS, json.dumps(content)
111
+ )
112
+ if typ == "text":
113
+ content = result.content[0].text
114
+ set_event_completion(
115
+ span, [{"type": typ, role: role, content: content}]
116
+ )
111
117
 
112
118
  if (
113
119
  hasattr(result, "system_fingerprint")
@@ -68,7 +68,6 @@ class Chunk:
68
68
 
69
69
  class ContentItem:
70
70
  role: str
71
- content: str
72
71
  text: str
73
72
  type: str
74
73
 
@@ -47,9 +47,12 @@ METADATA_ATTRIBUTES = [
47
47
 
48
48
  def extract_inputs(args, kwargs):
49
49
  extracted_params = {}
50
- kwargs_without_properties = {k: v for k, v in kwargs.items() if k != "properties"}
50
+ kwargs_without_properties = {
51
+ k: v for k, v in kwargs.items() if k not in ["properties", "fusion_type"]
52
+ }
51
53
  extracted_params.update(extract_input_params(args, kwargs_without_properties))
52
-
54
+ if kwargs.get("fusion_type", None):
55
+ extracted_params["fusion_type"] = kwargs["fusion_type"].value
53
56
  if kwargs.get("properties", None):
54
57
  extracted_params["properties"] = []
55
58
  for each_prop in kwargs.get("properties"):
@@ -126,7 +126,7 @@ def get_llm_request_attributes(kwargs, prompts=None, model=None, operation_name=
126
126
  tools = kwargs.get("tools", None)
127
127
  return {
128
128
  SpanAttributes.LLM_OPERATION_NAME: operation_name,
129
- SpanAttributes.LLM_REQUEST_MODEL: model or kwargs.get("model"),
129
+ SpanAttributes.LLM_REQUEST_MODEL: model or kwargs.get("model") or "gpt-3.5-turbo",
130
130
  SpanAttributes.LLM_IS_STREAMING: kwargs.get("stream"),
131
131
  SpanAttributes.LLM_REQUEST_TEMPERATURE: kwargs.get("temperature"),
132
132
  SpanAttributes.LLM_TOP_K: top_k,
@@ -1 +1 @@
1
- __version__ = "2.3.4"
1
+ __version__ = "2.3.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: langtrace-python-sdk
3
- Version: 2.3.4
3
+ Version: 2.3.7
4
4
  Summary: Python SDK for LangTrace
5
5
  Project-URL: Homepage, https://github.com/Scale3-Labs/langtrace-python-sdk
6
6
  Author-email: Scale3 Labs <engineering@scale3labs.com>
@@ -1,6 +1,8 @@
1
1
  examples/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
2
  examples/anthropic_example/__init__.py,sha256=03us1YuvAJR6fqXX8NH2kROBfTmyz7KzFVY01UlL-tM,237
3
3
  examples/anthropic_example/completion.py,sha256=3_YEZrt0BLVNJT_RbLXg6JGP2bweuc_HPC2MWR73tOM,713
4
+ examples/azureopenai_example/__init__.py,sha256=PaZM90r6VN4eSOXxb6wGsyhf9-RJCNqBypzk1Xa2GJI,271
5
+ examples/azureopenai_example/completion.py,sha256=K_GeU0TfJ9lLDfW5VI0Lmm8_I0JXf1x9Qi83ImJ350c,668
4
6
  examples/chroma_example/__init__.py,sha256=Mrf8KptW1hhzu6WDdRRTxbaB-0kM7x5u-Goc_zR7G5c,203
5
7
  examples/chroma_example/basic.py,sha256=oO7-__8HptnFXLVKbnPgoz02yM-CAPi721xsbUb_gYg,868
6
8
  examples/cohere_example/__init__.py,sha256=oYpsnS-dKOlWLkPEUWhXxi1vfxa77bt_DOdkJHg__7g,502
@@ -40,10 +42,11 @@ examples/gemini_example/function_tools.py,sha256=ZOBrdPy_8s3NDfsF5A4RXIoUi2VXlD8
40
42
  examples/gemini_example/main.py,sha256=cTXqgOa6lEMwgX56uneM-1TbIY_QZtDRkByW5z0LpNk,2470
41
43
  examples/hiveagent_example/basic.py,sha256=Sd7I5w8w5Xx7ODaydTY30yiq9HwJDMKHQywrZjgehP0,441
42
44
  examples/inspect_ai_example/basic_eval.py,sha256=hDg2BB9ONNpOGRVH08HsghnS1373sOnq6dyDmUQd9gY,1040
43
- examples/langchain_example/__init__.py,sha256=xAys_K5AbVqaJ8d5wCcE6w2tCiTXPkSGMyY9paBXitI,410
45
+ examples/langchain_example/__init__.py,sha256=g0WO8zrKVSDc8XmMVFl3oYno7ihXtPuHu9yy_tY3JhY,493
44
46
  examples/langchain_example/basic.py,sha256=hrwMHOUv78-su5DP9i5krkQnMGHq0svEXsBa40Jkggg,2981
45
47
  examples/langchain_example/groq_example.py,sha256=egrg3FHCnSJ-kV22Z2_t9ElJfKilddfcO5bwcKCfc5M,1060
46
48
  examples/langchain_example/langgraph_example.py,sha256=7C2a4Sg0PKbbab03CVkStO3MzT7C-O1UtdmObvBXurM,2005
49
+ examples/langchain_example/langgraph_example_tools.py,sha256=rFwgQYRngeyCz9PuBxnllp5t5PIHk8d-UDKwCQTgkxw,4208
47
50
  examples/langchain_example/sagemaker.py,sha256=V-rTZRyaErHCuo3kfrrZD8AELHJVi3wF7n1YrixfF1s,2330
48
51
  examples/langchain_example/tool.py,sha256=8T8_IDbgA58XbsfyH5_xhA8ZKQfyfyFxF8wor-PsRjA,2556
49
52
  examples/litellm_example/basic.py,sha256=h71u1vMKdPlGJbC1DmK8PKIbaDj4I96-cx2hztboDic,2544
@@ -86,7 +89,7 @@ examples/weaviate_example/__init__.py,sha256=8JMDBsRSEV10HfTd-YC7xb4txBjD3la56sn
86
89
  examples/weaviate_example/query_text.py,sha256=wPHQTc_58kPoKTZMygVjTj-2ZcdrIuaausJfMxNQnQc,127162
87
90
  langtrace_python_sdk/__init__.py,sha256=VZM6i71NR7pBQK6XvJWRelknuTYUhqwqE7PlicKa5Wg,1166
88
91
  langtrace_python_sdk/langtrace.py,sha256=rjIEwPd-Iq0mcSCh_3CEK-38kyJwazdR1CfDa_U4mfQ,8468
89
- langtrace_python_sdk/version.py,sha256=V3JuwBWPUgLiobXC7DivZI3eWt6Cy_7a_iP_DDpg3ns,22
92
+ langtrace_python_sdk/version.py,sha256=6gWyqqtavdLEWlseY6lzF5O9sA3rYGOPizMXn2nrFRg,22
90
93
  langtrace_python_sdk/constants/__init__.py,sha256=P8QvYwt5czUNDZsKS64vxm9Dc41ptGbuF1TFtAF6nv4,44
91
94
  langtrace_python_sdk/constants/exporter/langtrace_exporter.py,sha256=5MNjnAOg-4am78J3gVMH6FSwq5N8TOj72ugkhsw4vi0,46
92
95
  langtrace_python_sdk/constants/instrumentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -110,8 +113,8 @@ langtrace_python_sdk/extensions/langtrace_filesystem.py,sha256=34fZutG28EJ66l67O
110
113
  langtrace_python_sdk/instrumentation/__init__.py,sha256=bkyxh6lq_6dgCdbBseFQEbejRTLZv4s9nLBfNSqL6lk,1548
111
114
  langtrace_python_sdk/instrumentation/anthropic/__init__.py,sha256=donrurJAGYlxrSRA3BIf76jGeUcAx9Tq8CVpah68S0Y,101
112
115
  langtrace_python_sdk/instrumentation/anthropic/instrumentation.py,sha256=ndXdruI0BG7n75rsuEpKjfzePxrZxg40gZ39ONmD_v4,1845
113
- langtrace_python_sdk/instrumentation/anthropic/patch.py,sha256=_-PcDTNTvcNGjtk00YvLUJlQ3jm0HGZ0i77OveDJ8no,4806
114
- langtrace_python_sdk/instrumentation/anthropic/types.py,sha256=kboPgvqXPk1zJdISRjNj3LfB--6OiTuw7UzZezYAXWQ,2480
116
+ langtrace_python_sdk/instrumentation/anthropic/patch.py,sha256=LUv-nv94uPJprDj34LQNrhRDqweZZ26Cb9oVATBc2Yc,5230
117
+ langtrace_python_sdk/instrumentation/anthropic/types.py,sha256=WdeXe2tkjAisMLK38STKwVe7MJS5SLoETJ_aKhA_-UU,2463
115
118
  langtrace_python_sdk/instrumentation/chroma/__init__.py,sha256=pNZ5UO8Q-d5VkXSobBf79reB6AmEl_usnnTp5Itv818,95
116
119
  langtrace_python_sdk/instrumentation/chroma/instrumentation.py,sha256=nT6PS6bsrIOO9kLV5GuUeRjMe6THHHAZGvqWBP1dYog,1807
117
120
  langtrace_python_sdk/instrumentation/chroma/patch.py,sha256=jYcqBeu-0cYA29PO880oXYRwYh-R1oseXmzfK6UDBps,9074
@@ -169,11 +172,11 @@ langtrace_python_sdk/instrumentation/vertexai/instrumentation.py,sha256=Keeb1D7n
169
172
  langtrace_python_sdk/instrumentation/vertexai/patch.py,sha256=vPxwuSKgA3cUtelgot4XZEox8AD4ehsi3bNTKD_HS_M,4394
170
173
  langtrace_python_sdk/instrumentation/weaviate/__init__.py,sha256=Mc-Je6evPo-kKQzerTG7bd1XO5JOh4YGTE3wBxaUBwg,99
171
174
  langtrace_python_sdk/instrumentation/weaviate/instrumentation.py,sha256=bzPwtoQD0X6beLYXe6ZL7XRkyRkqdiqKiGc4gOlCQdU,2295
172
- langtrace_python_sdk/instrumentation/weaviate/patch.py,sha256=C4-zF6IY13yZs_BPJP5wxpRNpASQIVu-ey1kR5y9u4o,6453
175
+ langtrace_python_sdk/instrumentation/weaviate/patch.py,sha256=3qxhJjEnu5lNb6_x0p82PaFBgXul-b0XTyTQV1JHzhw,6597
173
176
  langtrace_python_sdk/types/__init__.py,sha256=MeGkmoy2OY3V21GErDIdlf_N8Aj7HDld5Tpbvq2PwTY,4104
174
177
  langtrace_python_sdk/utils/__init__.py,sha256=giTHkvDOQdqFqXU4PoGP7DhA9tAteZN-KxX3mEUg6QQ,893
175
178
  langtrace_python_sdk/utils/langtrace_sampler.py,sha256=BupNndHbU9IL_wGleKetz8FdcveqHMBVz1bfKTTW80w,1753
176
- langtrace_python_sdk/utils/llm.py,sha256=kPBsVPv8U7LjgKKT3_nrYFrGmluZ7hmFjZ80O0hiKE8,14722
179
+ langtrace_python_sdk/utils/llm.py,sha256=k16jQL3wf1dYIDOcXSvHVfL0s97cu3QVLMmZmtTT3Gk,14741
177
180
  langtrace_python_sdk/utils/misc.py,sha256=7PRJ45BwuwJ6fPAdy1OpBau8QERR2aWaVvzDvZ7JTkE,1729
178
181
  langtrace_python_sdk/utils/prompt_registry.py,sha256=n5dQMVLBw8aJZY8Utvf67bncc25ELf6AH9BYw8_hSzo,2619
179
182
  langtrace_python_sdk/utils/sdk_version_checker.py,sha256=FzjIWZjn53cX0LEVPdipQd1fO9lG8iGVUEVUs9Hyk6M,1713
@@ -184,7 +187,7 @@ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
187
  tests/conftest.py,sha256=0Jo6iCZTXbdvyJVhG9UpYGkLabL75378oauCzmt-Sa8,603
185
188
  tests/utils.py,sha256=8ZBYvxBH6PynipT1sqenfyjTGLhEV7SORQH1NJjnpsM,2500
186
189
  tests/anthropic/conftest.py,sha256=ht1zF3q4Xb1UiZ3BL_L-CQ3YWrd52Dqb4WTZ3f-GdG4,739
187
- tests/anthropic/test_anthropic.py,sha256=5c2UELkvrVHb07t7wyHvxxAOn_M0-L8wuVT4z1FMHUU,2863
190
+ tests/anthropic/test_anthropic.py,sha256=ODeGDGSZCopR7QVA8Y-Vvv3wBLs-LOlQ58LneU-aTng,2864
188
191
  tests/anthropic/cassettes/test_anthropic.yaml,sha256=z7YAqA_BBgI-hw7uyVMdLoIZdBYhKwl9cuTzUu9nAZs,2332
189
192
  tests/anthropic/cassettes/test_anthropic_streaming.yaml,sha256=D0w4-6dfsgrhbNLJEj8gZBV0yXfrAfA9u90Yu8Ac-TY,11675
190
193
  tests/anthropic/cassettes/test_async_anthropic_streaming.yaml,sha256=hQZPY2vwBaW3BWllLd0lcGQ73DjA8C3Ips1Hx9pA-ao,8373
@@ -222,8 +225,8 @@ tests/pinecone/cassettes/test_query.yaml,sha256=b5v9G3ssUy00oG63PlFUR3JErF2Js-5A
222
225
  tests/pinecone/cassettes/test_upsert.yaml,sha256=neWmQ1v3d03V8WoLl8FoFeeCYImb8pxlJBWnFd_lITU,38607
223
226
  tests/qdrant/conftest.py,sha256=9n0uHxxIjWk9fbYc4bx-uP8lSAgLBVx-cV9UjnsyCHM,381
224
227
  tests/qdrant/test_qdrant.py,sha256=pzjAjVY2kmsmGfrI2Gs2xrolfuaNHz7l1fqGQCjp5_o,3353
225
- langtrace_python_sdk-2.3.4.dist-info/METADATA,sha256=t5WV1418586CZeej1o61a6IXanvQYwOiqUxHZjRnBh8,15011
226
- langtrace_python_sdk-2.3.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
227
- langtrace_python_sdk-2.3.4.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
228
- langtrace_python_sdk-2.3.4.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
229
- langtrace_python_sdk-2.3.4.dist-info/RECORD,,
228
+ langtrace_python_sdk-2.3.7.dist-info/METADATA,sha256=AncuNESTDY0FsWOisJnbDW5dF6FNs318HmNBN-g915I,15011
229
+ langtrace_python_sdk-2.3.7.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
230
+ langtrace_python_sdk-2.3.7.dist-info/entry_points.txt,sha256=1_b9-qvf2fE7uQNZcbUei9vLpFZBbbh9LrtGw95ssAo,70
231
+ langtrace_python_sdk-2.3.7.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
232
+ langtrace_python_sdk-2.3.7.dist-info/RECORD,,
@@ -27,6 +27,7 @@ def test_anthropic(anthropic_client, exporter):
27
27
  "stream": False,
28
28
  "max_tokens": 1024,
29
29
  }
30
+
30
31
  anthropic_client.messages.create(**kwargs)
31
32
  spans = exporter.get_finished_spans()
32
33
  completion_span = spans[-1]