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

304 lines
51 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
ð€àiÔ™ãóæ
—dZddlmZddlZddlZddlZddlZddlZddlm Z ddl
m Z m Z m
Z
2026-04-14 10:28:22 +08:00
mZmZddlmZddlmZmZmZm ZddlmZdd lmZmZdd
lmZmZmZm Z dd l!m"Z"e e#«jI«jJZ&e&d z Z'e(e'«ejRvr"ejRjUde(e'««dd
l+m,Z,e,e&«ddl-m.Z.m/Z/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;m<Z<ejze>«Z?ej€«ZAd}d„ZBeB«ZCeCj‰«re"eC«e?j‹deC›�«ne?j�deC›�«daGdaHd„ZIGd„de«ZJGd„de«ZKGd„de«ZLGd„de«ZMGd„d e«ZNGd!„d"e«ZOGd#„d$e«ZPGd%„d&e«ZQGd'„d(e«ZRGd)„d*e«ZSGd+„d,e«ZTd~d-„ZUeVej®d.d/««ZXdd0œ dd1„ZYd€d2„ZZd�d3„Z[d‚d4„Z\dƒd5„Z]d„d6„Z^d„d7„Z_d…d8„Z`d…d9„Zad…d:„Zb d†d;„Zced‡d<„«Zd dˆd=„Zed‰d>„ZfdŠd?„Zg d‹ dŒd@„Zhd�dA„ZiedŽdB„«ZjedCdDdEej¬F«ZkekjÙedGgdHdGgdGg¬I«ekjÛdJ«dK„«ZnekjßdL«d‡dM„«ZpekjßdN«d‡dO„«ZqekjßdP«d�dQ„«ZrekjÛdP« d� d‘dR„«ZsekjÛdS«edTdU¬V«dddWdf d’dX„«ZtekjëdY«d“dZ„«Zvekjëd[« d”d\„«Zwekjñd]« d• d–d^„«Zyekjßd_«d—d`„«Zzekjßda«edT«fd˜db„«Z{ekjÛda« d™ dšdc„«Z|ekjÛdd« d• d›de„«Z}ekjßdd«dœdf„«Z~ekjëdg«ee¬h«ddf d�di„«Z€ekjñdg« d• dždj„«Z�ekjÛdk« dŸ d dl„«Z‚ekjßdm«dn„«ZƒekjÛdo«dp„«Z„e>dqk(r�ddl…Z…ddl†Z†eVej®drds««Z‡ej®dtdu«Zˆe?j‹dveˆ›dwe‡›�«e?j‹dxeˆ›dwe‡›dy�«e†�j«e…�jekeˆe‡dzd{d¬|«yy)¡uo
2026-04-16 10:53:10 +08:00
FastAPI �务入� - Text2SQL NL Chat API
包装 Text2SQLOrchestrator 为 REST API �务,供�端调用
é)Ú annotationsN)ÚPath)ÚOptionalÚListÚDictÚAnyÚ
AsyncIterator)Úasynccontextmanager)ÚFastAPIÚ
HTTPExceptionÚBodyr)ÚCORSMiddleware)ÚStreamingResponseÚ JSONResponse)Ú AliasChoicesÚ BaseModelÚ
ConfigDictÚField)Ú load_dotenvÚbackend)Úconfigure_text2sql_api_logging)Úsetup_environmentÚ load_schemaÚcreate_orchestratorÚresolve_sql_dialect)ÚGenerationResult)Ú
2026-04-16 10:53:10 +08:00
lite_nl_store)Ú DialogIntentÚclassify_dialog)Úlast_assistant_was_data_queryÚmessages_to_text2sql_contextÚis_likely_follow_upcóì—ddl}tj«dz }|j«r|St |dd«r6t |d«r*t|j «dz }|j«r|St |dd«r8t|j«j}|dz }|j«r|S|Stt«j«j}|dz }|j«r|S|S)u-查找 .env 文件,支æŒ�多ç§�è¿�行环境rNz.envÚfrozenFÚ_MEIPASS) ÚsysrÚcwdÚexistsÚgetattrÚhasattrr%Ú
2026-04-14 10:28:22 +08:00
executableÚparentÚ__file__Úresolve)r&Úcwd_envÚ meipass_envÚexe_dirÚenv_pathÚ
script_dirs ú2C:\Users\24019\Desktop\backman-camel\api_server.pyÚ_find_env_filer52sÞ€ãô�h‰h‹j˜6Ñ!€G؇~�~ÔØˆôˆs�H˜eÔ$¬°°jÔ)Aܘ3Ÿ<™<Ó(¨6Ñ1ˆ Ø × Ñ Ô ØÐ ôˆs�H˜eÔ$ä�s—~‘~Ó&×-Ñ-ˆØ˜VÑ#ˆØ �?‰?Ô ØˆOð €Nô
œ(“^×+Ñ+Ó-×4Ñ4ˆ
Ø Ñ&ˆØ �?‰?Ô ØˆOð €Nóu[OK] 已加载é…�置文件: u[WARN] 未找到 .env 文件: có(—t�tSt«s td«‚tjdd«}tjdd«}t ||«aGd„d«}tt |««atjd«tS) u获å�–或åˆ�始化 orchestratorNuºçŽ¯å¢ƒæ£€æŸ¥å¤±è´¥ï¼ˆè¯·æŸ¥çœ‹ä¸Šæ–¹ WARNING/INFO,常è§�原因:未é…�好 OPENAI_* / MODELSCOPE_* / DASHSCOPE_* 远程 Embedding;或 Schema 文件路径ä¸�对ã€�LLM Key æœªè®¾ç½®ï¼‰Ú SCHEMA_PATHz9./data/schemas/G3SB_MCDataDictionary_table_structure.jsonÚSCHEMA_META_PATHcó"—eZdZejd«Zejdd«Zeejdd««Ze ejdd««Z
2026-04-14 10:28:22 +08:00
e ejdd ««Z ejd
d «Z d Z
2026-04-16 10:53:10 +08:00
ejd
d«j«dvZe ejdd««Ze ejdd««Zejdd«j%«j«dvZy)úget_orchestrator.<locals>.ArgsÚDEEPSEEK_API_KEYÚ
MODEL_PRIMARYú
deepseek-chatÚ TEMPERATUREz0.3Ú
MAX_TOKENSÚ4096Ú MAX_RETRYÚ2ÚVECTOR_DB_PATHz./data/embeddings/chromaFÚFEWSHOT_ENABLEDÚtrue)rFÚ1ÚyesÚ
FEWSHOT_TOP_KÚ3ÚFEWSHOT_MIN_RATINGÚ7ÚTRANSLATE_EN_TO_ZH)Ú0ÚfalseÚnoÚoffN)Ú__name__Ú
__module__Ú __qualname__ÚosÚgetenvÚapi_keyÚmodelÚfloatÚ temperatureÚintÚ
max_tokensÚ max_retryÚ vector_dbÚno_vector_searchÚlowerÚ
no_fewshotÚ
fewshot_top_kÚfewshot_min_ratingÚstripÚno_translate_en©r6r4ÚArgsr;ps„à�"—)‘)Ð.Ó/ˆØ�— ‘ ˜/¨?Ó;ˆÙ˜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
ð
‰r6rgu![OK] Orchestrator åˆ�始化完æˆ�)
Ú orchestratorrÚ RuntimeErrorrUrVrÚschema_managerrÚloggerÚinfo)Ú schema_pathÚschema_meta_pathrgs r4Úget_orchestratorro]sˆ€ôÐÜÐä Ô Üð
Có
ð
ô —)‘)˜MÐ+fÓg€KÜ—y‘yÐ!3°TÓ:Ðä  Ð.>Ó?€N÷
2026-04-14 10:28:22 +08:00
ñ
ô&'¤~±t³vÓ>€LÜ
‡K�KÐ3Ô4ä Ðr6có —eZdZUed¬«Zedd¬«Zded<edd ¬«Zd
ed <edd ¬«Z d
ed
2026-04-14 10:28:22 +08:00
<ede
dd«d¬«Z d
ed<edd¬«Z d
ed<edd¬«Z
d
2026-04-14 10:28:22 +08:00
ed<edd¬«Zd
ed<edd¬«Zd
ed<y)Ú
2026-04-14 10:28:22 +08:00
NLChatRequestT)Úpopulate_by_name.u!用户输入的自然语言问题©Ú descriptionÚstrÚmessageNu模型路由: openai | deepseekú
Optional[str]Ú service_codeu-模型å��称(å�¯é€‰ï¼Œè¦†ç›–默认模型)rXÚautoÚ lang_codeÚlangCodeuD语言:zh=简体中文,tc=ç¹�体中文,en=英语;auto=自动)Úvalidation_aliasrtu任务IDÚtaskIdõ会è¯�IDÚ
session_idu访客业务IDÚvisitor_biz_idu用户IDÚuser_id)rRrSrTrÚ model_configrrvÚ__annotations__rxrXrrzr}rr€r�rfr6r4rqrq‰sª…Ù¨tÔ4€Lá˜Ð*MÔN€GˆSÓNÙ"'¨Ð:[Ô"\€L�-Ó\Ù  Ð3bÔc€Eˆ=Ócá$ØÙ% k°:Ó>ØZô €Iˆ}óñ
" $°JÔ?€FˆMÓ?Ù % d¸
Ô C€J�
ÓCÙ$)¨$Ð<LÔ$M€N�MÓMÙ" 4°ZÔ@€Gˆ]Ô@r6rqcó4—eZdZUded<dZded<dZded<y)Ú
IntentPayloadruÚintentNzOptional[float]Ú
confidencerwÚreason)rRrSrTrƒr‡rˆrfr6r4r…r…›s…Ø ƒKØ"&€J�Ó&Ø €FˆMÔ r6r…cóX—eZdZUedd¬«Zded<eed¬«Zded <eed
¬«Zd ed <ed
d¬«Z ded<edd¬«Z
ded<edd¬«Z ded<edd¬«Z ded<edd¬«Z
2026-04-16 10:53:10 +08:00
ded<edd ¬«Zded!<edd"¬«Zded#<edd$¬«Zded%<y)&ÚDataQueryResult.u生æˆ�çš„SQL语å�¥rsruÚsqlu查询结果列å��)Údefault_factoryrtz List[str]Úcolumnsu查询结果行数æ�®zList[Dict[str, Any]]Úrowsru 结果行数r[Ú row_countFu 是å�¦æˆªæ–­ÚboolÚ truncatedNuSQL自然语言说明rwÚ sql_explainTu是å�¦å…�许导出zOptional[bool]Ú
can_exportu_库探针:1=有数æ�®è¡Œï¼Œ0=无行需追问补充,-1=执行失败(é‡�试),None=未探针ú
Optional[int]Údb_execution_statusu7探针0时的无行说明与追问(å�«é—®é¢˜åˆ†æž�)Údb_empty_feedbackuNTrue 表示探针为0:需用户补充æ�¡ä»¶å�Žé‡�æ–°æ��问以é‡�新生æˆ�SQLÚfollow_up_requiredu4探针为1æ—¶LLM生æˆ�çš„é�¢å�‘用户SQL交付说明Úsql_delivery_message)rRrSrTrr‹rƒÚlistr�rŽr�r‘r’r“r•r–r—r˜rfr6r4rŠrŠ¡så…Ù�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�ÓNÙ).Ø Øuô*Иóñ(-Ø ÐSô(Ð�}óñ %Ø
Ødô Иóñ+0Ø ÐPô+И-ôr6rŠcó^—eZdZUded<ded<edd¬«Zded <edd
¬«Zded <y) ÚNLChatSuccessDatar…r†rŠÚ
branch_resultNu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—上方说明)rsrwÚstream_narrativeu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—下方说明)Ústream_narrative_after)rRrSrTrƒrr�ržrfr6r4r›r›¹s4…Ø ÓØ"Ó"Ù&+¨DÐ>dÔ&eÐ�mÓeÙ,1°$ÐDjÔ,kИMÔkr6r›cóh—eZdZUedd¬«Zded<edd¬«Zded <ed
d ¬«Zd ed
<y
)Ú ApiEnvelopeéÈu状æ€�ç �,200表示æˆ�功rsr[ÚcodeÚu消æ�¯ruÚmsgNu å“�应数æ�®zOptional[NLChatSuccessData]Údata)rRrSrTrr¢rƒr¤r¥rfr6r4r r Às7…Ù�cÐ'DÔE€Dˆ#ÓEÙ�R XÔ.€CˆÓ.Ù(-¨dÀÔ(O€DÐ
%ÔOr6r có0—eZdZUded<ded<dZded<y)Ú
ErrorResponser[r¢rur¤Nz
2026-04-16 10:53:10 +08:00
Optional[Any]r¥)rRrSrTrƒr¥rfr6r4r§r§Æs…Ø
ƒIØ ƒHØ€Dˆ-Ôr6r§có8—eZdZUdZded<dZded<dZded<y)ÚSessionCreateBodyNrwÚtitler�r€©rRrSrTrªrƒr�r€rfr6r4r©r©Ìó …Ø€Eˆ=ÓØ!€Gˆ]Ó!Ø$(€N�MÔ(r6r©có8—eZdZUdZded<dZded<dZded<y)ÚSessionTitlePatchBodyNrwrªr�r€r«rfr6r4r®r®Òr¬r6r®có4—eZdZUded<dZded<dZded<y)ÚSessionMessagePatchBodyruÚcontentNrwr�r€)rRrSrTrƒr�r€rfr6r4r°r°Øs…Ø
ƒLØ!€Gˆ]Ó!Ø$(€N�MÔ(r6r°có^—eZdZUded<dZded<dZded<dZded<dZded <dZded
<y) ÚSqlExecuteBodyrur‹Nr”Úmax_rowsrwr�r€Úchat_session_idÚchat_message_id) rRrSrTrƒr´r�r€rµr¶rfr6r4r³r³Þs9…Ø ƒHØ"€HˆmÓ"Ø!€Gˆ]Ó!Ø$(€N�MÓ(Ø%)€O�]Ó)Ø%)€O�]Ô)r6r³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 | reportrsruÚfav_typer£ÚnameNrwÚdescr�r€r‹r’ÚpathÚ
reportPathÚparams)rRrSrTrr¹rƒrºr»r�r€r‹r’r¼r½r¾rfr6r4r¸r¸çsm…Ù˜#Ð+DÔE€HˆcÓEØ€Dˆ#ƒNØ€Dˆ-ÓØ!€Gˆ]Ó!Ø$(€N�MÓ(Ø€CˆÓØ!%€K�Ó%Ø€Dˆ-ÓØ $€J�
Ó$Ø €FˆMÔ r6r¸cóV—dtj|d¬«›d�jd«S)Nzdata: F©Ú ensure_asciiz
zutf-8)ÚjsonÚdumpsÚencode)Úobjs r4Ú _sse_datarÆôs(€Ø
”D—J‘J˜s°Ô7Ð8¸Ð =× DÑ DÀWÓ MÐMr6ÚSSE_STREAM_CHUNK_CHARSÚ64)Ú
chunk_sizec óÞK—|sytd|xst«}tdt|«|«D]7}t |d||||zdœ«­–—t j d«ƒd{–—†Œ9y7Œ­w)uI将长文本拆æˆ�多段 SSE,便于æµ�览器é€�段渲染(æµ�å¼�)。Nérr±©ÚstageÚ stream_kindr±)ÚmaxÚ_DEFAULT_SSE_CHUNK_CHARSÚrangeÚlenrÆÚasyncioÚsleep)rÍr±rÉÚsizeÚis r4Ú_sse_stream_text_chunksr×üssèø€ñ ØÜ ˆq�*Ò8Ô 8Ó 9€DÜ
�1”c˜'“l DÖ
)ˆÜبIÀ'È!ÈaÐRVÉhÐBWÑ Xó
ó
ô�m‰m˜AÓ×Ññ *ð ús‚A!A-Á#A+Á$A-cóH—|xsdj«xsd}ddddœd|idœS) uP寒暄/元问题等:与å‰�端 BUSINESS_MANUAL + branch_result.answer 一致。r£u 您好。ÚBUSINESS_MANUALçð?Ú conversation©r†r‡rˆÚanswer©r†rœ)rd)ÚreplyÚrs r4Ú_conversation_nl_dictrá
s4€à Š�"×ÑÓÒ, €Aà.¸cÈ^Ñ\Ø" A˜ñ ðr6cóº—|xsdj«}|sy|dvry|dvry|dvry|j«jdd «}|d
vr|S|d vry|d vry|d
vryy)Nry)u 简体中文u简体u中文(简体)Úzh)u ç¹�体中文u ç¹�體中文uç¹�体uç¹�é«”Útc)u英语u英文u英語ÚenÚ_Ú-)rãräråry)Úenglishzen-uszen-gb)zzh-cnzzh-hanszzh-sg)zzh-twzzh-hantzzh-hkÚ traditionalztraditional-chinese©rdr`Úreplace)r¢ÚrawÚcs r4Ú_normalize_lang_coderîs�€Ø Š>�6×
Ñ
Ó
"€CÙ Øà
Ð>Ñ>ØØ
ÐBÑBØØ
Ð,Ñ,Øà � ‰ ‹ ×јC Ó%€AØÐ &Ñ&؈ð Ð )Ñ)ØØÐ )Ñ)ØØÐ OÑOØØ r6có—|xsdj«}|sy|j«j«}|jdd«jdd«}d|vr|jdd«}d|vrŒ|dvry|d vry
|d vry |d
vr|S|S)u©
�端�能传展示文案(如 'GPT-4o mini' / 'DeepSeek V3')。
这里统一映射到真实模型�(openai/deepseek �自�用的 model id)。
r£NrærçÚ z--)ú gpt-4o-miniz
gpt4o-minirñrñ)úgpt-4oÚgpt4orò)ú deepseek-v3Ú
deepseekv3z
deepseek-v3.0z deepseekv3.0rôr>)r>zdeepseek-reasonerrê)rXrìÚms r4Ú_normalize_model_labelr÷0s¨€ð
Š;�B×
Ñ
Ó
€CÙ ØØ � ‰ ‹ ×ÑÓ€AØ � ‰ �#�sÓ×#Ñ# C¨Ó-€AØ
�!‰)Ø
�I‰I�d˜CÓ ˆð �!Š)ð Ð 8Ñ8ØØÐ ÑØð Ð YÑYØØÐ 2Ñ2Øˆà €Jr6cóâ—|xsdj«j«}|r|dvr|S|dvryd|vry|xsdj«j«}|rd|vry|jd«ryy)Nr£)ÚopenaiÚdeepseek)ÚgptÚchatgptrùrúrû)rdr`Ú
startswith)rxÚ
model_nameÚscrös r4Ú_infer_service_coderLs�€Ø
Ò
˜"× #Ñ #Ó %× +Ñ +Ó -€BÙ Ø
Ð'Ñ '؈IØ
Ð#Ñ #ØØ ˜Ñ Øà Ò �r× Ñ Ó"×(Ñ(Ó*€AÙØ ˜‰?ØØ �<‰<˜Ô ØØ r6cób—ttjd«xsdj««S)NÚOPENAI_API_KEYr£©r�rUrVrdrfr6r4Ú_has_openai_keyr_s%€Ü ”—‘Ð+Ó,Ò2°×9Ñ9Ó;Ó <Ð<r6cób—ttjd«xsdj««S)Nr<r£rrfr6r4Ú_has_deepseek_keyrcs%€Ü ”—‘Ð-Ó.Ò4°"×;Ñ;Ó=Ó >Ð>r6có"—|dk(r y|dk(r y y)NråzÎHello, I'm the Text2SQL assistant.
Describe what you want to query or aggregate in natural language (e.g., available balance of an account; summarize unsettled trades by broker).
Type quit or exit to leave.räuØæ‚¨å¥½ï¼Œæˆ‘是業務庫 Text2SQL 助手。
請用自然語言�述�查詢或統計的內容(例如:查詢�帳戶�用餘��按經紀商匯總未�算交易筆數)。
輸入 quit 或 exit å�¯é€€å‡ºã€‚uØæ‚¨å¥½ï¼Œæˆ‘是业务库 Text2SQL 助手。
2026-04-14 10:28:22 +08:00
请用自然语言�述�查询或统计的内容(例如:查询�账户�用余��按�纪商汇总未结算交易笔数)。
输入 quit 或 exit å�¯é€€å‡ºã€‚rf©rzs r4Ú_localized_conversation_replyr gs2€Ø�DÒð
*ð
ð �DÒð
0ð
2026-04-14 10:28:22 +08:00
ð ,ðr6có—|dk(ry|dk(ryy)Nråz=Please enter a concrete business query, or type quit to exit.räu?請輸入具體的業務查詢å•�題,或輸入 quit 退出。u?请输入具体的业务查询问题,或输入 quit 退出。rfrs r4Ú_localized_empty_input_replyr }s€Ø�DÒØNØ�DÒØPØ Lr6có—|dk(ry|dk(ryy)NråÚEnglishräzTraditional ChinesezSimplified Chineserfrs r4Ú _lang_labelr…s€Ø�DÒØØ�DÒØ$Ø r6cƒó2‡‡K—|xsdj«}|s|S|dvr|St|«}dd|›d�dœd|dœgŠd ˆˆfd„ } tj|«ƒd {–—†}|xs|S7Œ
#t$r"}t
j
d
|«|cYd }~Sd }~wwxYw­w) uÓ
将“说明类�文本翻译到 lang_code(仅用于 sql_delivery_message / db_empty_feedback / sql_explain)。
zh 直接返回;en/tc 使用 LLM 翻译(短输出,��引入格�)。
2026-04-14 10:28:22 +08:00
r£)ryrãÚsystemzAYou are a translation assistant.
Translate the following text to z³.
2026-04-14 10:28:22 +08:00
Rules:
- Keep the meaning identical; do not add new information.
- Keep SQL keywords/code unchanged if present.
- Output plain text only (no Markdown, no code fences, no JSON).
)Úroler±Úusercó~•—‰jj‰ddd¬«}|jxsdj«S)NçrÚi@)rZÚtop_pÚmax_completion_tokensr£)rúÚchatr±rd)r¤ÚmessagesÚorchs €€r4Ú_callz&_translate_explain_text.<locals>._call¬s9ø€Ø�m‰m× Ñ  °sÀ#Ð]`Ð ÓaˆØ— ‘ Ò!˜r×(Ñ(Ó*Ð*r6Nz%[API] explain translation skipped: %s)Úreturnru)rdrrÓÚ to_threadÚ ExceptionrkÚwarning) rÚtextrzÚtÚtargetrÚoutÚers ` @r4Ú_translate_explain_textr$�sºùèø€ð
Š�×ÑÓ€A٠؈ Ø�NÑ"؈ Ü
˜Ó
#€Fðð3Ø39°(ð;UðUñ
ð AÑ&ð
€Hö+ðÜ×%Ñ% eÓ,×,ˆØŠ{�dÐð-ùä òÜ�‰Ð>ÀÔBØ� ûðüsG„?BÁA)ÁA'Á A)Á&BÁ'A)Á) BÁ2B BÂ
BÂBÂBcólK—t|j«}t|j|«}t |j
«}|duxs |duxs|dk(}|s|­–—yddlm}d}|€|��
|}|dk(r+t«s!t«rtjd«d}|dk(r+t«s!t«rtjd«d}i} |�ž|xsd j«j«dk(r!d|j«j«vrnX|xsd j«j«dk(r.|j«j«jd
«rn|| d <||fi| ¤Ž}t4ƒd{–—†t!|dd«}
t!|d d«} |�||_|dk(rt%|d «rd
|_ |­–—|�|
|_| �t%|d «r| |_ ddd«ƒd{–—†y7Œu#|�|
|_| �t%|d «r| |_wwwxYw7Œ,#1ƒd{–—†7swYyxYw­w)u—
若请求传 service_code / model,则临时覆盖 orchestrator.deepseek;
2026-04-16 10:53:10 +08:00
使用����一时刻仅一个请求修改该引用。
Nrår)Úcreate_llm_clientrúz<[API] deepseek requested but key missing, fallback to openairùz<[API] openai requested but key missing, fallback to deepseekr£rûrþÚtranslate_english_to_zhF)r÷rXrrxrîrzÚ
llm.routerr&rrrkrrdr`rýÚ_ORCH_LLM_LOCKr)rúr*r') rÚrequestrXrÿÚlangÚneeds_overrider&ÚtmpÚsc2Ú
llm_kwargsÚoldÚ
old_translates r4Ú_maybe_override_orch_llmr2¸sèø€ô
2026-04-16 10:53:10 +08:00
# 7§=¡=Ó 1€EÜ ˜W×1Ñ1°5Ó 9€BÜ  × 1Ñ 1Ó 2€DØ �nÒN¨%°tÐ*;ÒNÀÈÁ€NÙ Ø‹
Øå,à
€CØ €~˜Ñ*àˆØ �*Ò Ô%6Ô%8ÜÔ Ü—‘Ð]Ô^Ø�Ø �(Š?¤?Ô#4Ü Ô"Ü—‘Ð]Ô^Ø �à%'ˆ
Ø Ð à’ �r× Ñ Ó"×(Ñ(Ó*¨hÒ6¸:ÈÏÉË×I\ÑI\ÓI^Ñ;^ØØ’)˜×"Ñ"Ó$×*Ñ*Ó,°
Ò:¸u¿{¹{»}×?RÑ?RÓ?T×?_Ñ?_Ð`eÔ?fØà+0�
˜<Ñ(á Ñ2 zÑ2ˆçŽ~Ü�d˜J¨Ó-ˆÜ Ð&?ÀÓFˆ
Ø ˆ?؈DŒMà �4Š<œG DÐ*CÔDØ+0ˆDÔ (ð =Ø‹JàˆØ #�”
ØÐ(¬W°TÐ;TÔ-UØ/<�Õ,÷�~‰~ùðˆØ #�”
ØÐ(¬W°TÐ;TÔ-UØ/<�Õ,ð.VÐ(úðø�~�~‰~üs`‚E>H4ÆG6ÆH4Æ<HÇG8ÇHÇ% H4Ç0HÇ1H4Ç8"HÈHÈH4ÈH1È%H( È&H1È-H4cƒóNK—|jxsdj«}|sytj|j|j
|dd¬«ƒd{–—†}|sy|j
d«xsg}|syt|«}t|«rdnd}t||¬ «\}}||fS7ŒM­w)
2026-04-16 10:53:10 +08:00
u}
在写入本轮之�读�会�历�,构造 Text2SQL 上文,并判断上一轮助手是�为数�查询。
r£)r£Fr¡r)ÚlimitÚoffsetNÚitemsé)Ú max_pairs)
rrdrÚ get_messagesr�r€Úgetr r"r!) r*Ú user_textÚsidr¥r6Ú last_datar8ÚblockÚ_ns r4Ú_load_session_text2sql_contextr@òs®èø€ð × Ñ Ò # ×
2026-04-16 10:53:10 +08:00
*Ñ
*Ó
,€CÙ ØÜ×+Ñ+Ø�‰Ø×ÑØ ØØô ÷ €Dñ ØØ �H‰H�WÓ Ò # €EÙ ØÜ-¨eÓ4€Iä(¨Ô3‘¸€IÜ,¨U¸iÔH�I€Eˆ2Ø �)Ð Ðð! ús‚AB%ÁB#ÁAB%cƒó„K—|jr|jj«sy tj|d¬«}t j
|j |j|jj«||«ƒd{–—†y7Œ#t$r"}tjd|›�«Yd}~yd}~wwxYw­w)NFrÀu[API] 会è¯�è�½åº“跳过: ) rrdrÂrÃrÚappend_exchanger�r€rrkr)r*r;r¥Úassistant_jsonr#s r4Ú_append_session_if_neededrDs èø€Ø × Ò  7×#5Ñ#5×#;Ñ#;Ô#=Øð
9ÜŸ™ D°uÔ=ˆÜ×+Ñ+Ø �O‰OØ × "Ñ "Ø × Ñ × $Ñ $Ó &Ø Ø ó 
÷
ò
2026-04-14 10:28:22 +08:00
ùô ò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<t|jxr|dk(«|d <|jjd «}|rt |«|d <|jrd
nd}|jrdt|j«›d�} n|jr|jdnd} d|| dœ|dœ}
|jjd«} |jjd«} | r
2026-04-14 10:28:22 +08:00
| r| | dœ|
d<|jjd«r:|jjd«|jjd«dœ|
d<|
S)Nr£r–c3ó2K—|]}t|«–—Œy­w©N©ru)Ú.0Úws r4Ú <genexpr>z+_nl_dict_from_generation.<locals>.<genexpr>%sèø€Ð=©_¨œS ŸV©_ùó‚c3ó2K—|]}t|«–—Œy­wrGrH)rIr#s r4rKz+_nl_dict_from_generation.<locals>.<genexpr>'sèø€Ð;©]¨œS ŸV©]ùrLz; rF)r‹r�rŽr�r‘r’r•r—r˜rÚru
使用了 u 张表uSQL生æˆ�未通过验è¯�Ú
DATA_QUERYrÜrÞÚquestion_originalÚquestion_zh_normalized)ÚoriginalrãÚquery_normalizationÚfewshot_golden_reuseÚfewshot_golden_qidÚfewshot_golden_score)ÚqidÚscoreÚfewshot_golden)r‹rdÚmetadatar:ÚappendruÚwarningsÚextendÚerrorsÚjoinr�ÚvalidrÒÚ tables_used)
2026-04-16 10:53:10 +08:00
Úresultr‹Ú
explain_partsÚexplainrœÚdbsÚdbeÚsdmÚconfrˆÚpayloadÚqoÚqzs
r4Ú_nl_dict_from_generationrks6€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€CØ!€MØ
‡�×ÑÐ.Ô/Ø×ÑœS §¡Ð1DÑ!EÓFÔGØ
‡‚Ø×ÑÑ=¨V¯_ª_Ó=Ô=Ø
‡}‚}Ø×ÑÑ;¨V¯]ª]Ó;Ô;Ù*7ˆd�i‰i˜
Ô&¸T€GàØØØØñ %€MñØ'.ˆ
�mÑ$Ø
�/‰/×
Ñ
Ð3Ó
4€CØ
€Ø/2ˆ
2026-04-14 10:28:22 +08:00
Ð+Ñ,Ø
�/‰/×
Ñ
2026-04-16 10:53:10 +08:00
Ð1Ó
2026-04-14 10:28:22 +08:00
2€CÙ
2026-04-16 10:53:10 +08:00
Ø-0ˆ
Ð)Ñ*Ü*.¨v¯|©|Ò/HÀÀqÁÓ*I€MÐ&Ñ'Ø
�/‰/×
Ñ
Ð4Ó
5€CÙ
Ü03°C³ˆ
2026-04-14 10:28:22 +08:00
Ð,Ñ-Ø—,’,‰3 C€DØ
‡|‚|Øœc &×"4Ñ"4Ó5Ð6°gÐ>‰à%+§]¢]�—‘˜qÒ!Ð8Rˆà)¸ÈÑPØ&ñ€Gð
�‰× Ñ Ð0Ó 1€BØ �‰× Ñ Ð5Ó 6€BÙ ‰bØ68ÀÑ)CˆÐ%Ñ&Ø
2026-04-14 10:28:22 +08:00
‡�×ÑÐ1Ô2à—?‘?×&Ñ&Ð';Ó<Ø—_‘_×(Ñ(Ð)?Ó@ñ%
2026-04-16 10:53:10 +08:00
ˆÐ Ñ!ð €Nr6c ƒó‡‡‡‡ K—t«}ttjdd««Š |xsdj «xsdЉj «}t
2026-04-14 10:28:22 +08:00
j
d‰ ‰‰r t‰«ndt|«|ddt|«dkDrdndz«d ˆˆ ˆˆfd„ }|€||«ƒd{–—†St||«4ƒd{–—†}||«ƒd{–—†cddd«ƒd{–—†S7Œ:7Œ'7Œ7Œ #1ƒd{–—†7swYyxYw­w)
2026-04-14 10:28:22 +08:00
NÚTEXT2SQL_DIALECTÚ sqlserverr£zP[GEN/API] dialect=%s top_k=%s dialog_context_chars=%s question_len=%s preview=%rré,õ…c“ó`•‡K—dˆˆˆˆˆfd„ }tj|«ƒd{–—†S7Œ­w)NcóJ•—‰j‰j«‰‰‰¬«S)N)ÚquestionÚdialectÚtop_k_candidatesÚdialog_context)Úgeneraterd)ÚdcrtÚorsÚtop_ks€€€€€r4rz5_run_generate.<locals>._call_with_orch.<locals>._calles,ø€Ø—:‘:Ø!Ÿ™Ó)ØØ!&Ø!ð óð
r6©rr)rÓr)ryrrxrtrsrzs` €€€€r4Ú_call_with_orchz&_run_generate.<locals>._call_with_orchds*ùèø€÷ ñ ô×&Ñ& uÓ-×-Ð-Ð-ús „#.§,¨.r{) rorrUrVrdrkrlrÒr2)
2026-04-14 10:28:22 +08:00
rsrzrvr*rÚqr|ryrxrts
`` @@r4Ú
_run_generater~Qsíûèø€ô Ó €DÜ!¤"§)¡)Ð,>À Ó"LÓM€GØ
Ò
˜B× %Ñ %Ó 'Ò /¨4€BØ�‰Ó€AÜ
‡K�KØZØØ
2026-04-14 10:28:22 +08:00
ÙŒˆBŒ˜1Ü ˆA‹Ø ˆ$ˆ3ˆœC ›F SšL‘5¨bÑ1ô
÷ .ð .ð€Ù$ TÓ*×*Ð*Ü'¨¨g×6Ô6¸!Ù$ QÓ'×'÷7×6Ñ6ð+øØ6øØ'øð7ø×6×6Ñ6üsl†B.D Â4C/Â5D à C1Ã
2026-04-14 10:28:22 +08:00
D Ã
C7ÃC3ÃC7à D Ã)C5Ã*D Ã1D Ã3C7Ã5D Ã7D Ã=D Ã>D ÄD có¶ ‡‡‡‡‡‡‡‡K—|jr|jj«s1t|j«}t dt |«ddœ«­–—y|jj«Št
«}t|‰«ƒd{–—†\}}tjd|j|j|j|j|j|jt‰«‰ddt‰«dkDrdndz|r t|«nd|« t|j«}t!||«4ƒd{–—†Št#j$t&‰||xsd‰j(¬«ƒd{–—†}ddd«ƒd{–—†j*t,j.k(rŽ|j0xsdj«}|s t3|«}tjdt|«|dd t|«d kDrdndz«t d
d d d
œ«­–—t5d|«23d{–—†}|­–—Œt d
2026-04-16 10:53:10 +08:00
d dd
œ«­–—t;t=j>dd««Š|xsdj«xsdŠdŠt#j@«Štjd‰‰‰r t‰«ndt‰«‰ddt‰«dkDrdndz« t!||«4ƒd{–—†Št#jB«ŠiŠd$ˆˆˆˆˆˆˆˆfd„ } t#jDt#j$| ««}
‰jG«ƒd{–—†} | €n| rt dd | d
œ«­–—Œ0|
ƒd{–—†‰jGd«r‰d‚‰d} ddd«ƒd{–—† jNxsdj«}tjd| jP| jR| jTt|«|dd t|«d kDrdndz«| jVr tjYd| jV«| jZr tjd | jZ« t]| j^t`«r¦| j^jGd!«r8tc|tM| j^d!«|«ƒd{–—†| j^d!<| j^jGd"«r8tc|tM| j^d"«|«ƒd{–—†| j^d"<te| «}| jPrdnd#}t d||dœ«­–—t9|‰|«ƒd{–—†y7�Œå7�Œ47�Œ7�Œö#1ƒd{–—†7swY�ŒxYw7�Œj6t7|«}t dd|dœ«­–—t9|‰|«ƒd{–—†7y7�Œá7�Œ€7�Œa7�Œ9#1ƒd{–—†7swY�ŒJxYw#tH$r?}
2026-04-14 10:28:22 +08:00
tjKd|
›�d¬«t d tM|
«ddœ«­–—Yd}
2026-04-14 10:28:22 +08:00
~
yd}
~
wwxYw7�Œo7�Œ#tH$rY�ŒwxYw7Œâ­w)%Né�©r¢r¤r¥u±[API/stream] 开始: user_id=%r visitor_biz_id=%r session_id=%r service_code=%r model=%r lang_code=%r msg_chars=%s preview=%r dialog_context_chars=%s last_turn_was_data_query=%srpr£r©Úlast_turn_was_data_queryrvÚ
llm_clientu\[API/stream] 对è¯�æ„�图 conversation(跳过 Text2SQL): reply_chars=%s reply_preview=%réôrhr±ÚCHATrÌrr¡ÚsuccessrNrmrnézW[GEN/API/stream] dialect=%s top_k=%s dialog_context_chars=%s question_len=%s preview=%rrocó•— ‰j‰j«‰‰‰ˆˆfd„¬«‰d<‰j‰jd«y#t$r}|‰d<Yd}~Œ0d}~wwxYw#‰j‰jd«wxYw)Ncó<•—‰j‰j|«SrG)Úcall_soon_threadsafeÚ
2026-04-14 10:28:22 +08:00
put_nowait)ríÚ chunk_queueÚloops €€r4Ú<lambda>zA_chat_stream_events.<locals>._run_generate_sync.<locals>.<lambda>¾sø€°d×6OÑ6OØ'×2Ñ2°Aô7r6)rsrtrurvÚsql_stream_callbackraÚerror)rwrdrr‹rŒ) r#r�Údc_ctxrtÚholderrŽryrrzs €€€€€€€€r4Ú_run_generate_syncz/_chat_stream_events.<locals>._run_generate_sync·s„ø€ð
LØ'(§z¡zØ!%§¡£Ø 'Ø).Ø'-ô-ð (2ó(�F˜8Ñ$ð×-Ñ-¨k×.DÑ.DÀdÕKøô!ò(Ø&'�F˜7–Oûð(ûð×-Ñ-¨k×.DÑ.DÀdÕKús)ƒ+A Á A#ÁAÁA&ÁA#Á#A&Á&BTÚsql_genr‘rauPI/stream] 生æˆ�异常: )Úexc_infouZ[API/stream] Text2SQL 完æˆ�: valid=%s attempts=%s tables_used=%s sql_chars=%s sql_head=%ru[API/stream] 错误列表: %su[API/stream] 警告列表: %sr˜r–Úpartial)rÚNone)3rvrdrîrzrÆr ror@rkrlr�r€rrxrXrÒr2rÓrrrúr†rÚ CONVERSATIONÚreply_suggestionr r×rárDrrUrVÚget_running_loopÚQueueÚ create_taskr:rr‘rur‹r_Úattemptsr`r]rr[Ú
isinstancerYÚdictr$rk)r*r+rÚ dialog_blockr=Ú
classifiedrßÚpktÚ data_dictr”Úgen_taskÚpiecerar#Úsql_outr¤r�r’rtr“rŽryrrzs @@@@@@@@r4Ú_chat_stream_eventsr¨us„ÿèø€Ø �?Š? '§/¡/×"7Ñ"7Ô"9Ü# G×$5Ñ$5Ó6ˆÜ Ô-IÈ$Ó-OÐY]Ñ^Ó_Ó_ØØ �?‰?× Ñ Ó "€DÜ Ó €DÜ$BÀ7ÈDÓ$Q×QÑ€L�)Ü
‡K�Kð cà�‰Ø×ÑØ×ÑØ×ÑØ�
‰
2026-04-14 10:28:22 +08:00
Ø×ÑÜ ˆD‹ Ø ˆTˆcˆ
œs 4›y¨3š‘e°BÑ7Ù)ŒˆLÔ¨qØô
2026-04-16 10:53:10 +08:00
ô  × 1Ñ 1Ó 2€DÜ'¨¨g×6Ô6¸!Ü"×,Ñ,Ü Ø Ø%.Ø'Ò/¨4Ø—z‘zô 
÷
2026-04-14 10:28:22 +08:00
ˆ
÷7×6ð×ÑœL×5Ñ5Ò5Ø×,Ñ,Ò2°×9Ñ9Ó;ˆÙÜ1°$Ó7ˆEÜ� ‰ Ø jÜ �‹JØ �$�3ˆK¤C¨£J°Ò$4™5¸"Ñ =ô
ô
 .ÀÐW]Ñ^Ó_Ó_Ü0°¸Ô?÷ �#ØŒIô ˜n¸YÐS_Ñ`Ó
