dramaling-app/docs/04_technical/api/dialogue-practice.md

11 KiB
Raw Blame History

對話練習 API

概述

對話練習API負責管理AI驅動的互動式對話學習體驗包括場景式對話、實時AI分析回饋、回覆輔助系統和翻譯支援。

API 端點

對話系統 (Dialogue System)

開始對話練習

POST /api/v1/dialogues/start
Authorization: Bearer <access_token>
{
  "scenario_id": "SC_Restaurant_01",
  "difficulty_override": "A2", // optional
  "target_vocabulary": ["reservation", "menu", "order"], // optional
  "practice_mode": "guided", // guided, free_form, challenge
  "language_focus": ["grammar", "vocabulary", "pronunciation"] // optional
}

Response 201 Created
{
  "success": true,
  "data": {
    "dialogue_id": "DLG_20240905_001",
    "scenario_id": "SC_Restaurant_01",
    "session_token": "session_token_here",
    "practice_mode": "guided",
    "initial_context": {
      "setting": "高級餐廳內部晚上8點",
      "your_role": "客人",
      "ai_role": "餐廳服務員",
      "objective": "成功預約並點餐",
      "cultural_notes": "西式正式餐廳環境,需要適當的禮貌用語"
    },
    "ai_message": {
      "message": "Good evening! Welcome to Milano Restaurant. Do you have a reservation?",
      "audio_url": "https://cdn.example.com/audio/dlg001_001.mp3",
      "phonetic": "ɡʊd ˈivnɪŋ! ˈwɛlkəm tu mɪˈlɑnoʊ ˈrɛstərɑnt. du ju hæv ə ˌrɛzərˈveɪʃən?",
      "suggestions": [
        {
          "text": "Yes, I have a reservation under Smith.",
          "difficulty": "A2",
          "appropriateness": "formal"
        },
        {
          "text": "No, but could we get a table for two?",
          "difficulty": "A2",
          "appropriateness": "polite"
        },
        {
          "text": "I'd like to make a reservation for tonight.",
          "difficulty": "B1",
          "appropriateness": "formal"
        }
      ],
      "vocabulary_hints": [
        {
          "word": "reservation",
          "definition": "預約",
          "usage_note": "正式場合的預約用詞"
        }
      ]
    },
    "dialogue_settings": {
      "time_limit": 600, // seconds, null for unlimited
      "assistance_available": true,
      "hints_remaining": 3,
      "auto_feedback": true
    }
  }
}

發送對話訊息

POST /api/v1/dialogues/{dialogue_id}/message
Authorization: Bearer <access_token>
{
  "message": "Yes, I have a reservation under Chen for 8 PM.",
  "message_type": "text", // text, audio
  "audio_url": "https://cdn.example.com/user_audio/msg001.mp3", // if audio
  "request_feedback": true, // optional, default true
  "confidence_level": 4 // 1-5 scale, optional
}

Response 200 OK
{
  "success": true,
  "data": {
    "ai_response": {
      "message": "Perfect! Mr. Chen, your table for two is ready. Right this way please.",
      "audio_url": "https://cdn.example.com/audio/dlg001_002.mp3",
      "phonetic": "ˈpɜrfɪkt! ˈmɪstər ʧɛn, jʊr ˈteɪbəl fɔr tu ɪz ˈrɛdi. raɪt ðɪs weɪ pliz.",
      "emotion": "friendly_professional",
      "speaking_pace": "normal",
      "analysis": {
        "grammar_score": 90,
        "semantic_score": 95, 
        "fluency_score": 85,
        "pronunciation_score": 88,
        "overall_score": 90,
        "feedback": "Excellent use of formal language for restaurant context!",
        "detailed_analysis": {
          "grammar_issues": [],
          "vocabulary_usage": [
            {
              "word": "reservation",
              "correctness": "perfect",
              "context_appropriateness": "excellent"
            }
          ],
          "pronunciation_notes": [
            {
              "word": "reservation",
              "accuracy": 0.92,
              "suggestion": "輕微的r音可以更清晰"
            }
          ]
        }
      },
      "suggestions": [
        {
          "text": "Thank you. Could we see the menu please?",
          "reason": "自然的下一步動作",
          "difficulty": "A2"
        },
        {
          "text": "Great! What do you recommend today?",
          "reason": "顯示興趣並尋求建議",
          "difficulty": "B1"
        },
        {
          "text": "Thank you. We'd like to start with drinks.",
          "reason": "具體的點餐開始",
          "difficulty": "A2"
        }
      ]
    },
    "dialogue_progress": {
      "turns_completed": 2,
      "estimated_turns_remaining": 6,
      "objectives_completed": ["greeting", "reservation_confirmation"],
      "objectives_remaining": ["ordering", "payment"],
      "completion_percentage": 25,
      "current_phase": "seating_and_menu"
    },
    "session_stats": {
      "total_time_elapsed": 45, // seconds
      "average_response_time": 8.5,
      "hints_used": 0,
      "mistakes_count": 0
    }
  }
}

