@@ -2923,21 +2923,24 @@ async function generateNextQuestionWithLLM(conversationText, profile, pastBotMes
29232923
29242924 try {
29252925 const prompt = `
2926- Bạn là một CHUYÊN GIA TƯ VẤN NGHỀ NGHIỆP tâm lý và sâu sắc .
2926+ Bạn là một CHUYÊN GIA TƯ VẤN TÂM LÝ VÀ HƯỚNG NGHIỆP cấp cao .
29272927 Hồ sơ người dùng: ${ JSON . stringify ( profile ) }
29282928 Lịch sử hội thoại:
29292929 ${ conversationText || "Chưa có (đây là câu hỏi đầu tiên)" }
29302930
29312931 NHIỆM VỤ:
2932- - Hãy dẫn dắt buổi tư vấn một cách tự nhiên.
2933- - Nếu là câu đầu, hãy bắt đầu bằng một lời chào thân thiện và hỏi về đam mê, ước mơ hoặc một khó khăn họ đang gặp phải khi chọn nghề.
2934- - Nếu đã trò chuyện, hãy phân tích câu trả lời trước đó để hỏi sâu hơn.
2935- - Đừng chỉ hỏi về môn học, hãy hỏi về giá trị sống, môi trường làm việc mơ ước (trong nhà/ngoài trời, tự do/ổn định).
2932+ - Hãy dẫn dắt buổi tư vấn một cách cực kỳ sâu sắc, như một người bạn tri kỷ và chuyên gia.
2933+ - Đừng chỉ hỏi "Bạn thích gì?", hãy hỏi về:
2934+ * Những tình huống khiến họ thấy tự hào nhất.
2935+ * Cách họ đối mặt với áp lực hoặc giải quyết mâu thuẫn.
2936+ * Những giá trị họ muốn để lại cho thế giới (tiền bạc, danh tiếng, hay sự giúp đỡ?).
2937+ * Sở thích ẩn giấu mà họ chưa từng nói với ai.
2938+ - Nếu đã trò chuyện, hãy "đọc vị" tính cách của họ qua cách dùng từ để đặt câu hỏi tiếp theo thật "chạm".
29362939
29372940 YÊU CẦU:
2938- 1. KHÔNG lặp lại các câu hỏi đã hỏi: ${ JSON . stringify ( pastBotMessages . slice ( - 10 ) ) }
2939- 2. Ngôn ngữ ấm áp, khích lệ (dùng "mình", "bạn").
2940- 3. Câu hỏi ngắn gọn nhưng gợi mở .
2941+ 1. KHÔNG lặp lại câu hỏi: ${ JSON . stringify ( pastBotMessages . slice ( - 10 ) ) }
2942+ 2. Ngôn ngữ ấm áp, giàu hình ảnh, khích lệ (dùng "mình", "bạn").
2943+ 3. Câu hỏi ngắn gọn nhưng đầy sức gợi .
29412944
29422945 TRẢ VỀ DUY NHẤT JSON:
29432946 {
@@ -2970,23 +2973,32 @@ async function generateNextQuestionWithLLM(conversationText, profile, pastBotMes
29702973 return null ;
29712974}
29722975
2973- async function getFinalAIEvaluation ( conversationText , profile , recommendations ) {
2976+ async function getFinalAIResultsPure ( conversationText , profile ) {
29742977 const apiKey = localStorage . getItem ( 'GEMINI_API_KEY' ) || 'AIzaSyBufWY4GjPYSXH9jkOD6pjDcdMAgSgA2gM' ;
2975- if ( ! apiKey ) return "Cảm ơn bạn đã tham gia tư vấn. Dưới đây là kết quả dựa trên số liệu phân tích." ;
29762978
29772979 try {
29782980 const prompt = `
2979- Bạn là chuyên gia tư vấn nghề nghiệp. Dựa vào:
2981+ Bạn là chuyên gia tư vấn nghề nghiệp cao cấp . Dựa vào cuộc hội thoại sau :
29802982 Hồ sơ: ${ JSON . stringify ( profile ) }
29812983 Hội thoại: ${ conversationText }
2982- Gợi ý của hệ thống: ${ JSON . stringify ( recommendations . slice ( 0 , 3 ) ) }
29832984
2984- HÃY VIẾT:
2985- 1. Một đoạn tóm tắt về thế mạnh và định hướng của người dùng qua cuộc trò chuyện.
2986- 2. Giải thích tại sao 3 nghề nghiệp top đầu lại phù hợp với họ.
2987- 3. Một lời khuyên thực tế để họ bắt đầu (lộ trình học tập hoặc kỹ năng cần luyện).
2985+ NHIỆM VỤ:
2986+ 1. Phân tích sâu sắc tính cách, thiên hướng và tiềm năng của người dùng.
2987+ 2. Đề xuất 5 nghề nghiệp phù hợp NHẤT (không giới hạn trong database, hãy dùng kiến thức thực tế toàn cầu).
2988+ 3. Với mỗi nghề, hãy cho biết:
2989+ - Tên nghề nghiệp.
2990+ - Phần trăm phù hợp (match_score) từ 60-98.
2991+ - 3 lý do cụ thể tại sao hợp.
2992+ 4. Viết một bài đánh giá tổng quan (roadmap) truyền cảm hứng, giải thích logic đằng sau các lựa chọn này.
29882993
2989- YÊU CẦU: Ngôn ngữ chuyên nghiệp nhưng truyền cảm hứng. Tối đa 250 từ. Trả về text thuần.
2994+ TRẢ VỀ DUY NHẤT JSON THEO CẤU TRÚC:
2995+ {
2996+ "summary": "đoạn văn tóm tắt đánh giá thế mạnh và lời khuyên",
2997+ "recommendations": [
2998+ { "career_name": "...", "match_score": 95, "reasons": ["...", "...", "..."] },
2999+ ...
3000+ ]
3001+ }
29903002 ` ;
29913003
29923004 const response = await fetch ( `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${ apiKey } ` , {
@@ -2998,10 +3010,15 @@ async function getFinalAIEvaluation(conversationText, profile, recommendations)
29983010 } ) ;
29993011
30003012 const data = await response . json ( ) ;
3001- return data . candidates ?. [ 0 ] ?. content ?. parts ?. [ 0 ] ?. text || "Gợi ý của chúng mình dựa trên các tiêu chí bạn đã chia sẻ." ;
3013+ const text = data . candidates ?. [ 0 ] ?. content ?. parts ?. [ 0 ] ?. text ;
3014+ const jsonMatch = text . match ( / \{ [ \s \S ] * \} / ) ;
3015+ if ( jsonMatch ) {
3016+ return JSON . parse ( jsonMatch [ 0 ] ) ;
3017+ }
30023018 } catch ( e ) {
3003- return "Chúng mình đánh giá cao sự chia sẻ của bạn. Hãy xem qua danh sách gợi ý bên dưới nhé." ;
3019+ console . error ( "Pure AI Results Error:" , e ) ;
30043020 }
3021+ return null ;
30053022}
30063023
30073024
@@ -3101,18 +3118,37 @@ export const offlineApi = {
31013118 }
31023119 }
31033120
3104- const enoughInfo = state . answers . length >= 6 ;
3121+ const enoughInfo = state . answers . length >= 10 ;
31053122 if ( enoughInfo && ! request_more ) {
3106- const recs = scoreCareers ( state ) ;
3123+ const messages = getMessages ( convId ) ;
31073124 const conversationText = messages . map ( m => `${ m . sender } : ${ m . message } ` ) . join ( '\n' ) ;
3108- const aiSummary = await getFinalAIEvaluation ( conversationText , state . userProfile , recs ) ;
31093125
3126+ // Call PURE AI results
3127+ const aiResult = await getFinalAIResultsPure ( conversationText , state . userProfile ) ;
3128+
3129+ if ( aiResult ) {
3130+ saveRecommendations ( convId , aiResult . recommendations ) ;
3131+ saveState ( convId , state ) ;
3132+ return {
3133+ success : true ,
3134+ data : {
3135+ bot_reply : aiResult . summary ,
3136+ recommendations : aiResult . recommendations ,
3137+ next_node : null ,
3138+ completed : true ,
3139+ conversation_id : convId
3140+ }
3141+ } ;
3142+ }
3143+
3144+ // Fallback if AI fails
3145+ const recs = scoreCareers ( state ) ;
31103146 saveRecommendations ( convId , recs ) ;
31113147 saveState ( convId , state ) ;
31123148 return {
31133149 success : true ,
31143150 data : {
3115- bot_reply : aiSummary ,
3151+ bot_reply : 'Đây là gợi ý nghề nghiệp dựa trên phân tích dữ liệu môn học:' ,
31163152 recommendations : recs ,
31173153 next_node : null ,
31183154 completed : true ,
0 commit comments