Skip to content

Commit aef25ff

Browse files
committed
most changes
1 parent a96e2b8 commit aef25ff

File tree

14 files changed

+187
-113
lines changed

14 files changed

+187
-113
lines changed

src/backend/common/config/config.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
1+
"""Configuration class for the application.
2+
This class loads configuration values from environment variables and provides
3+
methods to access them. It also initializes an Azure AI client using the
4+
provided credentials.
5+
It uses the `azure.identity` library to handle authentication and
6+
authorization with Azure services.
7+
Access to .env variables requires adding the `python-dotenv` package to, or
8+
configuration of the env python path through the IDE. For example, in VSCode, the
9+
settings.json file in the .vscode folder should include the following:
10+
{
11+
"python.envFile": "${workspaceFolder}/.env"
12+
}
13+
"""
14+
115
import os
216

317
from azure.identity.aio import ClientSecretCredential, DefaultAzureCredential
4-
from dotenv import load_dotenv
5-
6-
load_dotenv()
18+
from semantic_kernel.agents.azure_ai.azure_ai_agent import AzureAIAgent
719

820

921
class Config:
22+
"""Configuration class for the application."""
23+
1024
def __init__(self):
1125
self.azure_tenant_id = os.getenv("AZURE_TENANT_ID", "")
1226
self.azure_client_id = os.getenv("AZURE_CLIENT_ID", "")
@@ -37,6 +51,10 @@ def __init__(self):
3751

3852
self.__azure_credentials = DefaultAzureCredential()
3953

54+
self.ai_project_client = AzureAIAgent.create_client(
55+
credential=self.get_azure_credentials()
56+
)
57+
4058
def get_azure_credentials(self):
4159
"""Retrieve Azure credentials, either from environment variables or managed identity."""
4260
if all([self.azure_tenant_id, self.azure_client_id, self.azure_client_secret]):

src/backend/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ structlog
3434
typing-extensions
3535
python-jose[cryptography]
3636
passlib[bcrypt]
37-
semantic-kernel==1.23.1
37+
semantic-kernel[azure]==1.26.1
3838
openai
3939
sqlparse
4040
sqlglot

src/backend/sql_agents/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
from .agent_config import AgentsConfigDialect, create_config
1414

1515
__all__ = [
16+
"create_kernel_with_chat_completion",
1617
"setup_migrator_agent",
1718
"setup_fixer_agent",
1819
"setup_picker_agent",
1920
"setup_syntax_checker_agent",
2021
"setup_semantic_verifier_agent",
2122
"get_prompt",
22-
"create_kernel_with_chat_completion",
2323
"create_config",
2424
"AgentType",
2525
]

src/backend/sql_agents/fixer/agent.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,57 @@
22

33
import logging
44

5+
from azure.ai.projects.models import (
6+
ResponseFormatJsonSchema,
7+
ResponseFormatJsonSchemaType,
8+
)
9+
from common.config.config import app_config
510
from common.models.api import AgentType
6-
from sql_agents.helpers.sk_utils import create_kernel_with_chat_completion
7-
from sql_agents.helpers.utils import get_prompt
8-
from semantic_kernel.agents import ChatCompletionAgent
11+
from semantic_kernel.agents.azure_ai.azure_ai_agent import AzureAIAgent
912
from semantic_kernel.kernel import KernelArguments
10-
from semantic_kernel.prompt_template import PromptTemplateConfig
1113
from sql_agents.agent_config import AgentModelDeployment, AgentsConfigDialect
1214
from sql_agents.fixer.response import FixerResponse
15+
from sql_agents.helpers.utils import get_prompt
1316

1417
logger = logging.getLogger(__name__)
1518
logger.setLevel(logging.DEBUG)
1619

1720

18-
logger = logging.getLogger(__name__)
19-
logger.setLevel(logging.DEBUG)
20-
21-
22-
def setup_fixer_agent(
21+
async def setup_fixer_agent(
2322
name: AgentType, config: AgentsConfigDialect, deployment_name: AgentModelDeployment
24-
) -> ChatCompletionAgent:
23+
) -> AzureAIAgent:
2524
"""Setup the fixer agent."""
2625
_deployment_name = deployment_name.value
2726
_name = name.value
28-
kernel = create_kernel_with_chat_completion(_name, _deployment_name)
2927

3028
try:
3129
template_content = get_prompt(_name)
3230
except FileNotFoundError as exc:
3331
logger.error("Prompt file for %s not found.", _name)
3432
raise ValueError(f"Prompt file for {_name} not found.") from exc
3533

