Customization Guide

Customize Kai to match your teaching style and institutional needs

Published

November 20, 2025

Overview

Kai the AI is designed to be highly customizable, allowing you to tailor features, workflows, and integrations to your specific teaching style and institutional requirements. This guide covers all available customization options.

Grading Customization

Custom Rubrics

Create custom grading rubrics that match your assessment criteria.

Creating a Rubric

Via Dashboard:

  1. Navigate: Dashboard → Settings → Grading → Rubrics
  2. Click: “Create New Rubric”
  3. Configure:
    • Name: “Essay Rubric - PSYCH 101”
    • Total Points: 100
    • Add Criteria

Example Rubric Structure:

Criterion Points Description Levels
Thesis Statement 20 Clear, arguable thesis Excellent (20), Good (15), Fair (10), Poor (5)
Evidence 30 Supporting evidence and analysis Excellent (30), Good (22), Fair (15), Poor (8)
Organization 20 Logical flow and structure Excellent (20), Good (15), Fair (10), Poor (5)
Writing Quality 20 Grammar, style, clarity Excellent (20), Good (15), Fair (10), Poor (5)
Citations 10 Proper citation format Excellent (10), Good (7), Fair (5), Poor (2)

Via API

rubric = {
    "name": "Essay Rubric - PSYCH 101",
    "total_points": 100,
    "criteria": [
        {
            "name": "Thesis Statement",
            "points": 20,
            "description": "Clear, arguable thesis",
            "levels": [
                {"name": "Excellent", "points": 20, "description": "Clear, specific, arguable thesis"},
                {"name": "Good", "points": 15, "description": "Clear thesis with minor issues"},
                {"name": "Fair", "points": 10, "description": "Vague or unclear thesis"},
                {"name": "Poor", "points": 5, "description": "Missing or fundamentally flawed thesis"}
            ]
        },
        # ... more criteria
    ]
}

response = requests.post(
    "https://chi2api.com/v1/rubrics",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json=rubric
)

Feedback Styles

Customize the tone and detail level of AI-generated feedback.

Available Styles:

Style Description Best For Example
Detailed Comprehensive feedback with specific suggestions Major assignments, essays “Your thesis in paragraph 2 effectively argues… However, consider strengthening…”
Concise Brief, actionable feedback Quizzes, frequent assignments “Strong analysis. Add more examples in body paragraphs.”
Points Only Score with minimal commentary Quick assessments, self-graded work “Score: 85/100”
Encouraging Positive tone, growth-focused Struggling students, formative assessment “Great progress! You’re developing strong analysis skills…”
Professional Formal, academic tone Graduate courses, professional programs “The analysis demonstrates competent understanding of…”

Configuration:

# Set default for course
kai.courses.update(
    course_id="course_abc",
    grading_settings={
        "feedback_style": "encouraging",
        "show_rubric_scores": True,
        "include_suggestions": True
    }
)

# Override for specific assignment
kai.assignments.grade(
    assignment_id="assign_123",
    student_submission="...",
    grading_style="detailed"  # Override course default
)

Auto-Grading Thresholds

Configure when AI can auto-grade vs. requiring human review.

Confidence-Based Grading:

grading_policy = {
    "auto_grade_threshold": 0.85,  # Auto-grade if confidence >= 85%
    "review_required": {
        "low_confidence": True,       # Always review if confidence < threshold
        "high_stakes": True,           # Review if assignment weight > 20%
        "boundary_scores": True,       # Review if score near grade boundary
        "flagged_content": True        # Review if content flagged
    },
    "grade_boundaries": [90, 80, 70, 60]  # A, B, C, D thresholds
}

kai.courses.update(
    course_id="course_abc",
    grading_settings=grading_policy
)

Example Scenarios:

Scenario Confidence Auto-Grade? Reason
Clear excellent work 0.95 ✅ Yes Above threshold
Borderline B/C (79%) 0.88 ❌ No Near boundary
Low-stakes quiz 0.80 ⚠️ Depends Check assignment weight
Plagiarism detected 0.92 ❌ No Flagged content

Feedback Workflow Customization

Custom Feedback Questions

