
    Ui                        d Z ddlZddlmZmZ ddlmZ g dZg dZde	deed	         e
e
f         fd
Zg dZg dZg dZg dZg dZg dZi ddddddddddddddddddddddddd d!d"dd#d!d$d%d&d%i d'dd(dd)dd*dd+dd,dd-dd.dd/d!d0d!d1dd2dd3dd4dd5dd6dd7d!i d8d!d9d:d;d<d=d<d>d:d?d:d@d<dAdBdCd:dDd<dEd:dFd:dGd:dHdBdId:dJd:dKd:i dLd:dMd:dNd:dOd:dPd<dQd:dRd:dSd<dTdUdVdUdWd<dXd:dYd<dZd:d[d:d\d<d]d:i d^d:d_d:d`d:dad:dbd<dcdBddd:ded:dfd:dgd:dhd:didBdjd:dkd<dld:dmd:dndBd:d<dBd:d:d<d:doZi dpdqdrdqdsdtdudqdvdqdwdxdydqdzdqd{dqd|d}d~dddddddd&dddddi ddqddqddqddqddqddxddddddddddqddxddqddqddddddZg dZde	deed         eeef         fdZg dZg dZg dZg dZeeeedZd%Zde	defdZded         ded         de	defdZde	de
dz  fdZ ddl!m"Z"m#Z#m$Z$ dde	de	de	de
fdZ%	 dde	ded         ded         de	de	defdZ&ded         ded         de	defdZ'dS )u'  
==============================================================================
Goalskill 데이터 분류 알고리즘 (전역 유틸리티)
==============================================================================
INPUT 데이터를 분석하여 Goalskill_DB의 48개 테이블 중 하나로 매칭·저장.

테이블명 패턴: {H|S}{A|B|C|D}_{T|P|R}{I|M}
  - H/S  : 큰 목표(H) vs 작은 목표(S)  ← 알고리즘이 판단
  - A~D   : 파트                         ← 호출 시 전달
  - T/P/R : 대화/조언/방향성              ← 알고리즘이 판단
  - I/M   : AI/User                       ← 호출 시 전달

사용법 (각 파트 라우터에서):
    from app.services.goalskill_classifier import classify_and_save

    await classify_and_save(
        session_id="sess_xxx",
        sender="M",        # "M" = User, "I" = AI
        part="A",           # "A" / "B" / "C" / "D"
        text="오늘 컨디션이 안 좋아서 쉬고 싶어"
    )
==============================================================================
    N)LiteralTuple)logger)3u   오늘u   내일u   모레u   어제u   그제u
   이번 주u	   이번주u   며칠u   하루	   컨디션   기분   의지	   진행도   진척u
   몇 시간u   오전u   오후u   저녁u   아침u   今日u   明日u	   明後日u   昨日u	   一昨日u   今週u   数日u   1日   コンディション   気分	   やる気   進捗u	   何時間u   午前u   午後u   夕方u   朝   体調u   調子u   今回u   次回u   直近u   最近u	   この前todaytomorrow	yesterdayz	this week	conditionmoodprogressfeeling)6   목표   장기u   전체   커리큘럼	   로드맵   계획   최종   취업	   자격증u   경력u   개월u   년	   앞으로u   미래u   전략   방향u   비전u   포부u   6개월u   1년u   반년u   한달u
   다음 달u   目標   長期u   全体   カリキュラム   ロードマップ   計画   最終   就職   資格u   キャリアu   ヶ月u   年   将来u   未来u   戦略   方向u   ビジョンu   抱負u   半年u   1年u   来月u	   再来月goal	long-termcareer
curriculumroadmapcertificatefuturestrategyvisiontextreturn)HSc                     |                                  }d}d}t          D ]}|                                 |v r|dz  }t          D ]}|                                 |v r|dz  }||k    rd||fS d||fS )u}  
    텍스트를 분석하여 H(큰 목표) 또는 S(작은 목표) 분류.

    판단 기준:
    - S: 어제~7일 이내 시간 범위, 컨디션, 진행도 관련
    - H: 장기적 시간 범위, 큰 목표, 방향성, 커리어 관련

    동일한 점수일 경우 S를 기본값으로 (일상적 대화가 더 빈번)

    Returns:
        (result, h_score, s_score)
    r      r5   r6   )lower
