Skip to content

Commit 89e6c5f

Browse files
committed
fix(hermes): align response id dependencies
1 parent 93411f9 commit 89e6c5f

6 files changed

Lines changed: 32 additions & 22 deletions

File tree

instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
- Prefer provider-supplied OpenAI-compatible response IDs (including
1313
DashScope-style `request_id` values) for `gen_ai.response.id` on Hermes LLM
1414
spans, while retaining Hermes's response ID as a fallback.
15+
- Align the Hermes plugin with the OpenTelemetry 1.39.1/0.60b1 release set used
16+
by LoongSuite releases so its standard PyPI dependencies resolve consistently.
1517

1618
## Version 0.7.0 (2026-07-03)
1719

instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent/pyproject.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ classifiers = [
2424
"Programming Language :: Python :: 3.13",
2525
]
2626
dependencies = [
27-
"opentelemetry-api >= 1.37.0, < 1.40",
28-
"opentelemetry-instrumentation >= 0.60b1, < 0.61",
29-
"opentelemetry-instrumentation-threading >= 0.60b1, < 0.61",
30-
"opentelemetry-sdk >= 1.37.0, < 1.40",
31-
"opentelemetry-semantic-conventions >= 0.60b1, < 0.61",
27+
"opentelemetry-api ~= 1.39.1",
28+
"opentelemetry-instrumentation ~= 0.60b1",
29+
"opentelemetry-instrumentation-threading ~= 0.60b1",
30+
"opentelemetry-sdk ~= 1.39.1",
31+
"opentelemetry-semantic-conventions ~= 0.60b1",
3232
"opentelemetry-util-genai",
3333
"wrapt >= 1.0.0, < 2.0.0",
3434
]

instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent/src/opentelemetry/instrumentation/hermes_agent/wrappers.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,30 @@ class _ProviderResponseAttempt:
7474
def __init__(self) -> None:
7575
self._lock = threading.Lock()
7676
self._response_id: str | None = None
77+
self._response_id_priority = 0
7778

7879
@property
7980
def response_id(self) -> str | None:
8081
with self._lock:
8182
return self._response_id
8283

8384
def record(self, value: Any) -> None:
84-
response_id = extract_response_id(
85-
value,
86-
fields=("request_id", "id", "response_id"),
87-
)
85+
# DashScope exposes its provider correlation ID as ``request_id`` even
86+
# when an OpenAI-compatible completion ``id`` is also present.
87+
response_id = extract_response_id(value, fields=("request_id",))
88+
priority = 2
89+
if response_id is None:
90+
response_id = extract_response_id(
91+
value,
92+
fields=("id", "response_id"),
93+
)
94+
priority = 1
8895
if response_id is None:
8996
return
9097
with self._lock:
91-
if self._response_id is None:
98+
if priority > self._response_id_priority:
9299
self._response_id = response_id
100+
self._response_id_priority = priority
93101

94102

95103
class _ProviderResponseIdCapture:

instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent/tests/requirements.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ pyyaml>=6.0
1919
openai>=1.0.0
2020
wrapt>=1.0.0,<2.0.0
2121

22-
opentelemetry-api>=1.37.0,<1.40
23-
opentelemetry-sdk>=1.37.0,<1.40
24-
opentelemetry-instrumentation>=0.60b1,<0.61
25-
opentelemetry-instrumentation-threading>=0.60b1,<0.61
26-
opentelemetry-semantic-conventions>=0.60b1,<0.61
22+
opentelemetry-api==1.39.1
23+
opentelemetry-sdk==1.39.1
24+
opentelemetry-instrumentation==0.60b1
25+
opentelemetry-instrumentation-threading==0.60b1
26+
opentelemetry-semantic-conventions==0.60b1
2727

2828
-e util/opentelemetry-util-genai
2929
-e instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent

instrumentation-loongsuite/loongsuite-instrumentation-hermes-agent/tests/test_telemetry_spec.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ def test_streaming_request_id_from_usage_trailer_is_preserved(
512512
[
513513
iter(
514514
[
515-
_stream_chunk(),
515+
_stream_chunk("chatcmpl-chunk-456"),
516516
_stream_chunk(request_id="dashscope-request-456"),
517517
]
518518
)

util/opentelemetry-util-genai/src/opentelemetry/util/genai/response_id.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from __future__ import annotations
1818

1919
from collections.abc import Mapping, Sequence
20-
from typing import Any
20+
from typing import Any, cast
2121

2222

2323
def _normalize_response_id(value: Any) -> str | None:
@@ -46,11 +46,11 @@ def extract_response_id(
4646

4747
for field in fields:
4848
try:
49-
candidate = (
50-
response.get(field)
51-
if isinstance(response, Mapping)
52-
else getattr(response, field, None)
53-
)
49+
if isinstance(response, Mapping):
50+
mapping_response = cast(Mapping[str, Any], response)
51+
candidate = mapping_response.get(field)
52+
else:
53+
candidate = getattr(response, field, None)
5454
except Exception: # pylint: disable=broad-exception-caught
5555
# Provider SDK properties may raise arbitrary lazy-load errors;
5656
# response-ID telemetry must never break the model call.

0 commit comments

Comments
 (0)