Frontend:
- SetupTab: restore missing Input import (runtime crash on render)
- SetupTab: wrap onSubmit in event adapter — button outside <form> passed undefined
- Pricing: load() → useCallback, add to useEffect deps (stale closure)
- Pricing: credits_label hardcoded string → t() interpolation
Backend:
- admin/ai-config/test: remove endpoint/api_key from request body (SSRF fix)
— endpoint and key now read exclusively from DB or env vars
- admin/ai-config/test: str(exc) → sanitized message, full exc logged server-side only
(prevents API key leak via OpenAI SDK error context)
- admin/ai-config PUT: whitelist allowed fields on provider/model merge
(prevents injection of arbitrary keys into DB document)
- admin/ai-config PUT: validate active_provider/model are non-empty strings
- admin.py: move deferred imports (time, os, AsyncOpenAI) to module level
- billing.py: guard get_json() with or {} (prevents AttributeError on empty body)
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 | ||
Cohorta Backend
This is the Python backend for the Cohorta 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