S_KEYWORDS
H_KEYWORDS)r3   
text_lowers_scoreh_scorekws        )/app/app/services/goalskill_classifier.pyclassify_goal_scoperA   C   s     JGG  88::##qLG  88::##qLG GW$$      )u   안녕하세요u   오늘 기분이 좋아요u   잘 모르겠어요u   네 알겠습니다u   좀 더 설명해주세요u
   그래요?u   어떻게 하면 돼요?u   오늘 뭐 했어요?u   고마워요u   재밌었어요   こんにちはu   今日は気分がいいですu   よくわかりませんu   はい、わかりましたu$   もう少し説明してくださいu   そうですか？u!   どうすればいいですか？u!   今日は何をしましたか？u   ありがとうございますu   楽しかったですHellozI'm feeling good todayzI don't understandzYes, I got itzCan you explain more?zReally?zHow do I do this?zWhat did you do today?z	Thank youzThat was fun)u%   이렇게 하면 좋을 것 같아요u.   먼저 기초부터 배우는 걸 추천해요u   파이썬부터 시작하세요u1   매일 1시간씩 공부하면 효과적이에요u$   이 부분은 다시 복습하세요u#   유튜브 강의를 참고하세요u   실습을 많이 해보세요u#   에러가 나면 구글링하세요u+   이 자료를 읽어보면 도움이 돼요u*   코드를 직접 쳐보면서 배우세요u$   こうするといいと思いますu3   まず基礎から学ぶことをお勧めしますu!   Pythonから始めてくださいu1   毎日1時間ずつ勉強すると効果的ですu3   この部分はもう一度復習してくださいu+   YouTube講義を参考にしてくださいu0   実習をたくさんやってみてくださいu-   エラーが出たらググってくださいu3   この資料を読んでみると役に立ちますu<   コードを直接書いてみながら学んでくださいz$I think you should try this approachz$I recommend starting with the basicszStart with Python firstz"Studying 1 hour daily is effectivez!You should review this part againzCheck out YouTube tutorialsz&Practice a lot with hands-on exercisesz#Google the error when you get stuckzReading this material will helpzLearn by writing code yourself)u4   앞으로 백엔드 개발자를 목표로 해봐요u7   다음 단계로 데이터베이스를 배워야 해요u5   웹 개발 쪽으로 방향을 잡으면 좋겠어요u=   이 커리큘럼으로 3개월 안에 완성할 수 있어요u$   나중에 AWS도 배우면 좋아요u1   풀스택 개발자가 되려면 이런 순서로u5   자격증을 먼저 따고 취업 준비를 하세요u>   프론트엔드와 백엔드 중 어디에 집중할 건가요u3   장기적으로 이런 로드맵을 추천합니다u>   최종 목표를 설정하고 역산해서 계획을 세워요uB   今後はバックエンド開発者を目指してみましょうuK   次のステップとしてデータベースを学ぶ必要がありますu3   Web開発の方向に進むといいと思いますu=   このカリキュラムで3ヶ月以内に完成できますu*   将来的にAWSも学ぶといいですよu9   フルスタック開発者になるにはこの順序でu?   資格を先に取ってから就活準備をしてくださいuK   フロントエンドとバックエンドのどちらに集中しますかu9   長期的にこのロードマップをお勧めしますuB   最終目標を設定して逆算して計画を立てましょうz(Let's aim for a backend developer careerz#The next step is to learn databasesz%I suggest focusing on web developmentz,You can complete this curriculum in 3 monthsz&Learning AWS later would be beneficialz3To become a full-stack developer, follow this orderz1Get certified first, then prepare for job huntingz6Which would you like to focus on, frontend or backend?z"I recommend this long-term roadmapz&Set your final goal and plan backwards)u   안녕u   네u   응u   아니u   모르u   그래u   뭐u	   어떻게u   고마u   재미   힘들r      좋아u   싫어u   궁금rC   u   はいu	   いいえu	   わかりu   ありがとうu   楽しhelloyesnothankfunz
