o
    \i                     @  s   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eZG dd deZdS )    )annotationsN)datetime	timedelta)Session)	BaseAgent)settings)MatchRepository)PredictionRepository)ModelRepository)OddsRepository)MatchStatus)OpenAIClientc                      s6   e Zd ZdZd fddZddd	ZdddZ  ZS )LLMAnalysisAgentz+Generate LLM analysis for upcoming matches.dbr   c                   s<   t  j|dd t|| _t|| _t|| _t|| _	d S )Nllm_analysis)
agent_name)
super__init__r   
match_repor	   	pred_repor
   
model_repor   	odds_repo)selfr   	__class__  app/agents/llm_analysis_agent.pyr      s
   


zLLMAnalysisAgent.__init__returnstrc           	      C  s   t |dd r|j nt|j}|jj}|jj}d|jdd|j	dd|j
d}d}|d urAd|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   	isoformatr   
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_txtr   r   r   _build_prompt$   s$    "$		
zLLMAnalysisAgent._build_promptboolc              
   C  s  t js
td dS z|  }tt jt jd}t }|t	t j
d }| jj||t jd}|s9| jddd W dS | j }|sJ| jdd	d
 W dS d}|D ]L}| jj|j|jd}	|	s]qNt|	dd rdqN| j|j}
| ||	|
}dddd|dg}|j|t jt jd }| jj|j|j|t d |d7 }qN| j|}|r||_| j !  | jdd| d W dS  t"y } zt#|}tj$d|dd | jd|d
 W Y d }~dS d }~w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)rA   rB   rC   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_matchr6   chatopenai_temperatureopenai_max_tokensstripupdate_or_createrun_repo	get_by_idrecords_createdr   commit	Exceptionr   r@   )r   run_idclientnowhorizonmatchesr9   	generatedmr/   r0   promptmessagestextrunemsgr   r   r   ro   >   st   



zLLMAnalysisAgent.run)r   r   )r   r   )r   r7   )__name__
__module____qualname____doc__r   r6   ro   __classcell__r   r   r   r   r      s
    
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   	getLoggerrr   rN   r   r   r   r   r   <module>   s    
