From 219e691c863441bb373ee4956eae71e5ceda7399 Mon Sep 17 00:00:00 2001 From: Karthik Kalyanaraman <105607645+karthikscale3@users.noreply.github.com> Date: Thu, 6 Feb 2025 09:04:13 -0800 Subject: [PATCH 1/5] Support tracing cached input tokens (#477) * capture cached input tokens * bump version --- .../instrumentation/openai/patch.py | 64 ++++++++----------- src/langtrace_python_sdk/version.py | 2 +- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/langtrace_python_sdk/instrumentation/openai/patch.py b/src/langtrace_python_sdk/instrumentation/openai/patch.py index 6cab2057..7c9d43b3 100644 --- a/src/langtrace_python_sdk/instrumentation/openai/patch.py +++ b/src/langtrace_python_sdk/instrumentation/openai/patch.py @@ -1,44 +1,31 @@ import json -from typing import Any, Dict, List, Optional, Callable, Awaitable, Union -from langtrace.trace_attributes import ( - LLMSpanAttributes, - SpanAttributes, -) -from langtrace_python_sdk.utils import set_span_attribute -from langtrace_python_sdk.utils.silently_fail import silently_fail +from typing import Any, Awaitable, Callable, Dict, List, Optional, Union + +from langtrace.trace_attributes import LLMSpanAttributes, SpanAttributes from opentelemetry import trace -from opentelemetry.trace import SpanKind, Tracer, Span -from opentelemetry.trace.status import Status, StatusCode +from opentelemetry.trace import Span, SpanKind, Tracer from opentelemetry.trace.propagation import set_span_in_context -from langtrace_python_sdk.constants.instrumentation.common import ( - SERVICE_PROVIDERS, -) -from langtrace_python_sdk.constants.instrumentation.openai import APIS -from langtrace_python_sdk.utils.llm import ( - calculate_prompt_tokens, - get_base_url, - get_extra_attributes, - get_langtrace_attributes, - get_llm_request_attributes, - get_llm_url, - get_span_name, - get_tool_calls, - is_streaming, - set_event_completion, - StreamWrapper, - set_span_attributes, - set_usage_attributes, -) -from langtrace_python_sdk.types import NOT_GIVEN +from opentelemetry.trace.status import Status, StatusCode +from langtrace_python_sdk.constants.instrumentation.common import \ + SERVICE_PROVIDERS +from langtrace_python_sdk.constants.instrumentation.openai import APIS from langtrace_python_sdk.instrumentation.openai.types import ( - ImagesGenerateKwargs, - ChatCompletionsCreateKwargs, - EmbeddingsCreateKwargs, - ImagesEditKwargs, - ResultType, - ContentItem, -) + ChatCompletionsCreateKwargs, ContentItem, EmbeddingsCreateKwargs, + ImagesEditKwargs, ImagesGenerateKwargs, ResultType) +from langtrace_python_sdk.types import NOT_GIVEN +from langtrace_python_sdk.utils import set_span_attribute +from langtrace_python_sdk.utils.llm import (StreamWrapper, + calculate_prompt_tokens, + get_base_url, get_extra_attributes, + get_langtrace_attributes, + get_llm_request_attributes, + get_llm_url, get_span_name, + get_tool_calls, is_streaming, + set_event_completion, + set_span_attributes, + set_usage_attributes) +from langtrace_python_sdk.utils.silently_fail import silently_fail def filter_valid_attributes(attributes): @@ -717,3 +704,8 @@ def _set_response_attributes(span: Span, result: ResultType) -> None: SpanAttributes.LLM_USAGE_TOTAL_TOKENS, result.usage.total_tokens, ) + set_span_attribute( + span, + "gen_ai.usage.cached_tokens", + result.usage.prompt_tokens_details.cached_tokens if result.usage.prompt_tokens_details else 0, + ) diff --git a/src/langtrace_python_sdk/version.py b/src/langtrace_python_sdk/version.py index 85197cb4..b202327a 100644 --- a/src/langtrace_python_sdk/version.py +++ b/src/langtrace_python_sdk/version.py @@ -1 +1 @@ -__version__ = "3.6.0" +__version__ = "3.6.1" From 73414907edea905bfa3c7c9da59913877afbcea8 Mon Sep 17 00:00:00 2001 From: Karthik Kalyanaraman Date: Fri, 7 Feb 2025 16:34:56 +0530 Subject: [PATCH 2/5] Bugfix DSPy --- src/langtrace_python_sdk/instrumentation/dspy/patch.py | 3 ++- src/langtrace_python_sdk/version.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/langtrace_python_sdk/instrumentation/dspy/patch.py b/src/langtrace_python_sdk/instrumentation/dspy/patch.py index 6e8dabfc..4f181009 100644 --- a/src/langtrace_python_sdk/instrumentation/dspy/patch.py +++ b/src/langtrace_python_sdk/instrumentation/dspy/patch.py @@ -114,7 +114,8 @@ def traced_method(wrapped, instance, args, kwargs): if instance.__class__.__name__: span_attributes["dspy.signature.name"] = instance.__class__.__name__ - span_attributes["dspy.signature"] = str(instance.signature) + # TODO(Karthik): This is not working for dspy >= 2.6.2 + # span_attributes["dspy.signature"] = str(instance.signature) if kwargs and len(kwargs) > 0: span_attributes["dspy.signature.args"] = str(kwargs) diff --git a/src/langtrace_python_sdk/version.py b/src/langtrace_python_sdk/version.py index b202327a..4f821939 100644 --- a/src/langtrace_python_sdk/version.py +++ b/src/langtrace_python_sdk/version.py @@ -1 +1 @@ -__version__ = "3.6.1" +__version__ = "3.6.2" From 05bbf8cc429420055975af46e9a2c9d145473625 Mon Sep 17 00:00:00 2001 From: Obinna Okafor Date: Tue, 25 Feb 2025 17:43:06 +0100 Subject: [PATCH 3/5] change pinecone-client to pinecone --- pyproject.toml | 2 +- .../instrumentation/pinecone/instrumentation.py | 4 ++-- src/langtrace_python_sdk/instrumentation/pinecone/patch.py | 2 +- src/langtrace_python_sdk/langtrace.py | 2 +- src/langtrace_python_sdk/types/__init__.py | 2 +- src/tests/pinecone/test_pinecone.py | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 73af63da..da0632c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dev = [ "qdrant-client", "graphlit-client", "python-dotenv", - "pinecone-client", + "pinecone", "langchain", "langchain-community", "langchain-openai", diff --git a/src/langtrace_python_sdk/instrumentation/pinecone/instrumentation.py b/src/langtrace_python_sdk/instrumentation/pinecone/instrumentation.py index c9266519..7608e901 100644 --- a/src/langtrace_python_sdk/instrumentation/pinecone/instrumentation.py +++ b/src/langtrace_python_sdk/instrumentation/pinecone/instrumentation.py @@ -33,12 +33,12 @@ class PineconeInstrumentation(BaseInstrumentor): The PineconeInstrumentation class represents the Pinecone instrumentation""" def instrumentation_dependencies(self) -> Collection[str]: - return ["pinecone-client >= 3.1.0"] + return ["pinecone >= 3.1.0"] def _instrument(self, **kwargs): tracer_provider = kwargs.get("tracer_provider") tracer = get_tracer(__name__, "", tracer_provider) - version = importlib.metadata.version("pinecone-client") + version = importlib.metadata.version("pinecone") for operation_name, details in APIS.items(): operation = details["OPERATION"] # Dynamically creating the patching call diff --git a/src/langtrace_python_sdk/instrumentation/pinecone/patch.py b/src/langtrace_python_sdk/instrumentation/pinecone/patch.py index 91c4f9d4..df8ce0e5 100644 --- a/src/langtrace_python_sdk/instrumentation/pinecone/patch.py +++ b/src/langtrace_python_sdk/instrumentation/pinecone/patch.py @@ -64,7 +64,7 @@ def traced_method(wrapped, instance, args, kwargs): ) as span: if span.is_recording(): - set_span_attribute(span, "server.address", instance._config.host) + set_span_attribute(span, "server.address", instance.config.host) if operation_name == "QUERY": set_query_input_attributes(span, kwargs) diff --git a/src/langtrace_python_sdk/langtrace.py b/src/langtrace_python_sdk/langtrace.py index 7830805f..4d3d7e32 100644 --- a/src/langtrace_python_sdk/langtrace.py +++ b/src/langtrace_python_sdk/langtrace.py @@ -301,7 +301,7 @@ def init( all_instrumentations = { "openai": OpenAIInstrumentation(), "groq": GroqInstrumentation(), - "pinecone-client": PineconeInstrumentation(), + "pinecone": PineconeInstrumentation(), "llama-index": LlamaindexInstrumentation(), "chromadb": ChromaInstrumentation(), "embedchain": EmbedchainInstrumentation(), diff --git a/src/langtrace_python_sdk/types/__init__.py b/src/langtrace_python_sdk/types/__init__.py index 0c6f7b87..ba875b9c 100644 --- a/src/langtrace_python_sdk/types/__init__.py +++ b/src/langtrace_python_sdk/types/__init__.py @@ -25,7 +25,7 @@ class InstrumentationType(Enum): MISTRALAI = "mistralai" OLLAMA = "ollama" OPENAI = "openai" - PINECONE = "pinecone-client" + PINECONE = "pinecone" QDRANT = "qdrant" SQLALCHEMY = "sqlalchemy" VERTEXAI = "vertexai" diff --git a/src/tests/pinecone/test_pinecone.py b/src/tests/pinecone/test_pinecone.py index aed86931..abc8cc17 100644 --- a/src/tests/pinecone/test_pinecone.py +++ b/src/tests/pinecone/test_pinecone.py @@ -34,7 +34,7 @@ def test_upsert(openai_client, pinecone_client, exporter): assert attributes.get("langtrace.sdk.name") == "langtrace-python-sdk" assert attributes.get("langtrace.service.name") == SERVICE_PROVIDERS["PINECONE"] assert attributes.get("langtrace.service.type") == "vectordb" - assert attributes.get("langtrace.service.version") == v("pinecone-client") + assert attributes.get("langtrace.service.version") == v("pinecone") assert attributes.get("langtrace.version") == v("langtrace-python-sdk") assert attributes.get("db.system") == "pinecone" assert attributes.get("db.operation") == APIS["UPSERT"]["OPERATION"] @@ -67,7 +67,7 @@ def test_query(openai_client, pinecone_client, exporter): assert attributes.get("langtrace.sdk.name") == "langtrace-python-sdk" assert attributes.get("langtrace.service.name") == SERVICE_PROVIDERS["PINECONE"] assert attributes.get("langtrace.service.type") == "vectordb" - assert attributes.get("langtrace.service.version") == v("pinecone-client") + assert attributes.get("langtrace.service.version") == v("pinecone") assert attributes.get("langtrace.version") == v("langtrace-python-sdk") assert attributes.get("db.system") == "pinecone" assert attributes.get("db.operation") == APIS["QUERY"]["OPERATION"] From f8b98c9f28ceeeaa01b0f190262bcfc3f8212208 Mon Sep 17 00:00:00 2001 From: Obinna Okafor Date: Tue, 25 Feb 2025 18:40:14 +0100 Subject: [PATCH 4/5] fix failing test --- .../instrumentation/langchain_core/patch.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/langtrace_python_sdk/instrumentation/langchain_core/patch.py b/src/langtrace_python_sdk/instrumentation/langchain_core/patch.py index 7b6e0821..69b302fc 100644 --- a/src/langtrace_python_sdk/instrumentation/langchain_core/patch.py +++ b/src/langtrace_python_sdk/instrumentation/langchain_core/patch.py @@ -248,8 +248,9 @@ def clean_empty(d): elif isinstance(val, object): # some langchain objects have a text attribute val = getattr(val, "text", None) - if val is not None and val.strip() != "": - result[k] = val.strip() + if val is not None and isinstance(val, str): + if val.strip() != "": + result[k] = val.strip() return result From 379fd7dd15494f9a28fd0d75c70a06d0b6b3089c Mon Sep 17 00:00:00 2001 From: Obinna Okafor Date: Wed, 26 Feb 2025 07:30:24 +0100 Subject: [PATCH 5/5] bump version --- src/langtrace_python_sdk/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/langtrace_python_sdk/version.py b/src/langtrace_python_sdk/version.py index 4f821939..6a45bf59 100644 --- a/src/langtrace_python_sdk/version.py +++ b/src/langtrace_python_sdk/version.py @@ -1 +1 @@ -__version__ = "3.6.2" +__version__ = "3.6.3"