grammo / README.md
kaeizen's picture
update key
308a2f4
---
title: Grammo
emoji: πŸ“š
colorFrom: purple
colorTo: yellow
sdk: docker
pinned: false
license: gpl-3.0
short_description: AI Translation and Grammar Correction
---
# Grammo Backend
Django REST API backend for Grammo, an AI-powered translation and grammar correction service.
## Overview
The Grammo backend provides a RESTful API for translation and grammar correction services. It leverages LangChain and HuggingFace models to process language requests, with LangGraph managing conversation state across sessions.
## Features
- 🌐 **Translation Service** - Natural, contextually appropriate translations between languages
- ✏️ **Grammar Correction** - Fixes grammar, spelling, and punctuation errors
- πŸ’¬ **Session Management** - Maintains conversation context using Django sessions and LangGraph checkpoints
- 🎭 **Customizable Modes** - Supports Default and Grammar modes
- 🎨 **Tone Control** - Configurable tone (Default, Formal, Casual) for responses
- πŸ”’ **Security** - CORS support, CSRF protection, secure session management
- πŸ“¦ **HuggingFace Integration** - Uses GPT-OSS-Safeguard-20B model via HuggingFace API
## Tech Stack
- **Django 5.2.7** - Web framework
- **Django REST Framework** - API development
- **LangChain** - AI agent orchestration
- **LangGraph** - Conversation state management
- **HuggingFace** - Language model integration (GPT-OSS-Safeguard-20B)
- **Python 3.14+** - Programming language
- **SQLite** - Database (development)
- **Uvicorn** - ASGI server
## Prerequisites
- Python 3.14 or higher
- pip (Python package manager)
- HuggingFace API Token ([Get one here](https://huggingface.co/settings/tokens))
## Installation
### 1. Navigate to the backend directory
```bash
cd backend
```
### 2. Create and activate a virtual environment
```bash
# Create virtual environment
python -m venv venv
# Activate virtual environment
# On macOS/Linux:
source venv/bin/activate
# On Windows:
venv\Scripts\activate
```
### 3. Install dependencies
```bash
pip install -r requirements.txt
```
### 4. Set up environment variables
Create a `.env` file in the `backend` directory (or copy from the example):
```bash
cp .env.example .env # or: touch .env
```
At minimum, set the variables below (see [Environment Variables](#environment-variables) for details):
```env
# Required
SECRET_KEY=your-secret-key-here
HUGGINGFACEHUB_API_TOKEN=your-huggingface-api-token
# Common
DEBUG=True
BUILD_MODE=development # change to "production" for deployment
```
To generate a Django secret key:
```bash
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
```
### 5. Run database migrations
```bash
python manage.py migrate
```
## Environment Variables
Create a `.env` file in the `backend` directory. The backend loads variables from this file using `python-dotenv`.
### Required
```env
# Django Secret Key (generate one using the command above)
SECRET_KEY=your-secret-key-here
# HuggingFace API Token (any of these will be picked up; preferred shown first)
HUGGINGFACEHUB_API_TOKEN=your-huggingface-api-token
# HF_TOKEN=your-huggingface-api-token
# HF_API_TOKEN=your-huggingface-api-token
```
### Core Runtime
```env
# Debug mode (default: True)
DEBUG=True
# App build mode: "development" (default) or "production"
BUILD_MODE=development
# Port only used when running `python app.py` (Hugging Face Spaces)
# PORT=7860
```
### Production-only
When `BUILD_MODE=production`, the following become relevant:
```env
# Allowed hosts (comma-separated, no spaces)
ALLOWED_HOSTS=yourdomain.com,www.yourdomain.com
# CSRF trusted origins (comma-separated)
CSRF_TRUSTED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
```
Notes:
- Most security and CORS flags are derived automatically from `BUILD_MODE` in `backend/settings.py`:
- In development: permissive defaults for local usage
- In production: `CORS_ALLOW_ALL_ORIGINS=False`, secure cookies, HSTS, content type nosniff, and SSL redirect are enabled
- Do not set `SESSION_COOKIE_SECURE`, `CSRF_COOKIE_SECURE`, `CORS_ALLOW_ALL_ORIGINS`, or `SECURE_*` directly via env; they are computed from `BUILD_MODE`.
## Running the Application
### Development Mode
**Option 1: Django Development Server (with warnings)**
```bash
python manage.py runserver
```
The server will run on `http://localhost:8000`
**Option 2: Uvicorn ASGI Server (production-like, no warnings)**
```bash
uvicorn backend.asgi:application --host 0.0.0.0 --port 8000 --reload
```
### Production Mode
```bash
# Set DEBUG=False in .env
uvicorn backend.asgi:application --host 0.0.0.0 --port 8000
# With multiple workers:
uvicorn backend.asgi:application --host 0.0.0.0 --port 8000 --workers 4
```
### Standalone Script (for HuggingFace Spaces)
The backend can also be run as a standalone script:
```bash
python app.py
```
This uses the `PORT` environment variable (defaults to 7860) and is configured for HuggingFace Spaces deployment.
## API Endpoints
### Base URL
All endpoints are prefixed with `/api/v1/`
### `GET /api/v1/hello/`
Health check endpoint.
**Response:**
```json
{
"message": "Hello from Grammo!"
}
```
### `POST /api/v1/chat/`
Send a message to start or continue a chat session.
**Request Body:**
```json
{
"message": "Translate this text to French",
"chatSession": 0,
"mode": "default",
"tone": "default"
}
```
**Parameters:**
- `message` (required): The user's message
- `chatSession` (optional): Session identifier to maintain conversation context
- `mode` (optional): `"default"` or `"grammar"` - Determines how the message is processed
- `tone` (optional): `"default"`, `"formal"`, or `"casual"` - Sets the tone of the response
**Response (Success):**
```json
{
"status": "success",
"response": "**Original**: \nTranslate this text to French\n**Output**: \nTraduisez ce texte en franΓ§ais\n___\n**Explanation**: \n> Direct translation maintaining the original meaning"
}
```
**Response (Error):**
```json
{
"status": "error",
"response": "Invalid message."
}
```
### `POST /api/v1/end/`
End the current chat session and clear conversation history.
**Request Body:**
```json
{}
```
**Response (Success):**
```json
{
"status": "success",
"message": "Session ended successfully"
}
```
**Response (Error):**
```json
{
"status": "error",
"response": "No active session."
}
```
## Project Structure
```
backend/
β”œβ”€β”€ agent_manager/ # AI agent management module
β”‚ └── __init__.py # LangChain agent setup, session management
β”œβ”€β”€ api/ # Django REST API application
β”‚ β”œβ”€β”€ views.py # API view handlers (chat, hello, end)
β”‚ β”œβ”€β”€ urls.py # URL routing
β”‚ └── apps.py # App configuration
β”œβ”€β”€ backend/ # Django project settings
β”‚ β”œβ”€β”€ settings.py # Django configuration
β”‚ β”œβ”€β”€ urls.py # Main URL configuration
β”‚ β”œβ”€β”€ asgi.py # ASGI application
β”‚ └── wsgi.py # WSGI application
β”œβ”€β”€ app.py # Standalone entry point (HuggingFace Spaces)
β”œβ”€β”€ manage.py # Django management script
β”œβ”€β”€ requirements.txt # Python dependencies
β”œβ”€β”€ Dockerfile # Docker configuration for deployment
└── README.md # This file
```
## Development
### Session Management
- Sessions are managed using Django's session framework
- Session data is stored in the cache backend (in-memory for development)
- Each session maintains its own LangGraph agent with conversation checkpointing
- Sessions expire after 24 hours of inactivity or when explicitly ended
### Agent Architecture
- Uses LangChain's `create_agent` with a structured output wrapper
- Structured output ensures consistent JSON responses for translation/correction tasks
- Agents are cached per session key for efficient memory usage
- Supports task types: `translation`, `correction`, `follow-up`, `invalid`
### Database
- Uses SQLite by default (suitable for development)
- No models are currently defined, but Django is configured for future database needs
- Run `python manage.py migrate` to set up the database schema
### Caching
- In-memory cache is used for sessions (development)
- **Note:** For production, consider switching to Redis or another persistent cache backend
### CORS Configuration
- CORS is configured to allow cross-origin requests
- In production, configure `CORS_ALLOW_ALL_ORIGINS` and `ALLOWED_HOSTS` appropriately
## Deployment
### Docker Deployment (HuggingFace Spaces)
The backend includes a `Dockerfile` configured for HuggingFace Spaces deployment.
1. **Set environment variables** in your Space settings:
- `SECRET_KEY`
- `HUGGINGFACEHUB_API_TOKEN`
- `BUILD_MODE=production`
- `DEBUG=False`
- `ALLOWED_HOSTS=your-space-name.hf.space`
- `CSRF_TRUSTED_ORIGINS=https://your-space-name.hf.space`
2. **Push your code** to the Space repository
3. **The API will be available** at `https://your-space-name.hf.space/api/v1/`
### General Production Deployment
1. Set production environment variables (see [Environment Variables](#environment-variables))
- `BUILD_MODE=production`, `DEBUG=False`
- `ALLOWED_HOSTS` and `CSRF_TRUSTED_ORIGINS`
3. Configure a proper database (PostgreSQL recommended)
4. Set up Redis or another cache backend for sessions
5. Use a production ASGI server (Uvicorn with multiple workers or Gunicorn with Uvicorn workers)
6. Configure reverse proxy (Nginx, Apache) with SSL/TLS
7. Set up static file serving or use a CDN
## Testing
To test the API endpoints:
```bash
# Health check
curl http://localhost:8000/api/v1/hello/
# Send a chat message
curl -X POST http://localhost:8000/api/v1/chat/ \
-H "Content-Type: application/json" \
-d '{"message": "Hello, translate this to Spanish", "mode": "default", "tone": "default"}'
# End session
curl -X POST http://localhost:8000/api/v1/end/
```
## Troubleshooting
### Common Issues
1. **Module not found errors**: Ensure your virtual environment is activated and dependencies are installed
2. **Secret key errors**: Make sure `SECRET_KEY` is set in your `.env` file
3. **HuggingFace API errors**: Verify your `HUGGINGFACEHUB_API_TOKEN` is valid
4. **CORS errors**: Check `CORS_ALLOW_ALL_ORIGINS` and `ALLOWED_HOSTS` settings
5. **Session not persisting**: Ensure cache backend is configured correctly
## Notes
- The application uses in-memory session storage for development. For production, consider using Redis.
- The HuggingFace model (`openai/gpt-oss-safeguard-20b`) is used for all language processing tasks.
- Conversation state is managed per Django session using LangGraph's checkpoint system.
- The structured output wrapper ensures responses follow a consistent JSON schema.
## License
See the [LICENSE](LICENSE) file for details.