
    i              	       p   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlZd dlmZ ej                            ej                            e                    Z ej        dd          ZddZdefdZ e             d	ej        d
<    ej        d	            ej        d                              ej                    ej        d                              ej                   dedefdZddedede defdZ!dedededefdZ"dede
ee	f         fdZ#d Z$e%dk    r e$             dS dS )    N)AnyDict)run_kyc_auto_variantKYC_OCR_MODELzgpt-4o-minireturnc                     t           j                            t          d          df} | D ]\}t           j                            |          s#	 t          |dd          5 }|D ]}|                                }|r|                    d          r.|                    d          r)|t          d          d                                         }d	|vrq|	                    d	d
          \  }}|                                }|s|                                                                                    d          }|r|t           j
        vr|t           j
        |<   	 ddd           n# 1 swxY w Y   M# t          $ r Y Zw xY wdS )zOLoad environment variables from local .env if missing from current environment.z.envz/var/www/html/.envrzutf-8encoding#zexport N=   z"')ospathjoin
_REPO_ROOTisfileopenstrip
startswithlensplitenvironOSError)
candidatesr   fraw_linelinekeyvalues          run_kyc_cli.py_load_dotenvr"      s    	Z((J   w~~d## 		dC'222 0a ! 0 0H#>>++D !4??3#7#7 ! y11 =#C	NNOO4::<<$ !%C!3!3JC))++C ! !KKMM//1177>>E 0s"*44*/
300 0 0 0 0 0 0 0 0 0 0 0 0 0 0   	 	 	H	) s7   E7 C=E*E7*E.	.E71E.	2E77
FFc                      t          j        d          p.t          j        d          pt          j        d          pt          S )Nr   OPENAI_MODELKYC_GEMINI_MODEL)r   getenv_DEFAULT_OPENAI_MODEL     r!   _default_openai_modelr*   2   sC    
	/"" 	!9^$$	!9'((	! !	r)   ignorePYTHONWARNINGSinsightfacenumpysc                     | pd                                                                 } |                     d          p|                     d          S )N zhttp://zhttps://)r   lowerr   )r/   s    r!   _is_urlr3   C   sD    	
b!!A<<	"">all:&>&>>r)         4@urlout_path	timeout_sc                 j   dddd}t           j                            | |d          }t           j                            ||          5 }|                                }d d d            n# 1 swxY w Y   t          |d          5 }|                    |           d d d            n# 1 swxY w Y   |S )	NzMozilla/5.0 (TrendoKYC/1.0)z*/*close)z
User-AgentAccept
ConnectionGET)headersmethod)timeoutwb)urllibrequestRequesturlopenreadr   write)r5   r6   r7   r=   reqrespdatar   s           r!   	_downloadrJ   H   s%   3 G
 .
 
 ge
 
D
DC			Y		7	7 4yy{{              	h		 	              Os$   
A++A/2A/B((B,/B,path_or_urltmpdirnamec                     | sdS t          |           r6d}t          j                            || |           }t	          | |          S | S )Nr1   z.jpg)r3   r   r   r   rJ   )rK   rL   rM   extouts        r!   resolve_imagerQ   V   sW     r{ +gll6d>C>>22c***r)   argc                 8   | si S |                                  } |                     d          rZ| dd                                           }t          |dd          5 }t          j        |          cd d d            S # 1 swxY w Y   t          j        |           S )N@r   r	   z	utf-8-sigr
   )r   r   r   jsonloadloads)rR   r   r   s      r!   load_user_inputrX   `   s     	
))++C
~~c  122w}}$k222 	 a9Q<<	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 :c??s   A==BBc                     t          j                    } |                     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t                      d           |                     ddd           |                     ddd           |                     ddd            |                     d!dd"           |                     d#dd$%           |                                 }t          |j                  }|j        rd&ndt          j	        d'<   |j
        p.|j        p't          j        d(          pt          j        d)          }|r|t          j	        d*<   |j        p|j        pt                      }|r|t          j	        d+<   d,d-lm} |j        r|j        t          j	        d.<   |j        rd&t          j	        d/<   t'          j                    5 }t+          |j        |d0          }|j        rt+          |j        |d1          nd }t1          t2          |j        |j        |j        |j        |||||j        d2d3d4|j        pdt=          |j                  d5|j        6          }	tA          tC          j"        |	d7d89                     d d d            d S # 1 swxY w Y   d S ):Nz--php-endpointTzPolicy server endpoint (PHP))requiredhelpz--model-pathr1   z9YOLO model path (.pt) [optional; server policy preferred])defaultr[   z
--doc-typeze.g. id_cardz	--countryze.g. IRz--doczDocument image path OR URLz--selfiez#Selfie image path OR URL (optional)z--user-inputzJSON string OR @file.jsonz--device0)r\   z--debug
store_true)actionz--openai-modelzChatGPT OCR model overridez--openai-api-keyzOpenAI API key overridez--gemini-modelz&Legacy alias; mapped to --openai-modelz--gemini-api-keyz(Legacy alias; mapped to --openai-api-keyz--identity-rulesz:Path to identity_rules.json (country ID formats/checksums)z--strict-identityz2Fail (REVIEW) if a strict key has no identity rule)r_   r[   1KYC_OCR_DEBUGKYC_GEMINI_API_KEYGOOGLE_API_KEYOPENAI_API_KEYr   r   )llm_ocrKYC_IDENTITY_RULES_PATHKYC_STRICT_IDENTITY_REGISTRYdocselfieg
ףp=
?g(\?gq=
ףp?)face_match_thresholdapprove_min_extractionapprove_min_match_coreidentity_rules_pathstrict_identity_registry)kyc_engine_modulephp_endpoint_url
model_pathdoc_typecountrydoc_image_pathselfie_image_path
user_inputre   debugdefaultsdeviceF   )ensure_asciiindent)#argparseArgumentParseradd_argumentr*   
parse_argsrX   rv   rw   r   r   openai_api_keygemini_api_keyr&   openai_modelgemini_modelllm_ocr_openaire   identity_rulesstrict_identitytempfileTemporaryDirectoryrQ   rh   ri   r   kycphp_endpointrq   rr   rs   boolry   printrU   dumps)
apargsrv   r   r   re   rL   doc_pathselfie_pathress
             r!   mainr   k   s   		 	"	"BOO$t:XOYYYOONB5pOqqqOOL4nOEEEOOK$YO???OOGd1MONNNOOJ1VOWWWOONT8SOTTTOOJO,,,OOIlO333 OO%'')    
 OO&9ROSSS OO5    
 OO7    
 OO&9uOvvvOO'CwOxxx==??D 11J *."<##BJ 	'	'9)**	' 9%&&	   6'5
#$$T(9T=R=T=TL 3&2
?#&&&&&&  D040C
,- 958
12 
	$	&	& =& 6599FJk[mDKBBBW["!!.]L#)!* )-*.*. (,':'@b,01E,F,F	 	 ;+
 
 
0 	dj5;;;<<<9= = = = = = = = = = = = = = = = = =s   B7MMM__main__)r   N)r4   )&r}   rU   r   warningsloggingr   urllib.requestrA   typingr   r   kyc_policy_engine_llm_v2r   policy_provider_llm_v2r   r   dirnameabspath__file__r   r&   r'   r"   strr*   r   filterwarnings	getLoggersetLevelERRORr   r3   floatrJ   rQ   rX   r   __name__r(   r)   r!   <module>r      sB     				                ' & & & 7 7 7 7 7 7 W__RW__X6677
!	/=AA    <s     '
    ! ! !  -     ) )'- 8 8 8  '   # #GM 2 2 2?s ?t ? ? ? ?
 3 # % 3    s C s s     c3h    \= \= \=~ zDFFFFF r)   