don't knowhowwhatgoodbad)!u   추천u   좋을u	   하세요u   해보세요u   배우세요   복습u   참고u   실습u   연습u   효과u   도움u   방법u   읽어u	   お勧めu   してください   復習u   参考u   実習u   練習u   効果u	   役に立u   方法u	   読んで	recommendshouldtrypracticereview	effectivehelpfulsuggesttipadvice)#r   r    r   u   단계r   r   r   r   u   다음r   r   r   u   목指r)   r#   u   ステップr"   r$   r(   r!   u   次r%   r&   r'   r*   	directionr.   stepr-   planr,   nextr0   r+   r/      元気      最高   	   爽やか   体調いい   よく眠れた   ぐっすり   快調      調子いいu   調子がいい   万全   スッキリ	   絶好調	   いいね      いい感じ   良い   悪くないr8      まあまあ   普通rF      최고   상쾌u   컨디션 좋u   잘 잤u   푹 잤   쾌조   괜찮   멀쩡   건강greatawesome	refreshedwell-rested	energeticfinerN      疲れ   眠い	   眠たい   頭痛   風邪u   熱u   体調悪いu   調子悪い	   だるい   しんどい   辛い	   無気力u	   吐き気u	   めまいu	   倦怠感   痛いu   痛むu   具合悪いu   気持ち悪いu	   寝不足u   微熱u   腹痛u   腰痛   悪い   微妙   イマイチ   よくない   피곤   졸려   두통   감기   열이u   컨디션 안rE      지쳐   아프	   무기력   나른u   구토u	   어지러u   권태   아파u   통증u
   속이 안u   몸살tiredsleepyheadachesick	exhausted)unwellsluggishnauseouspainhurtsoreillu   めっちゃg      ?u	   すごくu	   とてもg?u	   本当にu	   かなりu   死ぬほどg       @u   超u	   マジでu	   非常にu   結構g333333?u   割とg?u   ちょっとg      ?u   少しu   ややgffffff?u   なんとなくu	   微妙にu   엄청u   진짜u   매우u   너무u   정말u   죽을 만큼u   조금u   좀u   약간u   살짝very	extremelyreallysuperza bitslightlysomewhat)u   ないu	   ませんu   じゃないu   ではないu	   なくてu   なかったu   않u   안 u   못 u    없znot zdon'tzdoesn'tzno TPRc                 
   |                                  t          fdt          D                       }t          fdt          D                       }t          fdt          D                       }dt
          dt          dt          fd} || t                    } || t                    } || t                    }|dz  |d	z  z   }|dz  |d	z  z   }	|dz  |d	z  z   }
||	|
d
}t          ||j                  }|||	|
fS )u5  
    텍스트를 분석하여 T(대화), P(조언), R(방향성) 분류.

    2단계 판단:
    1) 핵심 키워드 매칭 점수
    2) 예문과의 단어 겹침 유사도

    두 점수를 합산하여 가장 높은 카테고리를 선택.

    Returns:
        (result, t_total, p_total, r_total)
    c              3   H   K   | ]}|                                 v d V  dS r8   Nr9   .0r?   r<   s     r@   	<genexpr>z(classify_content_type.<locals>.<genexpr>H  5      HH2rxxzzZ/G/GQ/G/G/G/GHHrB   c              3   H   K   | ]}|                                 v d V  dS r   r   r   s     r@   r   z(classify_content_type.<locals>.<genexpr>I  r   rB   c              3   H   K   | ]}|                                 v d V  dS r   r   r   s     r@   r   z(classify_content_type.<locals>.<genexpr>J  r   rB   r3   examplesr4   c                    t          t          j        d|                                                     }|sdS d}|D ]}t          t          j        d|                                                    }|s9t	          ||z            }|t          t	          |          t	          |                    z  }t          ||          }|S )Nz\w+        )setrefindallr9   lenmax)r3   r   
text_words	max_scoreexex_wordsoverlapscores           r@   word_overlap_scorez1classify_content_type.<locals>.word_overlap_scoreM  s    FDJJLL99::
 	3	 	. 	.B2:fbhhjj99::H *x/00Gc#j//3x==AAAEIu--IIrB   ro   
   r   key)r9   sum