結束對話

POST /api/v1/dialogues/{dialogue_id}/complete
Authorization: Bearer <access_token>
{
  "completion_type": "natural", // natural, forced, timeout
  "user_satisfaction": 4 // 1-5 scale, optional
}

Response 200 OK
{
  "success": true,
  "data": {
    "dialogue_summary": {
      "dialogue_id": "DLG_20240905_001",
      "completion_type": "natural",
      "duration": 420, // seconds
      "turns_completed": 8,
      "final_score": 88,
      "grade": "B+",
      "objectives_achieved": 4,
      "objectives_total": 4,
      "vocabulary_practiced": 12,
      "new_vocabulary_learned": 3,
      "mistakes_count": 2,
      "hints_used": 1
    },
    "rewards": {
      "experience_points": 150,
      "score_points": 75,
      "diamonds_earned": 25,
      "achievements_unlocked": ["First Perfect Dialogue", "Restaurant Master"],
      "vocabulary_progress": {
        "words_advanced": 3,
        "words_mastered": 1,
        "review_words_generated": 2
      }
    },
    "performance_analysis": {
      "strongest_areas": ["vocabulary_usage", "cultural_appropriateness"],
      "improvement_areas": ["pronunciation", "sentence_variety"],
      "next_recommended_scenarios": [
        {
          "scenario_id": "SC_Restaurant_02",
          "title": "餐廳點餐進階",
          "reason": "Continue building on restaurant vocabulary"
        }
      ]
    },
    "certificate": {
      "available": true,
      "certificate_url": "https://cdn.example.com/certificates/DLG_20240905_001.pdf"
    }
  }
}

回覆輔助系統

獲取回覆輔助

POST /api/v1/dialogues/{dialogue_id}/assistance
Authorization: Bearer <access_token>
{
  "assistance_type": "reply_guidance", // reply_guidance, translation, vocabulary_help
  "context": {
    "partner_message": "Good morning! How is your day going?",
    "scenario_context": "friendly morning greeting at office",
    "user_language_level": "A2",
    "dialogue_history": [
      {
        "speaker": "partner",
        "message": "Hello! Nice to meet you."
      },
      {
        "speaker": "user", 
        "message": "Nice to meet you too."
      }
    ]
  }
}

Response 200 OK
{
  "success": true,
  "data": {
    "assistance_id": "AST_20240905_001",
    "assistance_type": "reply_guidance",
    "analysis": {
      "partner_intent": {
        "intent": "friendly_greeting_inquiry",
        "emotion": "positive_friendly",
        "expectation": "positive_response_about_day",
        "cultural_context": "Western casual workplace greeting",
        "explanation": "對方是在進行友好的早晨問候,期待你分享今天的狀況或心情"
      },
      "response_guidance": {
        "thinking_process": [
          "對方表現友好,我應該同樣友善回應",
          "這是詢問我今天的狀況,我可以簡單分享",  
          "可以考慮反問對方相同的問題表示關心"
        ],
        "response_strategies": [
          {
            "strategy": "positive_sharing",
            "description": "積極分享今天的狀況",
            "tone": "upbeat"
          },
          {
            "strategy": "brief_polite",
            "description": "簡潔禮貌的回應",
            "tone": "neutral_friendly"
          },
          {
            "strategy": "reciprocal_inquiry", 
            "description": "回應後反問對方",
            "tone": "engaging"
          }
        ]
      },
      "reply_examples": [
        {
          "example": "Great, thank you! I'm feeling energetic today. How about you?",
          "level": "A2",
          "style": "friendly_reciprocal",
          "explanation": "表達積極心情並反問對方,展現對話技巧"
        },
        {
          "example": "Pretty good, thanks for asking!",
          "level": "A2", 
          "style": "casual_brief",
          "explanation": "簡潔友善的回應,適合快節奏對話"
        },
        {
          "example": "It's going well so far! Just got to the office. What about your day?",
          "level": "B1",
          "style": "detailed_engaging",
          "explanation": "提供更多細節並主動延續對話"
        }
      ]
    },
    "cost_deducted": {
      "item_type": "reply_hint",
      "quantity": 1,
      "remaining_quantity": 4
    }
  }
}

翻譯輔助

POST /api/v1/translation/assistance
Authorization: Bearer <access_token>
{
  "source_text": "今天天氣真好,讓我心情很愉快",
  "context": {
    "dialogue_scenario": "casual_conversation",
    "formality_level": "informal",
    "target_language_level": "A2",
    "cultural_adaptation": true
  }
}

Response 200 OK
{
  "success": true,
  "data": {
    "translation_result": {
      "primary_translation": "The weather is really nice today, it makes me feel happy.",
      "alternative_translations": [
        {
          "text": "It's such a beautiful day today, I'm in a great mood!",
          "level": "B1",
          "style": "enthusiastic"
        },
        {
          "text": "Today's nice weather is making me cheerful.",
          "level": "A2",
          "style": "simple_clear"
        }
      ],
      "grammar_notes": [
        {
          "point": "weather_description",
          "explanation": "英文描述天氣常用 'The weather is + adjective' 句型"
        },
        {
          "point": "causative_structure", 
          "explanation": "'makes me feel + adjective' 表達某事讓你產生某種感受"
        }
      ],
      "vocabulary_highlights": [
        {
          "chinese": "心情愉快",
          "english": "feel happy / in a good mood",
          "note": "英文有多種表達好心情的方式"
        }
      ],
      "cultural_adaptation": {
        "original_style": "direct_emotional_expression",
        "adapted_style": "moderate_positive_expression",
        "explanation": "調整為西方文化中更常見的表達方式"
      }
    }
  }
}

錯誤處理

對話練習相關錯誤

  • DIALOGUE_NOT_FOUND: 對話不存在
  • DIALOGUE_ALREADY_COMPLETED: 對話已完成
  • DIALOGUE_EXPIRED: 對話會話已過期
  • SCENARIO_NOT_ACCESSIBLE: 場景不可訪問
  • INVALID_MESSAGE_FORMAT: 無效的訊息格式
  • AUDIO_PROCESSING_FAILED: 音頻處理失敗
  • AI_ANALYSIS_UNAVAILABLE: AI分析服務不可用

輔助系統相關錯誤

  • INSUFFICIENT_REPLY_HINTS: 回覆提示道具不足
  • ASSISTANCE_NOT_AVAILABLE: 輔助功能不可用
  • TRANSLATION_SERVICE_ERROR: 翻譯服務錯誤
  • DAILY_HINT_LIMIT_EXCEEDED: 超過每日提示使用限制
  • DIALOGUE_HINT_LIMIT_EXCEEDED: 超過單次對話提示使用限制
  • INVALID_ASSISTANCE_TYPE: 無效的輔助類型
  • CONTEXT_INSUFFICIENT: 上下文資訊不足
  • LANGUAGE_PAIR_NOT_SUPPORTED: 不支援的語言對

建立日期: 2025-09-08
API版本: v1
負責模組: 對話練習系統