gyi; :dZddlZddlZddlZddlZddlZddlZddlmZej ej ej ej e Z ej e dZejedejejdejej edejg ejeZGd d ZdS) u NanoBanana模型客户端 N)datetimelogsT)exist_okz4%(asctime)s - %(name)s - %(levelname)s - %(message)szapp.log)levelformathandlerscJeZdZdZdZd dZd dZd dZdd Zdd Z dd Z dS)NanoBananaClientc>d|_d|_d|_d|_dS)Nz-https://api.aimindsky.com/v1/chat/completionsz3sk-39a5vNBNbkkMA6YHP03h663tBno6OqfJKngWmQy0oT7JCP1Ozgemini-3-pro-image-preview)api_urlapi_key model_nametimeoutselfs 6/root/new_image_generate/backend/utils/model_client.py__init__zNanoBananaClient.__init__s"F L 6 cLtjS)u获取当前时间戳)rnow isoformatrs r get_timestampzNanoBananaClient.get_timestamp%s|~~'')))rffffff?c  ddl}|j}dd|jd}|j||dd}t d|d |jd}t|D]} td |Drt d|d |D]} t| d tr_| d D]V} | d dkr;| dd} t d|dt| Wtj|j||d|j} t d|d| j| jdkrt d|dnWt d|d| jt d|dt'| j| jdkr| j}t d| jt d| t-j|}t dt-j|ddd|vr|d dd}|d d d!}t d"|d#||d$vrt3d%|t3d%|}nt3d&| jd'|}nI#t,j$r7t d(t3d&| jd'|}YnwxYw| |d)z krt d*|d| z}t d+|d,t7j|p|| |cS#tjj$rt3d-|jd.}t d-|jd/| d)zd0|| |d)z kr t d1|d2|d| z}t d+|d,t7j|YBtjj $r}t3d3tC|}t d4tC|d5| d)zd0|| |d)z kr|t7jd| zYd}~d}~wwxYw|pt3d6)7u$发送请求到API,带重试机制rNzapplication/jsonzBearer )z Content-Type AuthorizationT)modelmessages temperaturestream[线程u] API请求开始 - 模型: c3fK|],}t|dtV-dS)contentN) isinstancegetlist).0msgs r z1NanoBananaClient._make_request..Bs8PPz#'')"4"4d;;PPPPPPru.] 图片编辑请求 - 消息类型: 多模态r$type image_urlurlu] 图片数据长度: )headersjsonr!ru] API响应状态码: u)] API响应成功,开始接收数据...u] API响应失败: u ] 响应头: uAPI请求失败,状态码: u错误响应内容: u解析后的错误数据: F) ensure_asciiindenterrormessage 未知错误codeu错误代码: u, 错误消息: )invalid_request_errorauthentication_erroruAPI服务错误: uAPI请求失败: z - u%无法解析错误响应为JSON格式u所有重试都失败了u等待 u 秒后重试...u请求超时(u秒),请稍后重试u秒),尝试 /u(所有重试都超时,总共尝试了 u 次u网络请求错误: u网络请求异常: u , 尝试 u 请求失败)" threadingcurrent_threadidentrrloggerinforangeanyr%r&r'lenrequestspostr r status_coder4dictr.textr/loadsdumps ExceptionJSONDecodeErrortimesleep_parse_stream_response exceptionsTimeoutRequestExceptionstr)rrr max_retriesr= thread_idr.payload last_errorattemptr) content_itemr,response error_text error_data error_msg error_code wait_timees r _make_requestzNanoBananaClient._make_request)s,,..4 /5t|55   _ &     ViVVT_VVWWW [))V V GU PPxPPPPPmKK c) c c cddd'mm%cggi&8&8$??m03Imm #/#3#3F#;#;{#J#J0<[0I%0PI$*KK0k)0k0k[^_h[i[i0k0k$l$l$l#=L#  L  ]i]]xG[]]^^^'3..KK ^) ^ ^ ^____LL!_9!_!_I]!_!_```LL![9![![4HXCYCY![![\\\'3..!)JLL!WAU!W!WXXXLL!D !D!DEEEj%)Z %;%;  %x$*ZfktuBvBvBv%x%xyyy"j00(27(;(?(? >(Z(ZI)3G)<)@)@)L)LJ"LL)a*)a)aV_)a)abbb *-^^^&/0OI0O0O&P&P P*33Ry3R3R)S)SJJ)23lxG[3l3l`j3l3l)m)mJ/jjj %LMMM%./h8CW/h/h\f/h/h%i%i j +/11 %?@@@((!"W IKK E) E E EFFFJy)))228YGGGGG&.   &'_'_'_'_``  ht|hhWWX[hh[fhhiiikAo--LL!]K!]!]!]^^^$$L  AiAAABBB 9%%%&7   &'Fc!ff'F'FGG  `CFF``Wq[``S^``aaakAo--$$ 1<(((  5In555sN1GO5C%L65O56AM<9O5;M<r? iter_linesdecoder@rA startswithstripr/rJr&r4rLrDappendrMrTjoin_extract_image_data)rr[rVr= content_parts line_countline line_text data_contentdatar^rjr$ra full_content image_datas rrPz'NanoBananaClient._parse_stream_responsesl      !00228I F =J ++--, ), )+)!OJ $ G 4 4I"Q $ri$r$rz$r$r^ghlilhl^m$r$r$rsss!++H55")'0} '--//8;;"KK([)([([([\\\!E'--//))'+z,'?'?$,t#3#3$*KK0k)0k0k[_`h[i0k0k$l$l$l$+d??04W 0A0A)^0\0\I$*LL1d91d1dYb1d1d$e$e$e*34S 4S4S*T*T$T$-#4#4T)_9M9MPQ9Q9Q,0OA,>,B,B7B,O,OE'0E'9'927 2B(5(<(r?r@rArb)rpromptr r=rVrs rgenerate_text_to_imagez'NanoBananaClient.generate_text_to_image s,,..4  RiRR&"+RRRSSS !   !!(K888rc2|||g|S)u9图片编辑功能(单张图片,保留向后兼容))generate_with_images)rr image_base64r s rgenerate_with_imagez$NanoBananaClient.generate_with_images((,MMMrc ddl}|j}t|ts|g}t |dkr(|dd}t d|dt d|d|dddt | tj td d }t|d d 5}|}dddn #1swxYwY|d|} nG#t"$r:} t d|dt%| d|} Yd} ~ nd} ~ wwxYwd| dg} t'|D]R\} } | dd| idt d|d| dzdt | Sd| dg}|||S)u图片编辑功能(支持多张图片) Args: prompt: 用户提示词 image_base64_list: 图片base64数据列表,最多3张 temperature: 创意度参数 rNrr"u+] 图片数量超过3张,已截取前3张u] 开始图片编辑请求: ru...,图片数量: model_promptzimage_edit.txtrrd)encodingz {user_prompt}u] 读取系统提示词失败: u,使用原始提示词rI)r+rIr,r-)r+r,u ] 添加第 r;u! 张参考图片,数据长度: rr)r=r>r?r%r'rDr@warningrAospathrp project_rootopenreadrnreplacerLrT enumeraterorb)rrimage_base64_listr r=rVprompt_file_pathf system_prompt final_promptrar$irrs rrz%NanoBananaClient.generate_with_imagess ,,..4 +T22 4!2 3   ! !A % % 1"1" 5  NN[[[ \ \ \ ~i~~VCRC[~~fij{f|f|~~ "!w||L.JZ[[ &g>>> 1! ! 0 0  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)00&IILL " " " NNoYoosSTvvooo p p p!LLLLLL "$    )):;; v vOA| NN#<    KKt)ttQttadeqarartt u u u u"   !!(K888s<*8D7"'D D7DD7DD77 E;0E66E;)rr)N)r) __name__ __module__ __qualname__rrrbrPrqrrrrrr r s ***o6o6o6o6bN=N=N=N=`>9999 NNNN<9<9<9<9<9<9rr )__doc__rEr/r{rNloggingrrrdirnameabspath__file__rrplog_dirmakedirs basicConfigINFO FileHandler StreamHandler getLoggerrr@r rrrrso  wrwrwrwx?X?X/Y/YZZ[[ ',,|V , ,  Gd#### , ABGLL)<<==  8 $ ${9{9{9{9{9{9{9{9{9{9r