aÓaÜ!¤"§)¡)Ð,>À Ó"LÓM€GØÒ ˜b×
'Ñ
'Ó
)Ò
1¨T€FØ €EÜ × #Ñ #Ó %€DÜ
‡K�KØaØØ
ÙŒˆFŒ  1Ü ˆD‹ Ø ˆTˆcˆ
œs 4›y¨3š‘e°BÑ7ô
ð*Ü+¨D°'×:Ô:¸aÜ8?¿
¹
»ˆKØ%'ˆF÷
Lô
Lô ×*Ñ*¬7×+<Ñ+<Ð=OÓ+PÓQˆHØØ)Ÿo™oÓ/×/�Ø�=ØáÜ#à%.Ø+4Ø',ñóóð
ð�NˆNØ�z‰z˜'Ô"ؘW‘oÐ%ؘHÑ%ˆF÷K;×:ðV�z‰zÒ˜R×&Ñ&Ó(€GÜ
‡K�KØdØ� ‰ Ø�‰Ø×ÑÜ ˆG‹ Ø��ˆ
¤# g£,°Ò"4™¸"Ñ=ô
ð‡}‚}Ü�‰Ð6¸¿
¹
ÔFØ
‡‚Ü� ‰ Ð3°V·_±_ÔEð 
Ü �f—o‘o¤tÔ ,Ø�‰×"Ñ"Ð#9Ô:Ü@WØœ#˜fŸo™oÐ.DÑEÓFÈóA÷;�—‘Ð 6Ñ7ð�‰×"Ñ"Ð#6Ô7Ü=TØœ#˜fŸo™oÐ.AÑBÓCÀTó>÷8�—‘Ð 3Ñ4ô )¨Ó0€IØ—|’|‰)¨€CÜ
˜S¨°iÑ@Ó
AÓAÜ
# G¨T°9Ó
2026-04-14 10:28:22 +08:00
=×=Ñ=ðCRùð 7ùð
2026-04-16 10:53:10 +08:00
ùð7ù×6×6Ò6úð$ ùÐ?ä)¨%Ó0ˆ Ü ¨YÀ ÑJÓKÓKÜ'¨°°yÓA×AÑAØð ;ùð,0ùð