diff --git a/game.json b/game.json new file mode 100644 index 0000000..874f8a5 --- /dev/null +++ b/game.json @@ -0,0 +1,1021 @@ +{ + "game_types": [ + { + "name": "Quiz - Trắc nghiệm", + "description": "Câu hỏi trắc nghiệm với các lựa chọn, chọn 1 đáp án đúng", + "game_mechanics": { + "cách_chơi": "Người chơi đọc câu hỏi và chọn 1 trong các đáp án", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh đáp án người chơi chọn với trường 'answer'" + }, + "base_schema": { + "question": { + "type": "string", + "nullable": false, + "mô_tả": "Nội dung câu hỏi, dùng ____ cho chỗ trống" + }, + "request": { + "type": "string", + "nullable": false, + "mô_tả": "Yêu cầu (VD: 'Chọn đáp án đúng', 'Điền vào chỗ trống')" + }, + "answer": { + "type": "string", + "nullable": false, + "mô_tả": "Đáp án đúng" + }, + "options": { + "type": "array", + "nullable": false, + "mô_tả": "Danh sách các lựa chọn (2-4 options)" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh minh họa" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh để trả lời" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Quiz Text Only", + "mô_tả": "Câu hỏi văn bản thuần túy, không có hình ảnh", + "required_fields": [ + "question", + "request", + "answer", + "options" + ], + "example": { + "question": "Con hươu cao cổ có cổ ____.", + "request": "Điền vào chỗ trống", + "answer": "dài", + "options": [ + "dài", + "ngắn", + "to" + ] + } + }, + { + "name": "Quiz với Hình ảnh", + "mô_tả": "Câu hỏi đi kèm hình ảnh minh họa bắt buộc phải xem", + "required_fields": [ + "question", + "request", + "answer", + "options", + "image_url", + "is_required_image" + ], + "example": { + "question": "Đây là con gì?", + "request": "Nhìn tranh và chọn đáp án đúng", + "answer": "mèo", + "options": [ + "chó", + "mèo", + "thỏ" + ], + "image_url": "https://example.com/cat.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "Sequence - Sắp xếp thứ tự", + "description": "Sắp xếp các từ/câu theo đúng thứ tự", + "game_mechanics": { + "cách_chơi": "Người chơi kéo thả hoặc chọn thứ tự các phần tử", + "cách_tính_điểm": "Đúng toàn bộ = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh thứ tự người chơi sắp với 'sentence' hoặc 'word'" + }, + "base_schema": { + "word": { + "type": "string", + "nullable": true, + "mô_tả": "Từ/cụm từ đúng (dùng khi sub_type='word')" + }, + "sentence": { + "type": "string", + "nullable": true, + "mô_tả": "Câu hoàn chỉnh đúng (dùng khi sub_type='sentence')" + }, + "parts": { + "type": "array", + "nullable": false, + "mô_tả": "Mảng các phần tử theo thứ tự xáo trộn từ đề bài gốc" + }, + "is_scrambled": { + "type": "boolean", + "nullable": false, + "mô_tả": "true = đề bài đã xáo trộn, cần sắp xếp lại" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh gợi ý" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Sắp xếp câu (Sentence Scramble)", + "mô_tả": "Sắp xếp các từ rời rạc thành câu hoàn chỉnh", + "required_fields": [ + "sentence", + "parts", + "is_scrambled" + ], + "note": "parts lấy theo thứ tự xáo trộn trong đề gốc", + "example": { + "sentence": "Apple is red.", + "parts": [ + "red", + "is", + "Apple" + ], + "is_scrambled": true + } + }, + { + "name": "Sắp xếp chữ cái (Word Scramble)", + "mô_tả": "Sắp xếp các chữ cái rời rạc thành từ hoàn chỉnh", + "required_fields": [ + "word", + "parts", + "is_scrambled" + ], + "example": { + "word": "banana", + "parts": [ + "b", + "a", + "n", + "a", + "n", + "a" + ], + "is_scrambled": true + } + }, + { + "name": "Sắp xếp câu với Hình ảnh", + "mô_tả": "Sắp xếp câu dựa theo gợi ý hình ảnh", + "required_fields": [ + "sentence", + "parts", + "is_scrambled", + "image_url", + "is_required_image" + ], + "example": { + "sentence": "The cat is sleeping.", + "parts": [ + "sleeping", + "is", + "cat", + "The" + ], + "is_scrambled": true, + "image_url": "https://example.com/sleeping_cat.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "True/False - Đúng/Sai", + "description": "Xác định câu phát biểu là đúng hay sai", + "game_mechanics": { + "cách_chơi": "Người chơi đọc câu phát biểu và chọn Đúng hoặc Sai", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh lựa chọn người chơi với trường 'is_true'" + }, + "base_schema": { + "statement": { + "type": "string", + "nullable": false, + "mô_tả": "Câu phát biểu cần xác định đúng/sai" + }, + "is_true": { + "type": "boolean", + "nullable": false, + "mô_tả": "true nếu câu đúng, false nếu sai" + }, + "true_label": { + "type": "string", + "nullable": false, + "default": "True", + "mô_tả": "Nhãn nút Đúng (VD: 'Đúng', 'Yes')" + }, + "false_label": { + "type": "string", + "nullable": false, + "default": "False", + "mô_tả": "Nhãn nút Sai (VD: 'Sai', 'No')" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Đúng/Sai Text", + "mô_tả": "Câu phát biểu văn bản thuần túy", + "required_fields": [ + "statement", + "is_true", + "true_label", + "false_label" + ], + "example": { + "statement": "Bầu trời màu xanh.", + "is_true": true, + "true_label": "Đúng", + "false_label": "Sai" + } + }, + { + "name": "Đúng/Sai với Hình ảnh", + "mô_tả": "Xác định đúng/sai dựa trên hình ảnh", + "required_fields": [ + "statement", + "is_true", + "true_label", + "false_label", + "image_url", + "is_required_image" + ], + "example": { + "statement": "Đây là quả táo.", + "is_true": true, + "true_label": "Đúng", + "false_label": "Sai", + "image_url": "https://example.com/apple.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "Matching - Nối đôi", + "description": "Nối các cặp tương ứng với nhau", + "game_mechanics": { + "cách_chơi": "Người chơi kéo nối hoặc chọn cặp tương ứng giữa 2 cột", + "cách_tính_điểm": "Mỗi cặp đúng = 1 điểm", + "xác_định_đáp_án": "So sánh cặp left-right người chơi nối với mảng 'pairs'" + }, + "base_schema": { + "pairs": { + "type": "array", + "nullable": false, + "mô_tả": "Danh sách các cặp nối (min 2, max 10)", + "item_schema": { + "left": { + "text": { + "type": "string", + "nullable": true, + "mô_tả": "Nội dung text cột trái" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh cột trái" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + } + }, + "right": { + "text": { + "type": "string", + "nullable": true, + "mô_tả": "Nội dung text cột phải" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh cột phải" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + } + } + } + }, + "mode": { + "type": "enum", + "nullable": false, + "values": [ + "text_to_text", + "text_to_image", + "image_to_image", + "mixed" + ], + "mô_tả": "Loại nối đôi" + }, + "left_label": { + "type": "string", + "nullable": false, + "default": "Column A", + "mô_tả": "Tên cột trái" + }, + "right_label": { + "type": "string", + "nullable": false, + "default": "Column B", + "mô_tả": "Tên cột phải" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Nối Text - Text", + "mô_tả": "Nối 2 cột văn bản (câu hỏi-đáp án, từ-nghĩa)", + "required_fields": [ + "pairs", + "mode", + "left_label", + "right_label" + ], + "note": "Cả left và right đều dùng field 'text'", + "example": { + "pairs": [ + { + "left": { + "text": "Thủ đô của Pháp?" + }, + "right": { + "text": "Paris" + } + }, + { + "left": { + "text": "Màu của bầu trời?" + }, + "right": { + "text": "Xanh" + } + } + ], + "mode": "text_to_text", + "left_label": "Câu hỏi", + "right_label": "Đáp án" + } + }, + { + "name": "Nối Text - Hình ảnh", + "mô_tả": "Nối từ với hình ảnh tương ứng", + "required_fields": [ + "pairs", + "mode", + "left_label", + "right_label" + ], + "note": "left dùng 'text', right dùng 'image_url' + 'image_description'", + "example": { + "pairs": [ + { + "left": { + "text": "Apple" + }, + "right": { + "image_url": "https://example.com/apple.jpg", + "image_description": "Quả táo đỏ" + } + } + ], + "mode": "text_to_image", + "left_label": "Từ vựng", + "right_label": "Hình ảnh" + } + }, + { + "name": "Nối Hình ảnh - Hình ảnh", + "mô_tả": "Nối 2 hình ảnh có liên quan với nhau", + "required_fields": [ + "pairs", + "mode", + "left_label", + "right_label" + ], + "note": "Cả left và right đều dùng 'image_url' + 'image_description'", + "example": { + "pairs": [ + { + "left": { + "image_url": "https://example.com/cat.jpg", + "image_description": "Con mèo" + }, + "right": { + "image_url": "https://example.com/fish.jpg", + "image_description": "Con cá" + } + } + ], + "mode": "image_to_image", + "left_label": "Động vật", + "right_label": "Thức ăn yêu thích" + } + } + ] + }, + { + "name": "Odd One Out - Chọn từ khác loại", + "description": "Chọn từ khác biệt nhất trong nhóm", + "game_mechanics": { + "cách_chơi": "Người chơi nhìn nhóm từ và chọn từ không cùng loại", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh lựa chọn với trường 'answer'" + }, + "base_schema": { + "options": { + "type": "array", + "nullable": false, + "min": 3, + "max": 6, + "mô_tả": "Danh sách 3-6 từ để chọn" + }, + "answer": { + "type": "string", + "nullable": false, + "mô_tả": "Từ khác loại (đáp án) - phải nằm trong options" + }, + "reason": { + "type": "string", + "nullable": false, + "mô_tả": "Lý do tại sao đáp án khác biệt" + }, + "category": { + "type": "string", + "nullable": false, + "mô_tả": "Danh mục của các từ CÒN LẠI (không phải đáp án)" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh đáp án" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Chọn từ khác loại - Text", + "mô_tả": "Nhóm từ văn bản, chọn từ khác biệt", + "required_fields": [ + "options", + "answer", + "reason", + "category" + ], + "example": { + "options": [ + "chó", + "mèo", + "táo", + "chim" + ], + "answer": "táo", + "reason": "Các từ khác là động vật, táo là hoa quả", + "category": "động vật" + } + }, + { + "name": "Chọn từ khác loại - Với Hình ảnh", + "mô_tả": "Nhóm từ kèm hình ảnh minh họa cho đáp án", + "required_fields": [ + "options", + "answer", + "reason", + "category", + "image_url", + "is_required_image" + ], + "example": { + "options": [ + "xe đạp", + "ô tô", + "máy bay", + "chuối" + ], + "answer": "chuối", + "reason": "Các từ khác là phương tiện, chuối là hoa quả", + "category": "phương tiện", + "image_url": "https://example.com/banana.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "Fill Blank - Điền vào chỗ trống", + "description": "Điền từ/chữ cái còn thiếu", + "game_mechanics": { + "cách_chơi": "Người chơi kéo thả hoặc gõ từ/chữ cái vào chỗ trống", + "cách_tính_điểm": "Mỗi chỗ trống đúng = 1 điểm", + "xác_định_đáp_án": "So sánh input người chơi với mảng 'answers' theo thứ tự" + }, + "base_schema": { + "mode": { + "type": "enum", + "nullable": false, + "values": [ + "drag_drop", + "type" + ], + "mô_tả": "drag_drop = kéo thả, type = gõ tay" + }, + "target": { + "type": "enum", + "nullable": false, + "values": [ + "sentence", + "word" + ], + "mô_tả": "sentence = điền từ, word = điền chữ cái" + }, + "question": { + "type": "string", + "nullable": false, + "mô_tả": "Câu/từ với ____ đánh dấu chỗ trống" + }, + "answers": { + "type": "array", + "nullable": false, + "mô_tả": "Danh sách đáp án theo thứ tự chỗ trống" + }, + "word_bank": { + "type": "array", + "nullable": false, + "default": [], + "mô_tả": "Ngân hàng từ (chỉ dùng cho mode=drag_drop)" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh gợi ý" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Điền từ - Kéo thả", + "mô_tả": "Kéo từ từ ngân hàng từ vào chỗ trống trong câu", + "required_fields": [ + "mode", + "target", + "question", + "answers", + "word_bank" + ], + "example": { + "mode": "drag_drop", + "target": "sentence", + "question": "Mặt trời mọc ở hướng ____.", + "answers": [ + "đông" + ], + "word_bank": [ + "đông", + "tây", + "nam", + "bắc" + ] + } + }, + { + "name": "Điền từ - Gõ tay", + "mô_tả": "Tự gõ từ vào chỗ trống (không có gợi ý)", + "required_fields": [ + "mode", + "target", + "question", + "answers" + ], + "note": "word_bank để rỗng []", + "example": { + "mode": "type", + "target": "sentence", + "question": "Việt Nam có thủ đô là ____.", + "answers": [ + "Hà Nội" + ], + "word_bank": [] + } + }, + { + "name": "Điền chữ cái - Spelling", + "mô_tả": "Điền chữ cái còn thiếu trong từ, thường kèm hình ảnh gợi ý", + "required_fields": [ + "mode", + "target", + "question", + "answers", + "word_bank", + "image_url", + "is_required_image" + ], + "example": { + "mode": "drag_drop", + "target": "word", + "question": "A____ple", + "answers": [ + "p" + ], + "word_bank": [ + "p", + "b", + "d" + ], + "image_url": "https://example.com/apple.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "Circle Word - Khoanh tròn từ đúng", + "description": "Chọn từ đúng trong các tùy chọn nằm trong câu", + "game_mechanics": { + "cách_chơi": "Người chơi đọc câu và click/chọn từ đúng trong ngoặc", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh từ người chọn với trường 'answer'" + }, + "base_schema": { + "sentence_template": { + "type": "string", + "nullable": false, + "mô_tả": "Câu với ____ đánh dấu vị trí cần chọn từ" + }, + "options": { + "type": "array", + "nullable": false, + "min": 2, + "max": 2, + "mô_tả": "Các từ để chọn (2 từ)" + }, + "answer": { + "type": "string", + "nullable": false, + "mô_tả": "Từ đúng - phải nằm trong options" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh gợi ý" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Khoanh tròn từ - Ngữ pháp", + "mô_tả": "Chọn từ đúng ngữ pháp trong câu (2 lựa chọn)", + "required_fields": [ + "sentence_template", + "options", + "answer" + ], + "example": { + "sentence_template": "You should speak ____ to your teacher.", + "options": [ + "politely", + "loudly" + ], + "answer": "politely" + } + } + ] + }, + { + "name": "Drag Drop - Kéo thả đáp án", + "description": "Kéo thả đáp án đúng vào chỗ trống", + "game_mechanics": { + "cách_chơi": "Người chơi kéo từ từ danh sách options vào chỗ trống trong câu", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh từ người kéo vào với trường 'answer'" + }, + "base_schema": { + "question": { + "type": "string", + "nullable": false, + "mô_tả": "Câu với ____ đánh dấu chỗ trống" + }, + "instruction": { + "type": "string", + "nullable": false, + "default": "Drag the correct answer", + "mô_tả": "Hướng dẫn cho người chơi" + }, + "options": { + "type": "array", + "nullable": false, + "min": 2, + "mô_tả": "Danh sách từ để kéo thả" + }, + "answer": { + "type": "string", + "nullable": false, + "mô_tả": "Đáp án đúng - phải nằm trong options" + }, + "image_url": { + "type": "string", + "nullable": true, + "mô_tả": "URL hình ảnh gợi ý" + }, + "image_description": { + "type": "string", + "nullable": true, + "mô_tả": "Mô tả hình ảnh" + }, + "is_required_image": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = bắt buộc xem ảnh" + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Kéo thả - Text Only", + "mô_tả": "Kéo từ vào câu, không có hình ảnh", + "required_fields": [ + "question", + "instruction", + "options", + "answer" + ], + "example": { + "question": "He can ____.", + "instruction": "Hoàn thành câu", + "options": [ + "run", + "swim", + "read" + ], + "answer": "run" + } + }, + { + "name": "Kéo thả - Với Hình ảnh", + "mô_tả": "Nhìn hình và kéo từ đúng vào chỗ trống", + "required_fields": [ + "question", + "instruction", + "options", + "answer", + "image_url", + "is_required_image" + ], + "example": { + "question": "She can ____.", + "instruction": "Nhìn tranh và hoàn thành câu", + "options": [ + "run", + "swim", + "read" + ], + "answer": "read", + "image_url": "https://example.com/girl_reading.jpg", + "is_required_image": true + } + } + ] + }, + { + "name": "Quiz Image - Chọn hình đúng", + "description": "Chọn hình ảnh đúng dựa trên câu hỏi", + "game_mechanics": { + "cách_chơi": "Người chơi đọc câu hỏi và click vào hình ảnh đúng", + "cách_tính_điểm": "Đúng = 1 điểm, Sai = 0 điểm", + "xác_định_đáp_án": "So sánh id hình người chọn với option có is_correct=true" + }, + "base_schema": { + "question": { + "type": "string", + "nullable": false, + "mô_tả": "Câu hỏi yêu cầu chọn hình" + }, + "options": { + "type": "array", + "nullable": false, + "min": 2, + "max": 4, + "mô_tả": "Danh sách hình ảnh để chọn", + "item_schema": { + "id": { + "type": "number", + "nullable": false, + "mô_tả": "Index của option (0-3)" + }, + "image_url": { + "type": "string", + "nullable": false, + "mô_tả": "URL hình ảnh" + }, + "image_description": { + "type": "string", + "nullable": false, + "mô_tả": "Mô tả nội dung hình ảnh" + }, + "is_correct": { + "type": "boolean", + "nullable": false, + "mô_tả": "true nếu đây là đáp án đúng" + }, + "text_label": { + "type": "string", + "nullable": true, + "mô_tả": "Nhãn hiển thị dưới hình (optional)" + } + } + }, + "is_example": { + "type": "boolean", + "nullable": false, + "default": false, + "mô_tả": "true = đây là câu mẫu" + } + }, + "variants": [ + { + "name": "Chọn hình - Text Question", + "mô_tả": "Đọc câu hỏi văn bản và chọn hình ảnh đúng", + "required_fields": [ + "question", + "options" + ], + "note": "Chính xác 1 option phải có is_correct=true", + "example": { + "question": "Đâu là quả táo?", + "options": [ + { + "id": 0, + "image_url": "https://example.com/apple.jpg", + "image_description": "Quả táo đỏ", + "is_correct": true, + "text_label": null + }, + { + "id": 1, + "image_url": "https://example.com/banana.jpg", + "image_description": "Quả chuối vàng", + "is_correct": false, + "text_label": null + }, + { + "id": 2, + "image_url": "https://example.com/orange.jpg", + "image_description": "Quả cam", + "is_correct": false, + "text_label": null + } + ] + } + } + ] + } + ], + "excluded_games": [ + { + "name": "Writing - Viết tự do", + "lý_do_loại_bỏ": "Không thể xác định đáp án đúng/sai bằng thuật toán, cần AI hoặc người chấm manual" + }, + { + "name": "Voice/Audio Games", + "lý_do_loại_bỏ": "Chưa hỗ trợ xử lý giọng nói/audio, tất cả các trường audio_* đã được loại bỏ" + } + ], + "notes": { + "image_url": "Thay thế image_path từ backend, sử dụng URL hình ảnh trực tiếp có thể load được", + "removed_ai_fields": [ + "image_keywords", + "image_is_complex", + "original_quote", + "image_roi_box" + ], + "removed_audio_fields": [ + "audio_path", + "audio_script", + "is_required_audio" + ], + "is_required_image": "true = bắt buộc phải có và xem hình ảnh để chơi game, false = hình ảnh chỉ là minh họa hoặc không có", + "blank_format": "Sử dụng ____ (4 gạch dưới) cho chỗ trống trong câu hỏi", + "nullable_meaning": "nullable: true = có thể null/không điền, nullable: false = bắt buộc phải có giá trị" + } +} \ No newline at end of file diff --git a/postman_collection.json b/postman_collection.json deleted file mode 100644 index 31a028b..0000000 --- a/postman_collection.json +++ /dev/null @@ -1,265 +0,0 @@ -{ - "info": { - "name": "Game Generator API", - "description": "API tạo game giáo dục từ văn bản", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "📊 Generate Multi", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"text\": \"Mặt Trời là ngôi sao ở trung tâm của Hệ Mặt Trời.\",\n \"enabled_game_ids\": [1, 2],\n \"max_items\": 3\n}" - }, - "url": { - "raw": "http://localhost:8000/generate", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "generate" - ] - }, - "description": "Analyze + Generate nhiều games\n\nREQUEST:\n• text (required)\n• enabled_game_ids: [1,2,3] (optional)\n• max_items: 3 (optional)\n• min_score: 30 (optional)\n• run_validator: true (optional)\n\nRESPONSE:\n• games: [1, 2]\n• results: {1: [...], 2: [...]}" - } - }, - { - "name": "🎯 Generate Single Best", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"text\": \"Python là ngôn ngữ lập trình phổ biến.\",\n \"max_items\": 3\n}" - }, - "url": { - "raw": "http://localhost:8000/generate/single", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "generate", - "single" - ] - }, - "description": "1 API call = Analyze + Generate 1 game tốt nhất\n\nRESPONSE:\n• type_id: 1\n• reason: \"...\"\n• items: [...]" - } - }, - { - "name": "🎮 Direct Quiz (type_id=1)", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"text\": \"Question: Thủ đô Việt Nam?\\nA. Hà Nội\\nB. TP HCM\\nC. Đà Nẵng\\nD. Huế\\nCorrect: A\",\n \"max_items\": 5\n}" - }, - "url": { - "raw": "http://localhost:8000/generate/1", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "generate", - "1" - ] - }, - "description": "Generate Quiz trực tiếp\n\nINPUT FORMAT:\nQuestion: ...\nA. ...\nB. ...\nC. ...\nD. ...\nCorrect: A" - } - }, - { - "name": "🎮 Direct Sentence (type_id=2)", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"text\": \"Mặt trời mọc; Chim hót; Người thức dậy\",\n \"max_items\": 10\n}" - }, - "url": { - "raw": "http://localhost:8000/generate/2", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "generate", - "2" - ] - }, - "description": "Generate Arrange Sentences trực tiếp\n\nINPUT FORMAT:\nsentence1; sentence2; sentence3" - } - }, - { - "name": "🎮 Direct Word (type_id=3)", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"text\": \"Apple; Banana; Orange; Grape\",\n \"max_items\": 10\n}" - }, - "url": { - "raw": "http://localhost:8000/generate/3", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "generate", - "3" - ] - }, - "description": "Generate Arrange Words trực tiếp\n\nINPUT FORMAT:\nword1; word2; word3" - } - }, - { - "name": "📋 List Games", - "request": { - "method": "GET", - "url": { - "raw": "http://localhost:8000/games", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "games" - ] - }, - "description": "Danh sách games\n\nRESPONSE:\n[\n {type_id: 1, game_type: \"quiz\", ...},\n {type_id: 2, ...},\n {type_id: 3, ...}\n]" - } - }, - { - "name": "⚙️ Get LLM", - "request": { - "method": "GET", - "url": { - "raw": "http://localhost:8000/llm", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "llm" - ] - } - } - }, - { - "name": "⚙️ Set LLM - Gemini", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"provider\": \"gemini\",\n \"model_name\": \"gemini-2.0-flash-lite\"\n}" - }, - "url": { - "raw": "http://localhost:8000/llm", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "llm" - ] - } - } - }, - { - "name": "⚙️ Set LLM - Ollama", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"provider\": \"ollama\",\n \"model_name\": \"qwen2.5:14b\",\n \"base_url\": \"http://localhost:11434\"\n}" - }, - "url": { - "raw": "http://localhost:8000/llm", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "llm" - ] - } - } - }, - { - "name": "🔄 Reload Games", - "request": { - "method": "POST", - "url": { - "raw": "http://localhost:8000/reload", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "reload" - ] - } - } - }, - { - "name": "❤️ Health", - "request": { - "method": "GET", - "url": { - "raw": "http://localhost:8000/health", - "host": [ - "localhost" - ], - "port": "8000", - "path": [ - "health" - ] - } - } - } - ] -} \ No newline at end of file