 5df5bde127
			
		
	
	
		5df5bde127
		
			
		
	
	
	
	
		
			
			<!-- Thank you for your contribution! Please review https://microsoft.github.io/autogen/docs/Contribute before opening a pull request. --> <!-- Please add a reviewer to the assignee section when you create a PR. If you don't have the access to it, we will shortly find a reviewer and assign them to your PR. --> ## Why are these changes needed? Wrong file names in the README.md ## Related issue number ## Checks - [x] I've included any doc changes needed for https://microsoft.github.io/autogen/. See https://microsoft.github.io/autogen/docs/Contribute#documentation to build and test documentation locally. - [ ] I've added tests (if relevant) corresponding to the changes introduced in this PR. - [ ] I've made sure all auto checks have passed. Co-authored-by: Mohammad Mazraeh <Mazraeh.Mohammad@Gmail.com>
Distributed Group Chat
This example runs a gRPC server using GrpcWorkerAgentRuntimeHost and instantiates three distributed runtimes using GrpcWorkerAgentRuntime. These runtimes connect to the gRPC server as hosts and facilitate a round-robin distributed group chat. This example leverages the Azure OpenAI Service to implement writer and editor LLM agents. Agents are instructed to provide concise answers, as the primary goal of this example is to showcase the distributed runtime rather than the quality of agent responses.
Setup
Setup Python Environment
- Create a virtual environment and activate it. (e.g. python3.12 -m venv .venv && source .venv/bin/activate)
- Install dependencies.
pip install "autogen-ext[openai,azure,chainlit,rich,pyyaml]"
General Configuration
In the config.yaml file, you can configure the client_config section to connect the code to the Azure OpenAI Service.
Authentication
The recommended method for authentication is through Azure Active Directory (AAD), as explained in Model Clients - Azure AI. This example works with both the AAD approach (recommended) and by providing the api_key in the config.yaml file.
Run
Run Through Scripts
The run.sh file provides commands to run the host and agents using tmux. The steps for this approach are:
- Install tmux.
- Activate the Python environment: source .venv/bin/activate.
- Run the bash script: ./run.sh.
Here is a screen recording of the execution:
Note: Some asyncio.sleep commands have been added to the example code to make the ./run.sh execution look sequential and visually easy to follow. In practice, these lines are not necessary.
Run Individual Files
If you prefer to run Python files individually, follow these steps. Note that each step must be run in a different terminal process, and the virtual environment should be activated using source .venv/bin/activate.
- python run_host.py: Starts the host and listens for agent connections.
- chainlit run run_ui.py --port 8001: Starts the Chainlit app and UI agent and listens on UI topic to display messages. We're using port 8001 as the default port 8000 is used to run host (assuming using same machine to run all of the agents)
- python run_editor_agent.py: Starts the editor agent and connects it to the host. editor agent and connects it to the host.
- python run_writer_agent.py: Starts the writer agent and connects it to the host. writer agent and connects it to the host.
- python run_group_chat_manager.py: Run chainlit app which starts group chat manager agent and sends the initial message to start the conversation. group chat manager agent and sends the initial message to start the conversation.
What's Going On?
The general flow of this example is as follows:
- The UI Agent runs starts the UI App, listens for stream of messages in the UI topic and displays them in the UI.
- The  Group Chat Manager, on behalf of Group Chat Manager, on behalf of  User, sends aRequestToSpeakrequest to the  writer_agent.
- The   writer_agentwrites a short sentence into the group chat topic.
- The   editor_agentreceives the message in the group chat topic and updates its memory.
- The  Group Chat Manager receives the message sent by the writer into the group chat simultaneously and sends the next participant, the Group Chat Manager receives the message sent by the writer into the group chat simultaneously and sends the next participant, the  editor_agent, aRequestToSpeakmessage.
- The   editor_agentsends its feedback to the group chat topic.
- The   writer_agentreceives the feedback and updates its memory.
- The  Group Chat Manager receives the message simultaneously and repeats the loop from step 1. Group Chat Manager receives the message simultaneously and repeats the loop from step 1.
Here is an illustration of the system developed in this example:
graph TD;
    subgraph Host
        A1[GRPC Server]
        wt[Writer Topic]
        et[Editor Topic]
        ut[UI Topic]
        gct[Group Chat Topic]
    end
    all_agents[All Agents -  Simplified Arrows!] --> A1
    subgraph Distributed Writer Runtime
        wt -.->|2 - Subscription| writer_agent
        gct -.->|4 - Subscription| writer_agent
        writer_agent -.->|3.1 - Publish: UI Message| ut
        writer_agent -.->|3.2 - Publish: Group Chat Message| gct
    end
    subgraph Distributed Editor Runtime
        et -.->|6 - Subscription| editor_agent
        gct -.->|4 - Subscription| editor_agent
        editor_agent -.->|7.1 - Publish: UI Message| ut
        editor_agent -.->|7.2 - Publish: Group Chat Message| gct
    end
    subgraph Distributed Group Chat Manager Runtime
        gct -.->|4 - Subscription| group_chat_manager
        group_chat_manager -.->|1 - Request To Speak| wt
        group_chat_manager -.->|5 - Request To Speak| et
        group_chat_manager -.->|\* - Publish Some of to UI Message| ut
    end
    subgraph Distributed UI Runtime
        ut -.->|\* - Subscription| ui_agent
    end
    style wt fill:#beb2c3,color:#000
    style et fill:#beb2c3,color:#000
    style gct fill:#beb2c3,color:#000
    style ut fill:#beb2c3,color:#000
    style writer_agent fill:#b7c4d7,color:#000
    style editor_agent fill:#b7c4d7,color:#000
    style group_chat_manager fill:#b7c4d7,color:#000
    style ui_agent fill:#b7c4d7,color:#000
TODO:
- Properly handle chat restarts. It complains about group chat manager being already registered
- Add streaming to the UI like this example when this bug is resolved
