
    \i                        d dl mZ 	 d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ  ej.                  e      Z G d de      Zy)    )annotationsN)datetime	timedelta)Session)	BaseAgent)settings)MatchRepository)PredictionRepository)ModelRepository)OddsRepository)MatchStatus)OpenAIClientc                  4     e Zd ZdZd fdZddZddZ xZS )LLMAnalysisAgentz+Generate LLM analysis for upcoming matches.c                    t         |   |d       t        |      | _        t	        |      | _        t        |      | _        t        |      | _	        y )Nllm_analysis)
agent_name)
super__init__r	   
match_repor
   	pred_repor   
model_repor   	odds_repo)selfdb	__class__s     %/app/app/agents/llm_analysis_agent.pyr   zLLMAnalysisAgent.__init__   sE    GRN;-b1DO1"5DN-b1DO+B/DN    c                   t        |dd       r|j                  j                         nt        |j                        }|j
                  j                  }|j                  j                  }d|j                  dd|j                  dd|j                  d}d}|6d|j                   d|j                   d	|j                   d
|j                   }d| d| d| d| d| dS )N
match_datezP(Home)=z.2fz
, P(Draw)=z
, P(Away)= z
Bookmaker=z, 1=z, X=z, 2=u  Ты футбольный аналитик. Составь короткий, конкретный pre-match разбор (8-12 пунктов).
Формат:
- 1 строка: матч и дата
- 3-5 пунктов про контекст/форму/мотивацию (без выдумок, только осторожные формулировки)
- 2-3 пункта про вероятности модели и что они означают
- 2-3 пункта про риски (травмы неизвестны, ротация, мотивация, погода и т.д.)
- 1 строка: аккуратный вывод (не гарантировать исход).

ДАННЫЕ:
Матч: z vs u   
Дата: u&   
Вероятности модели: u3   
Коэффициенты 1X2 (если есть): ui   

Пиши по-русски, без токсичности и без призывов к ставкам.)getattrr    	isoformatstr
kickoff_at	home_teamname	away_teamprob_home_win	prob_drawprob_away_win	bookmakerodd_homeodd_drawodd_away)	r   matchpredodds_rowkickoffhomeawayprobsodds_txts	            r   _build_promptzLLMAnalysisAgent._build_prompt$   s   6=e\SW6Xe&&002^abgbrbr^sG??''D??''Dt11#6jPS@TT^_c_q_qru^vwEH#'(:(:';4@Q@Q?RRVW_WhWhViimnvnn  nA  B	 &TF ) &&+W -33;* =hk kr   c                x   t         j                  st        j                  d       y	 | j	                         }t        t         j                  t         j                        }t        j                         }|t        t         j                        z   }| j                  j                  ||t         j                        }|s| j                  dd       y| j                  j!                         }|s| j                  dd	
       yd}|D ]  }| j"                  j%                  |j&                  |j&                        }	|	s8t)        |	dd       rF| j*                  j-                  |j&                        }
| j/                  ||	|
      }dddd|dg}|j1                  |t         j2                  t         j4                        j7                         }| j"                  j9                  |j&                  |j&                  |t        j                                |dz  } | j:                  j=                  |      }|r!||_        | j@                  jC                          | j                  dd|        y# tD        $ r@}tG        |      }t        jI                  d|d       | j                  d|
       Y d }~yd }~ww xY w)Nz5OPENAI_API_KEY is not set; skipping LLMAnalysisAgent.T)api_keymodel)hours)	from_dateto_datelimitzNo upcoming matches found)successlogsFz&No active model found for LLM analysis)r@   errorr   )match_idmodel_idanalysis_textsystemu@   Ты аккуратный спортивный аналитик.)rolecontentuser)temperature
max_tokens)rC   rD   rE   analysis_generated_at   zGenerated analyses: zLLM analysis failed: %s)exc_info)%r   openai_api_keyloggerwarning	start_runr   openai_modelr   utcnowr   llm_horizon_hoursr   get_upcomingllm_max_matches
finish_runr   
get_latestr   get_latest_for_matchidr"   r   get_latest_1x2_for_matchr8   chatopenai_temperatureopenai_max_tokensstripupdate_or_createrun_repo	get_by_idrecords_createdr   commit	Exceptionr$   rB   )r   run_idclientnowhorizonmatchesr;   	generatedmr1   r2   promptmessagestextrunemsgs                    r   rq   zLLMAnalysisAgent.run>   sZ   **VWA)%$33"// oo'	0J0J KK//66g]e]u]u6vOOD7ROS 224OOE9aOb 	 A>>>>W\W_W_>`D t_d; #~~FFqttLH!//4BF!)6xy!'F; H
 ";; $,$?$?#+#=#= '  eg	  NN33!"!&&*.6oo.?	 4  NI9 !> mm--f5*3C'GGNN$5I)3UV !f6dKS9	s%   B+I0 /I0 E+I0 0	J996J44J9)r   r   )returnr$   )rt   bool)__name__
__module____qualname____doc__r   r8   rq   __classcell__)r   s   @r   r   r      s    9	0	k4F	r   r   )
__future__r   loggingr   r   sqlalchemy.ormr   app.agents.baser   app.core.configr   )app.core.db.repositories.match_repositoryr	   .app.core.db.repositories.prediction_repositoryr
   )app.core.db.repositories.model_repositoryr   (app.core.db.repositories.odds_repositoryr   app.core.db.models.matchr   app.llm.openai_clientr   	getLoggerrv   rP   r    r   r   <module>r      sP    "  ( " % $ E O E C 0 .			8	$jy jr   