T_KEYWORDS
P_KEYWORDS
R_KEYWORDSstrlistfloat
T_EXAMPLES
P_EXAMPLES
R_EXAMPLESr   get)r3   
t_kw_score
p_kw_score
r_kw_scorer   t_sim_scorep_sim_scorer_sim_scoret_totalp_totalr_totalscoresresultr<   s                @r@   classify_content_typer   8  sJ    J HHHHHHHHHJHHHHHHHHHJHHHHHHHHHJ       %$T:66K$$T:66K$$T:66K 1n{R//G1n{R//G1n{R//G w77FVZ(((F7GW,,rB   )Hr	   u	   진척도r
   u   진행u   어디까지u   완료u   끝냈u   어제 배운u
   어제 했u   어제 공부u	   지난번u   저번u   몇 퍼센트u
   몇 챕터u
   몇 단원u   몇 강u   몇 과rP   u
   다시 보u
   다시 했u	   마무리u	   이어서u   과제u   숙제u   제출u	   미완료u   미흡r   u	   進行度u   どこまでu   完了u   終わったu	   終えたu   昨日学んだu   昨日やったu   昨日勉強u   前回u   先日u   何パーセントu   何章u   何課u   何講rQ   u   もう一度u   やり直しu	   仕上げu   続きu   課題u   宿題u   提出u	   未完了u	   不十分r   zhow far	completedfinishedzyesterday learnedzyesterday studiedz	last timepreviouspercentchapterlessonlecturerV   redocontinue
incomplete
unfinished
assignmenthomework	submitted)or   u
   몸 상태u   체력r   r   u   졸리r   r   r   r   r   u   배탈u
   잠을 못u   잠이 부족u   수면u   밤새u   야근u	   좋아요u	   괜찮아u   안 좋rE   r   u   지치r   rv   r   r   ry   rF   ru   rw   rx   rz   r   r   u   体力r   r   r   r   r   r   u   熱があるu   お腹u   眠れなかったu   睡眠不足u   睡眠u   徹夜u   残業r`   u	   大丈夫u   調子が悪いr   u	   疲れたr   rd   r   r   r   rb   re   rf   rg   rh   rj   rk   rl   rm   rn   rp   rq   rr   rs   rt   r   r   r   r   r   physicalstaminar   r   r   r   coldfeverstomachachezcouldn't sleepzlack of sleepsleepz	all nightovertimezfeeling goodr   znot wellr   r   r}   	lethargicr   rN   r{   r|   r~   r   rO   okayokr   r   )Qr   u   열정u   동기u   의욕u
   하고 싶u	   열심히u   도전u   집중u   몰입u   흥미u   관심u
   하기 싫u   귀찮u   포기u   그만u
   쉬고 싶u   빨리 하고u   많이 하고u	   조금만u	   적당히u	   자신감u   확신u   불안u   걱정u   두려u	   해볼게u	   해보겠u   할 수 있u
   못 하겠r   u   意欲u   情熱u   モチベーションu   やりたいu   頑張u   挑戦u   集中u   没頭u   興味u   関心u   やりたくないu   面倒u   諦めu   やめたいu   休みたいu   早くやりたいu   たくさんu   少しだけu   ほどほどu   自信u   確信u   不安u   心配u   怖いu   やってみますu	   できるu   できない
motivationpassionwillingeagerzwant tohard	challengefocusimmerseinterestcuriousz
don't wantlazyzgive upquitzwant to rest
confidencesureanxiousworriedscaredzI'll tryzI canzI can't)cu   이해u	   이해했u
   이해 못u   이해가 안u   알겠u	   모르겠u   기억u
   기억 안u	   기억나u   까먹u   잊어u   잊었u	   어려웠u	   어려워u   쉬웠u   쉬워u   헷갈u   혼란u   개념u   원리u   뜻u   의미u   왜 그런지u   다시 설명u
   한번 더u   정리u   요약u	   맞나요u   틀렸u   정답u   오답u   점수u	   확실히u   확실하지 않u   애매u	   불확실u   理解u   理解したu   理解できないu   わかったu   わからないu	   覚えてu   覚えていないu   思い出せu	   忘れたu	   忘れてu   難しかったu	   難しいu   簡単だったu   簡単u   混乱u   混同u   概念u   原理u   意味u   なぜu   もう一度説明u   もう一回u   整理u	   まとめu   合ってますかu	   間違いu   正解u	   不正解u   点数u   確実u   確実じゃないu   曖昧u	   不確実
understand
understoodzdon't understandzget itz	don't getrememberzdon't rememberforgotforget	difficultr  easyconfused	confusingconcept	principlemeaningwhyzexplain againzone more time	summarizesummarycorrectwrongr   gradez
sure aboutznot sure	ambiguous	uncertain)r   r   r   comprehensionc           
         |                                  i }t                                          D ]%\  }}t          fd|D                       }|||<   &t          |                                          }|t
          k    }d}|rt          ||j                  }t          j	        d| d| d| d|            ||||dS )	u  
    A/B 파트 전용: 오늘의 커리큘럼 생성에 필요한 문장인지 판별.

    4개 카테고리로 판별:
    1. progress      - 어제까지의 커리큘럼 진행도
    2. condition     - 오늘 유저의 컨디션
    3. passion       - 오늘 유저의 열정/의지
    4. comprehension - 어제 내용에 대한 유저의 이해도

    키워드 매칭 합계가 임계값 이상이면 관련 있음으로 판정.
    여러 카테고리에 매칭되면 가장 점수가 높은 카테고리를 대표로 선택.

    Returns:
        {
            "is_relevant": True/False,
            "category": "progress" | "condition" | "passion" | "comprehension" | None,
            "scores": {"progress": 0, "condition": 2, ...},
            "total_score": 2
        }
    c              3   H   K   | ]}|                                 v d V  dS r   r   r   s     r@   r   z)is_curriculum_relevant.<locals>.<genexpr>  s5      EE"BHHJJ*,D,DA,D,D,D,DEErB   Nr   z#[Curriculum Relevance] is_relevant=z, category=z	, scores=z, total=)is_relevantcategoryr   total_score)
r9   _CURRICULUM_CATEGORIESitemsr   values_CURRICULUM_RELEVANCE_THRESHOLDr   r   r   info)	r3   r   r'  keywordsr   r(  r&  best_categoryr<   s	           @r@   is_curriculum_relevantr0    s   * JF4::<< ! !(EEEEEEEEE xfmmoo&&K!@@K M 4F
333
K	0"	0 	0!	0 	0 	0 	0 #.	0 	0   #!"	  rB   sender)IMpart)ABCDc                     t          |          \  }}}t          |          \  }}}}	| | d| |  }
t          j        d|  d| d| d| d| d| d|d	d
|d	d|	d	d|
            |
|||||||	dS )u  
    4차원 분류를 수행하여 최종 테이블명과 각 점수를 반환.

    Args:
        sender: "I" (AI) 또는 "M" (User)
        part: "A" / "B" / "C" / "D"
        text: 저장할 텍스트 내용

    Returns:
        {
            "table_name": "SA_TM",
            "goal_scope": "S",
            "content_type": "T",
            "h_score": 0,
            "s_score": 2,
            "t_score": 12.5,
            "p_score": 4.0,
            "r_score": 2.0,
        }
    _z[Goalskill Classifier] sender=z, part=z, goal_scope=z(H=z/S=z), content_type=z(T=.1fz/P=z/R=u   ) → table=)
table_name
goal_scopecontent_typer>   r=   t_scorep_scorer_score)rA   r   r   r-  )r1  r4  r3   r=  r>   r=   r>  r?  r@  rA  r<  s              r@   classify_tablerB    s%   2 $7t#<#< J.CD.I.I+L'7G===|=V==J
K	"	" 	"!%	" 	" 	" 	"%,	" 	"18	" 	" %	" 	" *1X	" 	" :AX	" 	" JQX	" 	"  		" 	"   ! $	 	 	rB   c                 ,   |                                  }d}d}d}t                                          D ]\  }}|                                 }||vr|dz  }t          |          }|                    |          }	|d|	         }
d}t
                                          D ]\  }}|                                 |
v r|} n |	t          |          z   }|||dz            }d}t          D ]}|                                 |v rd	} n|r| }||z  }||z  }t          j	        d
| d| d| d| d| 
           |dk    rdS ||z   }t          dt          dt          |                              }t          j        d| d|dd|dd|            |S )u*  
    텍스트에서 컨디션 관련 키워드를 감지하고 1~10점 점수를 산출.
    컨디션 키워드가 없으면 None 반환 (컨디션 문장이 아님).
    알고리즘:
    1. base_score = 5 (보통)
    2. 각 키워드 매칭 → 변동값 적용
    3. 강도 수식어가 키워드 앞에 있으면 배율 적용
    4. 부정어가 키워드 뒤에 있으면 극성 반전
    5. 최종 점수를 1~10으로 클램핑

    Returns:
        int (1~10): 컨디션 점수
        None: 컨디션 관련 키워드가 없는 경우
    g      @r   r   r8   Ng      ?r   FTz[Condition Score] keyword='z	', delta=z, amplifier=z
, negated=z, final_delta=z![Condition Score Result] matched=z, total_delta=r;  z, raw=z, final=)r9   CONDITION_SCORE_KEYWORDSr*  r   findINTENSITY_AMPLIFIERr   NEGATION_PATTERNSr   debugr   minroundr-  )r3   r<   
base_scoretotal_deltamatched_countkeyworddeltakw_lowercurrent_deltakw_posbefore_text	amplifieramp_word	amp_valueafter_start
after_near
is_negatedneg_pattern	raw_scorefinal_scores                       r@   calculate_condition_scorer]  H  sW    JJKM288:: )
 )
==?? :%%e ** &)	#6#<#<#>#> 	 	Hi~~;..%	 /
 s8}},K",< <=

, 	 	K  ""j00!
 1
  	+*NM%	1}$+' + +E + +"+ +.8+ +(+ +	
 	
 	
 	
 t [(IaRy!1!12233K
K	4 	4 	40;C	4 	43	4 	4&1	4 	4   rB   )save_to_goalskill_tablesave_admin_logsave_to_goalskill_table_scoresource_type
session_idc                    ddl m} ddl}ddl m} d}|dk    r|r	  |d          } |j        j        d&i |}|                    d          }	|	                    d	|f           |	                                }
|	                                 |
rj|
d
         rb|
d
         dk    rV|
d
         dz
  }ddl
m}  |||          }|r7|                    d          r"|d         }t          j        d| d|            n.# t          $ r!}t          j        d|            Y d}~nd}~ww xY w|dk    r	|rd| d}n|dk    rd}nd}d| d|  d}	  |            }|j                            d|ddi          }|j                                        }d                    d |D                       }|rIt-          |          }t/          dt1          d|                    }t          j        d| d |            |S t          j        d!| d"           d#S # t          $ r#}t          j        d$| d%           Y d}~d#S d}~ww xY w)'u  
    Gemini API로 텍스트를 1~10으로 수치화.
    source_type: 'learning' (어제 학습 자기평가) | 'mindset' (오늘 각오)
    learning의 경우, 어제 커리큘럼 내용을 기준으로 비교 판단.
    실패 시 5(중립) 반환.
    r   )get_gemini_modelN)get_db_configlearningGoalskill_DBT)
dictionaryzOSELECT daily FROM result WHERE session_id = %s ORDER BY created_at DESC LIMIT 1dailyr8   )get_today_item_infonameu(   [Gemini Score] 어제 커리큘럼 (Day z): u+   [Gemini Score] 커리큘럼 조회 실패: u&   昨日のカリキュラム内容: 「u  」

上記のカリキュラムに対するユーザーの理解度・学習達成度を1~10で判定してください。
1~2=全く理解できていない(学習していない・サボった)
3~4=少し理解した(表面的な理解・不十分)
5~6=普通(基本的な概念は理解)
7~8=よく理解した(応用もある程度可能)
9~10=完全に理解(自主的な追加学習・深い理解)ui  ユーザーが昨日の学習をどれだけ誠実に取り組んだかを1~10で細かく判定してください。
1~2=全くやっていない(完全にサボった)
3~4=少しだけやった(不十分)
5~6=普通(最低限はやった)
7~8=しっかりやった(真面目に取り組んだ)
9~10=非常に頑張った(自主的に追加学習も行った)u0  ユーザーの今日の学習に対する意気込み・覚悟を1~10で細かく判定してください。
1~2=全くやる気がない(諦め・面倒)
3~4=低い(消極的・不安)
5~6=普通(特に強い感情なし)
7~8=高い(積極的・意欲的)
9~10=非常に高い(強い決意・情熱的)ur   以下のユーザーメッセージを分析して、数値のみを返してください。

【評価基準】
u$   

【ユーザーメッセージ】
u@  

【重要な注意事項】
- 1から10の整数を1つだけ出力してください
- 極端な値(1や10)は避け、細かい数値で判定してください
- 文脈・ニュアンス・否定表現を慎重に考慮してください
- 説明や文章は一切不要です。数字のみ出力してくださいzgemini-2.5-flashtemperatureg?)modelcontentsconfig c              3   B   K   | ]}|                                 |V  d S N)isdigit)r   cs     r@   r   z%gemini_score_1to10.<locals>.<genexpr>  s/      ??q199;;???????rB   r   z[Gemini Score] source=z, score=u&   [Gemini Score] 숫자 추출 실패: 'u   ' → 기본값 5rc   u   [Gemini Score] API 에러: u    → 기본값 5 )app.core.configrd  mysql.connectorre  	connectorconnectcursorexecutefetchonecloseapp.models.curriculum_modulerj  r   r   r-  	Exceptionwarningmodelsgenerate_contentr3   stripjoinintr   rI  error)r3   ra  rb  rd  mysqlre  yesterday_curriculum	gs_configconnrz  rowyesterday_dayrj  	item_infoecontextpromptclientresponseresult_textdigitsr   s                         r@   gemini_score_1to10r    sl    100000------
  j  Z 	N%n55I*5?*77Y77D[[D[11FNNa   //##CJJLLL us7| uGq(8(8 #Gq 0 MLLLLL//
MJJ	 uv!6!6 u+4V+<(K s= s s]q s sttt 	N 	N 	NNLLLMMMMMMMM	N j  %9 L5I L L L 	 

	"	"O 	= 	Q 	Q Q Q Q QF!!##=11$!3' 2 
 
 m))++??K????? 	KKE3r5>>**EKMMMeMMNNNLNbKbbbccc1   F1FFFGGGqqqqqs7   CC= =
D(D##D(B+H ;H 
IH==Ic                 6  K   t          |||          }|d         }|d         }|d         }d}	|dv rt          |          }	|	d         st          j        d| d| d	           t	          | ||||d
         |d         |d         |d         |d         d| 
  
         |||||| dd|	|d
         |d         |d         |d         |d         dd
S t          |          }
	 d}|dk    r*|dv r&t          |||           }t          || |||           nt          || ||dk    r|
nd           t	          | ||||d
         |d         |d         |d         |d         |
  
         t          j        d| d|  d| |rd| d| ndz              |||||| d|
|d
         |d         |d         |d         |d         dd 	}|
||d!<   ||d"<   |	|	|d#<   |S # t          $ r<}t          j
        d$| d%|            |||||| dt          |          d&cY d}~S d}~ww xY w)'uR  
    INPUT 데이터를 분류하고 Goalskill_DB의 해당 테이블에 저장.
    T/P/R 모든 타입에서 실제 텍스트를 output에 저장.
    동시에 admin 테이블에 분류 점수 로그를 기록.

    ★ A/B 파트: 커리큘럼 생성에 필요한 문장만 저장 (필터링)
    ★ C/D 파트: 기존대로 모든 INPUT 저장

    Args:
        session_id: 유저 세션 ID
        sender: "I" (AI) 또는 "M" (User)
        part: "A" / "B" / "C" / "D"
        text: 저장할 텍스트 내용

    Returns:
        분류 결과 및 점수 정보를 포함한 dict
    r<  r=  r>  N)r5  r6  r&  z[Goalskill Skip] part=z	, sender=u1   , 커리큘럼 관련성 없음 → 저장 스킵r>   r=   r?  r@  rA  SKIP_)
rb  r1  r4  
input_text	h_scoring	s_scoring	t_scoring	p_scoring	r_scoringresult_tableFnot_curriculum_relevantr5   r6   r   r   r   )
r<  r=  r>  r1  r4  rb  savedskip_reason	relevancer   r6  )rf  mindset)rb  r5  )statusz[Goalskill Save] table=z
, session=z	, source=z	, status=rp  T)	r<  r=  r>  r1  r4  rb  r  condition_scorer   ra  r  r  z[Goalskill Save Error] table=z: )r<  r=  r>  r1  r4  rb  r  r  )rB  r0  r   r-  r_  r]  r  r`  r^  r  r  r   )rb  r1  r4  r3   ra  r   r<  r=  r>  r  r  status_scorer  r  s                 r@   classify_and_saver    s     0 FD$//F%J%J.)L
 Iz*400	' &	KC C C C C C   % + + + + +1Z11    )( , (8&	*	*	*	*	*   , 055O
