1
1
from opentelemetry .trace import Span
2
+ from opentelemetry .semconv_ai import SpanAttributes
2
3
import json
3
4
4
5
@@ -13,7 +14,7 @@ class CrewAISpanAttributes:
13
14
def __init__ (self , span : Span , instance ) -> None :
14
15
self .span = span
15
16
self .instance = instance
16
- self .crew = {"tasks" : [], "agents" : [], "llms" : [] }
17
+ self .crew = {"tasks" : [], "agents" : []}
17
18
self .process_instance ()
18
19
19
20
def process_instance (self ):
@@ -44,9 +45,37 @@ def _process_task(self):
44
45
self ._set_attribute (f"crewai.task.{ key } " , value )
45
46
46
47
def _process_llm (self ):
47
- llm_data = self ._populate_llm_attributes ()
48
- for key , value in llm_data .items ():
49
- self ._set_attribute (f"crewai.llm.{ key } " , value )
48
+ fields = [
49
+ "model" ,
50
+ "temperature" ,
51
+ "top_p" ,
52
+ "n" ,
53
+ "stop" ,
54
+ "max_completion_tokens" ,
55
+ "max_tokens" ,
56
+ "presence_penalty" ,
57
+ "frequency_penalty" ,
58
+ "seed"
59
+ ]
60
+
61
+ for field in fields :
62
+ value = getattr (self .instance , field , None )
63
+ if value is None :
64
+ continue
65
+ if field == "model" :
66
+ self ._set_attribute (SpanAttributes .LLM_REQUEST_MODEL , value )
67
+ elif field == "temperature" :
68
+ self ._set_attribute (SpanAttributes .LLM_REQUEST_TEMPERATURE , value )
69
+ elif field == "top_p" :
70
+ self ._set_attribute (SpanAttributes .LLM_REQUEST_TOP_P , value )
71
+ elif field == "max_tokens" :
72
+ self ._set_attribute (SpanAttributes .LLM_REQUEST_MAX_TOKENS , value )
73
+ elif field == "presence_penalty" :
74
+ self ._set_attribute (SpanAttributes .LLM_PRESENCE_PENALTY , value )
75
+ elif field == "frequency_penalty" :
76
+ self ._set_attribute (SpanAttributes .LLM_FREQUENCY_PENALTY , value )
77
+ else :
78
+ self ._set_attribute (f"llm.{ field } " , value )
50
79
51
80
def _populate_crew_attributes (self ):
52
81
for key , value in self .instance .__dict__ .items ():
@@ -56,8 +85,6 @@ def _populate_crew_attributes(self):
56
85
self ._parse_tasks (value )
57
86
elif key == "agents" :
58
87
self ._parse_agents (value )
59
- elif key == "llms" :
60
- self ._parse_llms (value )
61
88
else :
62
89
self .crew [key ] = str (value )
63
90
@@ -92,20 +119,6 @@ def _parse_tasks(self, tasks):
92
119
for task in tasks
93
120
]
94
121
95
- def _parse_llms (self , llms ):
96
- self .crew ["tasks" ] = [
97
- {
98
- "temperature" : llm .temperature ,
99
- "max_tokens" : llm .max_tokens ,
100
- "max_completion_tokens" : llm .max_completion_tokens ,
101
- "top_p" : llm .top_p ,
102
- "n" : llm .n ,
103
- "seed" : llm .seed ,
104
- "base_url" : llm .base_url ,
105
- "api_version" : llm .api_version , }
106
- for llm in llms
107
- ]
108
-
109
122
def _extract_agent_data (self , agent ):
110
123
model = (
111
124
getattr (agent .llm , "model" , None )
@@ -146,5 +159,5 @@ def _serialize_tools(self, tools):
146
159
)
147
160
148
161
def _set_attribute (self , key , value ):
149
- if value :
162
+ if value is not None :
150
163
set_span_attribute (self .span , key , str (value ) if isinstance (value , list ) else value )
0 commit comments