Skip to content

Add HITL API router to expose review data to the UI #60

@selvicim45

Description

@selvicim45

Title: Add HITL API router to expose review data and accept human decisions

Description

We currently create HITL review jobs in HITLNode (e.g., review_id, customer, safe variants, status). However, there is no dedicated API surface for the UI to:

  • Fetch details for a given review (customer + variants + status)
  • Submit a human reviewer decision (which variant is approved, optional notes)

This issue is to implement a simple HITL router in the backend so the front end can integrate with the human-in-the-loop flow.

Scope

Use the existing store (e.g., MemoryStore) where HITLNode saves reviews under keys like hitl:{review_id}.

Expose endpoints to:

  • Get HITL review payload by review_id
  • Submit human decision for review_id (approved variant, notes)

Proposed implementation

Extend HITLNode (if not already)

Ensure HITLNode.run(customer, safe_variants) saves the following structure in the store:

{
  "customer": {...},
  "variants": [...],
  "status": "pending_human_approval"
}

Uses key pattern:

hitl:{review_id}

Create new router: backend/app/routers/hitl.py

GET /hitl/{review_id}

  • Loads store.get(f"hitl:{review_id}")
  • Returns { customer, variants, status, ... }
  • Returns 404 if review is not found

POST /hitl/{review_id}/decision

Request body (Pydantic model):

{
  "approved_variant_id": "A",
  "notes": "optional free text"
}

Backend logic:

  • Load hitl:{review_id}
  • Update:
    • status = "approved"
    • approved_variant_id
    • notes
  • Save updated object back to store

Register router in app/main.py

Add:

from .routers.hitl import router as hitl_router
app.include_router(hitl_router)

Acceptance Criteria

GET /hitl/{review_id} returns:

  • customer
  • variants
  • status

POST /hitl/{review_id}/decision:

  • Updates review with:
    • status="approved"
    • approved_variant_id
    • notes

Additional Criteria

  • Both endpoints visible and testable in Swagger (/docs)
  • End-to-end flow works:
Trigger orchestration
→ HITLNode creates review
→ review is fetchable via GET /hitl/{review_id}
→ decision is submitted via POST /hitl/{review_id}/decision

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No fields configured for Task.

Projects

Status

Todo

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions