{ "basic": { "description": "Cài đặt cơ bản", "type": "object", "hint": "Các cài đặt cơ bản của plugin phân tích nhóm, gồm quyền sử dụng, số lượng tin nhắn và định dạng đầu ra. Lưu ý: quyền nhóm là điều kiện đầu tiên; nhóm không vượt qua bước này sẽ không được phân tích định kỳ hoặc tăng cường.", "items": { "group_list_mode": { "description": "Chế độ phân quyền nhóm", "type": "string", "options": [ "whitelist", "blacklist", "none" ], "default": "none", "hint": "Xác định nhóm nào được dùng plugin. Đây là điều kiện đầu tiên: whitelist = chỉ cho phép nhóm trong danh sách; blacklist = chặn nhóm trong danh sách; none = cho phép mọi nhóm. Ví dụ: whitelist + [\"onebot:GroupMessage:123456\"] chỉ cho phép nhóm này sử dụng." }, "group_list": { "type": "list", "description": "Danh sách trắng/đen của nhóm", "default": [], "hint": "Danh sách nhóm áp dụng. Có thể nhập ID phiên đầy đủ (ví dụ onebot:GroupMessage:123456) hoặc chỉ ID nhóm. Bot QQ Official dùng group_openid thay vì số nhóm; nên dùng /sid để lấy và nhập UMO đầy đủ.", "items": { "type": "string" } }, "analysis_days": { "type": "int", "description": "Số ngày phân tích mặc định", "default": 1, "hint": "Số ngày tin nhắn gần nhất được phân tích mặc định; phân tích tăng cường cũng dùng phạm vi này. API QQ Official không hỗ trợ truy xuất lịch sử nên chỉ phân tích được tin nhắn đã lưu cục bộ sau khi bật plugin." }, "max_messages": { "type": "int", "description": "Giới hạn tin nhắn cơ sở mỗi lần phân tích", "default": 1000, "hint": "Số tin nhắn tối đa làm mốc cho một lần phân tích. Khi đã lấy đủ max_messages, plugin sẽ dừng sau lô truy xuất hiện tại nên tổng số có thể vượt nhẹ giới hạn. Khuyến nghị 500-2000." }, "min_messages_threshold": { "type": "int", "description": "Ngưỡng tin nhắn tối thiểu", "default": 200, "hint": "Số tin nhắn tối thiểu cần có để bắt đầu phân tích." }, "bot_self_ids": { "type": "list", "description": "Danh sách ID bị loại khỏi phân tích", "default": [], "hint": "Có thể nhập ID bot dùng cho phân tích tự động (dạng số hoặc chuỗi tùy nền tảng), ID trên nhiều nền tảng hoặc ID người dùng không muốn xuất hiện trong báo cáo.", "items": { "type": "string" } }, "filter_bot_messages": { "type": "bool", "description": "Lọc tin nhắn của bot khi phân tích", "default": true, "hint": "Mặc định bật để loại tin nhắn của bot khỏi báo cáo. Khi tắt, tin nhắn bot cũng được đưa vào phân tích chủ đề, trích dẫn nổi bật, v.v." }, "enable_user_card": { "type": "bool", "description": "Dùng biệt danh trong nhóm", "default": true, "hint": "Ưu tiên dùng biệt danh của thành viên trong nhóm làm tên hiển thị." }, "output_format": { "type": "list", "description": "Định dạng đầu ra (có thể chọn nhiều)", "options": [ "image", "text", "html" ], "default": ["image"], "hint": "Chọn cách xuất báo cáo: image = ảnh, text = văn bản, html = trang web tương tác. Khi phân tích định kỳ, các định dạng đã chọn được gửi lần lượt; khi chạy thủ công chỉ gửi định dạng đầu tiên. Báo cáo ảnh/HTML trên QQ Official ưu tiên biệt danh sự kiện và dùng tên ẩn danh ổn định nếu thiếu; báo cáo Markdown dùng đề cập thành viên." }, "report_template": { "type": "string", "description": "Mẫu báo cáo", "options": [ "ATRI", "BlueArchive", "scrapbook", "retro_futurism", "HatsuneMiku", "hack", "spring_festival", "simple", "format" ], "default": "scrapbook", "hint": "Tên mẫu HTML dùng cho báo cáo. Dùng `/maubc` để chọn mẫu và `/xemmau` để xem trước. Trên nền tảng không hỗ trợ chuyển tiếp gộp, có thể xem mẫu trong thư mục [templates](https://github.com/SXP-Simon/astrbot_plugin_qq_group_daily_analysis/tree/main/assets)." }, "profile_display_mode": { "type": "string", "description": "Chế độ hiển thị nhãn tính cách", "options": [ "mbti", "sbti", "acgti" ], "default": "mbti", "hint": "Chỉ thay đổi chủ đề nhân vật trên thẻ chân dung, không ảnh hưởng kết quả MBTI. mbti = MBTI gốc, sbti = ánh xạ tính cách SBTI, acgti = ánh xạ nhân vật ACGTI." }, "profile_image_opacity": { "type": "float", "description": "Độ trong suốt ảnh nền tính cách", "default": 0.12, "hint": "Khuyến nghị 0.08-0.18 để ảnh chỉ đóng vai trò trang trí và không che nội dung." }, "profile_image_size_mode": { "type": "string", "description": "Chế độ kích thước ảnh nền tính cách", "options": [ "contain", "cover" ], "default": "contain", "hint": "Khuyến nghị dùng contain để hạn chế cắt mất nội dung ảnh nhân vật." }, "profile_mapping_config": { "type": "text", "description": "Cấu hình ánh xạ tính cách (JSON)", "editor_mode": true, "editor_language": "json", "default": "{\n \"mbti\": {\n \"INTJ\": {\n \"code\": \"INTJ\",\n \"name_zh\": \"建筑师\"\n },\n \"INTP\": {\n \"code\": \"INTP\",\n \"name_zh\": \"逻辑学家\"\n },\n \"ENTJ\": {\n \"code\": \"ENTJ\",\n \"name_zh\": \"指挥官\"\n },\n \"ENTP\": {\n \"code\": \"ENTP\",\n \"name_zh\": \"辩论家\"\n },\n \"INFJ\": {\n \"code\": \"INFJ\",\n \"name_zh\": \"提倡者\"\n },\n \"INFP\": {\n \"code\": \"INFP\",\n \"name_zh\": \"调停者\"\n },\n \"ENFJ\": {\n \"code\": \"ENFJ\",\n \"name_zh\": \"主人公\"\n },\n \"ENFP\": {\n \"code\": \"ENFP\",\n \"name_zh\": \"竞选者\"\n },\n \"ISTJ\": {\n \"code\": \"ISTJ\",\n \"name_zh\": \"物流师\"\n },\n \"ISFJ\": {\n \"code\": \"ISFJ\",\n \"name_zh\": \"守卫者\"\n },\n \"ESTJ\": {\n \"code\": \"ESTJ\",\n \"name_zh\": \"总经理\"\n },\n \"ESTP\": {\n \"code\": \"ESTP\",\n \"name_zh\": \"企业家\"\n },\n \"ISTP\": {\n \"code\": \"ISTP\",\n \"name_zh\": \"鉴赏家\"\n },\n \"ISFP\": {\n \"code\": \"ISFP\",\n \"name_zh\": \"探险家\"\n },\n \"ESFJ\": {\n \"code\": \"ESFJ\",\n \"name_zh\": \"执政官\"\n },\n \"ESFP\": {\n \"code\": \"ESFP\",\n \"name_zh\": \"表演者\"\n }\n },\n \"sbti\": {\n \"INTJ\": {\n \"code\": \"CTRL\",\n \"name_zh\": \"拿捏者\",\n \"asset_code\": \"CTRL\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/CTRL.png\"\n },\n \"INTP\": {\n \"code\": \"THIN-K\",\n \"name_zh\": \"思考者\",\n \"asset_code\": \"THIN-K\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/THIN-K.png\"\n },\n \"ENTJ\": {\n \"code\": \"BOSS\",\n \"name_zh\": \"领导者\",\n \"asset_code\": \"BOSS\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/BOSS.png\"\n },\n \"ENTP\": {\n \"code\": \"JOKE-R\",\n \"name_zh\": \"小丑\",\n \"asset_code\": \"JOKE-R\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/JOKE-R.jpg\"\n },\n \"INFJ\": {\n \"code\": \"LOVE-R\",\n \"name_zh\": \"多情者\",\n \"asset_code\": \"LOVE-R\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/LOVE-R.png\"\n },\n \"INFP\": {\n \"code\": \"SOLO\",\n \"name_zh\": \"孤儿\",\n \"asset_code\": \"SOLO\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/SOLO.png\"\n },\n \"ENFJ\": {\n \"code\": \"THAN-K\",\n \"name_zh\": \"感恩者\",\n \"asset_code\": \"THAN-K\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/THAN-K.png\"\n },\n \"ENFP\": {\n \"code\": \"GOGO\",\n \"name_zh\": \"行者\",\n \"asset_code\": \"GOGO\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/GOGO.png\"\n },\n \"ISTJ\": {\n \"code\": \"OH-NO\",\n \"name_zh\": \"哦不人\",\n \"asset_code\": \"OH-NO\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/OH-NO.png\"\n },\n \"ISTP\": {\n \"code\": \"POOR\",\n \"name_zh\": \"贫困者\",\n \"asset_code\": \"POOR\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/POOR.png\"\n },\n \"ESTJ\": {\n \"code\": \"SHIT\",\n \"name_zh\": \"愤世者\",\n \"asset_code\": \"SHIT\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/SHIT.png\"\n },\n \"ESTP\": {\n \"code\": \"WOC!\",\n \"name_zh\": \"握草人\",\n \"asset_code\": \"WOC\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/WOC.png\"\n },\n \"ISFJ\": {\n \"code\": \"MUM\",\n \"name_zh\": \"妈妈\",\n \"asset_code\": \"MUM\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/MUM.png\"\n },\n \"ISFP\": {\n \"code\": \"MALO\",\n \"name_zh\": \"吗喽\",\n \"asset_code\": \"MALO\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/MALO.png\"\n },\n \"ESFJ\": {\n \"code\": \"ATM-er\",\n \"name_zh\": \"送钱者\",\n \"asset_code\": \"ATM-er\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/ATM-er.png\"\n },\n \"ESFP\": {\n \"code\": \"SEXY\",\n \"name_zh\": \"尤物\",\n \"asset_code\": \"SEXY\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/sbti/SEXY.png\"\n }\n },\n \"acgti\": {\n \"INTJ\": {\n \"code\": \"MRTS-X\",\n \"name_zh\": \"Mortis\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/MRTS-X.png\"\n },\n \"INTP\": {\n \"code\": \"KNAN\",\n \"name_zh\": \"江户川柯南\"\n },\n \"ENTJ\": {\n \"code\": \"SAKI\",\n \"name_zh\": \"丰川祥子\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/SAKI.png\"\n },\n \"ENTP\": {\n \"code\": \"CHKA\",\n \"name_zh\": \"藤原千花\"\n },\n \"INFJ\": {\n \"code\": \"DLRS\",\n \"name_zh\": \"三角初华\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/DLRS.png\"\n },\n \"INFP\": {\n \"code\": \"BCHI\",\n \"name_zh\": \"后藤一里\"\n },\n \"ENFJ\": {\n \"code\": \"YCYO\",\n \"name_zh\": \"月见八千代\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/YCYO.png\"\n },\n \"ENFP\": {\n \"code\": \"HTMK\",\n \"name_zh\": \"初音未来\"\n },\n \"ISTJ\": {\n \"code\": \"MRTS\",\n \"name_zh\": \"若叶睦\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/MRTS.png\"\n },\n \"ISTP\": {\n \"code\": \"AYRE\",\n \"name_zh\": \"绫波丽\"\n },\n \"ESTJ\": {\n \"code\": \"MIKT\",\n \"name_zh\": \"御坂美琴\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/MIKT.png\"\n },\n \"ESTP\": {\n \"code\": \"ASKA\",\n \"name_zh\": \"明日香\"\n },\n \"ISFJ\": {\n \"code\": \"SOYO\",\n \"name_zh\": \"长崎爽世\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/SOYO.png\"\n },\n \"ISFP\": {\n \"code\": \"LTYI\",\n \"name_zh\": \"洛天依\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/LTYI.png\"\n },\n \"ESFJ\": {\n \"code\": \"ANON\",\n \"name_zh\": \"千早爱音\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/ANON.png\"\n },\n \"ESFP\": {\n \"code\": \"FRNA\",\n \"name_zh\": \"芙宁娜\",\n \"image\": \"https://fastly.jsdelivr.net/gh/SXP-Simon/profile_assets@main/acgti/characters/FRNA.png\"\n }\n }\n}", "hint": "Ghi đè tên tính cách và URL ảnh theo MBTI cho chế độ hiện tại. Để trống để dùng ánh xạ và manifest tích hợp. Plugin không kiểm tra khả năng truy cập URL ảnh." }, "debug_mode": { "type": "bool", "description": "Chế độ gỡ lỗi (nên tắt)", "default": false, "hint": "Khi bật, tin nhắn lịch sử thô từ API nền tảng và prompt của mỗi lần phân tích sẽ được lưu trong thư mục debug_data để gỡ lỗi và tối ưu prompt." }, "enable_base64_image": { "type": "bool", "description": "Truyền ảnh bằng mã hóa Base64", "default": true, "hint": "Khi bật, ảnh được mã hóa Base64 để truyền. Khi tắt, đường dẫn file hoặc URL được gửi trực tiếp cho OneBot, phù hợp với go-cqhttp, Lagrange và các triển khai hỗ trợ đường dẫn cục bộ để giảm bộ nhớ." }, "enable_analysis_reply": { "type": "bool", "description": "Phản hồi bằng văn bản/biểu cảm", "default": false, "hint": "Khi bật, `/phantichnhom` gửi tin nhắn văn bản để báo tiến độ; khi tắt (mặc định), plugin dùng biểu cảm phản hồi." }, "show_report_caption": { "type": "bool", "description": "Kèm tiền tố \"📊 Đã tạo báo cáo phân tích nhóm hàng ngày\"", "default": true, "hint": "Khi tắt, báo cáo ảnh/HTML chỉ gửi file mà không kèm tiền tố văn bản." } } }, "qq_official": { "description": "Bot QQ Official", "type": "object", "hint": "Chỉ áp dụng cho phần hiển thị báo cáo của bot QQ Official và QQ Official Webhook.", "items": { "enable_t2i_activity_histogram": { "type": "bool", "description": "Bật ảnh tổng quan nhóm bằng T2I", "default": true, "hint": "Nhúng ngày, thống kê cơ bản và biểu đồ 24 giờ nền trong suốt vào báo cáo Markdown QQ Official. Tự động dùng báo cáo văn bản đầy đủ nếu kết xuất thất bại." } } }, "t2i_rendering": { "description": "Chiến lược kết xuất ảnh", "type": "object", "hint": "Cấu hình tham số chuyển HTML thành ảnh. Hỗ trợ hai lượt: lượt đầu ưu tiên chất lượng, lượt hai là phương án dự phòng với độ phân giải và chất lượng thấp hơn để tăng tỷ lệ thành công.", "items": { "t2i_r1_type": { "type": "string", "description": "Lượt 1: định dạng ảnh", "options": ["jpeg", "png"], "default": "png", "hint": "PNG không mất dữ liệu nhưng dung lượng lớn; JPEG có dung lượng nhỏ hơn." }, "t2i_r1_quality": { "type": "int", "description": "Lượt 1: chất lượng ảnh (JPEG)", "default": 100, "slider": { "min": 1, "max": 100, "step": 1 }, "hint": "Chỉ có hiệu lực với JPEG. Khuyến nghị 80-100." }, "t2i_r1_device_scale": { "type": "string", "description": "Lượt 1: mức độ phân giải", "options": ["normal", "high", "ultra"], "default": "ultra", "hint": "Ảnh hưởng độ nét: normal=1.0x, high=1.3x, ultra=1.8x. Khuyến nghị ultra cho báo cáo chất lượng cao." }, "t2i_r1_timeout": { "type": "int", "description": "Lượt 1: thời gian chờ kết xuất (ms)", "default": 50000, "slider": { "min": 30000, "max": 180000, "step": 5000 }, "hint": "Thời gian chờ tối đa cho một lần kết xuất. Nên tăng với trang phức tạp." }, "t2i_r2_type": { "type": "string", "description": "Lượt 2 (dự phòng): định dạng ảnh", "options": ["jpeg", "png"], "default": "jpeg", "hint": "Nên dùng JPEG ở lượt dự phòng để giảm tải kết xuất." }, "t2i_r2_quality": { "type": "int", "description": "Lượt 2 (dự phòng): chất lượng ảnh (JPEG)", "default": 80, "slider": { "min": 1, "max": 100, "step": 1 }, "hint": "Chỉ có hiệu lực với JPEG. Có thể đặt thấp hơn để tăng khả năng tạo ảnh thành công." }, "t2i_r2_device_scale": { "type": "string", "description": "Lượt 2 (dự phòng): mức độ phân giải", "options": ["normal", "high", "ultra"], "default": "high", "hint": "Nên dùng high/normal để giảm bộ nhớ và nguy cơ hết thời gian với trang phức tạp." }, "t2i_r2_timeout": { "type": "int", "description": "Lượt 2 (dự phòng): thời gian chờ (ms)", "default": 100000, "slider": { "min": 30000, "max": 180000, "step": 5000 }, "hint": "Lượt dự phòng thường xử lý trang phức tạp; nên đặt thời gian chờ dài hơn, ví dụ từ 100000 ms." }, "t2i_font_source": { "type": "string", "description": "Môi trường kết xuất T2I", "options": ["Mainland", "Overseas"], "default": "Overseas", "hint": "Chọn môi trường truy cập font và tài nguyên tĩnh: Mainland hoặc Overseas. Plugin sẽ tự áp dụng máy chủ gương, mã ngôn ngữ và thứ tự ưu tiên font tương ứng." }, "t2i_mainland_google_fonts": { "type": "string", "description": "[Mainland] Máy chủ gương Google Fonts", "default": "https://fonts.loli.net", "hint": "Khuyến nghị loli.net hoặc máy chủ gương có thể truy cập trong môi trường Mainland." }, "t2i_mainland_gstatic": { "type": "string", "description": "[Mainland] Máy chủ gương Gstatic", "default": "https://gstatic.loli.net", "hint": "Khuyến nghị loli.net hoặc máy chủ gương có thể truy cập trong môi trường Mainland." }, "t2i_overseas_google_fonts": { "type": "string", "description": "[Overseas] Google Fonts chính thức", "default": "https://fonts.googleapis.com", "hint": "Môi trường Overseas thường có thể dùng trực tiếp địa chỉ chính thức." }, "t2i_overseas_gstatic": { "type": "string", "description": "[Overseas] Gstatic chính thức", "default": "https://fonts.gstatic.com", "hint": "Môi trường Overseas thường có thể dùng trực tiếp địa chỉ chính thức." } } }, "auto_analysis": { "description": "Cài đặt phân tích định kỳ", "type": "object", "hint": "Cấu hình thời điểm phân tích tự động hàng ngày và phạm vi nhóm mục tiêu. Chỉ các nhóm đã vượt qua kiểm tra quyền cơ bản mới được xét tại đây.", "items": { "auto_analysis_time": { "type": "list", "description": "Danh sách thời gian phân tích tự động", "default": [ "23:00" ], "hint": "Thời điểm tự động tạo báo cáo mỗi ngày theo định dạng HH:MM. Có thể nhập nhiều mốc, ví dụ [\"09:00\", \"21:30\"].", "items": { "type": "string" } }, "scheduled_group_list_mode": { "type": "string", "description": "Chế độ danh sách phân tích định kỳ", "options": [ "whitelist", "blacklist" ], "default": "whitelist", "hint": "Xác định nhóm áp dụng tác vụ định kỳ. whitelist = chỉ chạy các nhóm trong danh sách; blacklist = chạy mọi nhóm trừ các nhóm trong danh sách. Chỉ áp dụng với nhóm đã vượt qua quyền cơ bản." }, "scheduled_group_list": { "type": "list", "description": "Danh sách nhóm phân tích định kỳ", "default": [], "hint": "Danh sách nhóm cho tác vụ định kỳ. whitelist + [\"onebot:GroupMessage:123456\"] chỉ chạy nhóm này; blacklist với cùng danh sách sẽ bỏ qua nhóm này. whitelist với danh sách trống sẽ không tạo tác vụ định kỳ. Nhóm trong danh sách tăng cường vẫn cần vượt qua danh sách định kỳ.", "items": { "type": "string" } } } }, "llm": { "description": "Cài đặt LLM", "type": "object", "hint": "Cấu hình mô hình ngôn ngữ lớn, gồm lựa chọn Provider, chiến lược thử lại và giới hạn Token.", "items": { "llm_provider_id": { "type": "string", "description": "ID LLM Provider (dùng cho mọi tác vụ)", "_special": "select_provider", "default": "", "hint": "Chọn LLM Provider dùng để phân tích nhóm. Để trống để dùng Provider mặc định của phiên hiện tại." }, "topic_provider_id": { "type": "string", "description": "ID Provider riêng cho phân tích chủ đề", "_special": "select_provider", "default": "", "hint": "Provider riêng cho phân tích chủ đề. Để trống để dùng LLM Provider chính." }, "user_title_provider_id": { "type": "string", "description": "ID Provider riêng cho phân tích danh hiệu", "_special": "select_provider", "default": "", "hint": "Provider riêng cho phân tích danh hiệu thành viên. Để trống để dùng LLM Provider chính." }, "golden_quote_provider_id": { "type": "string", "description": "ID Provider riêng cho trích dẫn nổi bật", "_special": "select_provider", "default": "", "hint": "Provider riêng cho phân tích trích dẫn nổi bật. Để trống để dùng LLM Provider chính." }, "quality_provider_id": { "type": "string", "description": "ID Provider riêng cho chất lượng trò chuyện", "_special": "select_provider", "default": "", "hint": "Provider riêng cho đánh giá chất lượng trò chuyện. Để trống để dùng LLM Provider chính." }, "llm_retries": { "type": "int", "description": "Số lần thử lại yêu cầu LLM", "default": 2, "hint": "Số lần tự động thử lại khi yêu cầu thất bại hoặc hết thời gian. Khuyến nghị 1-3." }, "llm_backoff": { "type": "int", "description": "Thời gian chờ cơ sở khi thử lại LLM (giây)", "default": 2, "hint": "Thời gian chờ cơ sở giữa các lần thử. Thời gian thực tăng theo cấp số nhân và có độ trễ ngẫu nhiên; khi Provider riêng thất bại, plugin tiếp tục thử Provider mặc định theo hàng đợi." }, "enable_streaming_llm_call": { "type": "bool", "description": "Bật gọi LLM dạng luồng", "default": false, "hint": "Mặc định tắt và dùng phương thức không luồng. Khi bật, plugin dùng giao diện luồng của AstrBot Provider rồi tổng hợp kết quả, phù hợp với dịch vụ chỉ hỗ trợ stream=true." } } }, "analysis_features": { "description": "Tùy chọn tính năng phân tích", "type": "object", "hint": "Bật/tắt các tính năng phân tích LLM và thiết lập giới hạn số lượng.", "items": { "topic_analysis_enabled": { "type": "bool", "description": "Bật phân tích chủ đề", "default": true, "hint": "Dùng LLM để phân tích chủ đề thông minh." }, "user_title_analysis_enabled": { "type": "bool", "description": "Bật phân tích danh hiệu thành viên", "default": true, "hint": "Dùng LLM để phân tích danh hiệu của thành viên." }, "golden_quote_analysis_enabled": { "type": "bool", "description": "Bật phân tích trích dẫn nổi bật", "default": true, "hint": "Dùng LLM để tìm các trích dẫn nổi bật." }, "chat_quality_analysis_enabled": { "type": "bool", "description": "Bật đánh giá chất lượng trò chuyện", "default": true, "hint": "Dùng LLM để đánh giá chất lượng trò chuyện theo nhiều khía cạnh." }, "max_topics": { "type": "int", "description": "Số chủ đề tối đa", "default": 5, "hint": "Số chủ đề tối đa trong báo cáo. Kết quả phụ thuộc chất lượng dữ liệu có cấu trúc từ LLM nên số lượng thực tế có thể khác." }, "max_user_titles": { "type": "int", "description": "Số danh hiệu thành viên tối đa", "default": 8, "hint": "Số danh hiệu tối đa trong báo cáo. Kết quả phụ thuộc chất lượng dữ liệu có cấu trúc từ LLM nên số lượng thực tế có thể khác." }, "max_golden_quotes": { "type": "int", "description": "Số trích dẫn nổi bật tối đa", "default": 5, "hint": "Số trích dẫn nổi bật tối đa trong báo cáo. Kết quả phụ thuộc chất lượng dữ liệu có cấu trúc từ LLM nên số lượng thực tế có thể khác." }, "keep_original_persona": { "description": "Kế thừa phong cách persona của phiên", "type": "bool", "default": false, "hint": "[Ưu tiên 2] Tự nhận diện persona của phiên nhóm hiện tại và cố gắng dùng giọng điệu đó trong báo cáo. Chỉ có hiệu lực khi tùy chọn buộc dùng persona riêng của plugin đang tắt." }, "use_plugin_specific_persona": { "description": "Buộc dùng persona do plugin chỉ định", "type": "bool", "default": false, "hint": "[Ưu tiên 1] Bỏ qua persona của nhóm và luôn dùng ID persona được chọn bên dưới. Phù hợp khi muốn mọi báo cáo giữ một phong cách cố định." }, "plugin_specific_persona_id": { "description": "ID persona do plugin chỉ định", "type": "string", "_special": "select_persona", "default": "", "hint": "Chọn persona đã được định nghĩa trong hệ thống khi bật chế độ bắt buộc. Nếu để trống, plugin vẫn thử nhận diện persona mặc định toàn cục." } } }, "incremental": { "description": "Cài đặt phân tích tăng cường", "type": "object", "hint": "Phân tích tăng cường trích xuất từng phần trong giờ hoạt động để tăng độ sâu và độ phủ. Mục này chỉ chọn chế độ tăng cường hoặc thông thường cho nhóm đã vượt qua quyền cơ bản và danh sách định kỳ.", "items": { "incremental_group_list_mode": { "type": "string", "description": "Chế độ danh sách phân tích tăng cường", "options": [ "whitelist", "blacklist" ], "default": "whitelist", "hint": "Chọn nhóm dùng phân tích tăng cường. whitelist = chỉ nhóm trong danh sách; blacklist = mọi nhóm trừ danh sách. Nhóm không khớp sẽ dùng chế độ thông thường. Danh sách này chỉ chọn chế độ, không cấp quyền sử dụng." }, "incremental_group_list": { "type": "list", "description": "Danh sách nhóm phân tích tăng cường", "default": [], "hint": "Danh sách nhóm tăng cường. whitelist với một UMO chỉ bật cho nhóm đó; blacklist sẽ loại nhóm đó và bật cho các nhóm khác. whitelist với danh sách trống sẽ không bật tăng cường. Chỉ nhóm đã vượt qua quyền cơ bản và danh sách định kỳ mới được xét.", "items": { "type": "string" } }, "incremental_report_immediately": { "type": "bool", "description": "Báo cáo ngay sau phân tích tăng cường (gỡ lỗi)", "default": false, "hint": "[Gỡ lỗi] Tạo và gửi ngay báo cáo cuối sau mỗi lần phân tích tăng cường. Chỉ nên bật khi gỡ lỗi; hãy tắt trong môi trường thực tế để tránh làm phiền nhóm." }, "incremental_interval_minutes": { "type": "int", "description": "Khoảng cách phân tích tăng cường (phút)", "default": 120, "hint": "Số phút giữa các lần phân tích tăng cường. Khoảng cách càng ngắn thì phân tích càng chi tiết nhưng tiêu thụ nhiều Token hơn." }, "incremental_max_daily_analyses": { "type": "int", "description": "Số lần phân tích tăng cường tối đa mỗi ngày", "default": 8, "hint": "Giới hạn số lần tăng cường trong ngày. Khi đạt giới hạn, plugin không chạy thêm nhưng vẫn tạo báo cáo cuối đúng giờ. Khuyến nghị 4-12 lần." }, "incremental_safe_limit": { "type": "int", "description": "Giới hạn an toàn mỗi lần tăng cường (Safe Count)", "default": 2000, "hint": "Số tin nhắn lịch sử tối đa được truy xuất trong một lần khi nhóm quá hoạt động. Plugin sẽ dừng ở giới hạn này dù chưa đến điểm ngắt của lần trước, nhằm tránh truy xuất vô hạn. Khuyến nghị 1000-5000." }, "incremental_min_messages": { "type": "int", "description": "Ngưỡng tin nhắn tối thiểu cho tăng cường", "default": 300, "hint": "Bỏ qua lần tăng cường khi số tin nhắn mới thấp hơn ngưỡng để tiết kiệm Token. Con trỏ không cập nhật khi chưa đủ tin nhắn nên dữ liệu sẽ được phân tích sau khi tích lũy đủ." }, "incremental_topics_per_batch": { "type": "int", "description": "Số chủ đề mỗi lô tăng cường", "default": 2, "hint": "Số chủ đề tối đa trích xuất mỗi lần. Báo cáo cuối sẽ tổng hợp mọi lô. Khuyến nghị 1-4." }, "incremental_quotes_per_batch": { "type": "int", "description": "Số trích dẫn mỗi lô tăng cường", "default": 2, "hint": "Số trích dẫn nổi bật tối đa mỗi lần. Báo cáo cuối sẽ tổng hợp mọi lô. Khuyến nghị 1-2." }, "incremental_active_start_hour": { "type": "int", "description": "Giờ bắt đầu hoạt động tăng cường", "default": 8, "hint": "Giờ bắt đầu theo định dạng 24 giờ. Ngoài khung hoạt động, plugin không chạy tăng cường để tránh lãng phí hạn mức trong thời gian ít hoạt động." }, "incremental_active_end_hour": { "type": "int", "description": "Giờ kết thúc hoạt động tăng cường", "default": 23, "hint": "Giờ kết thúc theo định dạng 24 giờ. Sau thời điểm này plugin không kích hoạt phân tích tăng cường." }, "incremental_stagger_seconds": { "type": "int", "description": "Độ trễ xen kẽ giữa nhiều nhóm (giây)", "default": 2, "hint": "Độ trễ giữa các nhóm khi phân tích đồng thời để phân tán đều tải yêu cầu API." }, "incremental_fallback_enabled": { "type": "bool", "description": "Tự chuyển sang phân tích đầy đủ khi tăng cường lỗi", "default": true, "hint": "Khuyến nghị bật. Nếu phân tích tăng cường thất bại, plugin tự chuyển sang phân tích thông thường để vẫn có báo cáo trong ngày." } } }, "html": { "description": "Cài đặt HTML", "type": "object", "hint": "Cấu hình đầu ra báo cáo HTML, gồm Base URL công khai và thư mục lưu báo cáo.", "items": { "html_base_url": { "type": "string", "description": "Base URL công khai", "default": "", "hint": "Base URL dùng để tạo liên kết công khai (có thể để trống). Nếu được cấu hình, tin nhắn báo cáo sẽ kèm liên kết (${BASE_URL}/${FILENAME})." }, "html_output_dir": { "type": "string", "description": "Thư mục lưu báo cáo", "default": "", "hint": "Thư mục lưu file HTML và dữ liệu JSON gốc. Để trống để dùng thư mục self_hosted_html_reports trong thư mục dữ liệu của plugin." }, "html_only_url": { "type": "bool", "description": "Chỉ gửi liên kết", "default": false, "hint": "Khi bật và đã cấu hình Base URL, báo cáo HTML chỉ gửi liên kết thay vì file. Khi tắt, plugin tiếp tục gửi file HTML." }, "html_filename_format": { "type": "string", "description": "Định dạng tên file HTML", "default": "bao_cao_phan_tich_nhom_${group_id}_${date}_${ulid}.html", "hint": "Định dạng tên file HTML, hỗ trợ ${group_id} (ID nhóm), ${date} (ngày), ${ulid} (ID sắp xếp theo thời gian) và thư mục con." } } }, "qq_group_upload": { "description": "Cài đặt tải lên file/album nhóm", "type": "object", "hint": "Tự động tải báo cáo ảnh lên thư mục file hoặc album nhóm. Tải file nhóm dùng API OneBot upload_group_file và chỉ áp dụng cho báo cáo ảnh trên QQ (OneBot).", "items": { "enable_group_file_upload": { "type": "bool", "description": "Bật tải lên file nhóm", "default": false, "hint": "Tự lưu báo cáo ảnh thành PNG rồi tải lên thư mục file nhóm. Yêu cầu triển khai OneBot hỗ trợ API upload_group_file." }, "group_file_folder": { "type": "string", "description": "Tên thư mục file nhóm", "default": "", "hint": "Tên thư mục con trong file nhóm. Để trống để tải lên thư mục gốc; plugin sẽ thử tạo thư mục nếu chưa tồn tại." }, "enable_group_album_upload": { "type": "bool", "description": "Bật tải lên album nhóm", "default": false, "hint": "Tự động tải báo cáo ảnh lên album nhóm; cần bảo đảm bot có quyền. Đây là API mở rộng của NapCat nên các triển khai OneBot khác có thể không hỗ trợ." }, "group_album_name": { "type": "string", "description": "Tên album nhóm mục tiêu", "default": "", "hint": "Chọn album nhóm để tải lên và bảo đảm album đã tồn tại. Để trống để dùng album mặc định; nếu không tìm thấy album chỉ định, plugin sẽ dùng album mặc định." }, "group_album_strict_mode": { "type": "bool", "description": "Chế độ tải album nghiêm ngặt", "default": true, "hint": "Khi bật và đã đặt tên album, plugin sẽ hủy tải lên nếu không tìm thấy album cùng tên. Khi tắt, plugin dùng album mặc định đầu tiên của nhóm." } } }, "prompts": { "description": "Mẫu prompt", "type": "object", "hint": "Cấu hình prompt dùng cho phân tích LLM; có thể tùy chỉnh nội dung của từng tác vụ.", "items": { "topic_analysis_prompts": { "description": "Mẫu prompt phân tích chủ đề", "type": "object", "hint": "Có thể tùy chỉnh prompt phân tích chủ đề. Không thay đổi biến ${max_topics} và ${messages_text}; dùng dấu ngoặc kép {{ ... }} khi viết khối JSON để tương thích trình chỉnh sửa. Nên giữ ví dụ mẫu cho mô hình tham khảo.", "items": { "topic_prompt": { "description": "Prompt phân tích chủ đề mặc định", "type": "text", "editor_mode": true, "editor_language": "markdown", "default": "Hãy phân tích lịch sử trò chuyện nhóm bên dưới và trích xuất tối đa **${max_topics}** chủ đề chính có ý nghĩa nhất.\n\n## Với mỗi chủ đề, hãy cung cấp:\n\n1. **Tên chủ đề** (nêu bật nội dung chính, ngắn gọn, tối đa khoảng 10 từ)\n2. **ID người dùng của người tham gia chính** (tối đa 5 người, sắp xếp theo mức độ tham gia)\n3. **Mô tả chi tiết chủ đề** (gồm thông tin quan trọng và kết luận)\n\n## Lưu ý:\n\n- Viết mô tả bằng góc nhìn và giọng điệu của persona hiện tại.\n- Với điểm đáng chú ý, hãy giải thích thêm một hoặc hai câu để thể hiện chiều sâu thảo luận.\n- Khi cần, hãy nói rõ ai là chủ thể của hành động, tức là \"ai đã làm gì\".\n- **Tham chiếu người dùng**: nếu nhắc đến một người cụ thể trong mô tả, hãy dùng định dạng `[ID người dùng]` (ví dụ `[123456]`), không chỉ dùng biệt danh. Hệ thống sẽ tự kết xuất ảnh đại diện.\n- Mỗi phần tóm tắt cần nêu rõ nguyên nhân, diễn biến và kết quả, không chỉ liệt kê kết luận.\n- Nếu chủ đề có kết luận hoặc đồng thuận rõ ràng, hãy thể hiện trong mô tả.\n- Bỏ qua trò chuyện vô nghĩa, spam và phản hồi chỉ có biểu cảm.\n- Ưu tiên chủ đề có chiều sâu và nhiều người tham gia.\n- Nếu có quá ít tin nhắn hoặc không có chủ đề rõ ràng, có thể trả về mảng rỗng [].\n- Toàn bộ nội dung văn bản trong kết quả phải được viết bằng tiếng Việt.\n\nĐịnh dạng lịch sử: [HH:MM] [ID người dùng]: Nội dung tin nhắn\n\nLịch sử trò chuyện:\n${messages_text}\n\n---\n\n## Quan trọng: phải trả về JSON chuẩn\n\nTuân thủ nghiêm ngặt các quy tắc sau:\n\n1. Chỉ dùng dấu ngoặc kép tiếng Anh `\"`.\n2. Dấu ngoặc kép trong chuỗi phải được escape thành `\\\"`.\n3. Phân tách các object bằng dấu phẩy.\n4. Phân tách các phần tử mảng bằng dấu phẩy.\n5. Không thêm bất kỳ lời giải thích nào bên ngoài JSON.\n6. Hạn chế ký hiệu đặc biệt trong mô tả; ưu tiên văn bản thông thường.\n\n### Ví dụ định dạng trả về:\n\n```json\n[\n {{\n \"topic\": \"Tên chủ đề\",\n \"contributors\": [\"123456789\", \"987654321\"],\n \"detail\": \"Mô tả chi tiết chủ đề, gồm nội dung thảo luận, thông tin quan trọng và kết luận. Khi nhắc đến người dùng, hãy dùng định dạng [ID người dùng], ví dụ [123456789].\"\n }},\n {{\n \"topic\": \"Một chủ đề khác\",\n \"contributors\": [\"111222333\", \"444555666\"],\n \"detail\": \"Mô tả chi tiết của chủ đề khác...\"\n }}\n]\n```\n\n**Lưu ý**: chỉ trả về JSON thuần, không kèm dấu khối mã Markdown hoặc định dạng khác." } } }, "user_title_analysis_prompts": { "description": "Mẫu prompt phân tích danh hiệu", "type": "object", "hint": "Có thể tùy chỉnh prompt phân tích danh hiệu. Không thay đổi biến ${users_text}; dùng dấu ngoặc kép {{ ... }} khi viết khối JSON để tương thích trình chỉnh sửa. Nên giữ ví dụ mẫu cho mô hình tham khảo.", "items": { "user_title_prompt": { "description": "Prompt phân tích danh hiệu mặc định", "type": "text", "editor_mode": true, "editor_language": "markdown", "default": "Hãy gán danh hiệu và loại MBTI phù hợp cho các thành viên nhóm bên dưới.\n\n## Quy tắc:\n\n- Mỗi người chỉ có một danh hiệu.\n- Mỗi danh hiệu chỉ được trao cho một người.\n- Tất cả danh hiệu và lý do phải được viết bằng tiếng Việt.\n\n## Danh hiệu gợi ý:\n\n- **Vua trò chuyện**: thường xuyên nhắn tin với nội dung vui vẻ.\n- **Chuyên gia công nghệ**: thường thảo luận chủ đề kỹ thuật.\n- **Cú đêm**: thường hoạt động vào đêm khuya.\n- **Kho meme**: thường gửi biểu cảm hoặc meme.\n- **Người phá tan im lặng**: thường bắt đầu chủ đề mới.\n- **Nhà bình luận**: thường gửi tin nhắn dài và chi tiết.\n- **Người có sức ảnh hưởng**: có ảnh hưởng lớn trong nhóm.\n- **Bậc thầy tương tác**: thường xuyên trả lời người khác.\n- *Bạn có thể tự mở rộng thêm danh hiệu phù hợp.*\n\n## Dữ liệu người dùng:\n\n${users_text}\n\n---\n\n### Ví dụ định dạng trả về:\n\n```json\n[\n {{\n \"name\": \"Tên người dùng\",\n \"user_id\": \"123456789\",\n \"title\": \"Danh hiệu\",\n \"mbti\": \"Loại MBTI\",\n \"reason\": \"Lý do nhận danh hiệu\"\n }}\n]\n```\n\n**Lưu ý**: chỉ trả về JSON thuần, không kèm dấu khối mã Markdown." } } }, "golden_quote_analysis_prompts": { "description": "Mẫu prompt trích dẫn nổi bật", "type": "object", "hint": "Có thể tùy chỉnh prompt trích dẫn nổi bật. Không thay đổi biến ${max_golden_quotes} và ${messages_text}; dùng dấu ngoặc kép {{ ... }} khi viết khối JSON để tương thích trình chỉnh sửa. Nên giữ ví dụ mẫu.", "items": { "golden_quote_v2_prompt": { "description": "Prompt trích dẫn nổi bật mặc định", "type": "text", "editor_mode": true, "editor_language": "markdown", "default": "Hãy chọn tối đa **${max_golden_quotes}** câu nổi bật, bất ngờ và đáng nhớ nhất từ lịch sử trò chuyện bên dưới.\n\n## Tiêu chí:\n\n- **Tiêu chí chính**: nội dung độc đáo, đảo ngược lẽ thường, có cách diễn đạt nhảy logic hoặc tạo tương phản mạnh.\n- **Đặc điểm điển hình**: so sánh phóng đại, kết luận khác thường, phát biểu nghiêm túc nhưng hài hước, góc nhìn lạ hoặc chi tiết gây ấn tượng mạnh.\n\n## Với mỗi trích dẫn, hãy cung cấp:\n\n1. **Nội dung gốc** (giữ đầy đủ chi tiết của phát biểu).\n2. **ID người gửi** (phải dùng đúng `[ID người dùng]` trong lịch sử).\n3. **Lý do lựa chọn** (nêu rõ điểm độc đáo, bất ngờ, tương phản hoặc hài hước).\n\n## Ràng buộc:\n\n- Ưu tiên nội dung có tính độc đáo và tác động cao; loại bỏ câu chỉ lặp meme hoặc từ khóa mạng thông thường.\n- **Tham chiếu người dùng**: trong `reason`, nếu nhắc đến người cụ thể, dùng `[ID người dùng]` (ví dụ `[123456]`), không chỉ dùng biệt danh. Hệ thống sẽ tự kết xuất ảnh đại diện.\n- **Đồng bộ danh tính**: trường `sender` phải có dạng `[ID người dùng]`, ví dụ `[123456]`; hệ thống sẽ tự khôi phục biệt danh và ảnh đại diện.\n- Nội dung của `reason` phải được viết bằng tiếng Việt; `content` phải giữ nguyên lời nói gốc.\n\nĐịnh dạng lịch sử: [HH:MM] [ID người dùng]: Nội dung tin nhắn\n\nLịch sử trò chuyện:\n\n${messages_text}\n\n---\n\n### Ví dụ định dạng trả về:\n\n```json\n[\n {{\n \"content\": \"Nội dung nguyên văn của câu nói\",\n \"sender\": \"[123456789]\",\n \"reason\": \"Câu nói tạo ra một góc nhìn rất bất ngờ, đặc biệt khi phản hồi [987654321].\"\n }}\n]\n```\n\n**Lưu ý**: chỉ trả về JSON thuần, không kèm dấu khối mã Markdown hoặc định dạng khác." } } }, "quality_analysis_prompts": { "description": "Mẫu prompt chất lượng trò chuyện", "type": "object", "hint": "Có thể tùy chỉnh prompt đánh giá chất lượng trò chuyện.", "items": { "quality_v2_prompt": { "description": "Prompt chất lượng trò chuyện mặc định", "type": "text", "editor_mode": true, "editor_language": "markdown", "default": "Hãy phân tích lịch sử trò chuyện bên dưới và tạo một bản đánh giá chất lượng trò chuyện.\n\n## Mục tiêu:\n1. **Phân chia khía cạnh**: chia nội dung thành 3-6 khía cạnh cấp cao, trừu tượng và có tính khái quát (ví dụ: áp lực nghề nghiệp, định hướng tương lai, nghiên cứu giải pháp kỹ thuật, chia sẻ cảm xúc, trò chuyện lan man).\n2. **Không được đưa tên thành viên, tên dự án, lỗi cụ thể hoặc sự kiện vụn vặt vào tên khía cạnh (`name`). Tên phải khái quát và ngắn gọn, khoảng 2-6 từ.**\n3. Ước tính tỷ lệ phần trăm cho mỗi khía cạnh, tổng không vượt quá 100%.\n4. **Nhận xét**: viết một câu sắc sảo, hài hước hoặc ấm áp cho mỗi khía cạnh theo persona hiện tại. Chi tiết cụ thể và nội dung trêu đùa nên đặt tại đây.\n5. **Đánh giá toàn nhóm**: đưa ra một câu tổng kết nổi bật.\n6. **Chủ đề báo cáo**: đặt tiêu đề và phụ đề cho báo cáo.\n\n## Phong cách:\n- Ngôn ngữ tự nhiên, gần gũi với cộng đồng mạng Việt Nam; nhận xét chính xác nhưng không công kích.\n- Chỉ `name` cần trừu tượng; `comment` và `summary` có thể cụ thể, sinh động.\n- Toàn bộ nội dung văn bản phải được viết bằng tiếng Việt.\n\n## Định dạng trả về:\nChỉ trả về JSON thuần, không chứa Markdown.\n\n```json\n{{\n \"title\": \"Chủ đề trò chuyện hôm nay\",\n \"subtitle\": \"Phụ đề\",\n \"dimensions\": [\n {{\n \"name\": \"Tên khía cạnh khái quát\",\n \"percentage\": 35,\n \"comment\": \"Nhận xét về khía cạnh này theo giọng điệu persona hiện tại\"\n }}\n ],\n \"summary\": \"Một câu tổng kết nổi bật\"\n}}\n```\n\nLịch sử trò chuyện:\n${messages_text}" }, "quality_summary_prompt": { "description": "Prompt tổng hợp chất lượng tăng cường", "type": "text", "editor_mode": true, "editor_language": "markdown", "default": "Bạn có nhiều ghi chú đánh giá từ các lô phân tích tăng cường trong ngày. Hãy tổng hợp chúng thành một bản đánh giá chất lượng trò chuyện cuối ngày.\n\n## Mục tiêu:\n1. **Khía cạnh tổng quát**: cân bằng trọng số giữa các lô và trích xuất 3-6 khía cạnh cốt lõi, trừu tượng, bao quát cả ngày (ví dụ: xu hướng nghề nghiệp, phát triển kiến trúc kỹ thuật, tâm lý nơi làm việc).\n2. **Không đưa chi tiết của một lô cụ thể vào tên khía cạnh (`name`). Tên phải thể hiện một xu hướng xuyên suốt ngày.**\n3. **Tổng hợp tỷ lệ**: dựa trên tần suất và cường độ trong các ghi chú để đưa ra tỷ lệ toàn ngày, tổng không vượt quá 100%.\n4. **Nhận xét cuối ngày**: viết một câu tổng kết nâng cao cho mỗi khía cạnh theo persona hiện tại; có thể kết hợp chi tiết thú vị từ các lô.\n5. **Tổng kết chung**: đặt tiêu đề, phụ đề và một câu tổng kết nổi bật cho cả ngày.\n\n## Phong cách:\n- Chỉ `name` cần khái quát và trừu tượng.\n- `comment` và `summary` cần sinh động, cụ thể và kết nối các điểm đáng nhớ trong ngày.\n- Toàn bộ nội dung văn bản phải được viết bằng tiếng Việt.\n\n## Định dạng trả về:\nChỉ trả về JSON thuần, không chứa Markdown.\n\n```json\n{{\n \"title\": \"Chủ đề trò chuyện hôm nay\",\n \"subtitle\": \"Phụ đề\",\n \"dimensions\": [\n {{\n \"name\": \"Tên nhóm khía cạnh khái quát\",\n \"percentage\": 35,\n \"comment\": \"Nhận xét tổng hợp cả ngày theo giọng điệu persona hiện tại\"\n }}\n ],\n \"summary\": \"Câu tổng kết nổi bật của cả ngày\"\n}}\n```\n\nDữ liệu tổng hợp tăng cường:\n${reviews_text}" } } } } }, "performance": { "description": "Cài đặt giới hạn đồng thời", "type": "object", "hint": "Kiểm soát mức đồng thời khi plugin hoạt động. Cấu hình hợp lý giúp bảo vệ máy chủ và tránh vượt giới hạn API.", "items": { "max_concurrent_groups": { "type": "int", "description": "Số tác vụ hoạt động tối đa", "default": 2, "hint": "Giới hạn số tác vụ phân tích nhóm chạy cùng lúc để bảo vệ bộ nhớ và I/O, tránh đọc quá nhiều lịch sử dẫn đến OOM." }, "max_concurrent_llm": { "type": "int", "description": "Số yêu cầu LLM đồng thời tối đa", "default": 3, "hint": "Giới hạn số yêu cầu AI cùng lúc để tuân thủ giới hạn tần suất API (RPM) và tránh lỗi do gửi quá nhanh." }, "max_concurrent_t2i": { "type": "int", "description": "Số tiến trình T2I đồng thời tối đa", "default": 1, "hint": "Giới hạn số tiến trình kết xuất T2I chạy cùng lúc." }, "stagger_seconds": { "type": "int", "description": "Độ trễ xen kẽ giữa nhiều nhóm (giây)", "default": 30, "hint": "Độ trễ giữa các tác vụ định kỳ khi khởi chạy nhiều nhóm. Nên điều chỉnh theo tốc độ LLM; quá ngắn gây dồn yêu cầu, quá dài làm giảm hiệu suất." } } } }