Files
ai-g3sb-backman2.0/__pycache__/api_server.cpython-312.pyc
T

174 lines
30 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
²«ÜiROãó„ —dZddlmZddlZddlZddlZddlZddlZddl Z ddl
m Z ddl m
Z
mZmZmZmZddlmZddlmZmZmZm ZddlmZdd lmZmZdd
lmZm Z dd l!m"Z"e e#«jI«jJZ&e&d z Z'e(e'«ejRvr"ejRjUde(e'««dd
l+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5m6Z6e jne jpdd¬«e jre:«Z;e"e e#«jI«jJdz «da<da=d„Z>Gd„de«Z?Gd„de«Z@Gd„de«ZAGd„de«ZBGd„de«ZCGd „d!e«ZDGd"„d#e«ZEGd$„d%e«ZFGd&„d'e«ZGGd(„d)e«ZHGd*„d+e«ZIdod,„ZJdpd-„ZKdqd.„ZLdrd/„ZMdsd0„ZNdtdud1„ZOdvd2„ZPedwd3„«ZQed4d5d6eQ¬7«ZReRj§ed8gd9d8gd8g¬:«eRj©d;«d<„«ZUeRj­d=«dxd>„«ZWeRj­d?«dxd@„«ZXeRj­dA«dydB„«ZYeRj©dA« dz d{dC„«ZZeRj©dD«edEdF¬G«dddHdf d|dI„«Z[eRj¹dJ«d}dK„«Z]eRj¹dL« d~dM„«Z^eRj¿dN« d d€dO„«Z`eRj­dP«d�dQ„«ZaeRj­dR«edE«fd‚dS„«ZbeRj©dR« dƒ d„dT„«ZceRj©dU« d d…dV„«ZdeRj­dU«d†dW„«ZeeRj¹dX«eef¬Y«ddf d‡dZ„«ZgeRj¿dX« d dˆd[„«ZheRj©d\« d‰ dŠd]„«ZieRj­d^«d_„«ZjeRj©d`«da„«Zke:dbk(rwddllZlemejÜdcdd««ZoejÜdedf«Zpe;jãdgep›dheo›�«e;jãdiep›dheo›dj�«eljädkepeodldm¬n«yy)‹uo
FastAPI �务入� - Text2SQL NL Chat API
包装 Text2SQLOrchestrator 为 REST API �务,供�端调用
é)Ú annotationsN)ÚPath)ÚOptionalÚListÚDictÚAnyÚ
AsyncIterator)Úasynccontextmanager)ÚFastAPIÚ
HTTPExceptionÚBodyr)ÚCORSMiddleware)ÚStreamingResponseÚ JSONResponse)Ú BaseModelÚField)Ú load_dotenvÚbackend)Úsetup_environmentÚ load_schemaÚcreate_orchestratorÚresolve_sql_dialect)ÚGenerationResult)Ú
lite_nl_store)Ú DialogIntentÚclassify_dialogz1%(asctime)s [%(levelname)s] %(name)s: %(message)sz%Y-%m-%d %H:%M:%S)ÚlevelÚformatÚdatefmtz.envcó(—t�tSt«s td«‚tjdd«}tjdd«}t ||«aGd„d«}tt |««atjd«tS) u获å�–或åˆ�始化 orchestratorNu$环境检查失败,请检查é…�ç½®Ú SCHEMA_PATHz9./data/schemas/G3SB_MCDataDictionary_table_structure.jsonÚSCHEMA_META_PATHcó&—eZdZejd«Zejdd«Zeejdd««Ze ejdd««Z
e ejdd ««Z d
Z ejd d «Z
d
Zejdd«j«dvZe ejdd««Ze ejdd««Zejdd«j'«j«dvZy
)úget_orchestrator.<locals>.ArgsÚDEEPSEEK_API_KEYÚ
MODEL_PRIMARYz
deepseek-chatÚ TEMPERATUREz0.3Ú
MAX_TOKENSÚ4096Ú MAX_RETRYÚ2NÚVECTOR_DB_PATHz./data/embeddings/chromaFÚFEWSHOT_ENABLEDÚtrue)r.Ú1ÚyesÚ
FEWSHOT_TOP_KÚ3ÚFEWSHOT_MIN_RATINGÚ7ÚTRANSLATE_EN_TO_ZH)Ú0ÚfalseÚnoÚoff)Ú__name__Ú
__module__Ú __qualname__ÚosÚgetenvÚapi_keyÚmodelÚfloatÚ temperatureÚintÚ
max_tokensÚ max_retryÚembedding_modelÚ vector_dbÚno_vector_searchÚlowerÚ
no_fewshotÚ
fewshot_top_kÚfewshot_min_ratingÚstripÚno_translate_en©óú2C:\Users\24019\Desktop\backman-camel\api_server.pyÚArgsr$@s „Ø�"—)‘)Ð.Ó/ˆØ�— ‘ ˜/¨?Ó;ˆÙ˜I˜BŸI™I m°UÓ;Ó<ˆ Ù˜˜Ÿ™ <°Ó8Ó9ˆ
Ù˜ ˜Ÿ ™  +¨sÓ3Ó4ˆ ؈Ø�B—I‘IÐ.Ð0JÓKˆ Ø ÐØ"˜Ÿ™Ð#4°fÓ=×CÑCÓEÐI]Ð]ˆ
Ù˜I˜BŸI™I o°sÓ;Ó<ˆ
Ù   §¡Ð+?ÀÓ!EÓFÐØ#˜"Ÿ)™)Ð$8¸&ÓA×GÑGÓI×OÑOÓQðV
ð
‰rPrRu![OK] Orchestrator åˆ�始化完æˆ�)
Ú orchestratorrÚ RuntimeErrorr=r>rÚschema_managerrÚloggerÚinfo)Ú schema_pathÚschema_meta_pathrRs rQÚget_orchestratorrZ1s€ôÐÜÐä Ô ÜÐAÓBÐBä—)‘)˜MÐ+fÓg€KÜ—y‘yÐ!3°TÓ:Ðä  Ð.>Ó?€N÷
ñ
ô&'¤~±t³vÓ>€LÜ
‡K�KÐ3Ô4ä ÐrPcóþ—eZdZUedd¬«Zded<edd¬«Zded <ed
d ¬«Zded <edd
¬«Zded<edd¬«Z ded<edd¬«Z
ded<edd¬«Z ded<edd¬«Z ded<y)Ú
NLChatRequest.u!用户输入的自然语言问题©Ú descriptionÚstrÚmessageNu模型路由: openai | deepseekú
Optional[str]Ú service_codeÚautou语言: zh | en | tc | autoÚ lang_codeu任务IDÚtaskIdõ会è¯�IDÚ
session_idu访客业务IDÚvisitor_biz_idu用户IDÚuser_iduæµ�å¼�节æµ�å�‚æ•°ú
Optional[int]Ústreaming_throttle)
r:r;r<rr`Ú__annotations__rbrdrergrhrirkrOrPrQr\r\Ys�…Ù˜Ð*MÔN€GˆSÓNÙ"'¨Ð:[Ô"\€L�-Ó\Ù$ VÐ9VÔW€Iˆ}ÓWÙ! $°JÔ?€FˆMÓ?Ù % d¸
Ô C€J�
ÓCÙ$)¨$Ð<LÔ$M€N�MÓMÙ" 4°ZÔ@€Gˆ]Ó@Ù(-¨dÐ@TÔ(UИ
ÔUrPr\có4—eZdZUded<dZded<dZded<y)Ú
IntentPayloadr_ÚintentNzOptional[float]Ú
confidenceraÚreason)r:r;r<rlrprqrOrPrQrnrnds…Ø ƒKØ"&€J�Ó&Ø €FˆMÔ rPrncóà—eZdZUedd¬«Zded<eed¬«Zded <eed
¬«Zd ed <ed
d¬«Z ded<edd¬«Z
ded<edd¬«Z ded<edd¬«Z ded<y)ÚDataQueryResult.u生æˆ�çš„SQL语å�¥r]r_Úsqlu查询结果列å��)Údefault_factoryr^z List[str]Úcolumnsu查询结果行数æ�®zList[Dict[str, Any]]Úrowsru 结果行数rCÚ row_countFu 是å�¦æˆªæ–­ÚboolÚ truncatedNuSQL自然语言说明raÚ sql_explainTu是å�¦å…�许导出zOptional[bool]Ú
can_export)
r:r;r<rrtrlÚlistrvrwrxrzr{r|rOrPrQrsrsjs…Ù�SÐ&:Ô;€CˆÓ;Ù¨tÐAUÔV€GˆYÓVÙ!&°tÐI`Ô!a€DÐ
ÓaÙ˜1¨.Ô9€IˆsÓ9Ù˜E¨~Ô>€IˆtÓ>Ù!& tÐ9PÔ!Q€K�ÓQÙ!& tÐ9MÔ!N€J�ÔNrPrscó^—eZdZUded<ded<edd¬«Zded <edd
¬«Zded <y) ÚNLChatSuccessDatarnrorsÚ
branch_resultNu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—上方说明)r]raÚstream_narrativeu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—下方说明)Ústream_narrative_after)r:r;r<rlrr�r‚rOrPrQrrts4…Ø ÓØ"Ó"Ù&+¨DÐ>dÔ&eÐ�mÓeÙ,1°$ÐDjÔ,kИMÔkrPrcóh—eZdZUedd¬«Zded<edd¬«Zded <ed
d ¬«Zd ed
<y
)Ú ApiEnvelopeéÈu状æ€�ç �,200表示æˆ�功r]rCÚcodeÚu消æ�¯r_ÚmsgNu å“�应数æ�®zOptional[NLChatSuccessData]Údata)r:r;r<rr†rlrˆr‰rOrPrQr„r„{s7…Ù�cÐ'DÔE€Dˆ#ÓEÙ�R XÔ.€CˆÓ.Ù(-¨dÀÔ(O€DÐ
%ÔOrPr„có0—eZdZUded<ded<dZded<y)Ú
ErrorResponserCr†r_rˆNz
Optional[Any]r‰)r:r;r<rlr‰rOrPrQr‹r‹�s…Ø
ƒIØ ƒHØ€Dˆ-ÔrPr‹có8—eZdZUdZded<dZded<dZded<y)ÚSessionCreateBodyNraÚtitlerirh©r:r;r<rŽrlrirhrOrPrQr�r�‡ó …Ø€Eˆ=ÓØ!€Gˆ]Ó!Ø$(€N�MÔ(rPr�có8—eZdZUdZded<dZded<dZded<y)ÚSessionTitlePatchBodyNrarŽrirhr�rOrPrQr’r’�r�rPr’có4—eZdZUded<dZded<dZded<y)ÚSessionMessagePatchBodyr_ÚcontentNrarirh)r:r;r<rlrirhrOrPrQr”r”“s…Ø
ƒLØ!€Gˆ]Ó!Ø$(€N�MÔ(rPr”có^—eZdZUded<dZded<dZded<dZded<dZded <dZded
<y) ÚSqlExecuteBodyr_rtNrjÚmax_rowsrarirhÚchat_session_idÚchat_message_id) r:r;r<rlr˜rirhr™ršrOrPrQr—r—™s9…Ø ƒHØ"€HˆmÓ"Ø!€Gˆ]Ó!Ø$(€N�MÓ(Ø%)€O�]Ó)Ø%)€O�]Ô)rPr—cóª—eZdZUedd¬«Zded<dZded<dZd ed
<dZd ed <dZ d ed <dZ
d ed
<dZ d ed<dZ d ed<dZ
d ed<dZd ed<y)ÚFavoriteCreateBody.zsql | function | reportr]r_Úfav_typer‡ÚnameNraÚdescrirhrtr{ÚpathÚ
reportPathÚparams)r:r;r<rr�rlržrŸrirhrtr{r r¡r¢rOrPrQrœrœ¢sm…Ù˜#Ð+DÔE€HˆcÓEØ€Dˆ#ƒNØ€Dˆ-ÓØ!€Gˆ]Ó!Ø$(€N�MÓ(Ø€CˆÓØ!%€K�Ó%Ø€Dˆ-ÓØ $€J�
Ó$Ø €FˆMÔ rPrœcóV—dtj|d¬«›d�jd«S)Nzdata: F©Ú ensure_asciiz
zutf-8)ÚjsonÚdumpsÚencode)Úobjs rQÚ _sse_datarª¯s(€Ø
”D—J‘J˜s°Ô7Ð8¸Ð =× DÑ DÀWÓ MÐMrPcóH—|xsdj«xsd}ddddœd|idœS) uP寒暄/元问题等:与å‰�端 BUSINESS_MANUAL + branch_result.answer 一致。r‡u 您好。ÚBUSINESS_MANUALçð?Ú conversation©rorprqÚanswer©ror€)rM)ÚreplyÚrs rQÚ_conversation_nl_dictr´³s4€à Š�"×ÑÓÒ, €Aà.¸cÈ^Ñ\Ø" A˜ñ ðrPcƒó„K—|jr|jj«sy tj|d¬«}t j
|j |j|jj«||«ƒd{–—†y7Œ#t$r"}tjd|›�«Yd}~yd}~wwxYw­w)NFr¤u[API] 会è¯�è�½åº“跳过: ) rgrMr¦r§rÚappend_exchangerirhÚ ExceptionrVÚwarning)ÚrequestÚ user_textr‰Úassistant_jsonÚes rQÚ_append_session_if_neededr½¼s èø€Ø × Ò  7×#5Ñ#5×#;Ñ#;Ô#=Øð
9ÜŸ™ D°uÔ=ˆÜ×+Ñ+Ø �O‰OØ × "Ñ "Ø × Ñ × $Ñ $Ó &Ø Ø ó 
÷
ò
ùô ò9Ü�‰Ð3°A°3Ð7×8Ñ8ûð9üsA‚(C«ABÂ
B BÂCÂB B=ÂB8Â3CÂ8B=Â=CcóŽ—|jxsdj«}g}|jjd«r'|j t |jd««|j r"|jd„|j D««|jr"|jd„|jD««|rdj|«nd}|ggdddœ}|r||d <|jjd
«}|�||d
<|jjd«}|r||d<|jrd nd }|jrd
t|j«›d�}n|jr|jdnd}d||dœ|dœ} |jjd«}
|jjd«} |
r
| r|
| dœ| d<| S)Nr‡Údb_empty_feedbackc3ó2K—|]}t|«–—Œy­w©N©r_)Ú.0Úws rQÚ <genexpr>z+_nl_dict_from_generation.<locals>.<genexpr>Òsèø€Ð=©_¨œS ŸV©_ùó‚c3ó2K—|]}t|«–—Œy­wrÁr©rÃr¼s rQrÅz+_nl_dict_from_generation.<locals>.<genexpr>Ôsèø€Ð;©]¨œS ŸV©]ùrÆú; rF)rtrvrwrxrzr{Údb_execution_statusr­gu
使用了 u 张表uSQL生æˆ�未通过验è¯�Ú
DATA_QUERYr¯r±Úquestion_originalÚquestion_zh_normalized)ÚoriginalÚzhÚquery_normalization)
rtrMÚmetadataÚgetÚappendr_ÚwarningsÚextendÚerrorsÚjoinÚvalidÚlenÚ tables_used) ÚresultrtÚ
explain_partsÚexplainr€ÚdbsÚdbeÚconfrqÚpayloadÚqoÚqzs rQÚ_nl_dict_from_generationräÌsª€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€CØ!€MØ
‡�×ÑÐ.Ô/Ø×ÑœS §¡Ð1DÑ!EÓFÔGØ
‡‚Ø×ÑÑ=¨V¯_ª_Ó=Ô=Ø
‡}‚}Ø×ÑÑ;¨V¯]ª]Ó;Ô;Ù*7ˆd�i‰i˜
Ô&¸T€GàØØØØñ %€MñØ'.ˆ
�mÑ$Ø
�/‰/×
Ñ
Ð3Ó
4€CØ
€Ø/2ˆ
Ð+Ñ,Ø
�/‰/×
Ñ
Ð1Ó
2€CÙ
Ø-0ˆ
Ð)Ñ*Ø—,’,‰3 C€DØ
‡|‚|Øœc &×"4Ñ"4Ó5Ð6°gÐ>‰à%+§]¢]�—‘˜qÒ!Ð8Rˆà)¸ÈÑPØ&ñ€Gð
�‰× Ñ Ð0Ó 1€BØ �‰× Ñ Ð5Ó 6€BÙ ‰bØ68ÀÑ)CˆÐ%Ñ&Ø €NrPcó(—|jxsdj«}tjd|id¬«}d|›d�g}d}|jj d«rt
|jd«}nV|jrt
|jd«}n1|jr%d jd
„|jdd D««}|j«r(|jd tj|«›d
�«dj|«S)Nr‡rtFr¤z<data>z</data>r¿rrÉc3ó2K—|]}t|«–—Œy­wrÁrÂrÈs rQrÅz'_sql_gen_stream_html.<locals>.<genexpr>ÿsèø€Ð>Ñ,= qœC ŸFÑ,=ùrÆéz<div class="sql-explain-body">z</div>)
rtrMr¦r§rÑrÒr_rÔrÖr×rÓÚhtml_libÚescape)rÛrtÚinnerÚpartsrÝs rQÚ_sql_gen_stream_htmlrìõsá€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€CÜ �J‰J˜˜s�|°%Ô 8€EØ�e�W˜GÐ
$Ð %€EØ€GØ
‡�×ÑÐ.Ô/Ü�f—o‘oÐ&9Ñ:Ó;‰Ø �ŠÜ�f—o‘o aÑ(Ó)‰Ø �ŠØ—)‘)Ñ>¨F¯M©M¸"¸1Ñ,=Ó>Ó>ˆØ‡}�}„Ø
� ‰ Ð5´h·o±oÀgÓ6NÐ5OÈvÐVÔWØ
�7‰7�5‹>ÐrPcƒ󴇇‡‡K—t«Šttjdd««Šdˆˆˆˆfd„ }t j
|«ƒd{–—†S7Œ­w)NÚTEXT2SQL_DIALECTÚ sqlservercóH•—‰j‰j«‰‰¬«S)N)ÚquestionÚdialectÚtop_k_candidates)ÚgeneraterM)ròÚorchrñÚtop_ks€€€€rQÚ_callz_run_generate.<locals>._call s)ø€Ø�}‰}Ø—^‘^Ó%ØØ"ðó
ð
rP)Úreturnr)rZrr=r>ÚasyncioÚ to_thread)rñrör÷ròrõs`` @@rQÚ
_run_generaterûsHûèø€Ü Ó €DÜ!¤"§)¡)Ð,>À Ó"LÓM€G÷
ð
ô×"Ñ" 5Ó)× )Ð)Ð )ús†A AÁAÁAcóžK—|jr|jj«stddddœ«­–—y|jj«}t|«}|jt
j k(r||jxsd}tjd«tdddd œ«­–—td
d|d œ«­–—t|«}td d |dœ«­–—t|||«ƒd{–—†ytddd
d œ«­–— t|«ƒd{–—†}tddt!|«d œ«­–—t#|«}|j$rd nd}td ||dœ«­–—t|||«ƒd{–—†y7Œ‰7Œd#t$r=}tjd|›�«tdt|«ddœ«­–—Yd}~yd}~wwxYw7ŒR­w)Né�õ消æ�¯å†…容ä¸�能为空©r†rˆr‰r‡uZ[API/stream] 对è¯�æ„�图: conversation(跳过 Text2SQL,与 CLI single_query 一致)rSr•ÚCHAT)ÚstageÚ stream_kindr•Úchatr…ÚsuccessrËuPI/stream] 生æˆ�异常: éôÚsql_genÚpartial)r`rMrªrrorÚ CONVERSATIONÚreply_suggestionrVrWr´r½rûr·Úerrorr_rìrärØ)r¹ÚtextÚ
classifiedr²Ú data_dictrÛr¼rˆs rQÚ_chat_stream_eventsrsŸèø€Ø �?Š? '§/¡/×"7Ñ"7Ô"9Ü Ð-GÐQUÑVÓWÓWØØ �?‰?× Ñ Ó "€DÜ  Ó&€JØ×ÑœL×5Ñ5Ò5Ø×+Ñ+Ò1¨rˆÜ� ‰ ÐpÔqÜ .ÀÐW]Ñ^Ó_Ó_Ü &¸ÈuÑUÓVÓVÜ)¨%Ó0ˆ Ü ¨YÀ ÑJÓKÓKÜ'¨°°yÓA×AÐAØä
˜n¸YÐS_Ñ`Ó
aÓaðÜ$ TÓ*×*ˆô
˜i¸ ÔNbÐciÓNjÑkÓ
lÓlÜ(¨Ó0€IØ—|’|‰)¨€CÜ
˜S¨°iÑ@Ó
AÓAÜ
# G¨T°9Ó
=×=Ñ=ð Bøð
+ùÜ òÜ� ‰ Ð2°1°#Ð6Ô7Ü ¬S°«V¸TÑBÓCÓCÜûðúð>ús[‚C2G
Ã4E>Ã5G
Ä
FÄFÄFÄ AG
Å8G Å9G
ÆFÆ GÆ 3GÆ>G
ÇGÇG
cóRK—tjd«tjd«tjd« t«tjd«d­–—tjd«y#t$r}tj d|›�«‚d}~wwxYw­w)Nz<============================================================u Text2SQL API Server å�¯åЍ䏭...u[OK] æœ�务已就绪uæœ�务åˆ�始化失败: uText2SQL API Server 已关闭)rVrWrZr·r
)Úappr¼s rQÚlifespanr1s}èø€ä
‡K�K�ÔÜ
‡K�KÐ2Ô3Ü
‡K�K�ÔðÜÔÜ� ‰ Ð*Ô+ô

ä
‡K�KÐ/Õ0øô
òÜ� ‰ Ð.¨q¨cÐ2Ô3Ø
ûðüs*‚AB'ÁA=Á"B'Á= B$ÂBÂB$Â$B'zText2SQL NL Chat APIu!自然语言转SQL的对è¯�接å�£z1.0.0)rŽr^ÚversionrÚ*T)Ú
allow_originsÚallow_credentialsÚ
allow_methodsÚ
allow_headersz/healthcƒóK—dddœS­w)uå�¥åº·æ£€æŸ¥æŽ¥å�£ÚokzText2SQL API is running)Ústatusr`rOrOrPrQÚ health_checkrSsèø€ðÐ'@Ñ AÐAùs‚z/g3sb/api/nl/chatcƒóÞK— |jr|jj«s
tdd¬«‚|jj«}tj d|dd›d�«t |«}|j tjk(rK|jxsd}tj d «t|«}t|||«ƒd{–—†d
d |d œSt|«ƒd{–—†}t|«}tj|«}|j rd nd
}|j r+tj d|j"xsddd›d�«n"tj%d|j&›�«t|||«ƒd{–—†t)d
||¬ «S7ŒÉ7Œ²7Œ#t$r‚t*$r3}tj-d|›�«tdt/|«¬«‚d}~wwxYw­w)uš
自然语言对�接�(���),�应结构与��结�包一致。
寒暄/致谢等先� classify_dialog,与 CLI 一致。
rýrþ)Ú status_codeÚdetailu[API] 问题: Nédz...r‡u:[API/chat] 对è¯�æ„�图: conversation(跳过 Text2SQL)r…rrÿru[API] 生æˆ�æˆ�功: éPu[API] 生æˆ�失败: u[API] 异常: r)r`rMr rVrWrrorrr r´r½rûrärÚmodel_validaterØrtr¸rÖr„r·r
r_) r¹r r r²r
rÛÚ
response_datarˆr¼s rQÚnl_chatr#Ys¬èø€ð <Ø�Š g§o¡o×&;Ñ&;Ô&=ܨCÐ8RÔSÐ SØ�‰×$Ñ$Ó&ˆÜ� ‰ �n T¨$¨3 Z L°Ð4Ô5Ü$ TÓ*ˆ