File: sample_agents_multiple_connected_agents.py

package info (click to toggle)
python-azure 20250829%2Bgit-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 756,824 kB
  • sloc: python: 6,224,989; ansic: 804; javascript: 287; makefile: 198; sh: 195; xml: 109
file content (175 lines) | stat: -rw-r--r-- 6,802 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# pylint: disable=line-too-long,useless-suppression
# ------------------------------------
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# ------------------------------------
from azure.ai.agents.models._models import RunStepConnectedAgentToolCall

"""
DESCRIPTION:
    This sample demonstrates how to use Agent operations with the Connected Agent tool from
    the Azure Agents service using a synchronous client.

USAGE:
    python sample_agents_multiple_connected_agents.py

    Before running the sample:

    pip install azure-ai-projects azure-ai-agents azure-identity

    Set these environment variables with your own values:
    1) PROJECT_ENDPOINT - The Azure AI Project endpoint, as found in the Overview
                          page of your Azure AI Foundry portal.
    2) MODEL_DEPLOYMENT_NAME - The deployment name of the AI model, as found under the "Name" column in
       the "Models + endpoints" tab in your Azure AI Foundry project.
    3) STORAGE_QUEUE_URI - the storage service queue endpoint, triggering Azure function.

    Please see Getting Started with Azure Functions page for more information on Azure Functions:
    https://learn.microsoft.com/azure/azure-functions/functions-get-started
    **Note:** The Azure Function may be only used in standard agent setup. Please follow the instruction on the web page
    https://github.com/azure-ai-foundry/foundry-samples/tree/main/samples/microsoft/infrastructure-setup/41-standard-agent-setup
    to deploy an agent, capable of calling Azure Functions.
"""

import os
from azure.ai.projects import AIProjectClient
from azure.ai.agents.models import (
    AzureFunctionStorageQueue,
    AzureFunctionTool,
    ConnectedAgentTool,
    ListSortOrder,
    MessageRole,
    RunStepToolCallDetails,
)
from azure.identity import DefaultAzureCredential


project_client = AIProjectClient(
    endpoint=os.environ["PROJECT_ENDPOINT"],
    credential=DefaultAzureCredential(),
)
storage_service_endpoint = os.environ["STORAGE_QUEUE_URI"]

with project_client:
    agents_client = project_client.agents

    # [START create_two_toy_agents]
    connected_agent_name = "stock_price_bot"
    weather_agent_name = "weather_bot"

    stock_price_agent = agents_client.create_agent(
        model=os.environ["MODEL_DEPLOYMENT_NAME"],
        name=connected_agent_name,
        instructions=(
            "Your job is to get the stock price of a company. If asked for the Microsoft stock price, always return $350."
        ),
    )

    azure_function_tool = AzureFunctionTool(
        name="GetWeather",
        description="Get answers from the weather bot.",
        parameters={
            "type": "object",
            "properties": {
                "Location": {"type": "string", "description": "The location to get the weather for."},
            },
        },
        input_queue=AzureFunctionStorageQueue(
            queue_name="weather-input",
            storage_service_endpoint=storage_service_endpoint,
        ),
        output_queue=AzureFunctionStorageQueue(
            queue_name="weather-output",
            storage_service_endpoint=storage_service_endpoint,
        ),
    )

    weather_agent = agents_client.create_agent(
        model=os.environ["MODEL_DEPLOYMENT_NAME"],
        name=weather_agent_name,
        instructions=(
            "Your job is to get the weather for a given location. "
            "Use the provided function to get the weather in the given location."
        ),
        tools=azure_function_tool.definitions,
    )

    # Initialize Connected Agent tools with the agent id, name, and description
    connected_agent = ConnectedAgentTool(
        id=stock_price_agent.id, name=connected_agent_name, description="Gets the stock price of a company"
    )
    connected_weather_agent = ConnectedAgentTool(
        id=weather_agent.id, name=weather_agent_name, description="Gets the weather for a given location"
    )
    # [END create_two_toy_agents]

    # [START create_agent_with_connected_agent_tool]
    # Create agent with the Connected Agent tool and process assistant run
    agent = agents_client.create_agent(
        model=os.environ["MODEL_DEPLOYMENT_NAME"],
        name="my-assistant",
        instructions="You are a helpful assistant, and use the connected agents to get stock prices and weather.",
        tools=[
            connected_agent.definitions[0],
            connected_weather_agent.definitions[0],
        ],
    )
    # [END create_agent_with_connected_agent_tool]

    print(f"Created agent, ID: {agent.id}")

    # [START run_agent_with_connected_agent_tool]
    # Create thread for communication
    thread = agents_client.threads.create()
    print(f"Created thread, ID: {thread.id}")

    # Create message to thread
    message = agents_client.messages.create(
        thread_id=thread.id,
        role=MessageRole.USER,
        content="What is the stock price of Microsoft and the weather in Seattle?",
    )
    print(f"Created message, ID: {message.id}")

    # Create and process Agent run in thread with tools
    run = agents_client.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
    print(f"Run finished with status: {run.status}")
    # [END run_agent_with_connected_agent_tool]

    if run.status == "failed":
        print(f"Run failed: {run.last_error}")

    # Delete the Agent when done
    agents_client.delete_agent(agent.id)
    print("Deleted agent")

    # Delete the connected Agent when done
    agents_client.delete_agent(stock_price_agent.id)
    print("Deleted stock price agent")

    # Delete the connected Agent when done
    agents_client.delete_agent(weather_agent.id)
    print("Deleted weather agent")

    # [START list_tool_calls]
    for run_step in agents_client.run_steps.list(thread_id=thread.id, run_id=run.id, order=ListSortOrder.ASCENDING):
        if isinstance(run_step.step_details, RunStepToolCallDetails):
            for tool_call in run_step.step_details.tool_calls:
                if isinstance(tool_call, RunStepConnectedAgentToolCall):
                    print(
                        f"\tAgent: {tool_call.connected_agent.name} " f"query: {tool_call.connected_agent.arguments} ",
                        f"output: {tool_call.connected_agent.output}",
                    )
    # [END list_tool_calls]

    # [START list_messages]
    # Fetch and log all messages
    messages = agents_client.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
    for msg in messages:
        if msg.text_messages:
            last_text = msg.text_messages[-1]
            text = last_text.text.value.replace("\u3010", "[").replace("\u3011", "]")
            print(f"{msg.role}: {text}")
    # [END list_messages]

    agents_client.threads.delete(thread.id)