Skip to main content
Glama
SSE_STREAMING_IMPLEMENTATION.md4.53 kB
# SSE Streaming Implementation for HTTP Endpoint ## Overview Successfully implemented Server-Sent Events (SSE) streaming for the `/run_file` HTTP endpoint to provide real-time progress updates during long-running Stata executions. ## Changes Made ### 1. Added Required Imports (line 67, line 21) ```python from fastapi.responses import StreamingResponse import asyncio ``` ### 2. Created Async Generator Function (line 1673) **Function**: `stata_run_file_stream(file_path, timeout)` This async generator: - Runs Stata execution in a separate thread - Yields SSE-formatted events with progress updates every 2 seconds - Provides real-time elapsed time feedback - Streams final output in chunks when complete **Key Features**: - **Non-blocking**: Uses threading + async/await to avoid blocking the event loop - **Responsive**: 2-second update intervals for immediate feedback - **Safe**: Handles errors and timeouts gracefully - **Standard-compliant**: Proper SSE format (`data: ...\n\n`) ### 3. Updated HTTP Endpoint (line 1750) **Endpoint**: `GET /run_file` Changed from returning a blocking `Response` to returning a `StreamingResponse` with: - Content type: `text/event-stream` - Headers for preventing buffering and caching - Real-time event streaming ## Testing Results ### Test File: `test_streaming.do` ```stata display "Starting test..." forvalues i = 1/5 { display "Iteration `i'" sleep 2000 } display "Test complete!" ``` ### Observed Behavior ✅ **Before implementation**: - Client waited 10+ seconds with NO output - All output received at once after completion **After implementation**: - Immediate start notification: "Starting execution..." - Progress updates every 2 seconds: "Executing... 2.0s elapsed", "4.0s", "6.0s", etc. - Final output streamed in chunks - Clear completion marker ### Example SSE Stream ``` data: Starting execution of test_streaming.do... data: Executing... 2.0s elapsed data: Executing... 4.0s elapsed data: Executing... 6.0s elapsed data: Executing... 8.1s elapsed data: >>> [2025-10-22 21:24:38] do '/path/to/test_streaming.do' ... data: Iteration 1 Iteration 2 ... data: *** Execution completed *** ``` ## Technical Details ### Architecture ``` Client (curl/browser) ↓ HTTP GET /run_file FastAPI Endpoint ↓ Creates StreamingResponse stata_run_file_stream() [Async Generator] ↓ Spawns Thread run_stata_file() [Blocking Function] ↓ Executes in Thread Stata (PyStata) ``` ### Threading Model - **Main Thread**: FastAPI async event loop - **Background Thread**: Blocking Stata execution - **Communication**: Python queue.Queue for result passing - **Monitoring**: Async loop polls thread status and yields events ### SSE Format Server-Sent Events use a simple text format: ``` data: <message>\n\n ``` Multiple lines in a message: ``` data: line1\nline2\n\n ``` ## Benefits 1. **Better UX**: Users see immediate feedback instead of waiting in silence 2. **Prevents Timeouts**: Keep-alive messages prevent proxy/browser timeouts 3. **Progress Tracking**: Users can monitor elapsed time during execution 4. **Error Visibility**: Errors are streamed immediately, not after timeout 5. **Standards-Based**: SSE is a W3C standard supported by all modern browsers ## Browser/Client Usage ### JavaScript Client Example ```javascript const eventSource = new EventSource('/run_file?file_path=/path/to/file.do'); eventSource.onmessage = (event) => { console.log('Progress:', event.data); // Update UI with progress }; eventSource.onerror = (error) => { console.error('Stream error:', error); eventSource.close(); }; ``` ### curl Client ```bash curl -N "http://localhost:4000/run_file?file_path=/path/to/file.do" ``` The `-N` flag disables buffering for real-time output. ## Future Enhancements Possible improvements: 1. **Progress Percentage**: Calculate based on log file lines vs expected output 2. **Detailed Events**: Parse Stata output for specific progress markers 3. **Cancellation**: Allow client to cancel running execution via SSE 4. **Multiple Streams**: Support streaming multiple concurrent executions 5. **Log Tailing**: Stream log file updates in real-time instead of polling ## Related Files - `src/stata_mcp_server.py`: Main implementation (lines 1673-1784) - `test_streaming.do`: Test file for validation - `STREAMING_IMPLEMENTATION_GUIDE.md`: Original design document - `STREAMING_TEST_GUIDE.md`: Testing procedures ## Status ✅ **IMPLEMENTED AND TESTED** Date: 2025-10-22 Version: 0.3.5 (upcoming)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hanlulong/stata-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server