nikhilbabuy/openenv-ticket-triage
๐ซ OpenEnv โ IT Support Ticket Triage
A production-grade reinforcement learning environment where an AI agent learns to triage IT support tickets โ classifying priority, category, team assignment, and resolution steps.
   
๐ง Environment Description
IT support ticket triage is a high-volume, expert-knowledge task performed daily by Level 1/2 support engineers. A triage agent must read a natural-language ticket, assess its urgency, classify its domain, assign it to the correct team, and propose a resolution โ all from the ticket text alone.
This environment simulates that workflow with 15 realistic support tickets across 6 categories (Hardware, Software, Network, Security, Access, Other), and 3 tasks of escalating difficulty.
Why this task?
- Real-world: This exact task is done by humans in every company with an IT department
- Text-grounded: Requires understanding natural language, not pattern matching
- Multi-objective: Priority, category, team, resolution, and time estimate all interact
- Gradable: Has clear ground truth with partial credit available
๐ฎ Tasks
๐ญ Observation Space
All observations are structured JSON. Ground truth is never included โ only the ticket text and task context.
{
"ticket_id": "TKT-010",
"ticket_title": "Phishing email received โ employee clicked link",
"ticket_description": "An employee in the Finance department received a phishing email...",
"user_name": "Ramesh Krishnan",
"user_department": "Finance",
"submitted_at": "2025-03-15T10:30:00",
"task_type": "HARD",
"task_description": "Perform complete triage: priority, category, team...",
"step_count": 0,
"max_steps": 3,
"done": false,
"previous_actions": [],
"cumulative_reward": 0.0,
"action_schema": {
"required_fields": ["priority", "category", "assigned_team", "resolution_suggestion",
"similar_ticket_ids", "estimated_resolution_hours"],
"optional_fields": ["reasoning"],
"valid_priorities": ["LOW", "MEDIUM", "HIGH", "CRITICAL"],
"valid_categories": ["HARDWARE", "SOFTWARE", "NETWORK", "SECURITY", "ACCESS", "OTHER"],
"valid_teams": ["HELPDESK", "SYSADMIN", "NETWORK_OPS", "SECURITY_OPS", "DEVOPS", "MANAGEMENT"]
},
"similar_tickets": [
{
"ticket_id": "TKT-011",
"title": "Suspicious login attempts on server",
"resolution_summary": "Block source IP, enable fail2ban, rotate SSH keys.",
"resolved_in_hours": 3
}
]
}โก Action Space
Actions are structured JSON objects. Required fields vary by task type.
{
"priority": "CRITICAL",
"category": "SECURITY",
"assigned_team": "SECURITY_OPS",
"resolution_suggestion": "Reset user credentials immediately. Revoke all active sessions. Check audit logs for unauthorized access. Notify CISO. File security incident report.",
"similar_ticket_ids": ["TKT-011", "TKT-012"],
"estimated_resolution_hours": 2,
"reasoning": "Phishing with credential entry is a CRITICAL SECURITY incident requiring immediate credential reset."
}๐ Reward Function
Rewards are dense and multi-dimensional โ not binary end-of-episode.
EASY Task
MEDIUM Task
HARD Task
Penalties:
- Missing required field: -0.05 per field
- Invalid enum value: -0.03 to -0.10
All rewards are clamped to [0.0, 1.0]. Reward signal is provided at every step, not just end-of-episode.
๐ Setup & Usage
Quick Start (Docker)
# Build
docker build -t ticket-triage-env .
# Run (with OpenAI baseline)
docker run -p 7860:7860 \
-e OPENAI_API_KEY=your_key_here \
ticket-triage-env
# Run (without OpenAI โ mock baseline)
docker run -p 7860:7860 ticket-triage-envLocal Development
# Requirements: Java 17+, Maven 3.8+
# Build
mvn clean package -DskipTests
# Run
java -jar target/ticket-triage-env-1.0.0.jar
# Run tests
mvn testAPI Usage
# 1. Reset environment (start episode)
curl -X POST http://localhost:7860/api/v1/reset \
-H "Content-Type: application/json" \
-d '{"task_type": "EASY", "seed": 42}'
# 2. Submit action
curl -X POST http://localhost:7860/api/v1/step \
-H "Content-Type: application/json" \
-d '{"priority": "HIGH", "reasoning": "Screen flickering with client deadline is HIGH"}'
# 3. Inspect ground truth
curl http://localhost:7860/api/v1/state
# 4. Run baseline
curl -X POST "http://localhost:7860/api/v1/baseline/run?taskTypes=EASY,MEDIUM,HARD"Interactive API Docs
Visit: http://localhost:7860/swagger-ui
๐ Baseline Scores
Baseline agent: gpt-4o-mini with temperature 0.2, seed 42.
To reproduce:
export OPENAI_API_KEY=your_key
curl -X POST "http://localhost:7860/api/v1/baseline/run?taskTypes=EASY,MEDIUM,HARD"๐ Ticket Dataset
15 real-world style tickets across 6 categories:
๐ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Spring Boot Application โ
โ Port 7860 โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ OpenEnvControllerโ โ EnvironmentService โ โ
โ โ โโโโโถโ reset() / step() / state() โ โ
โ โ POST /reset โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ POST /step โ โ โ
โ โ GET /state โ โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ GET /info โ โ Grader Pipeline โ โ
โ โโโโโโโโโโโโโโโโโโโโ โ EasyTaskGrader (priority) โ โ
โ โ MediumTaskGrader(+cat+team) โ โ
โ โโโโโโโโโโโโโโโโโโโโ โ HardTaskGrader (+resolution) โ โ
โ โ BaselineControllerโ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ POST /baseline โ โ โ
โ โ /run โ โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโฌโโโโโโโโโโ โ TicketDataStore โ โ
โ โ โ 15 realistic IT tickets โ โ
โ โโโโโโโโโโผโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ BaselineRunner โ โ
โ โ OpenAI API โ โ
โ โ step/reset loop โ โ
โ โโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐งช Tests
mvn testOpenEnvIntegrationTestโ Full episode lifecycle for all 3 tasks (50+ assertions)GraderUnitTestโ Isolated reward function tests for all graders
๐ OpenEnv Spec Compliance
๐ License
MIT License โ see LICENSE