36-
# prompt = replace_tags(template_content, {"target": config.sql_dialect_out})
37-
38-
settings = kernel.get_prompt_execution_settings_from_service_id(service_id=_name)
39-
settings.response_format = FixerResponse
40-
settings.temperature = 0.0
41-
42-
kernel_args = KernelArguments(target=config.sql_dialect_out, settings=settings)
34+
kernel_args = KernelArguments(target=config.sql_dialect_out)
4335

44-
fixer_agent = ChatCompletionAgent(
45-
kernel=kernel,
36+
# Define an agent on the Azure AI agent service
37+
agent_definition = await app_config.ai_project_client.agents.create_agent(
38+
model=_deployment_name,
4639
name=_name,
4740
instructions=template_content,
41+
temperature=0.0,
42+
response_format=ResponseFormatJsonSchemaType(
43+
json_schema=ResponseFormatJsonSchema(
44+
name="FixerResponse",
45+
description="respond with fixer response",
46+
schema=FixerResponse.model_json_schema(),
47+
)
48+
),
49+
)
50+
51+
# Create a Semantic Kernel agent based on the agent definition.
52+
# Add RAG with docs programmatically for this one
53+
fixer_agent = AzureAIAgent(
54+
client=app_config.ai_project_client,
55+
definition=agent_definition,
4856
arguments=kernel_args,
4957
)
5058

src/backend/sql_agents/fixer/response.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from pydantic import BaseModel
1+
from semantic_kernel.kernel_pydantic import KernelBaseModel
22

33

4-
class FixerResponse(BaseModel):
4+
class FixerResponse(KernelBaseModel):
55
"""
66
Model for the response of the fixer
77
"""

src/backend/sql_agents/migrator/agent.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,62 @@
22

33
import logging
44

5+
from azure.ai.projects.models import (
6+
ResponseFormatJsonSchema,
7+
ResponseFormatJsonSchemaType,
8+
)
9+
from common.config.config import app_config
510
from common.models.api import AgentType
6-
from sql_agents.helpers.sk_utils import create_kernel_with_chat_completion
7-
from sql_agents.helpers.utils import get_prompt
8-
from semantic_kernel.agents import ChatCompletionAgent
11+
from semantic_kernel.agents.azure_ai.azure_ai_agent import AzureAIAgent
912
from semantic_kernel.functions import KernelArguments
1013
from sql_agents.agent_config import AgentModelDeployment, AgentsConfigDialect
14+
from sql_agents.helpers.utils import get_prompt
1115
from sql_agents.migrator.response import MigratorResponse
1216

1317
logger = logging.getLogger(__name__)
1418
logger.setLevel(logging.DEBUG)
1519

1620

17-
def setup_migrator_agent(
21+
async def setup_migrator_agent(
1822
name: AgentType, config: AgentsConfigDialect, deployment_name: AgentModelDeployment
19-
) -> ChatCompletionAgent:
23+
) -> AzureAIAgent:
2024
"""Setup the migrator agent."""
2125
_deployment_name = deployment_name.value
2226
_name = name.value
23-
NUM_CANDIDATES = 3
24-
25-
kernel = create_kernel_with_chat_completion(_name, _deployment_name)
27+
num_candidates = 3
2628

2729
try:
2830
template_content = get_prompt(_name)
2931
except FileNotFoundError as exc:
3032
logger.error("Prompt file for %s not found.", _name)
3133
raise ValueError(f"Prompt file for {_name} not found.") from exc
3234

33-
settings = kernel.get_prompt_execution_settings_from_service_id(
34-
service_id="migrator"
35-
)
36-
settings.response_format = MigratorResponse
37-
settings.temperature = 0.0
38-
3935
kernel_args = KernelArguments(
4036
target=config.sql_dialect_out,
41-
numCandidates=str(NUM_CANDIDATES),
37+
numCandidates=str(num_candidates),
4238
source=config.sql_dialect_in,
43-
settings=settings,
4439
)
4540

46-
migrator_agent = ChatCompletionAgent(
47-
kernel=kernel,
48-
name=name,
41+
# Define an agent on the Azure AI agent service
42+
agent_definition = await app_config.ai_project_client.agents.create_agent(
43+
model=_deployment_name,
44+
name=_name,
4945
instructions=template_content,
46+
temperature=0.0,
47+
response_format=ResponseFormatJsonSchemaType(
48+
json_schema=ResponseFormatJsonSchema(
49+
name="MigratorResponse",
50+
description="respond with migrator response",
51+
schema=MigratorResponse.model_json_schema(),
52+
)
53+
),
54+
)
55+
56+
# Create a Semantic Kernel agent based on the agent definition.
57+
# Add RAG with docs programmatically for this one
58+
migrator_agent = AzureAIAgent(
59+
client=app_config.ai_project_client,
60+
definition=agent_definition,
5061
arguments=kernel_args,
5162
)
5263

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from pydantic import BaseModel
1+
from semantic_kernel.kernel_pydantic import KernelBaseModel
22

33

4-
class MigratorCandidate(BaseModel):
4+
class MigratorCandidate(KernelBaseModel):
55
"""
66
Model for a single candidate for migration
77
"""
@@ -10,7 +10,7 @@ class MigratorCandidate(BaseModel):
1010
candidate_query: str
1111

1212

13-
class MigratorResponse(BaseModel):
13+
class MigratorResponse(KernelBaseModel):
1414
"""
1515
Model for the response of the migrator
1616
"""
@@ -19,4 +19,4 @@ class MigratorResponse(BaseModel):
1919
candidates: list[MigratorCandidate]
2020
input_error: str | None = None
2121
summary: str | None = None
22-
rai_error: str | None = None
22+
rai_error: str | None = None

src/backend/sql_agents/picker/agent.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import logging
44

5+
from azure.ai.projects.models import (
6+
ResponseFormatJsonSchema,
7+
ResponseFormatJsonSchemaType,
8+
)
9+
from common.config.config import app_config
510
from common.models.api import AgentType
6-
from sql_agents.helpers.sk_utils import create_kernel_with_chat_completion
7-
from sql_agents.helpers.utils import get_prompt
8-
from semantic_kernel.agents import ChatCompletionAgent
11+
from semantic_kernel.agents.azure_ai.azure_ai_agent import AzureAIAgent
912
from semantic_kernel.kernel import KernelArguments
1013
from sql_agents.agent_config import AgentModelDeployment, AgentsConfigDialect
14+
from sql_agents.helpers.utils import get_prompt
1115
from sql_agents.picker.response import PickerResponse
1216

1317
logger = logging.getLogger(__name__)
@@ -16,35 +20,45 @@
1620
NUM_CANDIDATES = 3
1721

1822

19-
def setup_picker_agent(
23+
async def setup_picker_agent(
2024
name: AgentType, config: AgentsConfigDialect, deployment_name: AgentModelDeployment
21-
) -> ChatCompletionAgent:
25+
) -> AzureAIAgent:
2226
"""Setup the picker agent."""
2327
_deployment_name = deployment_name.value
2428
_name = name.value
25-
kernel = create_kernel_with_chat_completion(_name, _deployment_name)
2629

2730
try:
2831
template_content = get_prompt(_name)
2932
except FileNotFoundError as exc:
3033
logger.error("Prompt file for %s not found.", _name)
3134
raise ValueError(f"Prompt file for {_name} not found.") from exc
3235

33-
settings = kernel.get_prompt_execution_settings_from_service_id(service_id="picker")
34-
settings.response_format = PickerResponse
35-
settings.temperature = 0.0
36-
3736
kernel_args = KernelArguments(
3837
target=config.sql_dialect_out,
3938
numCandidates=str(NUM_CANDIDATES),
4039
source=config.sql_dialect_in,
41-
settings=settings,
4240
)
4341

44-
picker_agent = ChatCompletionAgent(
45-
kernel=kernel,
42+
# Define an agent on the Azure AI agent service
43+
agent_definition = await app_config.ai_project_client.agents.create_agent(
44+
model=_deployment_name,
4645
name=_name,
4746
instructions=template_content,
47+
temperature=0.0,
48+
response_format=ResponseFormatJsonSchemaType(
49+
json_schema=ResponseFormatJsonSchema(
50+
name="PickerResponse",
51+
description="respond with picker response",
52+
schema=PickerResponse.model_json_schema(),
53+
)
54+
),
55+
)
56+
57+
# Create a Semantic Kernel agent based on the agent definition.
58+
# Add RAG with docs programmatically for this one
59+
picker_agent = AzureAIAgent(
60+
client=app_config.ai_project_client,
61+
definition=agent_definition,
4862
arguments=kernel_args,
4963
)
5064

src/backend/sql_agents/picker/response.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
from pydantic import BaseModel
1+
from semantic_kernel.kernel_pydantic import KernelBaseModel
22

33

4-
class PickerCandidateSummary(BaseModel):
4+
class PickerCandidateSummary(KernelBaseModel):
55
candidate_index: int
66
candidate_summary: str
77

88

9-
class PickerResponse(BaseModel):
9+
class PickerResponse(KernelBaseModel):
1010
"""
1111
The response of the picker agent.
1212
"""

0 commit comments

Comments
 (0)