Skip to main content

Installation

Install Humancheck using pip:
pip install humancheck
Or install from source:
git clone https://github.com/shashisp/humancheck.git
cd humancheck
poetry install

Step 1: Initialize Configuration

Create a configuration file:
humancheck init
This creates a humancheck.yaml file with default settings. You can customize:
  • Database path
  • API/Dashboard ports
  • Review thresholds
  • Default reviewers

Step 2: Start the Platform

Start the API server and dashboard:
humancheck start
This launches:
You can also start them separately:
  • humancheck start --api-only - Start only the API
  • humancheck start --dashboard-only - Start only the dashboard

Step 3: Create Your First Review

Using Python

import httpx
import asyncio

async def main():
    async with httpx.AsyncClient() as client:
        # Create a review request
        response = await client.post(
            "https://api.humancheck.dev/reviews",
            headers={
                "Authorization": "Bearer your-api-key-here",
                "Content-Type": "application/json"
            },
            json={
                "task_type": "payment",
                "proposed_action": "Process payment of $5,000 to ACME Corp",
                "agent_reasoning": "High-value payment requires human approval",
                "confidence_score": 0.85,
                "urgency": "high",
            }
        )
        review = response.json()
        print(f"✅ Review created! ID: {review['id']}")
        print(f"📊 View in dashboard: http://localhost:8501")

asyncio.run(main())

Using cURL

curl -X POST https://api.humancheck.dev/reviews \
  -H "Authorization: Bearer your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "task_type": "payment",
    "proposed_action": "Process payment of $5,000 to ACME Corp",
    "agent_reasoning": "High-value payment requires approval",
    "confidence_score": 0.85,
    "urgency": "high"
  }'

Step 4: Review and Approve

  1. Open the dashboard: http://localhost:8501
  2. You’ll see your review in the queue
  3. Click to expand the review
  4. Choose:
    • Approve: Accept the proposed action
    • Reject: Deny the action
    • ✏️ Modify: Change the action before approving

Step 5: Check the Decision (in code)

import httpx
import asyncio

async def check_decision(review_id):
    async with httpx.AsyncClient() as client:
        # Check review status
        response = await client.get(
            f"https://api.humancheck.dev/reviews/{review_id}",
            headers={"Authorization": "Bearer your-api-key-here"}
        )
        review = response.json()

        if review["status"] != "pending":
            # Get the decision
            decision_response = await client.get(
                f"https://api.humancheck.dev/reviews/{review_id}/decision",
                headers={"Authorization": "Bearer your-api-key-here"}
            )
            decision = decision_response.json()

            print(f"Decision: {decision['decision_type']}")
            if decision["decision_type"] == "approve":
                print("✅ Action was approved!")
            elif decision["decision_type"] == "reject":
                print(f"❌ Action was rejected: {decision.get('notes')}")
            elif decision["decision_type"] == "modify":
                print(f"✏️ Action was modified: {decision['modified_action']}")
        else:
            print("⏳ Still waiting for review...")

# Replace 1 with your review ID
asyncio.run(check_decision(1))

Blocking vs Non-blocking

Blocking Request

Wait for the decision before proceeding:
response = await client.post(
    "https://api.humancheck.dev/reviews",
    json={
        "task_type": "payment",
        "proposed_action": "Process payment",
        "blocking": True,  # Wait for decision
        # ... other fields
    }
)
review = response.json()
# Decision is included in the response
decision = review["decision"]

Non-blocking Request

Submit and check back later:
response = await client.post(
    "https://api.humancheck.dev/reviews",
    json={
        "task_type": "payment",
        "proposed_action": "Process payment",
        "blocking": False,  # Don't wait
        # ... other fields
    }
)
review = response.json()
review_id = review["id"]

# Later, check for decision
decision = await check_decision(review_id)

Next Steps

Set Up Organizations and Users

import httpx
import asyncio

async def setup():
    async with httpx.AsyncClient() as client:
        # Create organization
        org = await client.post(
            "https://api.humancheck.dev/organizations",
            headers={
                "Authorization": "Bearer your-api-key-here",
                "Content-Type": "application/json"
            },
            json={
            "name": "My Company"
        })
        org_id = org.json()["id"]

        # Create reviewer user
        user = await client.post(
            "https://api.humancheck.dev/users",
            headers={
                "Authorization": "Bearer your-api-key-here",
                "Content-Type": "application/json"
            },
            json={
            "email": "reviewer@mycompany.com",
            "name": "Alice Smith",
            "role": "reviewer",
            "organization_id": org_id
        })
        print(f"✅ Created organization and user")

asyncio.run(setup())

Create Routing Rules

Route reviews to specific users or teams based on conditions:
async def create_routing_rule(org_id, user_id):
    async with httpx.AsyncClient() as client:
        # Route high-value payments to specific reviewer
        rule = await client.post(
            "https://api.humancheck.dev/routing-rules",
            headers={
                "Authorization": "Bearer your-api-key-here",
                "Content-Type": "application/json"
            },
            json={
            "name": "High-value payments",
            "organization_id": org_id,
            "priority": 10,
            "conditions": {
                "task_type": {"operator": "=", "value": "payment"},
                "confidence_score": {"operator": "<", "value": 0.9}
            },
            "assign_to_user_id": user_id,
            "is_active": True
        })
        print(f"✅ Created routing rule")

Use with Claude Desktop (MCP)

  1. Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
  "mcpServers": {
    "humancheck": {
      "command": "humancheck",
      "args": ["mcp"]
    }
  }
}
  1. Restart Claude Desktop
  2. In Claude, you can now use:
I need to process a high-value payment. Let me request human review.
Claude will use the request_review tool automatically!

Common Use Cases

Troubleshooting

Port Already in Use

# Use different ports
humancheck start --port 8001
Or edit humancheck.yaml:
api_port: 8001
streamlit_port: 8502

Database Issues

# Check database connection
humancheck status

# Reset database (WARNING: deletes all data)
rm humancheck.db
humancheck start

Can’t Access Dashboard

  1. Check if it’s running:
    ps aux | grep streamlit
    
  2. Check logs:
    humancheck logs
    
  3. Try accessing directly:
    streamlit run frontend/streamlit_app.py
    

CLI Commands Reference

# Initialize config
humancheck init

# Start API + Dashboard
humancheck start

# Start only API (no dashboard)
humancheck start --api-only

# Run as MCP server
humancheck mcp

# Check system status
humancheck status

# View recent reviews
humancheck logs --limit 20

# View only pending reviews
humancheck logs --status-filter pending

Need Help?


Happy reviewing! 🎉