o
    ̿Si7                     @   sD  d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 z
ddlmZ dZW n ey9   dZdZY nw eeZed	d
ZeddZeddZeeddZeeddZeeddZdedefddZdededeeef fddZdeeef fddZ defdd Z!d!edeeef fd"d#Z"dS )$z
GPT-specific configuration and helper functions for the ChatGPT-based
trading engine. This module is responsible **only** for talking to
OpenAI models and building prompts; it has no Zerodha or DB logic.
    N)DictAny)HTTPException)prepare_market_data_prompt)OpenAITFOPENAI_API_KEY OPENAI_MODELzgpt-4oOPENAI_MODEL_FALLBACKzgpt-4o-miniOPENAI_TEMPERATUREz0.1
MAX_TOKENS1000REQUEST_TIMEOUT30excreturnc                 C   sH   t | pd }|sdS d|v o#d|v p#d|v p#d|v p#d|v p#d|v S )	Nr   Fmodelz	not foundzdoes not existzno such modelmodel_not_foundzunsupported model)strlower)r   msg r   8/var/www/html/Trade-python/app/v1/services/gpt_engine.py_looks_like_model_error#   s   r   r   
max_tokensc                 C   s2   | pd   }|drdt|iS dt|iS )zReturn the correct completion-length kwarg for the chosen model.

    Some newer models (e.g., GPT-5.*) do not accept `max_tokens` and instead
    require `max_completion_tokens`.
    r   zgpt-5max_completion_tokensr   )stripr   
startswithint)r   r   mr   r   r   _max_tokens_kwarg3   s   
r    c               
   C   s   t sdddS tsdddS z"ttd} | jjjdtdddgd	ttd
 ddt dW S  tyL } zddt	| dW  Y d}~S d}~ww )zValidate OpenAI configuration and basic connectivity.

    This is used by the `/health` endpoint to report whether GPT
    analysis is available.
    FzOpenAI package not installed)
configuredmessagezOPENAI_API_KEY not setapi_keyuserTestrolecontent)r   messages
   TzOpenAI configured with model zOpenAI test failed: Nr   )
OPENAI_AVAILABLEr   r   chatcompletionscreater	   r    	Exceptionr   )clienter   r   r   validate_openai_setup@   s&   




 r3   c                   C   s*   t stdddtstdddttdS )zCReturn an authenticated OpenAI client instance or raise HTTP error.i  zOpenAI package not available)status_codedetailzOpenAI API key not configuredr#   )r,   r   r   r   r   r   r   r   get_openai_client\   s
   
r6   promptc                  C   s  z,t dt dt  t }dddd| dg}ttt}z|jjj	dZt|td|dt
i}W n] ty } zQt|}d	|v r\d
|v r\t dt |jjj	t|tttt
d}n*trttkrt|rt}t dt| |jjj	dZ||tdt|tdt
i}n W Y d}~nd}~ww zt|dd}|rt dt|ddt|ddt|dd W n	 ty   Y nw |jd jj }	t d|	dd  d z!|	d}
|	dd }t d|
 d|  |
