Backend:
- task_manager.py: add result/error/completed_at storage, TTL sweeper (5min), store_task_result() helper
- tasks.py: add GET /<task_id> endpoint returning stored result; cancel route stores 'cancelled' status
- __init__.py: start TTL sweeper on app startup
- All 8 bg functions: store result before emitting lightweight WS hint (no payload data)
Frontend:
- src/lib/taskPolling.ts: waitForTaskResult() — polls GET /tasks/{id} every 2s, WS hint triggers immediate poll, 5min timeout
- src/hooks/useTaskPolling.ts: drop-in replacement for useCancellableGeneration using polling
- Migrate 6 Promise-based WS listeners → waitForTaskResult() in DiscussionPanel, FocusGroupSession (×2), PersonaProfile, PersonaModificationModal, useDiscussionGuideGeneration
- Migrate 3 hook-based consumers → useTaskPolling in AIRecruiter, SyntheticUsers, BulkExportProgressModal
Fixes WS Promise leak: polling survives disconnects, background tabs, page reloads.
WS events retained as zero-payload hints for near-zero latency when connected.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| app | ||
| prompts | ||
| scripts | ||
| tests | ||
| uploads/focus-group-68af42ff19ed40daa02b0392 | ||
| .dockerignore | ||
| .DS_Store | ||
| .env.example | ||
| Dockerfile | ||
| hypercorn_config.py | ||
| logging_config.py | ||
| migrate_legacy_folders.py | ||
| MIGRATION_README.md | ||
| README.md | ||
| requirements.txt | ||
| run.py | ||
| test_asset.txt | ||
| test_image.png | ||
| test_websocket_cross_process.py | ||
Semblance Synthetic Society Backend
This is the Python backend for the Semblance Synthetic Society project. It provides API endpoints for authentication, personas, and focus groups.
Setup
- Make sure you have Python 3.8+ installed
- Create a virtual environment:
cd backend python -m venv venv - Activate the virtual environment:
- On macOS/Linux:
source venv/bin/activate - On Windows:
venv\Scripts\activate
- On macOS/Linux:
- Install dependencies:
pip install -r requirements.txt
Running the Backend
python run.py
The server will start on http://localhost:5000
API Endpoints
Authentication
POST /api/auth/login- Login with username and passwordPOST /api/auth/register- Register a new userGET /api/auth/me- Get current user profile
Personas
GET /api/personas- Get personas for current userGET /api/personas/all- Get all personasGET /api/personas/:id- Get persona by IDPOST /api/personas- Create a new personaPUT /api/personas/:id- Update a personaDELETE /api/personas/:id- Delete a personaPOST /api/personas/batch- Create multiple personas
Focus Groups
GET /api/focus-groups- Get focus groups for current userGET /api/focus-groups/all- Get all focus groupsGET /api/focus-groups/:id- Get focus group by IDPOST /api/focus-groups- Create a new focus groupPUT /api/focus-groups/:id- Update a focus groupDELETE /api/focus-groups/:id- Delete a focus groupPOST /api/focus-groups/:id/participants- Add participant to focus groupDELETE /api/focus-groups/:id/participants/:personaId- Remove participant from focus groupGET /api/focus-groups/:id/messages- Get messages for a focus groupPOST /api/focus-groups/:id/messages- Add a message to a focus group
AI Personas
POST /api/ai-personas/generate- Generate a synthetic persona using AIPOST /api/ai-personas/generate-and-save- Generate and save a synthetic personaPOST /api/ai-personas/batch-generate- Generate multiple synthetic personasPOST /api/ai-personas/batch-generate-and-save- Generate and save multiple synthetic personas
Focus Group AI
POST /api/focus-group-ai/generate-response- Generate an AI response from a persona in a focus group discussion
AI Response Generation Example
Request Body:
{
"focus_group_id": "focus_group_id",
"persona_id": "persona_id",
"current_topic": "What do you think about this product?",
"temperature": 0.7 // Optional, controls randomness (0.0 to 1.0)
}
Response:
{
"message": "Response generated successfully",
"response": "I find the product quite interesting. As someone who values efficiency, I appreciate the intuitive interface and how it streamlines my workflow. However, I'm concerned about the price point, which seems high compared to similar options on the market.",
"message_id": "message_id"
}
How AI Response Generation Works
The system generates realistic persona responses by:
- Using the persona's demographic details, personality traits, goals, and frustrations
- Including the full discussion guide text
- Taking up to 50 most recent conversation messages for context
- Processing the current topic/question
- Generating a response in the persona's authentic voice
The current_topic parameter can be any text: a moderator question, a specific prompt, or a summary of discussion points. The AI will respond as if the persona is directly addressing this topic.
Default User
A default user with the following credentials is automatically created:
- Username: user
- Password: pass
- Role: admin