Skip to content

Commit d7d5e58

Browse files
CopilotnikhilNavanikhilc-microsoft
authored
SDK Schema changes (#189)
* Initial plan * Update telemetry schema attribute names to match nodejs PR #207 Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Update tests to reflect telemetry schema changes Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Remove ENABLE_A365_OBSERVABILITY_PER_REQUEST_EXPORT - not applicable for Python Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Fix ruff format errors, move _get_sdk_version to utils.py, remove set_request_context from BaggageBuilder Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Remove microsoft.tenant.id comment from trace_processor/util.py Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Fix get_sdk_version exception handling to catch all exceptions Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Remove service_name from AgentDetails - it's an SDK property not an agent property Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Add operation_source method to BaggageBuilder using SERVICE_NAME_KEY Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Remove GEN_AI_EXECUTION_SOURCE_NAME_KEY, GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY, and GEN_AI_EVENT_CONTENT constants Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Improve documentation for empty method implementations Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * Add missing GEN_AI_RESPONSE_ID_KEY constant to fix test import error Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> * fix tests * fix integration tests --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: nikhilNava <211831449+nikhilNava@users.noreply.github.com> Co-authored-by: Nikhil Chitlur Navakiran (from Dev Box) <nikhilc@microsoft.com>
1 parent 5ce0785 commit d7d5e58

27 files changed

Lines changed: 278 additions & 418 deletions

File tree

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
register_span_enricher,
1919
unregister_span_enricher,
2020
)
21-
from .inference_call_details import InferenceCallDetails
21+
from .inference_call_details import InferenceCallDetails, ServiceEndpoint
2222
from .inference_operation_type import InferenceOperationType
2323
from .inference_scope import InferenceScope
2424
from .invoke_agent_details import InvokeAgentDetails
@@ -61,6 +61,7 @@
6161
"SourceMetadata",
6262
"Request",
6363
"InferenceCallDetails",
64+
"ServiceEndpoint",
6465
# Enums
6566
"ExecutionType",
6667
"InferenceOperationType",

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/agent_details.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
from dataclasses import dataclass
55
from typing import Optional
66

7-
from .models.agent_type import AgentType
8-
97

108
@dataclass
119
class AgentDetails:
@@ -29,8 +27,8 @@ class AgentDetails:
2927
agent_blueprint_id: Optional[str] = None
3028
"""Blueprint/Application ID for the agent."""
3129

32-
agent_type: Optional[AgentType] = None
33-
"""The agent type."""
30+
agent_platform_id: Optional[str] = None
31+
"""Platform ID for the agent."""
3432

3533
tenant_id: Optional[str] = None
3634
"""Tenant ID for the agent."""
@@ -41,5 +39,5 @@ class AgentDetails:
4139
icon_uri: Optional[str] = None
4240
"""Optional icon URI for the agent."""
4341

44-
agent_client_ip: Optional[str] = None
45-
"""Client IP address of the agent user."""
42+
provider_name: Optional[str] = None
43+
"""The provider name (e.g., openai, anthropic)."""

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/constants.py

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
# Span operation names
77
INVOKE_AGENT_OPERATION_NAME = "invoke_agent"
88
EXECUTE_TOOL_OPERATION_NAME = "execute_tool"
9+
OUTPUT_MESSAGES_OPERATION_NAME = "output_messages"
10+
CHAT_OPERATION_NAME = "chat"
911