E
3;;;*AAA-dKJWWWL)*j$Uabbbb $J
D\`dg\g\gmqrrrr 	!Y'Y'Y'Y'Y'#	
 	
 	
 	
 	5j 5 5!5 5,25 5COW?;?????UWY	
 	
 	
 %$($.I&I&I&I&I& 
 
$ #&1H]#!-HX  $-H[! 
 
 
FZFF1FFGGG$$($VV	
 	
 		
 		
 		
 		
 		
 		

s   C2G 
H1HHHc                     t          | ||          }|d         |d         |d         | ||d         |d         |d         |d         |d         d	d
S )uo   
    분류만 수행 (저장하지 않음). 디버그/테스트용.
    점수도 함께 반환합니다.
    r<  r=  r>  r>   r=   r?  r@  rA  r  )r<  r=  r>  r1  r4  r   )rB  )r1  r4  r3   r   s       r@   classify_onlyr    sv     FD$//F \*\*~.	"	"	"	"	"
 
  rB   rr  )(__doc__r   typingr   r   rv  r   r:   r;   r   r  rA   r   r   r   r   r   r   rD  rF  rG  r   r   CURRICULUM_PROGRESS_KEYWORDSCURRICULUM_CONDITION_KEYWORDSCURRICULUM_PASSION_KEYWORDS!CURRICULUM_COMPREHENSION_KEYWORDSr)  r,  dictr0  rB  r]  app.models.goalskill_moduler^  r_  r`  r  r  r  ru  rB   r@   <module>r     sW	   0 
			 ! ! ! ! ! ! ! ! " " " " " "  
   
