Skip to content

Commit 5b15332

Browse files
sktool changes
1 parent e10aa37 commit 5b15332

2 files changed

Lines changed: 69 additions & 2 deletions

File tree

src/backend/kernel_agents/agent_factory.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
# Import the new AppConfig instance
88
from app_config import config
9+
from semantic_kernel.kernel import Kernel
10+
from semantic_kernel.core_plugins.text_plugin import TextPlugin
11+
from kernel_tools.kernel_to_tool import create_tool_from_kernel_function
12+
from semantic_kernel.core_plugins.text_plugin import TextPlugin
913
from azure.ai.agents.models import (ResponseFormatJsonSchema,
1014
ResponseFormatJsonSchemaType)
1115
from context.cosmos_memory_kernel import CosmosMemoryContext
@@ -146,9 +150,26 @@ async def create_agent(
146150
agent_type_str = cls._agent_type_strings.get(
147151
agent_type, agent_type.value.lower()
148152
)
149-
tools = None
153+
154+
#tools = None
150155

151-
# Create the agent instance using the project-based pattern
156+
tools = []
157+
158+
try:
159+
kernel = Kernel()
160+
plugin = TextPlugin()
161+
kernel.add_plugin(plugin, plugin_name="text")
162+
uppercase_fn = kernel.get_function("text", "uppercase")
163+
uppercase_tool = create_tool_from_kernel_function(
164+
uppercase_fn,
165+
name="UppercaseTool",
166+
description="Convert text to uppercase using SK"
167+
)
168+
tools.append(uppercase_tool)
169+
except Exception as sk_exc:
170+
logger.warning(f"SK tool injection failed: {sk_exc}")
171+
172+
#Create the agent instance using the project-based pattern
152173
try:
153174
# Filter kwargs to only those accepted by the agent's __init__
154175
agent_init_params = inspect.signature(agent_class.__init__).parameters
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from azure.ai.agents.models import ToolDefinition, AgentsResponseFormat
2+
from semantic_kernel.functions.kernel_function import KernelFunction
3+
from typing import Optional
4+
5+
class KernelFunctionToolWrapper(ToolDefinition):
6+
def __init__(
7+
self,
8+
kernel_function: KernelFunction,
9+
name: Optional[str] = None,
10+
description: Optional[str] = None
11+
):
12+
self._kernel_function = kernel_function
13+
self.name = name or kernel_function.name
14+
self.description = description or kernel_function.description or "SK-wrapped function"
15+
16+
async def invoke(self, request) -> AgentsResponseFormat:
17+
args = request.args or {}
18+
input_value = args.get("input", "")
19+
result = await self._kernel_function.invoke_async(input_value)
20+
return AgentsResponseFormat(output=result if isinstance(result, str) else str(result))#AgentsResponseFormat(output=str(result))
21+
22+
@property
23+
def _data(self) -> dict:
24+
"""Required for Azure Agent framework and planner compatibility."""
25+
return {
26+
"name": self.name,
27+
"description": self.description,
28+
"parameters": {
29+
"type": "object",
30+
"properties": {
31+
"input": {
32+
"type": "string",
33+
"description": "Input string for the function"
34+
}
35+
},
36+
"required": ["input"]
37+
}
38+
}
39+
40+
41+
def create_tool_from_kernel_function(
42+
kernel_function: KernelFunction,
43+
name: Optional[str] = None,
44+
description: Optional[str] = None
45+
) -> ToolDefinition:
46+
return KernelFunctionToolWrapper(kernel_function, name, description)

0 commit comments

Comments
 (0)