
    J7ih                        d dl mZmZ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Zd dlZd dlmZ d dlZd dlmZ d dlZd dlZd dlZd dlmZ d dlZd d	lmZ d dlZ e         ej:                  ej<                  d
        ej>                  e       Z! eddd      Z"e"jG                  edgddgdg       g Z$ ejJ                  d      Z& ejJ                  d      Z' ejJ                  d      Z( ejJ                  d      Z) ejJ                  d      Z*e&e'e(e)e*fD ]  Z+e+se$jY                  e+        e$se!j[                  d        e.d      d a/e!ja                  d e1e$       d       dZ2dZ3 e1e$      Z4g Z5 G d de      Z6 G d  d!e      Z7d" Z8d_d#ej                  d$e9d%ej                  fd&Z:d'e;d(e;d)e9d%e6fd*Z<d`d+e=d(e;d)e9d,e>d%e6f
d-Z?e"j                  d.      d/        ZAe"j                  d0      d1        ZBe"j                  d2e73       ed4      fd5ee   fd6       ZDe"j                  d7      d8        ZEe"j                  d9      d:        ZFe"j                  d;      d<eeG   fd=       ZHe d>k(  rd dlIZI eJd?        eJd@        eJdA        eJdB        eJdC e1e$               eJdDe2 dE        eJdFe3 dG        eJdH e1e$       dI        eJdJ        eJdK        eJ         eJdL        eJdM        eJdN        eJdO        eJdP        eJdQ        eJdR        eJdS        eJdT        eJ         eJdUe2 dV        eJdW e1e$      dXz   dY e1e$       dZ        eJd[        eIj                  e"d\d]^       yy)a    )FastAPIFile
UploadFileHTTPException)CORSMiddleware)StreamingResponseN)Image)List)	BaseModel)load_dotenv)datetimez4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatz"Tree Species and DBH Detection APIz*Upload 1-10 tree images for batch analysis2.0.0)titledescriptionversion*T)allow_originsallow_credentialsallow_methodsallow_headersGEMINI_API_KEYGEMINI_API_KEY_2GEMINI_API_KEY_3GEMINI_API_KEY_4GEMINI_API_KEY_5u   ❌ No GEMINI_API_KEY found!z5At least one GEMINI_API_KEY must be set in .env file!u   ✅ Loaded z API key(s) for rotation
   g      @c                      e Zd ZU dZdZeed<   eed<   eed<   dZ	eed<   dZ
eed	<   dZeed
<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   g Zee   ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   y)TreeAnalysiszSingle tree analysis resultTsuccessfilenameimage_idUnknownspeciesNspecies_hindispecies_marathiscientific_nameLow
confidenceheightcanopygirthdbh_estimate	conditioncharacteristicsadditional_inforecommendationsremarks	timestamperror)__name__
__module____qualname____doc__r!   bool__annotations__strintr%   r&   r'   r(   r*   r+   r,   r-   r.   r/   r0   r
   r1   r2   r3   r4   r5        +/var/www/html/treecensus/species_ai/main.pyr    r    K   s    %GTMMGSM3OSOSJFCFCE3L#Is!#OT#Y#OSOSGSIsE3r?   r    c                   T    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ee   ed<   y)	BatchAnalysisResponsez Response for batch tree analysistotal_images
successfulfailedunhealthy_treesprocessing_timeresultsN)	r6   r7   r8   r9   r=   r;   floatr
   r    r>   r?   r@   rB   rB   b   s,    *OK,r?   rB   c                  R    t         t           } t        dz   t        t               z  a| S )zGet next API key in rotation   )GEMINI_API_KEYScurrent_key_indexlen)keys    r@   get_next_api_keyrP   l   s)     +
,C*Q.#o2FFJr?   imagemax_sizereturnc                     t        | j                        |kD  rN| j                  ||ft        j                  j
                         t        j                  d| j                          | S )zResize image if too largez   Resized to )maxsize	thumbnailr	   
ResamplingLANCZOSloggerinfo)rQ   rR   s     r@   resize_imager\   t   sM    
5::!8,e.>.>.F.FGnUZZL12Lr?   response_textr"   r#   c                    d||ddg t        j                         j                         d}| j                  d      }d}|D ]  }|j	                         }|j                  d      r)|j                  dd      j	                         }|sH||d	<   N|j                  d
      r<|j                  d