"!c !eGH,=sC,G&H ! ! ! !J" " "
J" " "
J" " "
J  
  
  
  b B  +R 1?  r  *2  08  B	  *2	  08	 
 B 
 $R 
 *5b 
 ;I"  b  !"  '5b    ;CB  b  B  !)"  />r  r  b  #+B  19"  b  B  R  B  !,R  2?    R      "(  b  B  !,R  2:2   b!   !   ,R!   2@! " # " $R# " *22# " 8CB# $ % $ !"% $ '22% & b'     & B' & !/' & 5Fr' ( ) ( r) ( $,R) ( 2:2) * b+ * B+ * !/+ * 5CB+ . b/ . B/ . !)"/ . /7/ 0 b1 0 "21     0 (01 0 6>r1 2 b3 2 r3 2 $,R3 2 2:23 4 5 4 r5 6 b7 6 B7 6 !-b7 6 3;B7 : R; : 2; :  *2; : 06r; < =   <  "rrBr?      FC$c+6  "3 )7 
3	 S	 #.s	 5=c	 DLS	 C "3 )1# C +C 2=c  c S #+C 2:3 c #C c #  ( /7 C c $,S 3:3 S c $.s  $   0- 0-gm.DeUTY.Y(Z 0- 0- 0- 0-p      ,! ! ! 4   0% % % !: -.*6	   #$ 0 0 0 0 0 0n/H/
$
%/ / 
	/ / / /dMC MC$J M M M Mh o n n n n n n n n nl lS ls l ls l l l lh Y
 Y
Y
HY
 $
%Y
 	Y

 Y
 
Y
 Y
 Y
 Y
xH
$
%  
	     rB   