Files
ai-g3sb-backman2.0/backend/llm/__pycache__/openai_client.cpython-312.pyc
T

110 lines
15 KiB
Plaintext
Raw Normal View History

Ë
(YßiU/ãóð—dZddlmZddlZddlZddlZddlmZddlm Z m
Z
m Z m Z ddl
mZmZddlmZmZej&e«ZeGd„d ««ZGd
„d «ZGd „d
«Z d dd„Zy)u‘
OpenAI API 客户端�装(�步/异步)
�供与 :mod:`llm.deepseek_client` �形�的接�,便于在需�时切� LLM 路由。
é)Ú annotationsN)Ú dataclass)ÚAnyÚDictÚListÚOptional)Ú AsyncOpenAIÚOpenAI)ÚChatCompletionÚChatCompletionMessagecóš—eZdZUdZded<dZded<dZded<dZd ed
<d Zd ed
<dZ d ed<dZ
d ed<dZ d ed<dZ d ed<dZ
ded<y)Ú OpenAIConfigu4OpenAI API é…�置(支æŒ� OpenAI 兼容网关)。ÚstrÚapi_keyzhttps://api.openai.com/v1Úbase_urlz gpt-4o-miniÚ
model_nameg333333Ó?ÚfloatÚ temperatureiÚintÚ
max_tokensgÍÌÌÌÌÌì?Útop_pçÚfrequency_penaltyÚpresence_penaltygN@ÚtimeoutNzOptional[Dict[str, str]]Ú
extra_headers)Ú__name__Ú
__module__Ú __qualname__Ú__doc__Ú__annotations__rrrrrrrrr©óúbackend/llm/openai_client.pyrrsg…á>à
ƒLØ/€HˆcÓ/Ø#€J�Ó#Ø€K�ÓØ€J�ÓØ€Eˆ5ÓØ"Ð�uÓ"Ø!Ð�eÓ!Ø€GˆUÓØ.2€MÐ+Ô2r#rcóº—eZdZdZdd„Zdd„Z dd„Z d dd„Zdd„Z dd„Z dd„Z
dd „Z d
d œ dd „Z d
dœ dd„Z
y)Ú OpenAIClientuï
OpenAI API 客户端(�步)。
说明:本项目其他模�仅�求具备 ``chat`` / ``chat_with_json`` 方法;
这里�外�供若干便�方法,与 DeepSeekClient 对�,便于�用�一套 prompt。
cóÊ—||_t|j|j|j¬«|_t jd|j|j«y)N©rrru1[OK] OpenAIClientåˆ�始化: model=%s, base_url=%s) Úconfigr
rrrÚclientÚloggerÚinfor©Úselfr)s r$Ú__init__zOpenAIClient.__init__0sK€ØˆŒ ÜØ—N‘NØ—_‘_Ø—N‘Nô
ˆŒ ô
� ‰ Ø ?Ø × Ñ Ø �O‰Oõ
r#c
ó—|jd|jj«}|jdd«}|jj||jd|jj«|jd|jj
«|jd|jj «|jd|jj«|jd|jj«dœ}|�||d<n||d<|jjr|jj|d < |jjjjdi|¤Ž}|jd
j}|j }|�6t"j%d |j&|j(|j*«|S#t,$r¬} t/| «}
d |
vr�d|
vr}d|
vryd|vru|j1dd«||d< |jjjjdi|¤Ž}|jd
jcYd} ~ S#t,$rYnwxYwt"j3d
| «‚d} ~ wwxYw)NrÚmax_completion_tokensrrrrr)ÚmodelÚmessagesrrrrrrruKOpenAI调用完æˆ�: prompt_tokens=%s, completion_tokens=%s, total_tokens=%szUnsupported parameteruOpenAI API调用失败: %sr")Úgetr)rrrrrrrrr*ÚchatÚ completionsÚcreateÚchoicesÚmessageÚusager+ÚdebugÚ
prompt_tokensÚcompletion_tokensÚ total_tokensÚ ExceptionrÚpopÚerror) r.r3Úkwargsrr1ÚparamsÚresponser9r:ÚeÚmsgs r$r5zOpenAIClient.chat=s@€Ø—Z‘Z  ¨d¯k©k×.DÑ.DÓEˆ
Ø &§
¡
Ð+BÀDÓ IÐð—[‘[×+Ñ+Ø Ø!Ÿ:™: m°T·[±[×5LÑ5LÓMØ—Z‘Z ¨¯©×):Ñ):Ó;Ø!'§¡Ø# T§[¡[×%BÑ%Bó"ð!'§
¡
Ø" D§K¡K×$@Ñ$@ó!ð—z‘z )¨T¯[©[×-@Ñ-@ÓAñ "
ˆð" !Ð ,Ø.CˆFÐ*Ò +à#-ˆF�<Ñ à �;‰;× $Ò $Ø&*§k¡k×&?Ñ&?ˆF�?Ñ #ð Ø'J t§{¡{×'7Ñ'7×'CÑ'C×'JÑ'JÑ'TÈVÑ'TˆHØ×&Ñ& qÑ)×1Ñ1ˆGØ—N‘NˆEØÐ Ü— ‘ ØaØ×'Ñ'Ø×+Ñ+Ø×&Ñ&ô ð ˆNøÜò ä�a“&ˆCà'¨3Ñ.Ø  CÑ'Ø+¨sÑ2Ø+°6Ñ9à—
‘
˜<¨Ô.Ø2<�Ð.Ñ/ðØB˜tŸ{™{×/Ñ/×;Ñ;×BÑBÑLÀVÑL�HØ#×+Ñ+¨AÑ.×6Ñ6Õ6øÜ òÙðúô
�L‰LÐ5°qÔ 9Ø ûð% ús>ÅBGÇ J Ç 2JÈAI!ÉJ É! I-É*JÉ,I-É-JÊJ c óü—|j|fi|¤Ž}|jxsdj«} d|vr:|jd«dz}|jd|«}|||j«}n=d|vr9|jd«dz}|jd|«}|||j«}t j
|«S#tj $r%}tjd|«d|dœcYd}~Sd}~wwxYw) NÚz```jsonéú```éu)JSONè§£æž�失败,返回原始内容: %sT)Ú_json_decode_failedÚ raw_content) r5ÚcontentÚstripÚfindÚjsonÚloadsÚJSONDecodeErrorr+Úwarning)r.r3rBr9rNÚstartÚendrEs r$Úchat_with_jsonzOpenAIClient.chat_with_jsonzs÷€ð�$—)‘)˜HÑ/¨Ñ/ˆØ—?‘?Ò( b×/Ñ/Ó1ˆð IؘGÑ#ØŸ ™  YÓ/°!Ñ3�Ø—l‘l 5¨%Ó0�Ø! %¨Ð,×2Ñ2Ó4‘ؘ'Ñ!ØŸ ™  UÓ+¨aÑ/�Ø—l‘l 5¨%Ó0�Ø! %¨Ð,×2Ñ2Ó4�Ü—:‘:˜gÓ&Ð &øÜ×#Ñ#ò IÜ �N‰NÐFÈÔ JØ+/ÀÑHÕ Hûð Iús³BCÃC;ÃC6Ã0C;Ã6C;c óð—ddlm}m}d|dœd|j|||¬«dœg}|j dd«|j d d
«|j
|fi|¤Ž}|j xsd j«} d | vr;| jd «d
z}
| jd|
«} | |
| j«} | Sd| vr9| jd«dz}
| jd|
«} | |
| j«} | S)Nr)ÚSQL_GENERATOR_SYSTEMÚSQL_GENERATOR_USERÚsystem©ÚrolerNÚuser)ÚschemaÚquestionÚdialectrrrçð?rHz```sqlérJrK) Úconfig.promptsrYrZÚformatÚ
setdefaultr5rNrOrP) r.Úpromptr_rarBrYrZr3rDrNrUrVs r$Ú generate_sqlzOpenAIClient.generate_sql�s€÷ LðÐ*>Ñ ?àØ-×4Ñ4Ø!¨F¸Gð5óñ
ð
ˆð ×ј-¨Ô-Ø×ј' 3Ô'Ø�4—9‘9˜XÑ0¨Ñ0ˆØ×#Ñ#Ò) r×0Ñ0Ó2ˆà �wÑ Ø—L‘L Ó*¨QÑ.ˆEØ—,‘,˜u eÓ,ˆCؘe CÐ(×.Ñ.Ó0ˆGð ˆð �gÑ
Ø—L‘L Ó'¨!Ñ+ˆEØ—,‘,˜u eÓ,ˆCؘe CÐ(×.Ñ.Ó0ˆGàˆr#c ó¶—ddlm}m}d|dœd|j||¬«dœg}|j dd«|j d d
«|j
|fi|¤ŽS) Nr)ÚVALIDATOR_SYSTEMÚVALIDATOR_USERr[r\r^)Úsqlr_rrrrb)rdrjrkrerfrW)r.rlr_rBrjrkr3s r$Ú validate_sqlzOpenAIClient.validate_sql®si€ßCðÐ*:Ñ ;ب×(=Ñ(=À#ÈfÐ(=Ó(UÑ Vð
ˆð
×ј-¨Ô-Ø×ј' 3Ô'Ø"ˆt×"Ñ" 8Ñ6¨vÑ6Ð6r#c ó¶—ddlm}m}d|dœd|j||¬«dœg}|j dd«|j d d
«|j
|fi|¤ŽS) Nr)ÚSCHEMA_LINKER_SYSTEMÚSCHEMA_LINKER_USERr[r\r^)r`Ú
table_listrrrrb)rdrorprerfrW)r.r`rqrBrorpr3s r$Ú
select_tableszOpenAIClient.select_tablesºst€÷ LðÐ*>Ñ ?àØ-×4Ñ4Ø%°*ð5óñ
ð
ˆð ×ј-¨Ô-Ø×ј' 3Ô'Ø"ˆt×"Ñ" 8Ñ6¨vÑ6Ð6r#cóF—ddlm}m}|xsdj«}|syd|dœd|j |¬«dœg}|j |dd d
¬ «}|j xsdj«}|r!|j«dj«nd}|jd «S)
Nr)Ú#CANONICALIZE_NL_FOR_TEXT2SQL_SYSTEMÚ!CANONICALIZE_NL_FOR_TEXT2SQL_USERrHr[r\r^)r`rrbé)rrr1u「ã€�"'“â€�)rdrtrurOrer5rNÚ
splitlines) r.r`rtruÚqr3rFÚtextÚlines r$Ú"normalize_nl_question_for_text2sqlz/OpenAIClient.normalize_nl_question_for_text2sqlÍs§€÷
ð
Š^˜× "Ñ "Ó $ˆÙØàÐ*MÑ NØÐ(I×(PÑ(PÐZ[Ð(PÓ(\Ñ ]ð
ˆð�i‰i˜¨c¸ÐTWˆiÓXˆØ— ‘ Ò!˜r×(Ñ(Ó*ˆÙ/3ˆt�‰Ó  Ñ#×)Ñ)Ô+¸ˆØ�z‰zÐ+Ó,Ð,r#có$—|j|«S©N)r{)r.r`s r$Útranslate_nl_question_to_zhz(OpenAIClient.translate_nl_question_to_zhßs€Ø×6Ñ6°xÓ@Ð@r#i@)Úmax_schema_charsc óÌ—ddlm}m}|xsdd|}d|dœd|j|xsd||¬«dœg} |j| fd d
d œ|¤Ž}
|
j
xsdj
«S) Nr)ÚEMPTY_RESULT_FEEDBACK_SYSTEMÚEMPTY_RESULT_FEEDBACK_USERrHr[r\r^õ(æ— ))r`rlr_gš™™™™™Ù?rv)rr1)rdr�r‚rer5rNrO) r.r`rlr_rrBr�r‚Ú schema_snipr3rFs r$Úempty_result_user_feedbackz'OpenAIClient.empty_result_user_feedbackâsŠ€÷ \à’| Ð%6Ð&6Ð7ˆ àÐ*FÑ GàØ5×<Ñ<Ø%Ò0¨ØØ&ð=óñ
ð