d      j	                         }|s|j                         dvs||d<   |j                  d      r<|j                  dd      j	                         }	|	s|	j                         dvs|	|d<   |j                  d      r+|j                  dd      j	                         }
|
s|
|d<   $|j                  d      r+|j                  dd      j	                         }|sY||d<   `|j                  d      r?|j                  dd      j	                         }|sd|j                         vs||d<   |j                  d      r?|j                  dd      j	                         }|sd|j                         vs||d<    |j                  d      r?|j                  dd      j	                         }|s5d|j                         vsI||d<   P|j                  d      r?|j                  dd      j	                         }|sd|j                         vs||d<   |j                  d      r+|j                  dd      j	                         }|r||d<   d}|j                  d      rd}|j                  d       rd!}|j                  d"      rd#}|j                  d$      rd%}0|j                  d&      s|j                  d'      sT|d(d j	                         }|sk|dk(  r|d   j                  |       |d!k(  r"d!|vs|d!   s||d!<   |d!xx   d)|z   z  cc<   |d#k(  r"d#|vs|d#   s||d#<   |d#xx   d)|z   z  cc<   |d%k(  sd%|vs|d%   s||d%<   |d%xx   d)|z   z  cc<    t        d*i |S )+z2Parse Gemini response into structured TreeAnalysisTr$   r)   )r!   r"   r#   r%   r*   r0   r4   
NzENGLISH NAME: r%   zHINDI NAME:)znot availablenazn/ar&   zMARATHI NAME:r'   zSCIENTIFIC NAME:r(   zCONFIDENCE:r*   zHEIGHT:notr+   zCANOPY:r,   zGIRTH:r-   zDBH:r.   z
CONDITION:r/   zCHARACTERISTICS:r0   zADDITIONAL INFO:r1   zRECOMMENDATIONS:r2   zREMARKS:r3   z- u   •     r>   )
r   now	isoformatsplitstrip
startswithreplacelowerappendr    )r]   r"   r#   datalinescurrent_sectionliner%   hindimarathisciconfr+   r,   r-   dbhconditems                     r@   parse_gemini_responserx   |   s    \\^--/D %EO X2zz| ???+ll?B7==?G")Y__]+LL399;E.LL(-_%___-ll?B7==?G7==?2PP*1&'__/0,,126<<>C*-&'__]+<<r288:D%)\"__Y'\\)R0668F%v||~5!'X__Y'\\)R0668F%v||~5!'X__X&LL2.446Eekkm3 %W__V$,,vr*002CuCIIK/'*^$__\*<<b1779D$([!)O__/0/O__/0/O__/0/O__Z('O__T"doof&=8>>#D"33&'..t4 $55$D0=N8O.2D*+*+sTz9+ $55$D0=N8O.2D*+*+sTz9+ I-D(Y&*DOOsTz1OqX2t $r?   
image_data	add_delayc                 
  K   |rAt         j                  dt         d| d       t        j                  t               d{    t         j                  d| d|        	 t        j                  t        j                  |             }t         j                  d|j                   d|j                          |j                  d	k(  rHt        j                  d
|j                  d      }|j                  ||j                         d          |}n |j                  d
k7  r|j                  d
      }t        |      }t        j                         }|j!                  |dd       |j#                         }d}t9        t:              D ]j  }	 t=               }t?        j@                  |       t?        jB                  d      }t         j                  dtD        tG        tH              z  dz    dtG        tH               d|dz    dt:         d	       |jK                  |dtM        jN                  |      jQ                  d      d g      }tS        |jT                  jW                         ||      }t         j                  d!| d"|jX                   d#|jZ                   d$       t         j                  d%|j\                   d&|j^                          t2        j5                  |j7                                |c S  y7 # t$        $ r}dt'        |       }	t         j)                  d| d|	        t+        d|||	t-        j.                         j1                               }
t2        j5                  |
j7                                |
cY d}~S d}~ww xY w# t$        $ r}t'        |      }	d'|	v s%d(|	ja                         v sd)|	ja                         v r t         jc                  d*| d+|dz    dt:                |t:        dz
  k  r9t         j                  d,       t        j                  d-       d{  7   Y d}~t         j)                  d| d.tG        tH               d/       t+        d||d0tG        tH               d1t-        j.                         j1                               }
t2        j5                  |
j7                                |
cY d}~c S t         j)                  d| d2| d3|	        t+        d|||	t-        j.                         j1                               }
t2        j5                  |
j7                                |
cY d}~c S d}~ww xY ww)4zIAnalyze single tree image with AI (with retry logic and API key rotation)u   ⏳ Rate limit delay: z	s before z...Nu   📸 [z] Processing: z   Image size: z, Mode: RGBARGB)   r~   r~      )maskJPEGU   )r   qualityzImage processing error: u   ❌ [] F)r!   r"   r#   r5   r4   u  Analyze this tree image thoroughly and provide detailed information in the EXACT format below:

ENGLISH NAME: [Common English name of the tree species]
HINDI NAME: [Hindi name if known, otherwise "Not available"]
MARATHI NAME: [Marathi name if known, otherwise "Not available"]
SCIENTIFIC NAME: [Full scientific name - Genus species]
CONFIDENCE: [High/Medium/Low - based on visible features and image clarity]
HEIGHT: [Estimated height in meters, e.g., "12-15 meters" or "Not clearly visible"]
CANOPY: [Canopy diameter/spread in meters, e.g., "8-10 meters" or "Not clearly visible"]
GIRTH: [Tree circumference at breast height (1.3m), e.g., "2.5 meters" or "Not measurable from image"]
DBH: [Diameter at Breast Height calculated from girth, e.g., "79.6 cm" or "Not calculable"]
CONDITION: [Overall health - Healthy/Good/Fair/Poor/Declining with detailed explanation of visible signs]
CHARACTERISTICS:
- [Bark texture, color, and pattern details]
- [Leaf shape, size, arrangement, and color]
- [Branch structure and growth pattern]
- [Any flowers, fruits, or seeds visible]
- [Unique identifying features]
- [Additional observable characteristics]
ADDITIONAL INFO: [Ecological information - native habitat, typical growth conditions, cultural significance, common uses, interesting facts about this species]
RECOMMENDATIONS: [Specific care recommendations for this species - watering needs, pruning guidelines, fertilization, pest management, best growing conditions, seasonal care tips]
REMARKS: [Specific observations about THIS tree - any visible issues, notable features, age estimation if possible, overall assessment]

IMPORTANT:
1. Be as specific and detailed as possible with all measurements and descriptions
2. For DBH calculation: DBH = Girth / π (if girth is measurable)
3. Provide botanical details to justify species identification
4. Include both common and scientific nomenclature
5. Be honest about confidence level - explain if uncertain
6. Base all observations on what's actually visible in the image)api_keyzmodels/gemini-2.5-flashu      🔑 Using API key #rK   /z
 (attempt z)...z
image/jpegzutf-8)	mime_typerm   u   ✅ [z] SUCCESS: z ()z   DBH: z, Condition: 429quotaexceededu   ⚠️ [z] Quota exceeded on attempt u   🔄 Trying next API key...rc   z] All z API keys exhaustedzAll zQ API keys have exceeded their quota. Please try again later or add more API keys.z
] FAILED:  - )2rZ   r[   RATE_LIMIT_DELAYasynciosleepr	   openioBytesIOrV   modenewpasterg   convertr\   savegetvalue	Exceptionr<   r5   r    r   re   rf   analysis_historyrl   
model_dumprangeMAX_RETRIESrP   genai	configureGenerativeModelrM   rN   rL   generate_contentbase64	b64encodedecoderx   textrh   r%   r(   r.   r/   rk   warning)ry   r"   r#   rz   rQ   
background
img_buffer	img_bytese	error_msgerror_resultpromptretryr   modelresponseresults                    r@   analyze_tree_imager      s     ,-=,>izQTUVmm,---
KK&
.
;<

2::j12oejj\%**FG ::5%**oFJUq)9:EZZ5 MM%(E U# ZZ\


:fb
9'')	 DF@ {# :$9	$&(GOOG,))*CDEKK13Ds?G[3[_`2`1aabcfgvcwbx  yC  DI  LM  DM  CN  NO  P[  O\  \`  a  b--*F4D4DY4O4V4VW^4_`/ H +8==+>+>+@(HUFKK%zV^^4DBvG]G]F^^_`aKK(6#6#6"7}VEUEUDVWX ##F$5$5$78M+:$O 	.2  .s1vh7	uXJb45#lln..0
 	 7 7 9:J  #	$AI 	!W	0A%AZS\SbSbSdEd(3OPUXYPY{Z[\g[hij;?*KK"=?!--*** LL5
&_9M8NNa!bc#/ %!)!) $S%9$:  ;L  M"*,,.":":"<$L %++L,C,C,EF'' uXJj
#i[QR+!%%#&lln668  !''(?(?(AB##G#	$s   ?U
K3U
"DK6 3U
	E%N
.U
6	N?A=N<N=U
NU


UBU&P)'U,U
2BU UU
A2U:U;U
UU
r   c                     K   dddt         t         dt        t              dt          ddj	                  t               dd	d
dddS w)zAPI Informationu%   🌳 Tree Species & DBH Detection APIr   zFlexible Batch Processing seconds between imagesz	Upload 1-z tree images for analysisz/POST /api/analyze-multiple (upload 1-{} images)zGET /api/healthzGET /api/statszGET /api/export/csvz	GET /docs)analyzehealthstatsexportdocs)namer   r   
max_imagesrate_limit_delayapi_keys_availablemessage	endpoints)
MAX_IMAGESr   rN   rL   r   r>   r?   r@   rootr   r  s_      8+ /00GH!/2zl*CDHOOPZ['%+
 s   AAz/api/healthc            	         K   dt        t              dkD  t        t              dt        t        t        t              dS w)zHealth Checkhealthyr   zFLEXIBLE BATCH PROCESSING)statusapi_configuredapi_keys_countr   r   r   total_analyses)rN   rL   r   r   r   r>   r?   r@   health_checkr     s<      o.2o.+ ,./ s   =?z/api/analyze-multiple)response_model.filesc                   K   t        j                          }t        j                  d       t        j                  d       t        j                  dt        |               t        j                  dt         d       t        j                  dt        t
                      t        j                  d       t        |       dk  r"t        j                  d       t        d	d
      t        |       t        kD  rPt        j                  dt        |        dt                t        d	dt         dt        |        dt         d      t        |       D ]i  \  }}|j                  r|j                  j                  d      r.t        j                  d|j                          t        d	d|j                   d       	 t        j                  d       g }t        |       D ]t  \  }}|j                          d{   }|j                  ||j                  |dz   f       t        j                  d|dz    d|j                   dt        |      dd       v t        j                  dt         d       t        |       t        z  }t        j                  d|d d!       g }t        |      D ]6  \  }\  }}	}
|d"kD  }t        ||	|
|#       d{   }|j                  |       8 t!        d$ |D              }t!        d% |D              }g d&t!        fd'|D              }t        j                          |z
  }t        j                  d       t        j                  d(       t        j                  d)t        |        d*| d+| d,|        t        j                  d-|d.d!       t        j                  d       t#        t        |       |||t%        |d/      |0      S 7 7 # t        $ r  t&        $ rf}t        j                  d1t)        |              t        j                  t+        j,                                t        d2d3t)        |             d}~ww xY ww)4u   
    🌳 FLEXIBLE TREE ANALYSIS - Upload 1-10 tree images
    
    Features:
    - Upload anywhere from 1 to 10 images (botanist's choice)
    - Rate limited (5.5s delay between images)
    - Automatic API key rotation on quota exceeded
    - Comprehensive analysis: Species, DBH, Height, Canopy, Girth, Health
    - Regional names (Hindi & Marathi)
    - Detailed characteristics and recommendations
    
    Returns:
    - Complete analysis for all trees
    - Success/failure statistics
    - Unhealthy tree count
    - Processing time
    P================================================================================u   🌳 BATCH ANALYSIS REQUESTu   📊 Images received: u   📋 Allowed range: 1-z imagesu   🔑 API keys available: rK   u   ❌ No images uploaded  zPlease upload at least 1 image.status_codedetailu   ❌ Too many images: z > zMaximum z( images allowed per batch. You uploaded z images. Please select up to z images only.zimage/u   ❌ Invalid file type: zFile 'z=' is not an image. All files must be images (JPG, PNG, WEBP).u   📂 Reading uploaded files...Nu      ✓ [r   r   ,z bytesu)   🔄 Starting sequential processing with zs rate limiting...u   ⏱️  Estimated time: ~z.0fz secondsr   )rz   c              3   :   K   | ]  }|j                   sd   ywrK   Nr!   .0rs     r@   	<genexpr>z)analyze_multiple_trees.<locals>.<genexpr>  s     9qqyy9   c              3   :   K   | ]  }|j                   rd   ywr   r   r   s     r@   r   z)analyze_multiple_trees.<locals>.<genexpr>  s     91qyyQ9r   )poor	declining	unhealthydiseasedstresseddamagedweakc              3      K   | ]4  j                   sj                  st        fd D              rd 6 yw)c              3   V   K   | ]   }|j                   j                         v  " y w)N)r/   rk   )r   wordr   s     r@   r   z3analyze_multiple_trees.<locals>.<genexpr>.<genexpr>  s#     V441;;#4#4#66Vs   &)rK   N)r!   r/   any)r   r   unhealthy_keywordss    @r@   r   z)analyze_multiple_trees.<locals>.<genexpr>  s5      XaaiiAKKVCUVV  Xs   >>>u   ✅ BATCH ANALYSIS COMPLETEDu   📊 Total: z | Success: z | Failed: z | Unhealthy: u   ⏱️  Processing time: .1frc   )rC   rD   rE   rF   rG   rH   u   ❌ CRITICAL ERROR: i  zServer error during analysis: )timerZ   r[   rN   r   rL   r5   r   	enumeratecontent_typeri   r"   readrl   r   r   sumrB   roundr   r<   	traceback
format_exc)r   
start_timeidxfile
files_datacontentsestimated_timerH   rm   r   img_idrz   r   rD   rE   r   rG   r   r   s                     @r@   analyze_multiple_treesr     s    & J
KK
KK-/
KK(U56
KK(G<=
KK+C,@+ABC
KK 5zA~-/4
 	
 5zJ,SZLJ<HIj\)QRUV[R\Q] ^**4]D
 	
 u% 	T  (9(9(D(DX(NLL24==/BC.kl 7
45
"5) 	WIC!YY[(Hxa@AKK(3q5'DMM?#c(mA=NfUV	W 	?@P?QQcdeU&66/s/C8LM)2:)> 	#%C%$fqI-dD&IVVFNN6"		# 9G99
999 k X7 X X	 ))+
2F24l3u:,l:,kRXQYYghqgrst//DHMNF$U!%!/15
 	
C ) W:   
+CF845Y))+,3CF8<
 	

sW   FQ'>Q';O, ?O& CO, O)DO, %Q'&O, )O, ,Q$>A!QQ$$Q'z
/api/statsc                    K   t         sddiS t        t               } t        d t         D              }| |z
  }i }t         D ]C  }|j                  d      s|j                  d      s'|d   }|j                  |d      dz   ||<   E | ||| dkD  r|| z  dz  d	d
ndt	        t        |j                         d d      dd       dS w)zGet analysis statisticsr   z9No analysis history available yet. Upload trees to begin!c              3   F   K   | ]  }|j                  d d      sd  yw)r!   FrK   N)get)r   as     r@   r   z!get_statistics.<locals>.<genexpr>  s     L1AEE)U4KQLs   !!r!   r%   r   rK   d   r   %z0%c                     | d   S )NrK   r>   )xs    r@   <lambda>z get_statistics.<locals>.<lambda>  s
    QqT r?   T)rO   reverseNr   )r   rD   rE   success_ratespecies_frequency)r   rN   r   r   dictsorteditems)totalrD   rE   species_freqr   r%   s         r@   get_statisticsr	    s      VWW !EL 0LLJZF L E55i 0	lG$0$4$4Wa$@1$DL!E   <AAIJu,S0#6a84!&););)=>[_"`adbd"ef s   ACC&ACz/api/export/csvc                  J  K   t         st        dd      t        j                         } g d}t	        j
                  | |      }|j                          t         D ]  }|j                  i d|j                  dd      d|j                  dd      d	|j                  d	d      d