1012
# OpenTelemetry semantic conventions
1113
ERROR_TYPE_KEY = "error.type"
@@ -30,81 +32,79 @@
3032
GEN_AI_REQUEST_MODEL_KEY = "gen_ai.request.model"
3133
GEN_AI_REQUEST_TEMPERATURE_KEY = "gen_ai.request.temperature"
3234
GEN_AI_REQUEST_TOP_P_KEY = "gen_ai.request.top_p"
33-
GEN_AI_RESPONSE_ID_KEY = "gen_ai.response.id"
3435
GEN_AI_RESPONSE_FINISH_REASONS_KEY = "gen_ai.response.finish_reasons"
3536
GEN_AI_RESPONSE_MODEL_KEY = "gen_ai.response.model"
36-
GEN_AI_SYSTEM_KEY = "gen_ai.system"
37-
GEN_AI_SYSTEM_VALUE = "az.ai.agent365"
38-
GEN_AI_THOUGHT_PROCESS_KEY = "gen_ai.agent.thought.process"
39-
37+
GEN_AI_RESPONSE_ID_KEY = "gen_ai.response.id"
4038
GEN_AI_AGENT_ID_KEY = "gen_ai.agent.id"
4139
GEN_AI_AGENT_NAME_KEY = "gen_ai.agent.name"
4240
GEN_AI_AGENT_DESCRIPTION_KEY = "gen_ai.agent.description"
41+
GEN_AI_AGENT_PLATFORM_ID_KEY = "microsoft.a365.agent.platform.id"
42+
GEN_AI_AGENT_THOUGHT_PROCESS_KEY = "microsoft.a365.agent.thought.process"
4343
GEN_AI_CONVERSATION_ID_KEY = "gen_ai.conversation.id"
44-
GEN_AI_CONVERSATION_ITEM_LINK_KEY = "gen_ai.conversation.item.link"
44+
GEN_AI_CONVERSATION_ITEM_LINK_KEY = "microsoft.conversation.item.link"
4545
GEN_AI_TOKEN_TYPE_KEY = "gen_ai.token.type"
4646
GEN_AI_USAGE_INPUT_TOKENS_KEY = "gen_ai.usage.input_tokens"
4747
GEN_AI_USAGE_OUTPUT_TOKENS_KEY = "gen_ai.usage.output_tokens"
4848
GEN_AI_CHOICE = "gen_ai.choice"
4949
GEN_AI_PROVIDER_NAME_KEY = "gen_ai.provider.name"
50-
GEN_AI_AGENT_TYPE_KEY = "gen_ai.agent.type"
5150

5251
GEN_AI_SYSTEM_INSTRUCTIONS_KEY = "gen_ai.system_instructions"
5352
GEN_AI_INPUT_MESSAGES_KEY = "gen_ai.input.messages"
5453
GEN_AI_OUTPUT_MESSAGES_KEY = "gen_ai.output.messages"
55-
GEN_AI_EVENT_CONTENT = "gen_ai.event.content"
5654

5755
# Tool execution constants
5856
GEN_AI_TOOL_CALL_ID_KEY = "gen_ai.tool.call.id"
5957
GEN_AI_TOOL_NAME_KEY = "gen_ai.tool.name"
6058
GEN_AI_TOOL_DESCRIPTION_KEY = "gen_ai.tool.description"
61-
GEN_AI_TOOL_ARGS_KEY = "gen_ai.tool.arguments"
62-
GEN_AI_TOOL_CALL_RESULT_KEY = GEN_AI_EVENT_CONTENT # GEN_AI_EVENT_CONTENT
59+
GEN_AI_TOOL_ARGS_KEY = "gen_ai.tool.call.arguments"
60+
GEN_AI_TOOL_CALL_RESULT_KEY = "gen_ai.tool.call.result"
6361
GEN_AI_TOOL_TYPE_KEY = "gen_ai.tool.type"
6462

65-
# Agent user(user tied to agent instance during creation) or caller dimensions
66-
GEN_AI_AGENT_USER_ID_KEY = "gen_ai.agent.userid"
67-
GEN_AI_CALLER_USER_ID_KEY = "gen_ai.caller.userid"
68-
GEN_AI_CALLER_TENANT_ID_KEY = "gen_ai.caller.tenantid"
69-
GEN_AI_CALLER_ID_KEY = "gen_ai.caller.id"
70-
GEN_AI_CALLER_NAME_KEY = "gen_ai.caller.name"
71-
GEN_AI_CALLER_UPN_KEY = "gen_ai.caller.upn"
72-
GEN_AI_CALLER_CLIENT_IP_KEY = "gen_ai.caller.client.ip"
63+
# Agent user (user tied to agent instance during creation) or caller dimensions
64+
GEN_AI_CALLER_ID_KEY = "microsoft.caller.id"
65+
GEN_AI_CALLER_NAME_KEY = "microsoft.caller.name"
66+
GEN_AI_CALLER_UPN_KEY = "microsoft.caller.upn"
67+
GEN_AI_CALLER_CLIENT_IP_KEY = "client.address"
7368

