Skip to content

Commit 78cac7c

Browse files
authored
Merge pull request #1 from balureddy003/codex/create-simple-chat-agent-implementation
Add simple chat agent with chat history persistence
2 parents ec361d2 + 7855bd8 commit 78cac7c

File tree

2 files changed

+120
-7
lines changed

2 files changed

+120
-7
lines changed
Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,79 @@
1-
from kernel_agents.generic_agent import GenericAgent
2-
from models.messages_kernel import AgentType
31

2+
from typing import List, Optional
43

5-
class SimpleChatAgent(GenericAgent):
6-
"""Agent for basic conversational interactions."""
4+
from context.cosmos_memory_kernel import CosmosMemoryContext
5+
from kernel_agents.agent_base import BaseAgent
6+
from models.messages_kernel import MessageRole, StoredMessage
7+
from semantic_kernel.functions import KernelFunction
8+
9+
10+
class SimpleChatAgent(BaseAgent):
11+
"""A minimal chat agent for open-ended conversation."""
12+
13+
def __init__(
14+
self,
15+
session_id: str,
16+
user_id: str,
17+
memory_store: CosmosMemoryContext,
18+
tools: Optional[List[KernelFunction]] = None,
19+
system_message: Optional[str] = None,
20+
agent_name: str = "SimpleChatAgent",
21+
client=None,
22+
definition=None,
23+
) -> None:
24+
super().__init__(
25+
agent_name=agent_name,
26+
session_id=session_id,
27+
user_id=user_id,
28+
memory_store=memory_store,
29+
tools=tools,
30+
system_message=system_message,
31+
client=client,
32+
definition=definition,
33+
)
734

835
@staticmethod
9-
def default_system_message(agent_name: str = AgentType.SIMPLE_CHAT.value) -> str:
10-
"""Get the default system message for the SimpleChatAgent."""
11-
return "You are a Simple Chat agent that engages in basic conversation and provides helpful responses."
36+
def default_system_message(agent_name: str | None = None) -> str:
37+
"""Return the default system message for open-ended chat."""
38+
name = agent_name or "assistant"
39+
return (
40+
f"You are {name}, a friendly AI for open-ended conversation. "
41+
"Engage with the user naturally and helpfully."
42+
)
43+
44+
async def handle_user_message(self, content: str) -> str:
45+
"""Process a user message, storing it and returning the agent's reply."""
46+
# Record the user message locally and persist it
47+
self._chat_history.append({"role": "user", "content": content})
48+
await self._memory_store.add_item(
49+
StoredMessage(
50+
session_id=self._session_id,
51+
user_id=self._user_id,
52+
role=MessageRole.user,
53+
content=content,
54+
source=self._agent_name,
55+
)
56+
)
57+
58+
# Generate a reply from the underlying model
59+
async_generator = self.invoke(messages=str(self._chat_history), thread=None)
60+
response_content = ""
61+
async for chunk in async_generator:
62+
if chunk is not None:
63+
response_content += str(chunk)
64+
65+
# Record the assistant's response
66+
self._chat_history.append({"role": "assistant", "content": response_content})
67+
await self._memory_store.add_item(
68+
StoredMessage(
69+
session_id=self._session_id,
70+
user_id=self._user_id,
71+
role=MessageRole.assistant,
72+
content=response_content,
73+
source=self._agent_name,
74+
)
75+
)
76+
77+
return response_content
78+
79+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import os
2+
import pytest
3+
4+
# Set required environment variables before importing the agent
5+
os.environ.setdefault("AZURE_OPENAI_ENDPOINT", "https://mock-endpoint")
6+
os.environ.setdefault("AZURE_AI_SUBSCRIPTION_ID", "sub")
7+
os.environ.setdefault("AZURE_AI_RESOURCE_GROUP", "rg")
8+
os.environ.setdefault("AZURE_AI_PROJECT_NAME", "proj")
9+
os.environ.setdefault("AZURE_AI_AGENT_ENDPOINT", "https://agent-endpoint")
10+
11+
from kernel_agents.simple_chat_agent import SimpleChatAgent
12+
from models.messages_kernel import MessageRole
13+
14+
15+
class DummyMemoryStore:
16+
def __init__(self):
17+
self.items = []
18+
19+
async def add_item(self, item):
20+
self.items.append(item)
21+
22+
23+
@pytest.mark.asyncio
24+
async def test_handle_user_message_stores_and_replies():
25+
memory_store = DummyMemoryStore()
26+
agent = SimpleChatAgent(session_id="s", user_id="u", memory_store=memory_store)
27+
28+
async def fake_invoke(self, messages=None, thread=None):
29+
yield "Hi there!"
30+
31+
agent.invoke = fake_invoke.__get__(agent, SimpleChatAgent)
32+
33+
response = await agent.handle_user_message("Hello")
34+
35+
assert response == "Hi there!"
36+
assert agent._chat_history[-2:] == [
37+
{"role": "user", "content": "Hello"},
38+
{"role": "assistant", "content": "Hi there!"},
39+
]
40+
assert len(memory_store.items) == 2
41+
assert memory_store.items[0].content == "Hello"
42+
assert memory_store.items[0].role == MessageRole.user
43+
assert memory_store.items[1].content == "Hi there!"
44+
assert memory_store.items[1].role == MessageRole.assistant
45+

0 commit comments

Comments
 (0)