Files
2026-07-13 13:30:30 +08:00

152 lines
11 KiB
Markdown

# Project Livewire - Client Application
This README provides details about the client-side component of Project Livewire. The client is a web application built with Vanilla JavaScript, HTML, and CSS, designed to interact with the backend server and the Gemini API to provide a multimodal chat experience.
## Overview
The client application is responsible for:
- **User Interface (UI):** Providing a responsive and intuitive web interface for users to interact with the AI. This includes both a development UI (`index.html`) and a mobile-optimized UI (`mobile.html`).
- **Input Handling:** Capturing user inputs including:
- Voice input via microphone using WebAudio API.
- Text input from text fields.
- Webcam and screen sharing video streams via MediaStream API.
- **Output Rendering:** Displaying AI responses, including:
- Text responses in a chat-like interface.
- Audio responses played back using WebAudio API.
- Video streams from webcam and screen sharing.
- **WebSocket Communication:** Establishing and managing a WebSocket connection with the backend server (`server` component) to send user inputs and receive AI responses in real-time.
- **Media Processing:** Handling audio recording, audio streaming, and video capture for multimedia interactions.
## Key Components
The `client` directory is structured into several key components:
- **`index.html`**: The main HTML file for the **development user interface**. This UI includes more detailed logging and debugging features for development and testing.
- **`mobile.html`**: The HTML file for the **production, mobile-optimized user interface**. This UI is designed for a cleaner and more streamlined user experience, especially on mobile devices.
- **`styles/`**: Contains CSS stylesheets for both the development (`style.css`) and mobile (`mobile-style.css`) UIs.
- **`src/`**: Holds all the JavaScript source code, organized into subdirectories:
- **`api/`**: Contains modules for API communication:
- **`gemini-api.js`**: Handles WebSocket connection and communication with the backend server. Manages sending different types of messages (audio, text, image, end signals) and receiving responses.
- **`audio/`**: Contains modules for audio processing:
- **`audio-recorder.js`**: Handles audio recording from the microphone using WebAudio API, including starting, stopping, muting, and un-muting recording. Emits 'data' events with base64 encoded audio chunks.
- **`audio-recording-worklet.js`**: An AudioWorklet processor for efficient real-time audio processing and chunking.
- **`audio-streamer.js`**: Handles streaming and playback of audio received from the server using WebAudio API. Manages audio buffer queue, playback, and stopping/resuming audio.
- **`audioworklet-registry.js`**: Manages registration of AudioWorklet modules.
- **`media/`**: Contains modules for media handling:
- **`media-handler.js`**: Manages webcam and screen sharing functionalities using MediaStream API. Includes starting/stopping media streams, capturing video frames, and switching cameras.
- **`utils/`**: Contains utility functions:
- **`utils.js`**: Includes helper functions like `audioContext()` for creating and resuming AudioContext, and `base64ToArrayBuffer()` for converting base64 strings to ArrayBuffers.
- **`assets/`**: Contains static assets such as images, icons, and favicons used in the UI.
- **`cloudbuild.yaml`**: Cloud Build configuration file for deploying the client application to Google Cloud Run.
- **`Dockerfile`**: Dockerfile for building the client application's container image.
- **`nginx.conf`**: Nginx configuration file for serving the client application from within a Docker container.
## Technologies Used
The client application leverages the following web technologies:
- **Vanilla JavaScript (ES6+):** For all client-side logic, interaction handling, and API communication.
- **HTML5:** For structuring the user interface (both development and mobile UIs).
- **CSS3:** For styling the user interface and ensuring responsiveness (using `style.css` and `mobile-style.css`).
- **WebAudio API:** For capturing audio from the microphone, processing audio data, and playing back audio responses.
- **MediaStream API (getUserMedia, getDisplayMedia):** For accessing webcam and screen sharing video streams.
- **WebSocket API:** For establishing and maintaining real-time, bidirectional communication with the backend server.
- **EventEmitter3:** A lightweight JavaScript library for event handling, used for communication between audio components.
- **Material Symbols Outlined (Google Fonts):** For icons used in the user interface.
- **nginx:alpine:** Base image for the Docker container, providing an efficient and lightweight web server for serving static files.
## Project Structure
```
client/
├── assets/
│ └── ... (images, icons, favicon)
├── src/
│ ├── api/
│ │ └── gemini-api.js
│ ├── audio/
│ │ ├── audio-recorder.js
│ │ ├── audio-recording-worklet.js
│ │ ├── audio-streamer.js
│ │ └── audioworklet-registry.js
│ ├── media/
│ │ └── media-handler.js
│ └── utils/
│ └── utils.js
├── styles/
│ ├── mobile-style.css
│ └── style.css
├── index.html
├── mobile.html
├── cloudbuild.yaml
├── Dockerfile
├── nginx.conf
└── README.md (This file)
```
## Development
### Local Development Setup
To develop and test the client application locally, you will need:
1. **A running backend server:** Follow the instructions in the main project README or the `server/README.md` to set up and run the backend server locally. Ensure the server is accessible at `ws://localhost:8081` (or the endpoint configured in `client/src/api/gemini-api.js` if you are using a different setup).
2. **A simple HTTP server:** You can use Python's built-in simple HTTP server to serve the client files. Navigate to the `client/` directory in your terminal and run:
```bash
python -m http.server 8000
```
This will start a server on `http://localhost:8000`.
### Running the Development UI and Mobile UI
- **Development UI:** Open your web browser and navigate to `http://localhost:8000/index.html`. This UI is useful for debugging and testing features, as it provides more detailed logging and UI elements for monitoring the WebSocket connection and function calls.
- **Mobile UI:** Open your web browser and navigate to `http://localhost:8000/mobile.html` or `http://localhost:8000/mobile.html?mobile=true` (to force mobile view even on desktop). This UI provides a cleaner interface optimized for mobile devices and touch interactions.
### Development UI Features
The development UI (`index.html`) includes features to aid in debugging and testing:
- **Detailed WebSocket connection status:** Displays information about the WebSocket connection state and any connection errors in the browser's developer console.
- **Function call monitoring and logging:** Logs function calls and API responses in the output chat area, providing insights into tool usage and data flow.
- **Text input options:** Allows for testing text-based interactions without relying on voice input, simplifying testing of text-based features.
- **Enhanced error reporting and visualization:** Displays more verbose error messages in the UI and browser console to help identify and resolve issues quickly.
### Production UI Features
The mobile-optimized production UI (`mobile.html`) focuses on:
- **Clean, minimal interface:** Provides a streamlined and uncluttered UI optimized for voice-first interaction and mobile use.
- **Optimized for touch interactions:** UI elements and controls are designed for easy touch input on mobile devices.
- **Streamlined error handling and recovery:** Presents user-friendly error messages and attempts to handle connection issues gracefully.
- **Optimized performance for mobile devices:** Uses efficient JavaScript code and minimal dependencies to ensure smooth performance on mobile browsers.
## Troubleshooting
### Common Issues and Troubleshooting Steps
- **WebSocket Connection Failures:**
- **Verify WebSocket URL:** Double-check that the WebSocket URL in `client/src/api/gemini-api.js` is correctly configured to point to your running backend server (e.g., `ws://localhost:8081` for local development, or your Cloud Run backend URL for deployed setups).
- **Check Backend Service:** Ensure the backend server is running and accessible. Check its logs for any errors.
- **CORS Errors (Browser Console):** If you see CORS-related errors in the browser's developer console, it might indicate a configuration issue on the backend server side. Ensure the backend is configured to handle requests from `http://localhost:8000` (or your client's origin).
- **Firewall/Network Issues:** Check if any firewalls or network configurations are blocking WebSocket connections between the client and server.
- **API Errors or Unexpected Behavior:**
- **Check Browser Developer Console (Network Tab, Console Tab):** Inspect the browser's developer console for any JavaScript errors, WebSocket errors, or network requests that are failing.
- **Server Logs:** Examine the backend server logs for any errors or exceptions occurring during request processing or Gemini API interactions.
- **API Key Configuration:** Verify that API keys are correctly configured in the backend server's environment variables or Secret Manager (if deployed on Google Cloud).
- **Quota Limits:** If you are encountering errors related to API quotas, check your Google Cloud project's API usage and quota limits in the Google Cloud Console.
- **Audio or Video Issues:**
- **Permissions:** Ensure that the browser has been granted permission to access the microphone and webcam. Check browser settings and prompts for media permissions.
- **Device Availability:** Verify that the microphone and webcam are properly connected and functioning on your system.
- **Audio Context State:** If audio playback is not working, check the browser's developer console for any WebAudio API errors related to AudioContext state or audio buffer processing.
## Further Information
For more detailed information about the backend server, tool integrations, and deployment to Google Cloud, refer to the following README files:
- **Main Project README (`README.md` in the project root):** Provides a high-level overview of the entire project, including architecture and getting started instructions.
- **Server README (`server/README.md`):** Details the server-side component, its architecture, configuration, and deployment.
- **Cloud Functions README (`cloud-functions/README.md`):** Explains the setup and deployment of the Cloud Function tools.