Replace default questions with your own.

Default Questions: 1. “What concepts from today’s class were clear to you?” 2. “What topics would you like me to review or explain differently?”

Custom Questions Example:

feedback_config = {
    "questions": [
        {
            "id": "clarity",
            "text": "On a scale of 1-5, how clear was today's lecture?",
            "type": "scale",
            "min": 1,
            "max": 5
        },
        {
            "id": "confused_topics",
            "text": "Which specific topics need more explanation?",
            "type": "multiple_choice",
            "options": [
                "Standard Error",
                "Hypothesis Testing",
                "P-values",
                "Effect Size",
                "None - all clear"
            ],
            "allow_multiple": True
        },
        {
            "id": "pace",
            "text": "Was the pace of today's class...",
            "type": "single_choice",
            "options": ["Too fast", "Just right", "Too slow"]
        },
        {
            "id": "additional",
            "text": "Any other feedback?",
            "type": "free_text",
            "optional": True
        }
    ]
}

kai.courses.update(
    course_id="course_abc",
    feedback_settings=feedback_config
)

Feedback Triggers

Customize when feedback requests are suggested or automatic.

Trigger Configuration:

triggers = {
    "time_based": {
        "enabled": True,
        "interval_minutes": 30,
        "max_per_class": 3
    },
    "content_based": {
        "enabled": True,
        "trigger_on": [
            "topic_transition",      # New major topic
            "complex_concept",        # AI detects difficult concept
            "question_spike"          # Many student questions
        ]
    },
    "engagement_based": {
        "enabled": True,
        "trigger_on": [
            "attention_drop",         # Engagement metrics decline
            "confusion_indicators"    # Body language, facial expressions
        ],
        "threshold": 0.3              # 30% engagement drop
    },
    "manual_override": {
        "allow_disable_suggestions": True,
        "require_confirmation": False
    }
}

kai.courses.update(
    course_id="course_abc",
    feedback_triggers=triggers
)

Response Window Customization

Adjust how long students have to respond.

response_settings = {
    "default_window_minutes": 2,
    "allow_late_responses": True,
    "late_window_minutes": 5,
    "send_reminder": {
        "enabled": True,
        "after_seconds": 60
    }
}

Quiz Customization

Question Generation Rules

Control how Kai generates quiz questions.

quiz_settings = {
    "difficulty_distribution": {
        "easy": 0.3,      # 30% easy questions
        "medium": 0.5,    # 50% medium questions
        "hard": 0.2       # 20% hard questions
    },
    "question_types": {
        "multiple_choice": 0.5,
        "true_false": 0.2,
        "short_answer": 0.3
    },
    "content_sources": [
        "lecture_notes",
        "textbook_chapters",
        "assigned_readings",
        "previous_exams"
    ],
    "avoid_repetition": {
        "enabled": True,
        "lookback_quizzes": 5  # Don't repeat from last 5 quizzes
    },
    "adaptive_difficulty": {
        "enabled": True,
        "adjust_based_on": "student_performance"
    }
}

kai.courses.update(
    course_id="course_abc",
    quiz_settings=quiz_settings
)

Question Templates

Create custom question templates for consistency.

Template Example:

template = {
    "name": "Concept Application Template",
    "structure": {
        "stem": "Given the following scenario: {scenario}",
        "question": "Which statistical test would be most appropriate?",
        "options": [
            "{correct_test}",
            "{plausible_alternative_1}",
            "{plausible_alternative_2}",
            "{clearly_wrong_option}"
        ],
        "explanation": "The correct answer is {correct_test} because {reasoning}. "
                      "{plausible_alternative_1} would not work because {why_not}."
    },
    "variables": {
        "scenario": {
            "type": "generated",
            "context": "real-world statistical scenario"
        },
        "correct_test": {
            "type": "from_content",
            "category": "statistical_tests"
        }
    }
}

kai.quiz_templates.create(template)

Time Limits and Attempts