|j                  d
d      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      ddj                  |j                  dg             d|j                  dd      d|j                  dd      d|j                  dd      |j                  dd      |j                  dd      d        | j                  d       t        t        | j                         g      ddd i!      S w)"z"Export all analysis history as CSVi  zNo analysis history availabler   )r4   r#   r"   r%   r(   r&   r'   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r!   r5   
fieldnamesr4   r`   r#   r"   r%   r(   r&   r'   r*   r+   r,   r-   r.   r/   r0   ; r1   r2   r3   r!   Fr5   )r!   r5   r   text/csvContent-Dispositionz.attachment; filename=tree_analysis_history.csv
media_typeheaders)r   r   r   StringIOcsv
DictWriterwriteheaderwriterowr   joinseekr   iterr   )outputr  writerrecords       r@   export_all_historyr    sU     4STT[[]FJ ^^Fz:F
"  
K4


:r2
 

:r2
 vzz)R0	

 vzz*;R@
 VZZ<
 vzz*;R@
 &**\26
 fjj2.
 fjj2.
 VZZ,
 FJJ~r:
 K4
 tyy4Er)JK
 vzz*;R@
  vzz*;R@!
" vzz)R0#
$ zz)U3ZZ,'
 	. KKNfoo !&*XZ s   H!H#z/api/export/csv/resultsrH   c                 b  K   | st        dd      t        j                         }g d}t        j                  ||      }|j                          | D ]z  }|j                  i d|j                  dd      d|j                  dd      d	|j                  d	d      d
|j                  d
d      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      ddj                  |j                  dg             d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      i       } |j                  d       t        t        |j                         g      dddt        j                         j                  d       d i!      S w)"zExport provided results as CSVr   zNo results to exportr   )r4   r#   r"   r%   r(   r&   r'   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r!   r  r4   r`   r#   r"   r%   r(   r&   r'   r*   r+   r,   r-   r.   r/   r0   r  r1   r2   r3   r!   Fr   r  r  z#attachment; filename=tree_analysis_z%Y%m%d_%H%M%Sz.csvr  )r   r   r  r  r  r  r  r   r  r  r   r  r   r   re   strftime)rH   r  r  r  r  s        r@   export_current_resultsr!  N  sf     4JKK[[]FJ ^^Fz:F
  
