Skip to content

Commit 5996b45

Browse files
authored
TeamOne handle multimodal console (#200)
* Added ability to print multimodal messages to console. * Fixed hatch error
1 parent 14628f2 commit 5996b45

File tree

7 files changed

+42
-28
lines changed

7 files changed

+42
-28
lines changed

python/teams/team-one/src/team_one/agents/base_agent.py

+5-21
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
from typing import List, Tuple, Union
1+
from typing import List, Tuple
22

3-
from agnext.components import Image, TypeRoutedAgent, message_handler
3+
from agnext.components import TypeRoutedAgent, message_handler
44
from agnext.components.models import (
55
AssistantMessage,
66
LLMMessage,
77
UserMessage,
88
)
99
from agnext.core import CancellationToken
1010

11-
from team_one.messages import BroadcastMessage, RequestReplyMessage
12-
13-
# Convenience type
14-
UserContent = Union[str, List[Union[str, Image]]]
11+
from team_one.messages import BroadcastMessage, RequestReplyMessage, UserContent
12+
from team_one.utils import message_content_to_str
1513

1614

1715
class BaseAgent(TypeRoutedAgent):
@@ -35,21 +33,7 @@ async def handle_request_reply(self, message: RequestReplyMessage, cancellation_
3533
"""Respond to a reply request."""
3634
request_halt, response = await self._generate_reply(cancellation_token)
3735

38-
# Convert the response to an acceptable format for the assistant
39-
if isinstance(response, str):
40-
assistant_message = AssistantMessage(content=response, source=self.metadata["name"])
41-
elif isinstance(response, List):
42-
converted: List[str] = list()
43-
for item in response:
44-
if isinstance(item, str):
45-
converted.append(item.rstrip())
46-
elif isinstance(item, Image):
47-
converted.append("<image>")
48-
else:
49-
raise AssertionError("Unexpected response type.")
50-
assistant_message = AssistantMessage(content="\n".join(converted), source=self.metadata["name"])
51-
else:
52-
raise AssertionError("Unexpected response type.")
36+
assistant_message = AssistantMessage(content=message_content_to_str(response), source=self.metadata["name"])
5337
self._chat_history.append(assistant_message)
5438

5539
user_message = UserMessage(content=response, source=self.metadata["name"])

python/teams/team-one/src/team_one/agents/coder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
)
1010
from agnext.core import CancellationToken
1111

12-
from .base_agent import BaseAgent, UserContent
12+
from ..messages import UserContent
13+
from .base_agent import BaseAgent
1314

1415

1516
class Coder(BaseAgent):

python/teams/team-one/src/team_one/agents/file_surfer.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
from agnext.core import CancellationToken
1515
from typing_extensions import Annotated
1616

17-
from .base_agent import BaseAgent, UserContent
17+
from ..messages import UserContent
18+
from .base_agent import BaseAgent
1819

1920

2021
async def read_local_file(file_path: Annotated[str, "relative or absolute path of file to read"]) -> str:

python/teams/team-one/src/team_one/agents/orchestrator.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from agnext.core import AgentProxy, CancellationToken
88

99
from ..messages import BroadcastMessage, OrchestrationEvent, RequestReplyMessage
10+
from ..utils import message_content_to_str
1011

1112
logger = logging.getLogger(EVENT_LOGGER_NAME + ".orchestrator")
1213

@@ -30,7 +31,7 @@ async def handle_incoming_message(self, message: BroadcastMessage, cancellation_
3031
if isinstance(message.content, UserMessage) or isinstance(message.content, AssistantMessage):
3132
source = message.content.source
3233

33-
content = str(message.content.content)
34+
content = message_content_to_str(message.content.content)
3435

3536
logger.info(OrchestrationEvent(source, content))
3637

python/teams/team-one/src/team_one/agents/user_proxy.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
from agnext.core import CancellationToken
55

6-
from .base_agent import BaseAgent, UserContent
6+
from ..messages import UserContent
7+
from .base_agent import BaseAgent
78

89

910
class UserProxy(BaseAgent):

python/teams/team-one/src/team_one/messages.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
from dataclasses import dataclass
2+
from typing import List, Union
23

3-
from agnext.components.models import LLMMessage
4+
from agnext.components import FunctionCall, Image
5+
from agnext.components.models import FunctionExecutionResult, LLMMessage
6+
7+
# Convenience type
8+
UserContent = Union[str, List[Union[str, Image]]]
9+
AssistantContent = Union[str, List[FunctionCall]]
10+
FunctionExecutionContent = List[FunctionExecutionResult]
11+
SystemContent = str
412

513

614
@dataclass

python/teams/team-one/src/team_one/utils.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
import os
44
from datetime import datetime
5-
from typing import Any, Dict
5+
from typing import Any, Dict, List
66

77
from agnext.components.models import (
88
AzureOpenAIChatCompletionClient,
@@ -11,7 +11,7 @@
1111
OpenAIChatCompletionClient,
1212
)
1313

14-
from .messages import OrchestrationEvent
14+
from .messages import AssistantContent, FunctionExecutionContent, OrchestrationEvent, SystemContent, UserContent
1515

1616
ENVIRON_KEY_CHAT_COMPLETION_PROVIDER = "CHAT_COMPLETION_PROVIDER"
1717
ENVIRON_KEY_CHAT_COMPLETION_KWARGS_JSON = "CHAT_COMPLETION_KWARGS_JSON"
@@ -70,6 +70,24 @@ def create_completion_client_from_env(env: Dict[str, str] | None = None, **kwarg
7070
raise ValueError(f"Unknown OAI provider '{_provider}'")
7171

7272

73+
# Convert UserContent to a string
74+
def message_content_to_str(
75+
message_content: UserContent | AssistantContent | SystemContent | FunctionExecutionContent,
76+
) -> str:
77+
if isinstance(message_content, str):
78+
return message_content
79+
elif isinstance(message_content, List):
80+
converted: List[str] = list()
81+
for item in message_content:
82+
if isinstance(item, str):
83+
converted.append(item.rstrip())
84+
else:
85+
converted.append(str(item).rstrip())
86+
return "\n".join(converted)
87+
else:
88+
raise AssertionError("Unexpected response type.")
89+
90+
7391
# TeamOne log event handler
7492
class LogHandler(logging.Handler):
7593
def __init__(self) -> None:

0 commit comments

Comments
 (0)