Skip to content

Commit 391094f

Browse files
adharshctrnirga
andauthored
fix(crewai):Added the logic to set necessary attributes to the llm span (#3202)
Co-authored-by: Nir Gazit <[email protected]>
1 parent 0125110 commit 391094f

File tree

1 file changed

+34
-21
lines changed

1 file changed

+34
-21
lines changed

packages/opentelemetry-instrumentation-crewai/opentelemetry/instrumentation/crewai/crewai_span_attributes.py

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from opentelemetry.trace import Span
2+
from opentelemetry.semconv_ai import SpanAttributes
23
import json
34

45

@@ -13,7 +14,7 @@ class CrewAISpanAttributes:
1314
def __init__(self, span: Span, instance) -> None:
1415
self.span = span
1516
self.instance = instance
16-
self.crew = {"tasks": [], "agents": [], "llms": []}
17+
self.crew = {"tasks": [], "agents": []}
1718
self.process_instance()
1819

1920
def process_instance(self):
@@ -44,9 +45,37 @@ def _process_task(self):
4445
self._set_attribute(f"crewai.task.{key}", value)
4546

4647
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)
5079

5180
def _populate_crew_attributes(self):
5281
for key, value in self.instance.__dict__.items():
@@ -56,8 +85,6 @@ def _populate_crew_attributes(self):
5685
self._parse_tasks(value)
5786
elif key == "agents":
5887
self._parse_agents(value)
59-
elif key == "llms":
60-
self._parse_llms(value)
6188
else:
6289
self.crew[key] = str(value)
6390

@@ -92,20 +119,6 @@ def _parse_tasks(self, tasks):
92119
for task in tasks
93120
]
94121

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-
109122
def _extract_agent_data(self, agent):
110123
model = (
111124
getattr(agent.llm, "model", None)
@@ -146,5 +159,5 @@ def _serialize_tools(self, tools):
146159
)
147160

148161
def _set_attribute(self, key, value):
149-
if value:
162+
if value is not None:
150163
set_span_attribute(self.span, key, str(value) if isinstance(value, list) else value)

0 commit comments

Comments
 (0)