Skip to content

Commit 4785865

Browse files
Msingh agentic systems code interpreter (#1639)
1 parent 0ce1302 commit 4785865

22 files changed

+10173
-0
lines changed

examples/object_oriented_agentic_approach/Secure_code_interpreter_tool_for_LLM_agents.ipynb

Lines changed: 562 additions & 0 deletions
Large diffs are not rendered by default.

examples/object_oriented_agentic_approach/resources/data/traffic_accidents.csv

Lines changed: 8757 additions & 0 deletions
Large diffs are not rendered by default.
409 KB
Loading
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
classDiagram
2+
3+
%% ==========================
4+
%% Abstract Classes
5+
%% ==========================
6+
class BaseAgent {
7+
- model_name: str
8+
- messages: ChatMessages
9+
- tool_manager: ToolManager
10+
- logger: Logger
11+
- language_model_interface: LanguageModelInterface
12+
13+
+ __init__(developer_prompt: str, model_name: str)
14+
+ setup_tools(): void %% abstract
15+
+ add_context(content: str): void
16+
+ add_message(content: str): void
17+
+ task(user_task: str, tool_call_enabled: bool, return_tool_response_as_is: bool): str
18+
}
19+
20+
class ToolInterface {
21+
+ get_definition(): Dict[str, Any]
22+
+ run(arguments: Dict[str, Any]): str
23+
}
24+
25+
class LanguageModelInterface {
26+
+ generate_completion(
27+
model: str,
28+
messages: List<Dict[str, str]],
29+
tools: List[Dict[str, Any]]
30+
): Dict[str, Any]
31+
}
32+
33+
34+
%% ==========================
35+
%% Concrete Classes
36+
%% ==========================
37+
class ChatMessages {
38+
- messages: List<Dict[str, str]>
39+
40+
+ __init__(developer_prompt: str)
41+
+ add_developer_message(content: str): void
42+
+ add_user_message(content: str): void
43+
+ add_assistant_message(content: str): void
44+
+ get_messages(): List<Dict[str, str]>
45+
}
46+
47+
class ToolManager {
48+
- tools: Dict[str, ToolInterface]
49+
- logger: Logger
50+
- language_model_interface: LanguageModelInterface
51+
52+
+ __init__()
53+
+ register_tool(tool: ToolInterface): void
54+
+ get_tool_definitions(): List<Dict[str, Any]>
55+
+ handle_tool_call_sequence(
56+
response: str,
57+
return_tool_response_as_is: bool,
58+
messages: ChatMessages
59+
): str
60+
}
61+
62+
class OpenAILanguageModel {
63+
- openai_client: OpenAI
64+
- logger: Logger
65+
66+
+ __init__()
67+
+ generate_completion(
68+
model: str,
69+
messages: List<Dict[str, str]],
70+
tools: List<Dict[str, Any]]
71+
): Dict[str, Any]
72+
}
73+
74+
class OpenAIClientFactory {
75+
+ create_client(api_key: str): OpenAI
76+
- _resolve_api_key(api_key: str): str
77+
}
78+
79+
80+
%% ==========================
81+
%% Relationships
82+
%% ==========================
83+
BaseAgent --> ChatMessages : uses
84+
BaseAgent --> LanguageModelInterface : uses
85+
BaseAgent --> ToolManager : optionally uses
86+
87+
ToolManager "0..*" --> "1" ToolInterface : manages
88+
ToolManager --> ChatMessages : uses
89+
ToolManager --> LanguageModelInterface : uses
90+
91+
LanguageModelInterface <|-- OpenAILanguageModel
92+
OpenAILanguageModel --> OpenAIClientFactory : uses
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
FROM python:3.10
2+
3+
RUN apt-get update && \
4+
apt-get install -y build-essential && \
5+
rm -rf /var/lib/apt/lists/*
6+
7+
# Create a non-root user
8+
RUN useradd -m sandboxuser
9+
USER sandboxuser
10+
WORKDIR /home/sandboxuser
11+
12+
COPY requirements.txt .
13+
RUN pip install --no-cache-dir -r requirements.txt
14+
15+
CMD ["python", "--version"]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
numpy==1.23.5
2+
pandas==1.5.3
3+
matplotlib==3.7.2
4+
seaborn==0.12.2
5+
scikit-learn==1.2.2
200 KB
Loading
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# object_oriented_agents/core_classes/agent_signature.py
2+
from typing import Optional, Dict, Any, List
3+
from .tool_manager import ToolManager
4+
5+
class AgentSignature:
6+
"""
7+
Encapsulates the logic to produce an agent's 'signature' data:
8+
- The developer prompt
9+
- The model name
10+
- The list of tool definitions
11+
"""
12+
13+
def __init__(self, developer_prompt: str, model_name: str, tool_manager: Optional[ToolManager] = None):
14+
self.developer_prompt = developer_prompt
15+
self.model_name = model_name
16+
self.tool_manager = tool_manager
17+
18+
def to_dict(self) -> Dict[str, Any]:
19+
"""
20+
Return a dictionary containing:
21+
1. The developer prompt
22+
2. The model name
23+
3. A list of tool definitions (function schemas)
24+
"""
25+
if self.tool_manager:
26+
# Each item in get_tool_definitions() looks like {"type": "function", "function": {...}}
27+
tool_definitions = self.tool_manager.get_tool_definitions()
28+
# We need the whole definition for the final signature
29+
functions = [t for t in tool_definitions]
30+
else:
31+
functions = []
32+
33+
return {
34+
"developer_prompt": self.developer_prompt,
35+
"model_name": self.model_name,
36+
"tools": functions
37+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# object_oriented_agents/core_classes/base_agent.py
2+
from abc import ABC, abstractmethod
3+
from typing import Optional
4+
from .chat_messages import ChatMessages
5+
from .tool_manager import ToolManager
6+
from ..utils.logger import get_logger
7+
from ..services.language_model_interface import LanguageModelInterface
8+
from .agent_signature import AgentSignature
9+
10+
11+
class BaseAgent(ABC):
12+
"""
13+
An abstract base agent that defines the high-level approach to handling user tasks
14+
and orchestrating calls to the OpenAI API.
15+
"""
16+
17+
def __init__(
18+
self,
19+
developer_prompt: str,
20+
model_name: str,
21+
logger=None,
22+
language_model_interface: LanguageModelInterface = None
23+
):
24+
self.developer_prompt = developer_prompt
25+
self.model_name = model_name
26+
self.messages = ChatMessages(developer_prompt)
27+
self.tool_manager: Optional[ToolManager] = None
28+
self.logger = logger or get_logger(self.__class__.__name__)
29+
self.language_model_interface = language_model_interface
30+
31+
@abstractmethod
32+
def setup_tools(self) -> None:
33+
pass
34+
35+
def add_context(self, content: str) -> None:
36+
self.logger.debug(f"Adding context: {content}")
37+
self.messages.add_user_message(content)
38+
39+
def add_message(self, content: str) -> None:
40+
self.logger.debug(f"Adding user message: {content}")
41+
self.messages.add_user_message(content)
42+
43+
def task(self, user_task: str, tool_call_enabled: bool = True, return_tool_response_as_is: bool = False) -> str:
44+
if self.language_model_interface is None:
45+
error_message = "Error: Cannot execute task without the LanguageModelInterface."
46+
self.logger.error(error_message)
47+
raise ValueError(error_message)
48+
49+
self.logger.debug(f"Starting task: {user_task} (tool_call_enabled={tool_call_enabled})")
50+
51+
# Add user message
52+
self.add_message(user_task)
53+
54+
tools = []
55+
if tool_call_enabled and self.tool_manager:
56+
tools = self.tool_manager.get_tool_definitions()
57+
self.logger.debug(f"Tools available: {tools}")
58+
59+
# Submit to OpenAI
60+
self.logger.debug("Sending request to language model interface...")
61+
response = self.language_model_interface.generate_completion(
62+
model=self.model_name,
63+
messages=self.messages.get_messages(),
64+
tools=tools,
65+
)
66+
67+
tool_calls = response.choices[0].message.tool_calls
68+
if tool_call_enabled and self.tool_manager and tool_calls:
69+
self.logger.debug(f"Tool calls requested: {tool_calls}")
70+
return self.tool_manager.handle_tool_call_sequence(
71+
response,
72+
return_tool_response_as_is,
73+
self.messages,
74+
self.model_name
75+
)
76+
77+
# No tool call, normal assistant response
78+
response_message = response.choices[0].message.content
79+
self.messages.add_assistant_message(response_message)
80+
self.logger.debug("Task completed successfully.")
81+
return response_message
82+
83+
def signature(self) -> dict:
84+
"""
85+
Return a dictionary with:
86+
- The developer prompt
87+
- The model name
88+
- The tool definitions (function schemas)
89+
"""
90+
signature_obj = AgentSignature(
91+
developer_prompt=self.developer_prompt,
92+
model_name=self.model_name,
93+
tool_manager=self.tool_manager
94+
)
95+
return signature_obj.to_dict()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# object_oriented_agents/core_classes/chat_messages.py
2+
from typing import List, Dict
3+
4+
class ChatMessages:
5+
"""
6+
Stores all messages in a conversation (developer, user, assistant).
7+
"""
8+
9+
def __init__(self, developer_prompt: str):
10+
self.messages: List[Dict[str, str]] = []
11+
self.add_developer_message(developer_prompt)
12+
13+
def add_developer_message(self, content: str) -> None:
14+
self.messages.append({"role": "developer", "content": content})
15+
16+
def add_user_message(self, content: str) -> None:
17+
self.messages.append({"role": "user", "content": content})
18+
19+
def add_assistant_message(self, content: str) -> None:
20+
self.messages.append({"role": "assistant", "content": content})
21+
22+
def get_messages(self) -> List[Dict[str, str]]:
23+
return self.messages

0 commit comments

Comments
 (0)