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

289 lines
48 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
Ÿgßi]�ãó —dZddlmZddlZddlZddlZddlZddlZddl Z ddl
2026-04-14 10:28:22 +08:00
m Z ddl m
Z
2026-04-14 10:28:22 +08:00
mZmZmZmZddlmZddlmZmZmZm ZddlmZdd lmZmZdd
lmZm Z m!Z!m"Z"dd l#m$Z$e e%«jM«jNZ(e(d z Z)e*e)«ejVvr"ejVjYde*e)««dd
l-m.Z.m/Z/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;m<Z<e jze j|dd¬«e j~e@«ZAej„«ZCd€d„ZDeD«ZEeEj�«re$eE«eAj�deE›�«neAj‘deE›�«daIdaJd„ZKGd„de «ZLGd„de «ZMGd„de «ZNGd„d e «ZOGd!„d"e «ZPGd#„d$e «ZQGd%„d&e «ZRGd'„d(e «ZSGd)„d*e «ZTGd+„d,e «ZUGd-„d.e «ZVd�d/„ZWeXej²d0d1««ZZdd2œ d‚d3„Z[dƒd4„Z\d„d5„Z]d…d6„Z^d†d7„Z_d‡d8„Z`d‡d9„Zadˆd:„Zbdˆd;„Zcdˆd<„Zd d‰d=„ZeedŠd>„«Zf d‹d?„ZgdŒd@„Zhd�dA„ZidŽdB„Zj d� d�dC„Zkd‘dD„Zled’dE„«ZmedFdGdHem¬I«ZnenjßedJgdKdJgdJg¬L«enjádM«dN„«ZqenjådO«dŠdP„«ZsenjådQ«dŠdR„«ZtenjådS«d“dT„«ZuenjádS« d” d•dU„«ZvenjádV«edWdX¬Y«dddZdf d–d[„«Zwenjñd\«d—d]„«Zyenjñd^« d˜d_„«Zzenj÷d`« d™ dšda„«Z|enjådb«d›dc„«Z}enjådd«edW«fdœde„«Z~enjádd« d� dždf„«Zenjádg« d™ dŸdh„«Z€enjådg«d di„«Z�enjñdj«ee‚¬k«ddf d¡dl„«Zƒenj÷dj« d™ d¢dm„«Z„enjádn« d£ d¤do„«Z…enjådp«dq„«Z†enjádr«ds„«Z‡e@dtk(rŽddlˆZˆddl‰Z‰eXej²dudv««ZŠej²dwdx«Z‹eAj�dye‹›dzeŠ›�«eAj�d{e‹›dzeŠ›d|�«e‰�j«eˆ�jene‹eŠd}d~¬«yy)¥uo
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)Úsetup_environmentÚ load_schemaÚcreate_orchestratorÚresolve_sql_dialect)ÚGenerationResult)Ú
lite_nl_store)Ú DialogIntentÚclassify_dialog)Úlast_assistant_was_data_queryÚmessages_to_text2sql_contextÚis_likely_follow_upz1%(asctime)s [%(levelname)s] %(name)s: %(message)sz%Y-%m-%d %H:%M:%S)ÚlevelÚformatÚdatefmtcóì—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_filer74sÞ€ãô�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
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)rHÚ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©r8r6ÚArgsr=rs„à�"—)‘)Ð.Ó/ˆØ�— ‘ ˜/¨?Ó;ˆÙ˜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
ð
‰r8riu![OK] Orchestrator åˆ�始化完æˆ�)
Ú orchestratorrÚ RuntimeErrorrWrXrÚschema_managerrÚloggerÚinfo)Ú schema_pathÚschema_meta_pathris r6Úget_orchestratorrq_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ä Ðr8có>—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<edd¬«Zded<y)Ú
2026-04-14 10:28:22 +08:00
NLChatRequestT)Úpopulate_by_name.u!用户输入的自然语言问题©Ú descriptionÚstrÚmessageNu模型路由: openai | deepseekú
Optional[str]Ú service_codeu-模型å��称(å�¯é€‰ï¼Œè¦†ç›–默认模型)rZÚautoÚ lang_codeÚlangCodeuD语言:zh=简体中文,tc=ç¹�体中文,en=英语;auto=自动)Úvalidation_aliasrvu任务IDÚtaskIdõ会è¯�IDÚ
session_idu访客业务IDÚvisitor_biz_idu用户IDÚuser_iduæµ�å¼�节æµ�å�‚æ•°ú
Optional[int]Ústreaming_throttle)rTrUrVrÚ model_configrrxÚ__annotations__rzrZrr|rr�r‚rƒr…rhr8r6rsrs‹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ˆ]Ó@Ù(-¨dÐ@TÔ(UИ
ÔUr8rscó4—eZdZUded<dZded<dZded<y)Ú
IntentPayloadrwÚintentNzOptional[float]Ú
confidenceryÚreason)rTrUrVr‡r‹rŒrhr8r6r‰r‰žs…Ø ƒKØ"&€J�Ó&Ø €FˆMÔ r8r‰cóX—eZdZUedd¬«Zded<eed¬«Zded <eed
¬«Zd ed <ed
d¬«Z ded<edd¬«Z
ded<edd¬«Z ded<edd¬«Z ded<edd¬«Z
ded<edd ¬«Zded!<edd"¬«Zded#<edd$¬«Zded%<y)&ÚDataQueryResult.u生æˆ�çš„SQL语å�¥rurwÚsqlu查询结果列å��)Údefault_factoryrvz List[str]Úcolumnsu查询结果行数æ�®zList[Dict[str, Any]]Úrowsru 结果行数r]Ú row_countFu 是å�¦æˆªæ–­ÚboolÚ truncatedNuSQL自然语言说明ryÚ sql_explainTu是å�¦å…�许导出zOptional[bool]Ú
can_exportu_库探针:1=有数æ�®è¡Œï¼Œ0=无行需追问补充,-1=执行失败(é‡�试),None=未探针r„Údb_execution_statusu7探针0时的无行说明与追问(å�«é—®é¢˜åˆ†æž�)Údb_empty_feedbackuNTrue 表示探针为0:需用户补充æ�¡ä»¶å�Žé‡�æ–°æ��问以é‡�新生æˆ�SQLÚfollow_up_requiredu4探针为1æ—¶LLM生æˆ�çš„é�¢å�‘用户SQL交付说明Úsql_delivery_message)rTrUrVrr�r‡Úlistr‘r’r“r•r–r—r˜r™ršr›rhr8r6rŽ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ô+И-ôr8rŽcó^—eZdZUded<ded<edd¬«Zded <edd
¬«Zded <y) ÚNLChatSuccessDatar‰rŠrŽÚ
branch_resultNu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—上方说明)ruryÚstream_narrativeu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—下方说明)Ústream_narrative_after)rTrUrVr‡rr r¡rhr8r6ržrž¼s4…Ø ÓØ"Ó"Ù&+¨DÐ>dÔ&eÐ�mÓeÙ,1°$ÐDjÔ,kИMÔkr8ržcóh—eZdZUedd¬«Zded<edd¬«Zded <ed
d ¬«Zd ed
<y
)Ú ApiEnvelopeéÈu状æ€�ç �,200表示æˆ�功rur]ÚcodeÚu消æ�¯rwÚmsgNu å“�应数æ�®zOptional[NLChatSuccessData]Údata)rTrUrVrr¥r‡r§r¨rhr8r6r£r£Ãs7…Ù�cÐ'DÔE€Dˆ#ÓEÙ�R XÔ.€CˆÓ.Ù(-¨dÀÔ(O€DÐ
%ÔOr8r£có0—eZdZUded<ded<dZded<y)Ú
ErrorResponser]r¥rwr§Nz
Optional[Any]r¨)rTrUrVr‡r¨rhr8r6rªrªÉs…Ø
ƒIØ ƒHØ€Dˆ-Ôr8rªcó8—eZdZUdZded<dZded<dZded<y)ÚSessionCreateBodyNryÚtitlerƒr‚©rTrUrVr­r‡rƒr‚rhr8r6r¬r¬Ïó …Ø€Eˆ=ÓØ!€Gˆ]Ó!Ø$(€N�MÔ(r8r¬có8—eZdZUdZded<dZded<dZded<y)ÚSessionTitlePatchBodyNryr­rƒr‚r®rhr8r6r±r±Õr¯r8r±có4—eZdZUded<dZded<dZded<y)ÚSessionMessagePatchBodyrwÚcontentNryrƒr‚)rTrUrVr‡rƒr‚rhr8r6r³r³Ûs…Ø
ƒLØ!€Gˆ]Ó!Ø$(€N�MÔ(r8r³có^—eZdZUded<dZded<dZded<dZded<dZded <dZded
<y) ÚSqlExecuteBodyrwr�Nr„Úmax_rowsryrƒr‚Úchat_session_idÚchat_message_id) rTrUrVr‡r·rƒr‚r¸r¹rhr8r6r¶r¶ás9…Ø ƒHØ"€HˆmÓ"Ø!€Gˆ]Ó!Ø$(€N�MÓ(Ø%)€O�]Ó)Ø%)€O�]Ô)r8r¶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 | reportrurwÚfav_typer¦ÚnameNryÚdescrƒr‚r�r–ÚpathÚ
reportPathÚparams)rTrUrVrr¼r‡r½r¾rƒr‚r�r–r¿rÀrÁrhr8r6r»r»êsm…Ù˜#Ð+DÔE€HˆcÓEØ€Dˆ#ƒNØ€Dˆ-ÓØ!€Gˆ]Ó!Ø$(€N�MÓ(Ø€CˆÓØ!%€K�Ó%Ø€Dˆ-ÓØ $€J�
Ó$Ø €FˆMÔ r8r»cóV—dtj|d¬«›d�jd«S)Nzdata: F©Ú ensure_asciiz
zutf-8)ÚjsonÚdumpsÚencode)Úobjs r6Ú _sse_datarÉ÷s(€Ø
”D—J‘J˜s°Ô7Ð8¸Ð =× DÑ DÀWÓ MÐMr8Ú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 r6Ú_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Ÿ)rf)ÚreplyÚrs r6Ú_conversation_nl_dicträs4€à Š�"×ÑÓÒ, €Aà.¸cÈ^Ñ\Ø" A˜ñ ðr8cóº—|xsdj«}|sy|dvry|dvry|dvry|j«jdd «}|d
vr|S|d vry|d vry|d
vryy)Nr{)u 简体中文u简体u中文(简体)Úzh)u ç¹�体中文u ç¹�體中文uç¹�体uç¹�é«”Útc)u英语u英文u英語ÚenÚ_Ú-)rærçrèr{)Úenglishzen-uszen-gb)zzh-cnzzh-hanszzh-sg)zzh-twzzh-hantzzh-hkÚ traditionalztraditional-chinese©rfrbÚreplace)r¥ÚrawÚcs r6Ú_normalize_lang_coderñs�€Ø Š>�6×
Ñ
Ó
"€CÙ Øà
Ð>Ñ>ØØ
ÐBÑBØØ
Ð,Ñ,Øà � ‰ ‹ ×јC Ó%€AØÐ &Ñ&؈ð Ð )Ñ)ØØÐ )Ñ)ØØÐ OÑOØØ r8có—|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í)rZrïÚms r6Ú_normalize_model_labelrú3s¨€ð
Š;�B×
Ñ
Ó
€CÙ ØØ � ‰ ‹ ×ÑÓ€AØ � ‰ �#�sÓ×#Ñ# C¨Ó-€AØ
�!‰)Ø
�I‰I�d˜CÓ ˆð �!Š)ð Ð 8Ñ8ØØÐ ÑØð Ð YÑYØØÐ 2Ñ2Øˆà €Jr8cóâ—|xsdj«j«}|r|dvr|S|dvryd|vry|xsdj«j«}|rd|vry|jd«ryy)Nr¦)ÚopenaiÚdeepseek)ÚgptÚchatgptrürýrþ)rfrbÚ
startswith)rzÚ
model_nameÚscrùs r6Ú_infer_service_coderOs�€Ø
Ò
˜"× #Ñ #Ó %× +Ñ +Ó -€BÙ Ø
Ð'Ñ '؈IØ
Ð#Ñ #ØØ ˜Ñ Øà Ò �r× Ñ Ó"×(Ñ(Ó*€AÙØ ˜‰?ØØ �<‰<˜Ô ØØ r8cób—ttjd«xsdj««S)NÚOPENAI_API_KEYr¦©r”rWrXrfrhr8r6Ú_has_openai_keyrbs%€Ü ”—‘Ð+Ó,Ò2°×9Ñ9Ó;Ó <Ð<r8cób—ttjd«xsdj««S)Nr>r¦rrhr8r6Ú_has_deepseek_keyr fs%€Ü ”—‘Ð-Ó.Ò4°"×;Ñ;Ó=Ó >Ð>r8có"—|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 å�¯é€€å‡ºã€‚rh©r|s r6Ú_localized_conversation_replyr js2€Ø�DÒð
*ð
ð �DÒð
0ð
2026-04-14 10:28:22 +08:00
ð ,ðr8có—|dk(ry|dk(ryy)Nrèz=Please enter a concrete business query, or type quit to exit.rçu?請輸入具體的業務查詢å•�題,或輸入 quit 退出。u?请输入具体的业务查询问题,或输入 quit 退出。rhr s r6Ú_localized_empty_input_replyr€s€Ø�DÒØNØ�DÒØPØ Lr8có—|dk(ry|dk(ryy)NrèÚEnglishrçzTraditional ChinesezSimplified Chineserhr s r6Ú _lang_labelrˆs€Ø�DÒØØ�DÒØ$Ø r8cƒó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)。
2026-04-14 10:28:22 +08:00
zh 直接返回;en/tc 使用 LLM 翻译(短输出,��引入格�)。
r¦)r{ræÚsystemzAYou are a translation assistant.
2026-04-14 10:28:22 +08:00
Translate the following text to z³.
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@)r\Útop_pÚmax_completion_tokensr¦)rýÚchatr´rf)r§ÚmessagesÚorchs €€r6Ú_callz&_translate_explain_text.<locals>._call¯s9ø€Ø�m‰m× Ñ  °sÀ#Ð]`Ð ÓaˆØ— ‘ Ò!˜r×(Ñ(Ó*Ð*r8Nz%[API] explain translation skipped: %s)Úreturnrw)rfrrÖÚ to_threadÚ ExceptionrmÚwarning) rÚtextr|ÚtÚtargetrÚoutÚers ` @r6Ú_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-14 10:28:22 +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úrZrrzrñr|Ú
llm.routerr)r rrmr!rfrbrÚ_ORCH_LLM_LOCKr+rýr,r*) rÚrequestrZrÚlangÚneeds_overrider)ÚtmpÚsc2Ú
llm_kwargsÚoldÚ
old_translates r6Ú_maybe_override_orch_llmr5»sèø€ô
# 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)
u}
在写入本轮之�读�会�历�,构造 Text2SQL 上文,并判断上一轮助手是�为数�查询。
r¦)r¦Fr¤r)ÚlimitÚoffsetNÚitemsé)Ú max_pairs)
r�rfrÚ get_messagesrƒr‚Úgetrr!r ) r-Ú user_textÚsidr¨r9Ú last_datar;ÚblockÚ_ns r6Ú_load_session_text2sql_contextrCõs®èø€ð × Ñ Ò # ×
*Ñ
2026-04-14 10:28:22 +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] 会è¯�è�½åº“跳过: ) r�rfrÅrÆrÚappend_exchangerƒr‚r rmr!)r-r>r¨Úassistant_jsonr&s r6Ú_append_session_if_neededrGs èø€Ø × Ò  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
| r| | dœ|
d<|
S)Nr¦r™c3ó2K—|]}t|«–—Œy­w©N©rw)Ú.0Úws r6Ú <genexpr>z+_nl_dict_from_generation.<locals>.<genexpr>(sèø€Ð=©_¨œS ŸV©_ùó‚c3ó2K—|]}t|«–—Œy­wrJrK©rLr&s r6rNz+_nl_dict_from_generation.<locals>.<genexpr>*sèø€Ð;©]¨œS ŸV©]ùrOú; 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)r�rfÚmetadatar=ÚappendrwÚwarningsÚextendÚerrorsÚjoinr”ÚvalidrÕÚ tables_used)
Úresultr�Ú
explain_partsÚexplainrŸÚdbsÚdbeÚsdmÚconfrŒÚpayloadÚqoÚqzs
r6Ú_nl_dict_from_generationrj"sî€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€CØ!€MØ
‡�×ÑÐ.Ô/Ø×ÑœS §¡Ð1DÑ!EÓFÔGØ
‡‚Ø×ÑÑ=¨V¯_ª_Ó=Ô=Ø
‡}‚}Ø×ÑÑ;¨V¯]ª]Ó;Ô;Ù*7ˆd�i‰i˜
Ô&¸T€GàØØØØñ %€MñØ'.ˆ
2026-04-14 10:28:22 +08:00
�mÑ$Ø
�/‰/×
Ñ
2026-04-14 10:28:22 +08:00
Ð3Ó
4€CØ
€Ø/2ˆ
2026-04-14 10:28:22 +08:00
Ð+Ñ,Ø
�/‰/×
Ñ
Ð1Ó
2026-04-14 10:28:22 +08:00
2€CÙ
Ø-0ˆ
2026-04-14 10:28:22 +08:00
Ð)Ñ*Ü*.¨v¯|©|Ò/HÀÀqÁÓ*I€MÐ&Ñ'Ø
�/‰/×
2026-04-14 10:28:22 +08:00
Ñ
Ð4Ó
5€CÙ
Ü03°C³ˆ
Ð,Ñ-Ø—,’,‰3 C€DØ
‡|‚|Øœc &×"4Ñ"4Ó5Ð6°gÐ>‰à%+§]¢]�—‘˜qÒ!Ð8Rˆà)¸ÈÑPØ&ñ€Gð
2026-04-14 10:28:22 +08:00
�‰× Ñ Ð0Ó 1€BØ �‰× Ñ Ð5Ó 6€BÙ ‰bØ68ÀÑ)CˆÐ%Ñ&Ø €Nr8c óÚ—|jxsdj«}tjd|id¬«}d|›d�g}d}|jj d«r>|j
dtjt|jd««›d �«|jj d
2026-04-14 10:28:22 +08:00
«rt|jd
«}nV|jrt|jd «}n1|jr%d jd
„|jddD««}|j«r(|j
dtj|«›d �«dj|«S)Nr¦r�FrÃz<data>z</data>r›z<div class="sql-delivery-body">z</div>r™rrRc3ó2K—|]}t|«–—Œy­wrJrKrQs r6rNz'_sql_gen_stream_html.<locals>.<genexpr>]sèø€Ð>Ñ,= qœC ŸFÑ,=ùrOéz<div class="sql-explain-body">)
r�rfrÅrÆrXr=rYÚhtml_libÚescaperwrZr\r])r`r�ÚinnerÚpartsrbs r6Ú_sql_gen_stream_htmlrrOs(€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€CÜ �J‰J˜˜s�|°%Ô 8€EØ�e�W˜GÐ
$Ð %€EØ€GØ
2026-04-14 10:28:22 +08:00
‡�×ÑÐ1Ô2Ø
� ‰ Ø-¬h¯o©o¼cÀ&Ç/Á/ÐRhÑBiÓ>jÓ.kÐ-lÐlrÐ sô
2026-04-14 10:28:22 +08:00
ð‡�×ÑÐ.Ô/Ü�f—o‘oÐ&9Ñ:Ó;‰Ø �ŠÜ�f—o‘o aÑ(Ó)‰Ø �ŠØ—)‘)Ñ>¨F¯M©M¸"¸1Ñ,=Ó>Ó>ˆØ‡}�}„Ø
� ‰ Ð5´h·o±oÀgÓ6NÐ5OÈvÐVÔWØ
2026-04-14 10:28:22 +08:00
�7‰7�5‹>Ðr8cƒóp‡‡‡‡K—t«}ttjdd««Š|xsdj «xsdŠdˆˆˆˆfd„ }|€||«ƒd{–—†St ||«4ƒd{–—†}||«ƒd{–—†cddd«ƒd{–—†S7Œ:7Œ'7Œ7Œ #1ƒd{–—†7swYyxYw­w)NÚTEXT2SQL_DIALECTÚ sqlserverr¦c“ó`•‡K—dˆˆˆˆˆfd„ }tj|«ƒd{–—†S7Œ­w)NcóJ•—‰j‰j«‰‰‰¬«S)N)ÚquestionÚdialectÚtop_k_candidatesÚdialog_context)Úgeneraterf)ÚdcryÚorxÚtop_ks€€€€€r6rz5_run_generate.<locals>._call_with_orch.<locals>._callns,ø€Ø—:‘:Ø!Ÿ™Ó)ØØ!&Ø!ð óð
r8©rr)rÖr)r~rr}ryrxrs` €€€€r6Ú_call_with_orchz&_run_generate.<locals>._call_with_orchms*ùèø€÷ ñ ô×&Ñ& uÓ-×-Ð-Ð-ús „#.§,¨.r€)rqrrWrXrfr5) rxrr{r-rr�r~r}rys `` @@r6Ú
_run_generater‚cs ûèø€ô Ó €DÜ!¤"§)¡)Ð,>À Ó"LÓM€GØ
Ò
˜B× %Ñ %Ó 'Ò /¨4€B÷ .ð .ð€Ù$ TÓ*×*Ð*Ü'¨¨g×6Ô6¸!Ù$ QÓ'×'÷7×6Ñ6ð+øØ6øØ'øð7ø×6×6Ñ6üsl†AB6ÁBÁB6Á3BÁ4B6Á7 B!ÂBÂB! B6ÂBÂB6ÂB6ÂB!ÂB6Â!B3Â'B* Â(B3Â/B6cóHK—|jr|jj«s1t|j«}t dt |«ddœ«­–—y|jj«}t
2026-04-14 10:28:22 +08:00
«}t||«ƒd{–—†\}}t|j«}t||«4ƒd{–—†}tjt|||xsd|j¬«ƒd{–—†}ddd«ƒd{–—†jtjk(rm|j xsdj«}|s t#|«}t$j'd«t dddd œ«­–—t)d
|«23d{–—†} | ­–—Œt ddd
d œ«­–— t/||xsd|¬«ƒd{–—†} t7| j8t:«r¦| j8j=d«r8t?|t5| j8d«|«ƒd{–—†| j8d<| j8j=d«r8t?|t5| j8d«|«ƒd{–—†| j8d<tA| «}
t)d|
«23d{–—†} | ­–—Œ7�Œ7�Œê7�Œ¹7�Œ¬#1ƒd{–—†7swY�Œ½xYw7�ŒA6t+|«}
t d d |
2026-04-14 10:28:22 +08:00
dœ«­–—t-|||
«ƒd{–—†7y7�ŒF#t0$r=} t$j3d| ›�«t dt5| «ddœ«­–—Yd} ~ yd} ~ wwxYw7�Œ17Œà#t0$rYŒÜwxYw7ŒÄ6tC| «}
| jDrd nd}t d ||
2026-04-14 10:28:22 +08:00
dœ«­–—t-|||
«ƒd{–—†7y­w)Né�©r¥r§r¨©Úlast_turn_was_data_queryr{Ú
llm_clientr¦uZ[API/stream] 对è¯�æ„�图: conversation(跳过 Text2SQL,与 CLI single_query 一致)rjr´ÚCHATrÏrr¤ÚsuccessrS©r{r-uPI/stream] 生æˆ�异常: éôr›r™Úsql_genÚpartial)#rxrfrñr|rÉrrqrCr5rÖrrrýrŠrÚ CONVERSATIONÚreply_suggestionr rmrnrÚrärGr‚r ÚerrorrwÚ
isinstancerXÚdictr=r'rrrjr^)r-r.r"rÚ dialog_blockr@r~Ú
classifiedrâÚpktÚ data_dictr`r&Úhtmlr§s r6Ú_chat_stream_eventsr™~s+èø€Ø �?Š? '§/¡/×"7Ñ"7Ô"9Ü# G×$5Ñ$5Ó6ˆÜ Ô-IÈ$Ó-OÐY]Ñ^Ó_Ó_ØØ �?‰?× Ñ Ó "€DÜ Ó €DÜ$BÀ7ÈDÓ$Q×QÑ€L�)Ü  × 1Ñ 1Ó 2€DÜ'¨¨g×6Ô6¸!Ü"×,Ñ,Ü Ø Ø%.Ø'Ò/¨4Ø—z‘zô 
÷
ˆ
÷7×6ð×ÑœL×5Ñ5Ò5Ø×,Ñ,Ò2°×9Ñ9Ó;ˆÙÜ1°$Ó7ˆEÜ� ‰ ÐpÔqÜ .ÀÐW]Ñ^Ó_Ó_Ü0°¸Ô?÷ �#ØŒIô ˜n¸YÐS_Ñ`Ó
aÓaðÜ$ T¸,Ò:NÈ$ÐX_Ô`×`ˆð 
Ü �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ô  Ó '€DÜ,¨Y¸Ô=÷ˆcØŒ ð_Rùà6ùð
ùð7ù×6×6Ò6úð ùÐ?ä)¨%Ó0ˆ Ü ¨YÀ ÑJÓKÓKÜ'¨°°yÓA×AÑAØðaúÜ òÜ� ‰ Ð2°1°#Ð6Ô7Ü ¬S°«V¸TÑBÓCÓCÜûðúð;ùð8ùô ò
Ù ð
úðøÐ=ä(¨Ó0€IØ—|’|‰)¨€CÜ
˜S¨°iÑ@Ó
AÓAÜ
# G¨T°9Ó
=×=Ò=ùsM‚B N"Â
J!Â,N"Â:J$Â;N"Â>0J-Ã.J'Ã/J-Ã3 N"Ã>J*Ã?A?N"Å>KÆKÆKÆN"Æ K>Æ5K;Æ6K>Æ;AM ÈMÈAM É)M
É*M É;N"ÊMÊMÊMÊN"Ê$N"Ê'J-Ê*N"Ê-KÊ3J6 Ê4KÊ;N"ËKË.N"Ë4K7Ë5N"Ë;K>Ë> MÌ3L?Ì:N"Ì?MÍN"ÍM Í
M Í MÍN"ÍMÍN"ÍMÍ>N"ÎNÎN"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 已关闭)rmrnrqr r‘)Úappr&s r6Úlifespanrœ»s}èø€ä
‡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­rvÚversionrœÚ*T)Ú
allow_originsÚallow_credentialsÚ
2026-04-14 10:28:22 +08:00
allow_methodsÚ
allow_headersz/healthcƒóK—dddœS­w)uå�¥åº·æ£€æŸ¥æŽ¥å�£ÚokzText2SQL API is running)Ústatusrxrhrhr8r6Ú health_checkr¦Ýsèø€ðÐ'@Ñ AÐAùs‚z/g3sb/api/nl/chatcƒóXK— |jr|jj«s+t|j«}t dt |«¬«‚|jj«}t jd|dd›d�«t«}t||«ƒd{–—†\}}t|j«}t||«4ƒd{–—†}tjt|||xsd|j¬«ƒd{–—†}ddd«ƒd{–—†jt j"k(rf|j$xsdj«}|s t'|«}t jd «t)|«} t+||| «ƒd{–—†d