quiz_policies = {
    "time_limit": {
        "enabled": True,
        "minutes": 10,
        "auto_submit": True
    },
    "attempts": {
        "allowed": 2,
        "use_highest": True,  # Or "average", "latest"
        "time_between_attempts_hours": 24
    },
    "question_randomization": {
        "randomize_order": True,
        "randomize_options": True,
        "pool_size": 20,  # Select 10 from pool of 20
        "questions_shown": 10
    }
}

SafeStream Customization

Content Moderation Rules

Fine-tune what content gets flagged.

Sensitivity Levels:

moderation_config = {
    "sensitivity": "medium",  # low, medium, high, custom
    "categories": {
        "profanity": {
            "enabled": True,
            "action": "flag",  # flag, block, or allow
            "severity_threshold": "medium"
        },
        "harassment": {
            "enabled": True,
            "action": "block",
            "notify_admin": True
        },
        "academic_dishonesty": {
            "enabled": True,
            "action": "flag",
            "patterns": [
                "plagiarism_indicators",
                "contract_cheating_language",
                "suspicious_collaboration"
            ]
        },
        "personal_information": {
            "enabled": True,
            "action": "flag",
            "types": ["phone", "address", "ssn", "credit_card"]
        }
    }
}

kai.courses.update(
    course_id="course_abc",
    safestream_settings=moderation_config
)

Custom Keyword Lists

Add institution-specific or course-specific keywords.

custom_keywords = {
    "flag_words": [
        # Academic integrity
        "write my paper for me",
        "homework help service",

        # Institution-specific
        "campus-specific-concern",

        # Course-specific sensitive topics
        "sensitive-topic-1",
        "sensitive-topic-2"
    ],
    "allow_words": [
        # Context where flagged words are acceptable
        "discussing the ethics of cheating",  # Academic discussion
        "analyzing plagiarism in literature"  # Course content
    ],
    "escalate_words": [
        # Immediate admin notification
        "self-harm",
        "violence",
        "threat"
    ]
}

kai.safestream.update_keywords(
    course_id="course_abc",
    keywords=custom_keywords
)

Action Workflows

Define what happens when content is flagged.

action_workflow = {
    "low_severity": {
        "action": "log",
        "notify_instructor": False,
        "allow_post": True
    },
    "medium_severity": {
        "action": "flag",
        "notify_instructor": True,
        "allow_post": True,
        "require_review_within_hours": 24
    },
    "high_severity": {
        "action": "block",
        "notify_instructor": True,
        "notify_admin": True,
        "notify_counseling": ["self_harm", "violence"],
        "immediate_review": True
    }
}

UI/UX Customization

Branding

Customize the appearance of Kai to match your institution.

Dashboard Customization:

branding = {
    "logo_url": "https://your-institution.edu/logo.png",
    "primary_color": "#003366",      # Institution blue
    "secondary_color": "#FFD700",    # Institution gold
    "font_family": "Proxima Nova, sans-serif",
    "custom_css_url": "https://your-institution.edu/kai-custom.css"
}

kai.settings.update_branding(branding)

Mobile App Customization (Institution License):

app_branding = {
    "app_name": "University XYZ Learning Assistant",
    "app_icon_url": "https://your-institution.edu/app-icon.png",
    "splash_screen_url": "https://your-institution.edu/splash.png",
    "theme": {
        "primary_color": "#003366",
        "accent_color": "#FFD700",
        "dark_mode_available": True
    }
}

Notification Preferences

Customize notification timing and frequency.

Instructor Notifications:

instructor_notifications = {
    "feedback_complete": {
        "enabled": True,
        "method": ["push", "email"],
        "immediate": True
    },
    "grading_complete": {
        "enabled": True,
        "method": ["email"],
        "digest": "daily"  # Or "immediate", "weekly"
    },
    "low_engagement_alert": {
        "enabled": True,
        "threshold": 0.4,  # Alert if <40% participation
        "method": ["push"]
    },
    "quiet_hours": {
        "enabled": True,
        "start": "22:00",
        "end": "07:00",
        "timezone": "America/New_York"
    }
}

Student Notifications:

student_notifications = {
    "feedback_request": {
        "enabled": True,
        "method": ["push"],
        "sound": "gentle_chime"
    },
    "quiz_available": {
        "enabled": True,
        "method": ["push", "email"],
        "advance_notice_hours": 24
    },
    "grade_posted": {
        "enabled": True,
        "method": ["push"],
        "include_score": False  # Privacy option
    },
    "reminder_frequency": "once"  # Or "twice", "persistent"
}

Analytics Customization

Custom Metrics

Define custom metrics to track.

custom_metrics = {
    "engagement_score": {
        "formula": "(feedback_response_rate * 0.4) + (quiz_completion * 0.3) + (app_usage * 0.3)",
        "display_name": "Engagement Index",
        "threshold_warning": 0.6,
        "threshold_critical": 0.4
    },
    "comprehension_velocity": {
        "formula": "improvement_rate / time_period",
        "display_name": "Learning Velocity",
        "unit": "points/week"
    },
    "intervention_effectiveness": {
        "formula": "post_intervention_score - pre_intervention_score",
        "display_name": "Intervention Impact",
        "track_by": "topic"
    }
}

kai.analytics.add_custom_metrics(custom_metrics)

Dashboard Layout

Customize what appears on your dashboard.

dashboard_config = {
    "widgets": [
        {
            "type": "engagement_overview",
            "position": {"row": 1, "col": 1},
            "size": "large"
        },
        {
            "type": "recent_feedback",
            "position": {"row": 1, "col": 2},
            "size": "medium",
            "settings": {
                "show_analysis": True,
                "limit": 5
            }
        },
        {
            "type": "struggling_students",
            "position": {"row": 2, "col": 1},
            "size": "medium",
            "settings": {
                "threshold": 0.7,
                "metric": "quiz_average"
            }
        },
        {
            "type": "topic_confusion_trends",
            "position": {"row": 2, "col": 2},
            "size": "large",
            "settings": {
                "timeframe": "2_weeks"
            }
        }
    ],
    "refresh_interval_seconds": 60
}

kai.settings.update_dashboard(dashboard_config)

Export Templates

Create custom export formats for reporting.

export_template = {
    "name": "Weekly Institutional Report",
    "format": "pdf",
    "sections": [
        {
            "title": "Executive Summary",
            "include": ["total_students", "avg_engagement", "top_challenges"]
        },
        {
            "title": "Course Performance",
            "include": ["course_list", "completion_rates", "avg_scores"]
        },
        {
            "title": "Student Support Needs",
            "include": ["struggling_students", "intervention_recommendations"]
        },
        {
            "title": "Appendix",
            "include": ["detailed_analytics", "raw_data"]
        }
    ],
    "schedule": {
        "frequency": "weekly",
        "day": "Monday",
        "time": "06:00",
        "recipients": ["dean@institution.edu", "analytics@institution.edu"]
    }
}

kai.exports.create_template(export_template)

Integration Customization

Webhook Customization

Filter and transform webhook payloads.

webhook_config = {
    "url": "https://your-server.com/webhook",
    "events": ["feedback.received", "quiz.submitted"],
    "filters": {
        "course_ids": ["course_abc", "course_xyz"],  # Only these courses
        "min_confidence": 0.8,  # Only high-confidence events
        "exclude_test_data": True
    },
    "transform": {
        "include_fields": ["student_id", "score", "timestamp"],
        "exclude_fields": ["personal_info"],
        "rename_fields": {
            "student_id": "learner_id"
        }
    },
    "retry_policy": {
        "max_attempts": 3,
        "backoff": "exponential"
    }
}

LMS Sync Customization

Control what syncs between Kai and your LMS.

lms_sync_config = {
    "sync_direction": {
        "courses": "bidirectional",      # LMS ↔️ Kai
        "students": "from_lms",          # LMS → Kai only
        "assignments": "bidirectional",
        "grades": "to_lms"               # Kai → LMS only
    },
    "sync_frequency": {
        "courses": "daily",
        "students": "hourly",
        "assignments": "hourly",
        "grades": "immediate"
    },
    "conflict_resolution": {
        "grade_conflicts": "keep_highest",  # Or "keep_latest", "manual_review"
        "enrollment_conflicts": "lms_wins"
    },
    "selective_sync": {
        "only_published_courses": True,
        "only_active_students": True,
        "exclude_past_courses": True
    }
}

