db620d33df
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
"""Client application for interacting with a Durable Task hosted agent.
|
|
|
|
This client connects to the Durable Task Scheduler and sends requests to
|
|
registered agents, demonstrating how to interact with agents from external processes.
|
|
|
|
Prerequisites:
|
|
- The worker must be running with the agent registered
|
|
- Set FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_MODEL
|
|
- Sign in with Azure CLI for AzureCliCredential authentication
|
|
- Durable Task Scheduler must be running
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
import os
|
|
|
|
from agent_framework.azure import DurableAIAgentClient
|
|
from azure.identity import AzureCliCredential
|
|
from dotenv import load_dotenv
|
|
from durabletask.azuremanaged.client import DurableTaskSchedulerClient
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
# Configure logging
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_client(
|
|
taskhub: str | None = None, endpoint: str | None = None, log_handler: logging.Handler | None = None
|
|
) -> DurableAIAgentClient:
|
|
"""Create a configured DurableAIAgentClient.
|
|
|
|
Args:
|
|
taskhub: Task hub name (defaults to TASKHUB env var or "default")
|
|
endpoint: Scheduler endpoint (defaults to ENDPOINT env var or "http://localhost:8080")
|
|
log_handler: Optional logging handler for client logging
|
|
|
|
Returns:
|
|
Configured DurableAIAgentClient instance
|
|
"""
|
|
taskhub_name = taskhub or os.getenv("TASKHUB", "default")
|
|
endpoint_url = endpoint or os.getenv("ENDPOINT", "http://localhost:8080")
|
|
|
|
logger.debug(f"Using taskhub: {taskhub_name}")
|
|
logger.debug(f"Using endpoint: {endpoint_url}")
|
|
|
|
credential = None if endpoint_url == "http://localhost:8080" else AzureCliCredential()
|
|
|
|
dts_client = DurableTaskSchedulerClient(
|
|
host_address=endpoint_url,
|
|
secure_channel=endpoint_url != "http://localhost:8080",
|
|
taskhub=taskhub_name,
|
|
token_credential=credential,
|
|
log_handler=log_handler,
|
|
)
|
|
|
|
return DurableAIAgentClient(dts_client)
|
|
|
|
|
|
def run_client(agent_client: DurableAIAgentClient) -> None:
|
|
"""Run client interactions with the Joker agent.
|
|
|
|
Args:
|
|
agent_client: The DurableAIAgentClient instance
|
|
"""
|
|
# Get a reference to the Joker agent
|
|
logger.debug("Getting reference to Joker agent...")
|
|
joker = agent_client.get_agent("Joker")
|
|
|
|
# Create a new session for the conversation
|
|
session = joker.create_session()
|
|
logger.debug(f"Session ID: {session.session_id}")
|
|
logger.info("Start chatting with the Joker agent! (Type 'exit' to quit)")
|
|
|
|
# Interactive conversation loop
|
|
while True:
|
|
# Get user input
|
|
try:
|
|
user_message = input("You: ").strip()
|
|
except (EOFError, KeyboardInterrupt):
|
|
logger.info("\nExiting...")
|
|
break
|
|
|
|
# Check for exit command
|
|
if user_message.lower() == "exit":
|
|
logger.info("Goodbye!")
|
|
break
|
|
|
|
# Skip empty messages
|
|
if not user_message:
|
|
continue
|
|
|
|
# Send message to agent and get response
|
|
try:
|
|
response = joker.run(user_message, session=session)
|
|
logger.info(f"Joker: {response.text} \n")
|
|
except Exception as e:
|
|
logger.error(f"Error getting response: {e}")
|
|
|
|
logger.info("Conversation completed.")
|
|
|
|
|
|
async def main() -> None:
|
|
"""Main entry point for the client application."""
|
|
logger.debug("Starting Durable Task Agent Client...")
|
|
|
|
# Create client using helper function
|
|
agent_client = get_client()
|
|
|
|
try:
|
|
run_client(agent_client)
|
|
except Exception as e:
|
|
logger.exception(f"Error during agent interaction: {e}")
|
|
finally:
|
|
logger.debug("Client shutting down")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|