7469
# Agent to Agent caller agent dimensions
75-
GEN_AI_CALLER_AGENT_USER_ID_KEY = "gen_ai.caller.agent.userid"
76-
GEN_AI_CALLER_AGENT_UPN_KEY = "gen_ai.caller.agent.upn"
77-
GEN_AI_CALLER_AGENT_TENANT_ID_KEY = "gen_ai.caller.agent.tenantid"
78-
GEN_AI_CALLER_AGENT_NAME_KEY = "gen_ai.caller.agent.name"
79-
GEN_AI_CALLER_AGENT_ID_KEY = "gen_ai.caller.agent.id"
80-
GEN_AI_CALLER_AGENT_APPLICATION_ID_KEY = "gen_ai.caller.agent.applicationid"
81-
GEN_AI_CALLER_AGENT_TYPE_KEY = "gen_ai.caller.agent.type"
82-
GEN_AI_CALLER_AGENT_USER_CLIENT_IP = "gen_ai.caller.agent.user.client.ip"
70+
GEN_AI_CALLER_AGENT_USER_ID_KEY = "microsoft.a365.caller.agent.user.id"
71+
GEN_AI_CALLER_AGENT_UPN_KEY = "microsoft.a365.caller.agent.user.upn"
72+
GEN_AI_CALLER_AGENT_NAME_KEY = "microsoft.a365.caller.agent.name"
73+
GEN_AI_CALLER_AGENT_ID_KEY = "microsoft.a365.caller.agent.id"
74+
GEN_AI_CALLER_AGENT_APPLICATION_ID_KEY = "microsoft.a365.caller.agent.blueprint.id"
75+
GEN_AI_CALLER_AGENT_PLATFORM_ID_KEY = "microsoft.a365.caller.agent.platform.id"
8376

8477
# Agent-specific dimensions
8578
AGENT_ID_KEY = "gen_ai.agent.id"
8679
GEN_AI_TASK_ID_KEY = "gen_ai.task.id"
87-
SESSION_ID_KEY = "session.id"
80+
SESSION_ID_KEY = "microsoft.session.id"
81+
SESSION_DESCRIPTION_KEY = "microsoft.session.description"
8882
GEN_AI_ICON_URI_KEY = "gen_ai.agent365.icon_uri"
89-
TENANT_ID_KEY = "tenant.id"
83+
TENANT_ID_KEY = "microsoft.tenant.id"
9084

9185
# Baggage keys
92-
OPERATION_SOURCE_KEY = "operation.source"
93-
GEN_AI_AGENT_AUID_KEY = "gen_ai.agent.user.id"
94-
GEN_AI_AGENT_UPN_KEY = "gen_ai.agent.upn"
95-
GEN_AI_AGENT_BLUEPRINT_ID_KEY = "gen_ai.agent.applicationid"
96-
CORRELATION_ID_KEY = "correlation.id"
97-
HIRING_MANAGER_ID_KEY = "hiring.manager.id"
98-
SESSION_DESCRIPTION_KEY = "session.description"
86+
GEN_AI_AGENT_AUID_KEY = "microsoft.agent.user.id"
87+
GEN_AI_AGENT_UPN_KEY = "microsoft.agent.user.upn"
88+
GEN_AI_AGENT_BLUEPRINT_ID_KEY = "microsoft.a365.agent.blueprint.id"
9989

10090
# Execution context dimensions
10191
GEN_AI_EXECUTION_TYPE_KEY = "gen_ai.execution.type"
10292
GEN_AI_EXECUTION_PAYLOAD_KEY = "gen_ai.execution.payload"
10393

104-
# Source metadata dimensions
105-
GEN_AI_EXECUTION_SOURCE_NAME_KEY = "gen_ai.channel.name"
106-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY = "gen_ai.channel.link"
94+
# Channel dimensions
95+
CHANNEL_NAME_KEY = "microsoft.channel.name"
96+
CHANNEL_LINK_KEY = "microsoft.channel.link"
10797