kai.integrations.update_lms_sync(
    platform="canvas",
    config=lms_sync_config
)

Accessibility Customization

Language and Localization

Configure language preferences and translations.

localization = {
    "default_language": "en",
    "available_languages": ["en", "es", "fr", "zh"],
    "student_choice": True,  # Students can choose their language
    "auto_translate": {
        "enabled": True,
        "feedback": True,
        "questions": True,
        "ui_elements": True
    },
    "regional_settings": {
        "date_format": "MM/DD/YYYY",  # Or "DD/MM/YYYY", "YYYY-MM-DD"
        "time_format": "12h",         # Or "24h"
        "timezone": "America/New_York"
    }
}

Accessibility Features

accessibility = {
    "screen_reader": {
        "enabled": True,
        "verbose_mode": True
    },
    "visual": {
        "high_contrast_mode": True,
        "font_size_options": ["small", "medium", "large", "x-large"],
        "dyslexia_friendly_font": True
    },
    "mobile_accessibility": {
        "voice_input": True,
        "haptic_feedback": True,
        "simplified_ui": True
    }
}

Template Library

Pre-built Configurations

Kai provides templates for common scenarios:

Available Templates:

Template Description Best For
Large Lecture High-frequency feedback, auto-grading 100+ students
Seminar Discussion Rich feedback, peer review 10-25 students
Flipped Classroom Pre-class quizzes, targeted support Any size
Lab Course Practical assessments, safety monitoring Hands-on courses
Online Asynchronous Flexible deadlines, discussion monitoring Remote learning
Hybrid Balanced online/in-person features Mixed format

Applying a Template:

kai.courses.apply_template(
    course_id="course_abc",
    template="large_lecture",
    customize={
        "feedback_frequency": "high",  # Override template default
        "auto_grade_threshold": 0.90   # Stricter than template
    }
)

Advanced Customization

Custom Algorithms

Institution license holders can upload custom algorithms.

Example: Custom Engagement Score

def custom_engagement_score(student_data):
    """
    Custom engagement calculation emphasizing attendance
    """
    attendance_weight = 0.5
    participation_weight = 0.3
    completion_weight = 0.2

    score = (
        student_data['attendance_rate'] * attendance_weight +
        student_data['participation_rate'] * participation_weight +
        student_data['completion_rate'] * completion_weight
    )

    return {
        'score': score,
        'level': 'high' if score > 0.8 else 'medium' if score > 0.5 else 'low',
        'components': {
            'attendance': student_data['attendance_rate'],
            'participation': student_data['participation_rate'],
            'completion': student_data['completion_rate']
        }
    }

# Upload custom algorithm
kai.algorithms.upload(
    name="custom_engagement",
    function=custom_engagement_score,
    test_data=sample_student_data
)

Best Practices

Start Simple

TipIncremental Customization

Don’t customize everything at once. Start with defaults, identify pain points, then customize specific features.

Recommended Progression: 1. Week 1-2: Use defaults, identify needs 2. Week 3-4: Customize feedback questions and timing 3. Week 5-6: Add custom rubrics 4. Week 7+: Advanced features (custom metrics, algorithms)

Version Control

Track your customizations:

# Export current configuration
config = kai.settings.export(course_id="course_abc")

# Save as version
with open("kai_config_v2.json", "w") as f:
    json.dump(config, f, indent=2)

# Import configuration
with open("kai_config_v2.json", "r") as f:
    config = json.load(f)

kai.settings.import_config(
    course_id="course_new",
    config=config
)

Test Before Deploying

Always test customizations in a sandbox course:

# Create test course
test_course = kai.courses.create(
    name="TEST - Configuration Testing",
    is_sandbox=True
)

# Apply customizations
kai.settings.import_config(
    course_id=test_course.course_id,
    config=custom_config
)

# Test with sample data
# ... testing ...

# If successful, apply to production
kai.settings.import_config(
    course_id="course_abc",
    config=custom_config
)

Support


Customization capabilities vary by plan. Contact sales for institution-specific features.