dkr||
kr|	|
| }t d|  t|}t d t dt|   d |vrd!|d < d"|vr0d#|v r0|d#|d"< d#|vrAd"|v rA|d"|d#< d"|vrJd$|d"< d#|vrW|d"d$|d#< d%|vrad&g|d%< zt|d pkd' d!krsd$|d"< d$|d#< |d(}z|durt|nd)}W n ty   d)}Y nw ttd*t dt||d(< |d+}t!|t"rd,|v r|d,n|d-}d.|v r|d.n|d/}z|durt|nd}|durt|nd}W n ty   d0\}}Y nw |dur|dks|dur|dkrd|d+< n	|d1v rd|d+< d2D ](}z||}|du r+W qt|dkr6d||< W q tyC   Y qw |d3}t!|trjz	d4d5 |D }W n tyd   g }Y nw ||d3< n	|d6v rsg |d3< W n
 ty~   Y nw |d7}z@|durt|}n4d(|v r|d(durt|d( }n t|d#|d"d$ }|d8krd9}n
|d:krd;}nd<}W n ty   d=}Y nw |durt d)td>|}||d7< |W W S t #d?|	  t$d@ tj%y- } z.t #dA|  t #dB|	ddC   d!d$dDdEt| gdF|	dd dGW  Y d}~W S d}~ww  ty } zt|dHdpFtt|dIddHd}t|}d}z=t|dJdpatt|dIddKdLdM  }t!|t"r|dNpoi }t!|t"r|dOp|dP}|dQp|}W n
 ty   Y nw |dRkr|dSksdS|v rt #dT d!d$dUdVg|dRdSdWW  Y d}~S t &dX d!d$dY| g|||dWW  Y d}~S d}~ww )[z@Call ChatGPT for structured JSON analysis with detailed logging.u   🤖 CHATGPT API CALL - Model: z, Temp: systema?  You are an expert institutional intraday trader and risk manager. You infer the best intraday decision purely from provided data. Priority: capital protection, trade only when edge is clear, precision over frequency. If no clear edge exists, you MUST choose HOLD. Output ONLY valid JSON (no code blocks, no extra text).r'   r%   )r   r*   temperaturetimeoutr   r   zTRetrying OpenAI call with max_completion_tokens due to parameter mismatch (model=%s))r   r*   r9   r   r:   z9OpenAI model failed (%s). Retrying with fallback model=%sNusageu1   📦 GPT usage | prompt=%s completion=%s total=%sprompt_tokenscompletion_tokenstotal_tokensr   u-   📥 CHATGPT RAW RESPONSE (first 500 chars): i  z...{}   u   🔍 JSON EXTRACTION - Start: z, End: u   📋 EXTRACTED JSON STRING: u   ✅ JSON PARSED SUCCESSFULLYu   🎯 PARSED ANALYSIS KEYS: decisionHOLD
conviction
confidenceLOW	rationalezNo analysis providedr   score        '   
entry_zonelowr   highupper)NN)r   rI   )entry_price	stop_lossrisk_reward_ratiotargetsc                 S   s(   g | ]}|d urt |dkrt |qS )Nr   )float).0xr   r   r   
<listcomp>  s   ( z)call_chatgpt_analysis.<locals>.<listcomp>)r   rI   Ndecision_probabilityHIGHg      T@MEDIUMg      N@g      D@g      I@g      Y@u(   ❌ NO JSON FOUND in response. Content: zNo JSON found in responseu   ❌ JSON DECODE ERROR: u   🔍 FAILED JSON STRING: i  z.Analysis failed - invalid JSON response formatzError: zJSON parse error)rB   rE   rG   errorraw_responser4   responsebodyjsonc                   S   s   d S )Nr   r   r   r   r   <lambda><  s    z'call_chatgpt_analysis.<locals>.<lambda>rZ   codetyper"   i  insufficient_quotaz*OpenAI quota exceeded (insufficient_quota)z6GPT analysis temporarily unavailable (quota exceeded).z?Using non-GPT fallback is recommended until billing is updated.)rB   rE   rG   rZ   
error_code
error_typezChatGPT analysis failedzAnalysis failed: r   )'loggerinfor	   r   r6   r    r   r-   r.   r/   r   r0   r   warningr   r
   r   getattrchoicesr"   r)   r   findrfindr^   loadslistkeysgetrN   rS   minmax
isinstancedictrZ   
ValueErrorJSONDecodeError	exception) r7   r1   r*   token_kwargsr\   r2   r   fbr;   r)   	start_idxend_idxjson_stranalysisrH   score_fezrL   rM   low_fhigh_fkvtcleanedprobconfr4   r"   rd   r]   errr   r   r   call_chatgpt_analysisg   s  




"












(












"(


r   )#__doc__osr^   loggingtypingr   r   fastapir   app.v1.services.gpt_promptsr   openair   r,   ImportError	getLogger__name__re   getenvr   r	   r
   rS   r   r   r   r   r0   boolr   r   r    r3   r6   r   r   r   r   r   <module>   s4   