108-
# custom parent id and parent name key
98+
# Custom parent id and parent name key
10999
CUSTOM_PARENT_SPAN_ID_KEY = "custom.parent.span.id"
110100
CUSTOM_SPAN_NAME_KEY = "custom.span.name"
101+
102+
# Service attributes
103+
SERVICE_NAME_KEY = "service.name"
104+
105+
# Telemetry SDK attributes
106+
TELEMETRY_SDK_NAME_KEY = "telemetry.sdk.name"
107+
TELEMETRY_SDK_LANGUAGE_KEY = "telemetry.sdk.language"
108+
TELEMETRY_SDK_VERSION_KEY = "telemetry.sdk.version"
109+
TELEMETRY_SDK_NAME_VALUE = "A365ObservabilitySDK"
110+
TELEMETRY_SDK_LANGUAGE_VALUE = "python"

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/execute_tool_scope.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55

66
from .agent_details import AgentDetails
77
from .constants import (
8+
CHANNEL_LINK_KEY,
9+
CHANNEL_NAME_KEY,
810
EXECUTE_TOOL_OPERATION_NAME,
9-
GEN_AI_EVENT_CONTENT,
10-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
11-
GEN_AI_EXECUTION_SOURCE_NAME_KEY,
1211
GEN_AI_TOOL_ARGS_KEY,
1312
GEN_AI_TOOL_CALL_ID_KEY,
1413
GEN_AI_TOOL_DESCRIPTION_KEY,
@@ -115,15 +114,16 @@ def __init__(
115114

116115
# Set request metadata if provided
117116
if request and request.source_metadata:
118-
self.set_tag_maybe(GEN_AI_EXECUTION_SOURCE_NAME_KEY, request.source_metadata.name)
119-
self.set_tag_maybe(
120-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY, request.source_metadata.description
121-
)
117+
self.set_tag_maybe(CHANNEL_NAME_KEY, request.source_metadata.name)
118+
self.set_tag_maybe(CHANNEL_LINK_KEY, request.source_metadata.description)
122119

123120
def record_response(self, response: str) -> None:
124121
"""Records response information for telemetry tracking.
125122
123+
Note: This method is intentionally a no-op as GEN_AI_EVENT_CONTENT was removed.
124+
The method is kept for interface compatibility.
125+
126126
Args:
127127
response: The response to record
128128
"""
129-
self.set_tag_maybe(GEN_AI_EVENT_CONTENT, response)
129+
pass

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/inference_call_details.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
66
from .inference_operation_type import InferenceOperationType
77

88

9+
@dataclass
10+
class ServiceEndpoint:
11+
"""Represents a service endpoint with hostname and optional port."""
12+
13+
hostname: str
14+
"""The hostname of the service endpoint."""
15+
16+
port: int | None = None
17+
"""The port of the service endpoint."""
18+
19+
920
@dataclass
1021
class InferenceCallDetails:
1122
"""Details of an inference call for generative AI operations."""
@@ -16,4 +27,5 @@ class InferenceCallDetails:
1627
inputTokens: int | None = None
1728
outputTokens: int | None = None
1829
finishReasons: list[str] | None = None
19-
responseId: str | None = None
30+
thoughtProcess: str | None = None
31+
endpoint: ServiceEndpoint | None = None

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/inference_scope.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66

77
from .agent_details import AgentDetails
88
from .constants import (
9-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
10-
GEN_AI_EXECUTION_SOURCE_NAME_KEY,
9+
CHANNEL_LINK_KEY,
10+
CHANNEL_NAME_KEY,
11+
GEN_AI_AGENT_THOUGHT_PROCESS_KEY,
1112
GEN_AI_INPUT_MESSAGES_KEY,
1213
GEN_AI_OPERATION_NAME_KEY,
1314
GEN_AI_OUTPUT_MESSAGES_KEY,
1415
GEN_AI_PROVIDER_NAME_KEY,
1516
GEN_AI_REQUEST_MODEL_KEY,
1617
GEN_AI_RESPONSE_FINISH_REASONS_KEY,
17-
GEN_AI_RESPONSE_ID_KEY,
18-
GEN_AI_THOUGHT_PROCESS_KEY,
1918
GEN_AI_USAGE_INPUT_TOKENS_KEY,
2019
GEN_AI_USAGE_OUTPUT_TOKENS_KEY,
20+
SERVER_ADDRESS_KEY,
21+
SERVER_PORT_KEY,
2122
)
2223
from .inference_call_details import InferenceCallDetails
2324
from .opentelemetry_scope import OpenTelemetryScope
@@ -100,24 +101,28 @@ def __init__(
100101
self.set_tag_maybe(GEN_AI_PROVIDER_NAME_KEY, details.providerName)
101102
self.set_tag_maybe(
102103
GEN_AI_USAGE_INPUT_TOKENS_KEY,
103-
str(details.inputTokens) if details.inputTokens is not None else None,
104+
details.inputTokens if details.inputTokens is not None else None,
104105
)
105106
self.set_tag_maybe(
106107
GEN_AI_USAGE_OUTPUT_TOKENS_KEY,
107-
str(details.outputTokens) if details.outputTokens is not None else None,
108+
details.outputTokens if details.outputTokens is not None else None,
108109
)
109110
self.set_tag_maybe(
110111
GEN_AI_RESPONSE_FINISH_REASONS_KEY,
111112
safe_json_dumps(details.finishReasons) if details.finishReasons else None,
112113
)
113-
self.set_tag_maybe(GEN_AI_RESPONSE_ID_KEY, details.responseId)
114+
self.set_tag_maybe(GEN_AI_AGENT_THOUGHT_PROCESS_KEY, details.thoughtProcess)
115+
116+
# Set endpoint information if provided
117+
if details.endpoint:
118+
self.set_tag_maybe(SERVER_ADDRESS_KEY, details.endpoint.hostname)
119+
if details.endpoint.port:
120+
self.set_tag_maybe(SERVER_PORT_KEY, str(details.endpoint.port))
114121

115122
# Set request metadata if provided
116123
if request and request.source_metadata:
117-
self.set_tag_maybe(GEN_AI_EXECUTION_SOURCE_NAME_KEY, request.source_metadata.name)
118-
self.set_tag_maybe(
119-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY, request.source_metadata.description
120-
)
124+
self.set_tag_maybe(CHANNEL_NAME_KEY, request.source_metadata.name)
125+
self.set_tag_maybe(CHANNEL_LINK_KEY, request.source_metadata.description)
121126

122127
def record_input_messages(self, messages: List[str]) -> None:
123128
"""Records the input messages for telemetry tracking.
@@ -141,15 +146,15 @@ def record_input_tokens(self, input_tokens: int) -> None:
141146
Args:
142147
input_tokens: Number of input tokens
143148
"""
144-
self.set_tag_maybe(GEN_AI_USAGE_INPUT_TOKENS_KEY, str(input_tokens))
149+
self.set_tag_maybe(GEN_AI_USAGE_INPUT_TOKENS_KEY, input_tokens)
145150

146151
def record_output_tokens(self, output_tokens: int) -> None:
147152
"""Records the number of output tokens for telemetry tracking.
148153
149154
Args:
150155
output_tokens: Number of output tokens
151156
"""
152-
self.set_tag_maybe(GEN_AI_USAGE_OUTPUT_TOKENS_KEY, str(output_tokens))
157+
self.set_tag_maybe(GEN_AI_USAGE_OUTPUT_TOKENS_KEY, output_tokens)
153158

154159
def record_finish_reasons(self, finish_reasons: List[str]) -> None:
155160
"""Records the finish reasons for telemetry tracking.
@@ -166,4 +171,4 @@ def record_thought_process(self, thought_process: str) -> None:
166171
Args:
167172
thought_process: The thought process to record
168173
"""
169-
self.set_tag_maybe(GEN_AI_THOUGHT_PROCESS_KEY, thought_process)
174+
self.set_tag_maybe(GEN_AI_AGENT_THOUGHT_PROCESS_KEY, thought_process)

libraries/microsoft-agents-a365-observability-core/microsoft_agents_a365/observability/core/invoke_agent_scope.py

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,18 @@
88

99
from .agent_details import AgentDetails
1010
from .constants import (
11+
CHANNEL_LINK_KEY,
12+
CHANNEL_NAME_KEY,
1113
GEN_AI_CALLER_AGENT_APPLICATION_ID_KEY,
1214
GEN_AI_CALLER_AGENT_ID_KEY,
1315
GEN_AI_CALLER_AGENT_NAME_KEY,
14-
GEN_AI_CALLER_AGENT_TENANT_ID_KEY,
15-
GEN_AI_CALLER_AGENT_TYPE_KEY,
16+
GEN_AI_CALLER_AGENT_PLATFORM_ID_KEY,
1617
GEN_AI_CALLER_AGENT_UPN_KEY,
17-
GEN_AI_CALLER_AGENT_USER_CLIENT_IP,
1818
GEN_AI_CALLER_AGENT_USER_ID_KEY,
19+
GEN_AI_CALLER_CLIENT_IP_KEY,
1920
GEN_AI_CALLER_ID_KEY,
2021
GEN_AI_CALLER_NAME_KEY,
21-
GEN_AI_CALLER_TENANT_ID_KEY,
2222
GEN_AI_CALLER_UPN_KEY,
23-
GEN_AI_CALLER_USER_ID_KEY,
24-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
25-
GEN_AI_EXECUTION_SOURCE_NAME_KEY,
2623
GEN_AI_EXECUTION_TYPE_KEY,
2724
GEN_AI_INPUT_MESSAGES_KEY,
2825
GEN_AI_OUTPUT_MESSAGES_KEY,
@@ -133,10 +130,8 @@ def __init__(
133130
# Set request metadata if provided
134131
if request:
135132
if request.source_metadata:
136-
self.set_tag_maybe(GEN_AI_EXECUTION_SOURCE_NAME_KEY, request.source_metadata.name)
137-
self.set_tag_maybe(
138-
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY, request.source_metadata.description
139-
)
133+
self.set_tag_maybe(CHANNEL_NAME_KEY, request.source_metadata.name)
134+
self.set_tag_maybe(CHANNEL_LINK_KEY, request.source_metadata.description)
140135

141136
self.set_tag_maybe(
142137
GEN_AI_EXECUTION_TYPE_KEY,
@@ -149,27 +144,23 @@ def __init__(
149144
self.set_tag_maybe(GEN_AI_CALLER_ID_KEY, caller_details.caller_id)
150145
self.set_tag_maybe(GEN_AI_CALLER_UPN_KEY, caller_details.caller_upn)
151146
self.set_tag_maybe(GEN_AI_CALLER_NAME_KEY, caller_details.caller_name)
152-
self.set_tag_maybe(GEN_AI_CALLER_USER_ID_KEY, caller_details.caller_user_id)
153-
self.set_tag_maybe(GEN_AI_CALLER_TENANT_ID_KEY, caller_details.tenant_id)
147+
# Validate and set caller client IP
148+
self.set_tag_maybe(
149+
GEN_AI_CALLER_CLIENT_IP_KEY,
150+
validate_and_normalize_ip(caller_details.caller_client_ip),
151+
)
154152

155153
# Set caller agent details tags
156154
if caller_agent_details:
157155
self.set_tag_maybe(GEN_AI_CALLER_AGENT_NAME_KEY, caller_agent_details.agent_name)
158156
self.set_tag_maybe(GEN_AI_CALLER_AGENT_ID_KEY, caller_agent_details.agent_id)
159-
self.set_tag_maybe(
160-
GEN_AI_CALLER_AGENT_TYPE_KEY,
161-
caller_agent_details.agent_type.value if caller_agent_details.agent_type else None,
162-
)
163157
self.set_tag_maybe(
164158
GEN_AI_CALLER_AGENT_APPLICATION_ID_KEY, caller_agent_details.agent_blueprint_id
165159
)
166160
self.set_tag_maybe(GEN_AI_CALLER_AGENT_USER_ID_KEY, caller_agent_details.agent_auid)
167161
self.set_tag_maybe(GEN_AI_CALLER_AGENT_UPN_KEY, caller_agent_details.agent_upn)
168-
self.set_tag_maybe(GEN_AI_CALLER_AGENT_TENANT_ID_KEY, caller_agent_details.tenant_id)
169-
# Validate and set caller agent client IP
170162
self.set_tag_maybe(
171-
GEN_AI_CALLER_AGENT_USER_CLIENT_IP,
172-
validate_and_normalize_ip(caller_agent_details.agent_client_ip),
163+
GEN_AI_CALLER_AGENT_PLATFORM_ID_KEY, caller_agent_details.agent_platform_id
173164
)
174165

175166
def record_response(self, response: str) -> None:

0 commit comments

Comments
 (0)