K4


:r2
 

:r2
 vzz)R0	

 vzz*;R@
 VZZ<
 vzz*;R@
 &**\26
 fjj2.
 fjj2.
 VZZ,
 FJJ~r:
 K4
 tyy4Er)JK
 vzz*;R@
  vzz*;R@!
" vzz)R0#
$ vzz)U3%
 	, KKNfoo !&*MhllnNeNefuNvMww{(|} s   H-H/__main__zQ
================================================================================u%   🌳 TREE SPECIES & DBH DETECTION APIr   u4   🔧 AI System:             Advanced Vision Analysisu   🔑 API Keys Loaded:       u(   📊 Upload Mode:           FLEXIBLE (1-z images)u   ⏱️  Rate Limit:            r   u+   🔄 Auto Retry:            Enabled (up to z keys)u1   🌐 Server:                http://localhost:8000u6   📚 API Documentation:     http://localhost:8000/docsu   📋 Analysis Includes:u7      ✓ Species identification (English, Hindi, Marathi)u1      ✓ DBH (Diameter at Breast Height) estimationu%      ✓ Height and Canopy measurementsu      ✓ Girth measurementu"      ✓ Health condition assessmentu      ✓ Detailed characteristicsu      ✓ Care recommendationsu      ✓ CSV export functionalityu4   💡 Botanist-Friendly: Upload any number from 1 to z trees!u   🎯 Daily Capacity: ~   z requests with z	 API keyszQ================================================================================
z0.0.0.0i@  )hostport)i   )F)Lfastapir   r   r   r   fastapi.middleware.corsr   fastapi.responsesr   google.generativeaigenerativeair   PILr	   r   ostypingr
   loggingpydanticr   r   r   r   dotenvr   r   r   r  basicConfigINFO	getLoggerr6   rZ   appadd_middlewarerL   getenv	api_key_1	api_key_2	api_key_3	api_key_4	api_key_5rO   rl   r5   
ValueErrorrM   r[   rN   r   r   r   r   r    rB   rP   r=   r\   r<   rx   bytesr:   r   r   r   r   postr   r	  r  r  r!  uvicornprintrunr>   r?   r@   <module>rB     sZ   < < 2 / #  	 	          
    
,,A 
		8	$
.<   %%%   BII&'	BII()	BII()	BII()	BII()	 y)Y	B $C
s#$ 
LL/0
L
MM   k#o.//GH I 
 /"  9 . I   s ekk i  i  i s i | i XG$ G$# G$ G$Y] G$jv G$T  ( 
 
 
!2GH;?9 l
Z(8 l
 Il
^  2 	+ +\ 
#$*$t* * %*Z z	-	
12	&M	@B	(_)=(>
?@	4ZL
IJ	+,<+==T
UV	7O8L7MV
TU	=?	BD	#J	#%	CE	=?	13	$&	.0	+-	')	+-	#J	@G
TU	"3#7"#<"=_SQ`MaLbbk
lm	-GKK)$/5 r?   