# 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())