diff --git a/cozeloop/integration/langchain/trace_callback.py b/cozeloop/integration/langchain/trace_callback.py index 4985633..ca6823a 100644 --- a/cozeloop/integration/langchain/trace_callback.py +++ b/cozeloop/integration/langchain/trace_callback.py @@ -304,7 +304,7 @@ def _span_type_mapping(span_type: str) -> str: elif span_type == 'ReActSingleInputOutputParser': return 'parser' elif span_type == 'tool': - return 'plugin' + return 'tool' return span_type @@ -406,7 +406,7 @@ def _convert_inputs(inputs: Any) -> Any: format_inputs['content'] = inputs.content return format_inputs if isinstance(inputs, BaseMessage): - message = Message(role=inputs.type, content=inputs.content) + message = Message(role=inputs.type, content=inputs.content, tool_calls=inputs.additional_kwargs.get('tool_calls', [])) return message if isinstance(inputs, ChatPromptValue): return _convert_inputs(inputs.messages) diff --git a/cozeloop/integration/langchain/trace_model/llm_model.py b/cozeloop/integration/langchain/trace_model/llm_model.py index 520b296..5dbf0e4 100644 --- a/cozeloop/integration/langchain/trace_model/llm_model.py +++ b/cozeloop/integration/langchain/trace_model/llm_model.py @@ -3,7 +3,7 @@ import json import time -from typing import List, Optional, Union +from typing import List, Optional, Union, Dict, Any from pydantic.dataclasses import dataclass from langchain_core.messages import BaseMessage, ToolMessage, AIMessageChunk from langchain_core.outputs import Generation, ChatGeneration @@ -14,7 +14,7 @@ class ToolFunction: name: Optional[str] = None description: Optional[str] = None parameters: Optional[dict] = None - arguments: Optional[dict] = None + arguments: Optional[Union[dict, str]] = None @dataclass @@ -50,20 +50,31 @@ class Message: tool_calls: List[ToolCall] = None def __post_init__(self): - if self.role is not None and self.role == 'AIMessageChunk': + if self.role is not None and (self.role == 'AIMessageChunk' or self.role == 'ai'): self.role = 'assistant' parts: Optional[List[Parts]] = [] if isinstance(self.content, List) and all(isinstance(x, dict) for x in self.content): + is_parts = False for each in self.content: text = each.get('text', None) url = each.get('url', each.get('image_url', {}).get('url', None)) + if text is None and url is None: + continue + is_parts = True parts.append(Parts(type=each.get('type', ''), text=text, image_url=ImageUrl(url=url) if url is not None else None)) - self.content = None + if is_parts: + self.content = None + else: + self.content = self.content.__str__() elif isinstance(self.content, dict): + is_part = False text = self.content.get('text', None) url = self.content.get('url', self.content.get('image_url', {}).get('url', None)) - parts.append(Parts(type=self.content.get('type', ''), text=text, image_url=ImageUrl(url=url) if url is not None else None)) - self.content = None + if text is not None or url is not None: + parts.append(Parts(type=self.content.get('type', ''), text=text, image_url=ImageUrl(url=url) if url is not None else None)) + self.content = None + else: + self.content = self.content.__str__() elif isinstance(self.content, List) and all(type(x, Parts) for x in self.content): parts = self.content self.content = None @@ -172,4 +183,4 @@ def convert_tool_calls(tool_calls: list) -> List[ToolCall]: for tool_call in tool_calls: function = ToolFunction(name=tool_call.get('function', {}).get('name', ''), arguments=json.loads(tool_call.get('function', {}).get('arguments', {}))) format_tool_calls.append(ToolCall(id=tool_call.get('id', ''), type=tool_call.get('type', ''), function=function)) - return format_tool_calls + return format_tool_calls \ No newline at end of file diff --git a/cozeloop/integration/langchain/trace_model/runtime.py b/cozeloop/integration/langchain/trace_model/runtime.py index 95f22f7..27ae6d8 100644 --- a/cozeloop/integration/langchain/trace_model/runtime.py +++ b/cozeloop/integration/langchain/trace_model/runtime.py @@ -5,12 +5,12 @@ import importlib.metadata as metadata from typing import Optional, Any -from cozeloop.spec import tracespce +from cozeloop.spec import tracespec -class RuntimeInfo(tracespce.Runtime): - language: Optional[str] = tracespce.V_LANG_PYTHON - library: Optional[str] = tracespce.V_LIB_LANGCHAIN +class RuntimeInfo(tracespec.Runtime): + language: Optional[str] = tracespec.V_LANG_PYTHON + library: Optional[str] = tracespec.V_LIB_LANGCHAIN def model_post_init(self, context: Any) -> None: try: diff --git a/cozeloop/internal/consts/__init__.py b/cozeloop/internal/consts/__init__.py index bdcca4b..f33b111 100644 --- a/cozeloop/internal/consts/__init__.py +++ b/cozeloop/internal/consts/__init__.py @@ -4,7 +4,7 @@ from contextvars import ContextVar from .error import * -from ...spec.tracespce.span_key import INPUT_TOKENS, OUTPUT_TOKENS, TOKENS, INPUT, OUTPUT +from ...spec.tracespec.span_key import INPUT_TOKENS, OUTPUT_TOKENS, TOKENS, INPUT, OUTPUT # default values for loop client # ComBaseURL = "https://api.coze.com" diff --git a/cozeloop/internal/prompt/converter.py b/cozeloop/internal/prompt/converter.py index fcd4559..ff1f065 100644 --- a/cozeloop/internal/prompt/converter.py +++ b/cozeloop/internal/prompt/converter.py @@ -3,7 +3,7 @@ from typing import List, Dict -from cozeloop.spec.tracespce import PromptInput, PromptOutput, ModelMessage, PromptArgument +from cozeloop.spec.tracespec import PromptInput, PromptOutput, ModelMessage, PromptArgument from cozeloop.entities.prompt import ( Prompt as EntityPrompt, Message as EntityMessage, diff --git a/cozeloop/internal/prompt/prompt.py b/cozeloop/internal/prompt/prompt.py index de86137..82cb571 100644 --- a/cozeloop/internal/prompt/prompt.py +++ b/cozeloop/internal/prompt/prompt.py @@ -7,7 +7,7 @@ from jinja2 import Environment, BaseLoader, Undefined from jinja2.utils import missing, object_type_repr -from cozeloop.spec.tracespce import PROMPT_KEY, INPUT, PROMPT_VERSION, V_SCENE_PROMPT_TEMPLATE, V_SCENE_PROMPT_HUB +from cozeloop.spec.tracespec import PROMPT_KEY, INPUT, PROMPT_VERSION, V_SCENE_PROMPT_TEMPLATE, V_SCENE_PROMPT_HUB from cozeloop.entities.prompt import (Prompt, Message, VariableDef, VariableType, TemplateType, Role, PromptVariable) from cozeloop.internal import consts diff --git a/cozeloop/internal/trace/exporter.py b/cozeloop/internal/trace/exporter.py index 1479135..d5d0ce0 100644 --- a/cozeloop/internal/trace/exporter.py +++ b/cozeloop/internal/trace/exporter.py @@ -6,7 +6,7 @@ import time from typing import Dict, List, Optional, Tuple, Callable, Any -from cozeloop.spec.tracespce import ModelInput, ModelMessagePart, ModelMessagePartType, ModelImageURL, ModelFileURL, ModelOutput +from cozeloop.spec.tracespec import ModelInput, ModelMessagePart, ModelMessagePartType, ModelImageURL, ModelFileURL, ModelOutput from cozeloop.internal.consts import * from cozeloop.internal.httpclient import Client, BaseResponse from cozeloop.internal.trace.model.model import UploadType, Attachment, ObjectStorage diff --git a/cozeloop/internal/trace/noop_span.py b/cozeloop/internal/trace/noop_span.py index 29e92ca..e06a3d2 100644 --- a/cozeloop/internal/trace/noop_span.py +++ b/cozeloop/internal/trace/noop_span.py @@ -8,7 +8,7 @@ from cozeloop.entities.prompt import Prompt from cozeloop.span import Span -from cozeloop.spec.tracespce import Runtime +from cozeloop.spec.tracespec import Runtime class NoopSpan(Span, ABC): diff --git a/cozeloop/internal/trace/span.py b/cozeloop/internal/trace/span.py index 3169cf1..e30768e 100644 --- a/cozeloop/internal/trace/span.py +++ b/cozeloop/internal/trace/span.py @@ -10,7 +10,7 @@ import urllib.parse from cozeloop import span -from cozeloop.spec.tracespce import (ModelInput, ModelOutput, ModelMessagePartType, ModelMessage, ModelMessagePart, +from cozeloop.spec.tracespec import (ModelInput, ModelOutput, ModelMessagePartType, ModelMessage, ModelMessagePart, ModelImageURL, ModelFileURL, ModelChoice, Runtime, ERROR, PROMPT_KEY, PROMPT_VERSION, MODEL_PROVIDER, MODEL_NAME, RUNTIME_, CALL_OPTIONS, V_SCENE_CUSTOM, V_LANG_PYTHON) diff --git a/cozeloop/internal/trace/trace.py b/cozeloop/internal/trace/trace.py index beb1610..7e763a1 100644 --- a/cozeloop/internal/trace/trace.py +++ b/cozeloop/internal/trace/trace.py @@ -5,7 +5,7 @@ from datetime import datetime from typing import Dict, Optional -from cozeloop.spec.tracespce import Runtime, RUNTIME_ +from cozeloop.spec.tracespec import Runtime, RUNTIME_ from cozeloop.internal import consts from cozeloop.internal.trace.span import from_header, Span, SpanContext, \ get_newest_span_from_context, set_span_to_context, logger diff --git a/cozeloop/span.py b/cozeloop/span.py index 0c8fade..ec3fd22 100644 --- a/cozeloop/span.py +++ b/cozeloop/span.py @@ -6,7 +6,7 @@ from typing import Dict, Any from datetime import datetime from cozeloop.entities.prompt import Prompt -from cozeloop.spec.tracespce import Runtime +from cozeloop.spec.tracespec import Runtime class SpanContext(ABC): diff --git a/cozeloop/spec/tracespce/__init__.py b/cozeloop/spec/tracespec/__init__.py similarity index 100% rename from cozeloop/spec/tracespce/__init__.py rename to cozeloop/spec/tracespec/__init__.py diff --git a/cozeloop/spec/tracespce/model.py b/cozeloop/spec/tracespec/model.py similarity index 100% rename from cozeloop/spec/tracespce/model.py rename to cozeloop/spec/tracespec/model.py diff --git a/cozeloop/spec/tracespce/prompt.py b/cozeloop/spec/tracespec/prompt.py similarity index 90% rename from cozeloop/spec/tracespce/prompt.py rename to cozeloop/spec/tracespec/prompt.py index 1ed45cb..59a32e6 100644 --- a/cozeloop/spec/tracespce/prompt.py +++ b/cozeloop/spec/tracespec/prompt.py @@ -5,7 +5,7 @@ from pydantic import BaseModel -from cozeloop.spec.tracespce import ModelMessage +from cozeloop.spec.tracespec import ModelMessage class PromptInput(BaseModel): diff --git a/cozeloop/spec/tracespce/retriever.py b/cozeloop/spec/tracespec/retriever.py similarity index 100% rename from cozeloop/spec/tracespce/retriever.py rename to cozeloop/spec/tracespec/retriever.py diff --git a/cozeloop/spec/tracespce/runtime.py b/cozeloop/spec/tracespec/runtime.py similarity index 100% rename from cozeloop/spec/tracespce/runtime.py rename to cozeloop/spec/tracespec/runtime.py diff --git a/cozeloop/spec/tracespce/span_key.py b/cozeloop/spec/tracespec/span_key.py similarity index 100% rename from cozeloop/spec/tracespce/span_key.py rename to cozeloop/spec/tracespec/span_key.py diff --git a/cozeloop/spec/tracespce/span_value.py b/cozeloop/spec/tracespec/span_value.py similarity index 100% rename from cozeloop/spec/tracespce/span_value.py rename to cozeloop/spec/tracespec/span_value.py diff --git a/examples/prompt/prompt_hub.py b/examples/prompt/prompt_hub.py index 1bb53b9..475f388 100644 --- a/examples/prompt/prompt_hub.py +++ b/examples/prompt/prompt_hub.py @@ -8,7 +8,7 @@ import cozeloop from cozeloop import Message from cozeloop.entities.prompt import Role -from cozeloop.spec.tracespce import CALL_OPTIONS, ModelCallOption, ModelMessage, ModelInput +from cozeloop.spec.tracespec import CALL_OPTIONS, ModelCallOption, ModelMessage, ModelInput class LLMRunner: diff --git a/examples/trace/multi_modality.py b/examples/trace/multi_modality.py index 0e4f75c..39a8b93 100644 --- a/examples/trace/multi_modality.py +++ b/examples/trace/multi_modality.py @@ -9,7 +9,7 @@ from typing import Any from cozeloop import new_client -from cozeloop.spec.tracespce import ModelInput, ModelMessage, ModelMessagePart, ModelMessagePartType, ModelImageURL, ModelFileURL +from cozeloop.spec.tracespec import ModelInput, ModelMessage, ModelMessagePart, ModelMessagePartType, ModelImageURL, ModelFileURL from cozeloop.logger import set_log_level logger = logging.getLogger(__name__) diff --git a/examples/trace/prompt.py b/examples/trace/prompt.py index 67d6ff0..c884a1b 100644 --- a/examples/trace/prompt.py +++ b/examples/trace/prompt.py @@ -7,7 +7,7 @@ from cozeloop.internal.consts import TRACE_PROMPT_HUB_SPAN_NAME, TRACE_PROMPT_TEMPLATE_SPAN_NAME from cozeloop.entities.prompt import PromptTemplate, Prompt, Message, Role from cozeloop import new_client, set_log_level -from cozeloop.spec.tracespce import ModelMessage, PromptInput, PromptArgument, V_PROMPT_HUB_SPAN_TYPE, PROMPT_KEY, \ +from cozeloop.spec.tracespec import ModelMessage, PromptInput, PromptArgument, V_PROMPT_HUB_SPAN_TYPE, PROMPT_KEY, \ INPUT, PROMPT_VERSION, OUTPUT, V_PROMPT_SPAN_TYPE