ˆðˆd�i‰i˜ÐW¨cÈÑWÐPVÑWˆØ—‘Ò" ×)Ñ)Ó+Ð,r#i )Ú
max_sql_charsc ó¼—ddlm}m}|xsdj«xsd}|xsdj«}t |«|kDr|d|dz
j «dz}d|dœd |j
||¬
«dœg} |jd d «|jd
d«|jdd«|j| fi|¤Ž}
|
jxsdj«S)Nr)Ú!SQL_PROBE_SUCCESS_DELIVERY_SYSTEMÚSQL_PROBE_SUCCESS_DELIVERY_USERrHrƒéu
-- …(已截断)r[r\r^)r`rlrgš™™™™™É?rrbr1i@)
rdrˆr‰rOÚlenÚrstriprerfr5rN) r.r`rlr†rBrˆr‰rxÚsr3rFs r$Ú"sql_probe_success_delivery_messagez/OpenAIClient.sql_probe_success_delivery_messageüsí€÷
ð
Š^˜× "Ñ "Ó $Ò /¨ˆØ
ŠY�B× Ñ Ó ˆÜ ˆq‹6�MÒ !ØÐ&�M BÑ&Ð'×.Ñ.Ó0Ð3HÑHˆAðÐ*KÑ LàØ:×AÑAÈ1ÐRSÐAÓTñ
ð
ˆð ×ј-¨Ô-Ø×ј' 3Ô'Ø×ÑÐ1°3Ô7؈d�i‰i˜Ñ+ FÑ+ˆØ— ‘ Ò!˜r×(Ñ(Ó*Ð*r#N©r)r©r3úList[Dict[str, str]]Úreturnr )r3r‘r’úDict[str, Any])Útsql)rgrr_rrarr’r)rlrr_rr’r“)r`rrqrr’r“)r`rr’r) r`rrlrr_rrrrBrr’r)
r`rrlrr†rrBrr’r)rrrr r/r5rWrhrmrrr{r~r…rŽr"r#r$r&r&(sÿ„ñó 
ó;ðzIØ,ðIà óIð,8>ðØðØ#&ðØ14ðà óó>
7ð7Øð7Ø),ð7à ó7ó&-ó$Að!%ñ
-àð-ðð-ðð -ð ð
-ðð-ð