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

332 lines
59 KiB
Plaintext
Raw Normal View History

2026-04-14 10:28:22 +08:00
Ë
UÝáižÃãóä —dZddlmZddlZddlZddlZddlZddlZddlm Z ddl
m Z m Z m
Z
2026-04-14 10:28:22 +08:00
mZmZddlmZddlmZmZmZm ZmZddlmZdd lmZmZdd
lmZdd lm Z m!Z!m"Z"m#Z#dd l$m%Z%e e&«jO«jPZ)e)d
z Z*e+e*«ejXvr"ejXj[de+e*««ddl.m/Z/e/e)«ddl0m1Z1m2Z2m3Z3m4Z4ddl5m6Z6ddl7m8Z8ddl9m:Z:m;Z;ddl<m=Z=m>Z>m?Z?ej€eA«ZBej†«ZDdˆd„ZEeE«ZFeFj�«re%eF«eBj‘deF›�«neBj“deF›�«daJdaKd„ZLGd„de!«ZMGd„de!«ZNGd„de!«ZOGd„de!«ZPGd „d!e!«ZQGd"„d#e!«ZRGd$„d%e!«ZSGd&„d'e!«ZTGd(„d)e!«ZUGd*„d+e!«ZVd‰d,„ZWeXej²d-d.««ZZej²d/d0«xsd0j·«j¹«Z]dŠd1„Z^dŠd2„Z_dŠd3„Z`dd4œ d‹d5„ZadŒd6„Zbd�d7„ZcdŽd8„Zdd�d9„Zed�d:„ZfdŠd;„ZgdŠd<„Zhd‘d=„Zid‘d>„Zjd‘d?„Zk d’d@„Zled“dA„«Zm d”dB„Znd•dC„Zod–dD„Zp d— d˜dE„Zqd™dF„ZrdšdG„Zsd›dH„ZtedœdI„«ZuedJdKdLeu¬M«Zvd�dždN„Zwevjñe«dŸdO„«Zyevjñe«d dP„«Zzevjñe{«d¡dQ„«Z|evjûedRgdSdRgdRg¬T«evjýdU«dV„«Zev�jdW«d“dX„«Z�ev�jdY«d“dZ„«Z‚ev�jd[«d¢d\„«Zƒevjýd[« d£ d¤d]„«Z„evjýd^«ed_d`¬a«dddbdf d¥dc„«Z…ev�j
dd«d¦de„«Z‡ev�j
df« d§dg„«Zˆev�jdh« d¨ d©di„«ZŠev�jdj«dk„«Z‹ev�jdl«dm„«ZŒevjýdl« dª d«dn„«Z�evjýdo« d¨ d¬dp„«ZŽev�jdo«d­dq„«Z�ev�j
dr«ee�¬s«ddf d®dt„«Z‘ev�jdr« d¨ d¯du„«Z’evjýdv« dª d«dw„«Z“ev�jdx«dy„«Z”evjýdz«d{„«Z•eAd|k(r�ddl–Z–ddl—Z—eXej²d}d~««Z˜ej²dd€«Z™eBj‘d�e™›d‚e˜›�«eBj‘dƒe™›d‚e˜›d„�«e—�j4«e–�j6eve™e˜d…d†d¬‡«yy)°uo
FastAPI �务入� - Text2SQL NL Chat API
包装 Text2SQLOrchestrator 为 REST API �务,供�端调用
é)Ú annotationsN)ÚPath)ÚOptionalÚListÚDictÚAnyÚ
AsyncIterator)Úasynccontextmanager)ÚFastAPIÚ
2026-04-14 10:28:22 +08:00
HTTPExceptionÚBodyrÚRequest)ÚCORSMiddleware)ÚStreamingResponseÚ JSONResponse)ÚRequestValidationError)Ú AliasChoicesÚ BaseModelÚ
ConfigDictÚField)Ú load_dotenvÚbackend)Úconfigure_text2sql_api_logging)Ú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_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'Ú
executableÚparentÚ__file__Úresolve)r(Úcwd_envÚ meipass_envÚexe_dirÚenv_pathÚ
2026-04-14 10:28:22 +08:00
script_dirs ú2C:\Users\24019\Desktop\backman-camel\api_server.pyÚ_find_env_filer73sÞ€ãô�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
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=qs„à�"—)‘)Ð.Ó/ˆØ�— ‘ ˜/¨?Ó;ˆÙ˜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 åˆ�始化完æˆ�)
2026-04-14 10:28:22 +08:00
Ú 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
2026-04-14 10:28:22 +08:00
ed<edd¬«Z
d
ed<edd¬«Zd
ed<y)Ú
NLChatRequestT)Úpopulate_by_name.u!用户输入的自然语言问题©Ú descriptionÚstrÚmessageNu模型路由: openai | deepseekú
Optional[str]Ú service_codeu-模型å��称(å�¯é€‰ï¼Œè¦†ç›–默认模型)rZÚautoÚ lang_codeÚlangCodeuD语言:zh=简体中文,tc=ç¹�体中文,en=英语;auto=自动)Úvalidation_aliasrvõ会è¯�IDÚ
session_idu访客业务IDÚvisitor_biz_idu用户IDÚuser_id)rTrUrVrÚ model_configrrxÚ__annotations__rzrZrr|r€r�r‚rhr8r6rsrsŠs™…Ù¨tÔ4€Lá˜Ð*MÔN€GˆSÓNÙ"'¨Ð:[Ô"\€L�-Ó\Ù  Ð3bÔc€Eˆ=Ócá$ØÙ% k°:Ó>ØZô €Iˆ}óñ
!& d¸
Ô C€J�
ÓCÙ$)¨$Ð<LÔ$M€N�MÓMÙ" 4°ZÔ@€Gˆ]Ô@r8rscó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=未探针ú
Optional[int]Ú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 <edd ¬«Zded
<edd¬«Zded<y)ÚNLChatSuccessDatar†r‡r‹Ú
branch_resultNuC便æ�·å­—段:等价于 branch_result.sql(å�¯åŒ…å�« -- 注释)ruryrŒuiSQL 自然语言解释/交付说明(便æ�·å­—段;通常æ�¥è‡ª sql_delivery_message 或 sql_explainï¼‰Ú explanationu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—上方说明)Ústream_narrativeu$æµ�å¼�å�™è¿°ï¼ˆSQLå�—下方说明)Ústream_narrative_after) rTrUrVr„rrŒržrŸr rhr8r6rœrœ¹s_…Ø ÓØ"Ó"Ù˜tÐ1vÔw€CˆÓwÙ!&Ø Øô"€K�óñ',¨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óª—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ÚSSE_STREAM_SHAPEÚdualcó—tdvS)N)rÇÚbothrIrHrJÚonÚdefault©Ú_SSE_STREAM_SHAPErhr8r6Ú_sse_stream_shape_dualrÎÿs€Ü Ð UÐ UÐUr8có—tdvS)N)ÚenvelopeÚenvz data-onlyÚ data_onlyrÌrhr8r6Ú_sse_stream_shape_envelope_onlyrÓs€Ü Ð MÐ MÐMr8có—tdvS)N)ÚdeltaÚlegacyrPrQrRrSrÌrhr8r6Ú_sse_stream_shape_delta_onlyr×s€Ü Ð NÐ NÐNr8)Ú
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ó—t|j«}t|j|«}|}|dk(rt «s t «rd}|dk(rt «s t «rd}|}|�œ|xsdj
«j«dk(r#d|j
«j«vrd}nT|xsdj
«j«dk(r/|j
«j«jd«rd}||dœS)u°
计算“本次请求实际使用的 LLM 路由信��(用于�端�调回显)。
注�:此处仅回显路由结果,�包�密钥等�感信�。
ÚdeepseekÚopenaiNr¥Úgpt)rzrZ) Ú_normalize_model_labelrZÚ_infer_service_coderzÚ_has_deepseek_keyÚ_has_openai_keyrfrbÚ
startswith)ÚrequestrZÚscÚsc2Úeffective_models r6Ú!_effective_llm_route_from_requestrÿ%s÷€ô
# 7§=¡=Ó 1€EÜ ˜W×1Ñ1°5Ó 9€Bà
€CØ
ˆjÒÔ!2Ô!4Ü Ô ØˆCØ
ˆh‚œÔ0Ü Ô ØˆCð€OØÐ"Ø ŠI�2× Ñ Ó × $Ñ $Ó &¨(Ò 2°zÀ_×EZÑEZÓE\×EbÑEbÓEdÑ7dØ"‰OØŠi�R×
Ñ
Ó
×
&Ñ
&Ó
(¨JÒ
6¸?×;PÑ;PÓ;R×;XÑ;XÓ;Z×;eÑ;eÐfkÔ;lØ"ˆOðØ ñ ð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Ú_Ú-)rrrr{)Úenglishzen-uszen-gb)zzh-cnzzh-hanszzh-sg)zzh-twzzh-hantzzh-hkÚ traditionalztraditional-chinese©rfrbÚreplace)r¤ÚrawÚcs r6Ú_normalize_lang_coder Cs�€Ø Š>�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¥NrrÚ z--)ú gpt-4o-miniz
gpt4o-minirr)úgpt-4oÚgpt4or)ú deepseek-v3Ú
deepseekv3z
deepseek-v3.0z deepseekv3.0rr@)r@zdeepseek-reasonerr)rZr
Úms r6rörö]s¨€ð
2026-04-14 10:28:22 +08:00
Š;�B×
Ñ
Ó
€CÙ ØØ � ‰ ‹ ×ÑÓ€AØ � ‰ �#�sÓ×#Ñ# C¨Ó-€AØ
�!‰)Ø
2026-04-14 10:28:22 +08:00
�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¥)rôró)rõÚchatgptrôrórõ)rfrbrú)rzÚ
model_namerürs r6r÷r÷ys�€Ø
Ò
˜"× #Ñ #Ó %× +Ñ +Ó -€BÙ Ø
Ð'Ñ '؈IØ
Ð#Ñ #ØØ ˜Ñ Øà Ò �r× Ñ Ó"×(Ñ(Ó*€AÙØ ˜‰?ØØ �<‰<˜Ô ØØ r8cób—ttjd«xsdj««S)NÚOPENAI_API_KEYr¥©r‘rWrXrfrhr8r6rùrùŒs%€Ü ”—‘Ð+Ó,Ò2°×9Ñ9Ó;Ó <Ð<r8cób—ttjd«xsdj««S)Nr>r¥rrhr8r6rørø�s%€Ü ”—‘Ð-Ó.Ò4°"×;Ñ;Ó=Ó >Ð>r8có"—|dk(r y|dk(r y y)NrzÎ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.ruØæ‚¨å¥½ï¼Œæˆ‘是業務庫 Text2SQL 助手。
請用自然語言�述�查詢或統計的內容(例如:查詢�帳戶�用餘��按經紀商匯總未�算交易筆數)。
2026-04-14 10:28:22 +08:00
輸入 quit 或 exit å�¯é€€å‡ºã€‚uØæ‚¨å¥½ï¼Œæˆ‘是业务库 Text2SQL 助手。
请用自然语言�述�查询或统计的内容(例如:查询�账户�用余��按�纪商汇总未结算交易笔数)。
2026-04-14 10:28:22 +08:00
输入 quit 或 exit å�¯é€€å‡ºã€‚rh©r|s r6Ú_localized_conversation_replyr”s2€Ø�DÒð
*ð
ð �DÒð
0ð
ð ,ðr8có—|dk(ry|dk(ryy)Nrz=Please enter a concrete business query, or type quit to exit.ru?請輸入具體的業務查詢å•�題,或輸入 quit 退出。u?请输入具体的业务查询问题,或输入 quit 退出。rhrs r6Ú_localized_empty_input_replyr ªs€Ø�DÒØNØ�DÒØPØ Lr8có—|dk(ry|dk(ryy)NrÚEnglishrzTraditional ChinesezSimplified Chineserhrs 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)。
zh 直接返回;en/tc 使用 LLM 翻译(短输出,��引入格�)。
r¥)r{rÚsystemzAYou are a translation assistant.
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)rfr#rãÚ to_threadÚ ExceptionrmÚwarning) r.Útextr|ÚtÚtargetr/ÚoutÚer-s ` @r6Ú_translate_explain_textr9ºsºùèø€ð
Š�×ÑÓ€A٠؈ Ø�NÑ"؈ Ü
˜Ó
#€Fðð3Ø39°(ð;UðUñ
2026-04-16 10:53:10 +08:00
ð 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}|€|��
2026-04-16 10:53:10 +08:00
|}|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;
使用����一时刻仅一个请求修改该引用。
Nrr)Ú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örZr÷rzr r|Ú
llm.routerr;rørùrmr3rfrbrúÚ_ORCH_LLM_LOCKr+rór,r<) r.rûrZrüÚlangÚneeds_overrider;ÚtmprýÚ
llm_kwargsÚoldÚ
old_translates r6Ú_maybe_override_orch_llmrEå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)
2026-04-16 10:53:10 +08:00
r€rfrÚ get_messagesr‚r�Úgetr"r$r#) rûÚ user_textÚsidr§rJÚ last_datarLÚblockÚ_ns r6Ú_load_session_text2sql_contextrTs®èø€ð × Ñ Ò # ×
*Ñ
*Ó
,€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�r2rmr3)rûrOr§Úassistant_jsonr8s r6Ú_append_session_if_neededrX<s èø€Ø × Ò  7×#5Ñ#5×#;Ñ#;Ô#=Øð
2026-04-16 10:53:10 +08:00
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óL—|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
2026-04-14 10:28:22 +08:00
nd}|jrdt|j«›d�} n|jr|jdnd} d|| dœ|dœ}
||
d<|rt |«j«n|rt |«j«nd|
d<|jjd«} |jjd«} | r
| r| | dœ|
d<|jjd«r:|jjd«|jjd«dœ|
d<|
S) Nr¥r—c3ó2K—|]}t|«–—Œy­w©N©rw)Ú.0Úws r6Ú <genexpr>z+_nl_dict_from_generation.<locals>.<genexpr>Rsèø€Ð=©_¨œS ŸV©_ùó‚c3ó2K—|]}t|«–—Œy­wr[r\)r]r8s r6r_z+_nl_dict_from_generation.<locals>.<genexpr>Tsèø€Ð;©]¨œS ŸV©]ùr`z; rF©rŒrŽr�r�r’r“r–r˜r™rêr)u
使用了 u 张表uSQL生æˆ�未通过验è¯�Ú
2026-04-14 10:28:22 +08:00
DATA_QUERYrìrîrŒržÚquestion_originalÚquestion_zh_normalized)ÚoriginalrÚquery_normalizationÚfewshot_golden_reuseÚfewshot_golden_qidÚfewshot_golden_score)ÚqidÚscoreÚfewshot_golden)rŒrfÚmetadatarNÚappendrwÚwarningsÚextendÚerrorsÚjoinr‘ÚvalidrâÚ tables_used)
ÚresultrŒÚ
explain_partsÚexplainr�ÚdbsÚdbeÚsdmÚconfr‰ÚpayloadÚqoÚqzs
r6Ú_nl_dict_from_generationr€Lst€Ø �:‰:Ò ˜×
"Ñ
"Ó
$€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ˆ
Ð)Ñ*Ü*.¨v¯|©|Ò/HÀÀqÁÓ*I€MÐ&Ñ'Ø
�/‰/×
2026-04-14 10:28:22 +08:00
Ñ
Ð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ð€GˆE�Nñ ô ˆC‹�‰Ôá&-Œc�'‹l× Ñ Ô"°4ð ˆMÑð
�‰× Ñ Ð0Ó 1€BØ �‰× Ñ Ð5Ó 6€BÙ ‰bØ68ÀÑ)CˆÐ%Ñ&Ø
2026-04-14 10:28:22 +08:00
‡�×ÑÐ1Ô2à—?‘?×&Ñ&Ð';Ó<Ø—_‘_×(Ñ(Ð)?Ó@ñ%
ˆÐ Ñ!ð €Nr8c ƒó‡‡‡‡ K—t«}ttjdd««Š |xsdj «xsdЉj «}t
j
d‰ ‰‰r t‰«ndt|«|ddt|«dkDrdndz«d ˆˆ ˆˆfd„ }|€||«ƒd{–—†St||«4ƒd{–—†}||«ƒd{–—†cddd«ƒd{–—†S7Œ:7Œ'7Œ7Œ #1ƒd{–—†7swYyxYw­w)
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)Úgeneraterf)Údcr‰ÚorˆÚtop_ks€€€€€r6r/z5_run_generate.<locals>._call_with_orch.<locals>._call˜s,ø€Ø—:‘:Ø!Ÿ™Ó)ØØ!&Ø!ð óð
r8©r0r)rãr1)rŽr/r�r‰rˆr�s` €€€€r6Ú_call_with_orchz&_run_generate.<locals>._call_with_orch—s*ùèø€÷ ñ ô×&Ñ& uÓ-×-Ð-Ð-ús „#.§,¨.r�) rqrrWrXrfrmrnrârE)
rˆr�r‹rûr.Úqr‘rŽr�r‰s
`` @@r6Ú
_run_generater“„síûèø€ô Ó €DÜ!¤"§)¡)Ð,>À Ó"LÓM€GØ
2026-04-14 10:28:22 +08:00
Ò
˜B× %Ñ %Ó 'Ò /¨4€BØ�‰Ó€AÜ
2026-04-14 10:28:22 +08:00
‡K�KØZØØ
ÙŒˆBŒ˜1Ü ˆA‹Ø ˆ$ˆ3ˆœC ›F SšL‘5¨bÑ1ô
2026-04-14 10:28:22 +08:00
÷ .ð .ð€Ù$ TÓ*×*Ð*Ü'¨¨g×6Ô6¸!Ù$ QÓ'×'÷7×6Ñ6ð+øØ6øØ'øð7ø×6×6Ñ6üsl†B.D Â4C/Â5D à C1Ã
D Ã
2026-04-14 10:28:22 +08:00
C7ÃC3ÃC7Ã D Ã)C5Ã*D Ã1D Ã3C7Ã5D Ã7D Ã=D Ã>D ÄD c óüK—|xsd}tdt«}d}tdt|«|«D]E}|||||zz
}t dddddd œd
|id œd œ«­–—t j d«ƒd
{–—†ŒGy
7Œ­w)uZ将寒暄等回å¤�以 ApiEnvelope æµ�å¼�输出:data.branch_result.answer é€�步增长。r¥rÚrr£Ú streamingrérêrërìrírî©r¤r¦r§NrÞ)rïrðråÚaccræs r6Ú&_stream_business_manual_answer_in_datar˜¨s”èø€à
Š �€AÜ ˆqÔ*Ó +€DØ
2026-04-14 10:28:22 +08:00
€CÜ
�1”c˜!“f˜dÖ
#ˆØ ˆq��Q˜‘XˆÑˆÜàØ"à):È#ÐYgÑhØ&.° _ññ
ó 
ó
ô�m‰m˜AÓ×Ññ$ð ús‚A0A<Á2A:Á3A<c óŠK—tddddddœdggdd d
œ|d œd œ«­–—tjd«ƒd
{–—†y
7Œ­w)ukå�‘é€�一æ�¡ DATA_QUERY 的中间 envelope:模型输出进入 data.stream_narrative(SQL ä»�为空)。r£r•rcr)Ú
generatingrìr¥rFrb)r‡r�rŸr–N)rÃrãrä)Ú narratives r6Ú+_yield_data_query_stream_narrative_enveloperœ¼s[èø€ä
2026-04-14 10:28:22 +08:00
àØà%1ÀÐP\Ñ]àØ!ØØ!"Ø!&ñ "ð%.ñ
ñ
2026-04-14 10:28:22 +08:00
ó óô" �-‰-˜Ó
×Òús‚9A»A¼Acó(‡ ‡!‡"‡#‡$‡%‡&‡'K—|jr|jj«sbt|j«}t |«}t «rt
d|ddœ«­–—yt
dd|dœ«­–—t
d|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*¬
2026-04-14 10:28:22 +08:00
«ƒd{–—†}ddd«ƒd{–—†j,t.j0k(�rx|j2xsdj«}|s t5|«}tjd t!|«|dd t!|«d kDrdndz«t «rt7|«23d{–—†}|­–—Œt9«r�t;d
t<«} d}
t?d t!|xsd«| «D]]} |xsd| | | z} |
| z
}
t
dd| dœ«­–—t
ddddddœd|
idœdœ«­–—t%j@d «ƒd{–—†Œ_ntCd|«23d{–—†}|­–—ŒtE|«}
tG|«|
2026-04-14 10:28:22 +08:00
d<tI|‰&|
«ƒd{–—†t
dd|
dœ«­–—ytKtMjNdd««Š"|xsdj«xsdŠ!dŠ't%jP«Š$tjd‰"‰'‰!r t!‰!«nd t!‰&«‰&ddt!‰&«dkDrdndz« t#||«4ƒd{–—†Š%t%jR«Š iŠ#d}d}d}d4ˆ ˆ!ˆ"ˆ#ˆ$ˆ%ˆ&ˆ'fd„ }t%jTt%j&|««}d} ‰ jW«ƒd{–—†} | €�nE| �r@|| z}d}g}d } | t!|«kr®|sV|jYd!| «}|d"k(r|j[|| d«n€|| kDr|j[|| |«d }|t!d!«z} Œf|jYd#| «}|d"k(r t!|«| z
|kDr|| d}n|| d}d}nd}|t!d#«z} | t!|«krŒ®dj]|«}|rf|st!|«|kDr|d| }|| d|z}n |s|s|}nd}|r;t «r||z
}t_|«23d{–—†}|­–—Œt
dd|dœ«­–—�Œa|r=|s;t «r||z
}t_|«23d{–—†}|­–—Œt
dd|dœ«­–—d}|ƒd{–—†‰#jWd$«r‰#d$‚‰#d%}ddd«ƒd{–—†jfxsdj«}tjd)|jh|jj|jlt!|«|dd t!|«d kDrdndz«|jnr tjqd*|jn«|jrr tjd+|jr« tu|jvtx«r¦|jvjWd,«r8t{|te|jvd,«|«ƒd{–—†|jvd,<|jvjWd-«r8t{|te|jvd-«|«ƒd{–—†|jvd-<t}|«}
tG|«|
2026-04-14 10:28:22 +08:00
d<tI|‰&|
«ƒd{–—†tMjNd.d«j«j«d/vr` |
jWd0«xsdj«}d!t�j‚d0|id¬1«›d#�}tCdd2|›d2�«23d{–—†}|­–—Œt
d|jhrdnd3|
dœ«­–—y7�ŒØ7�Œ'7�Œö7�Œé#1ƒd{–—†7swY�ŒúxYw7�Œe6�Œ®7�ŒÑ7�Œ¼6�Œ·7�ŒŽ7�ŒÕ7�Œl7�Œ@6�Œ)7�Œ6�Œî7�Œç7�Œ¿#1ƒd{–—†7swY�ŒÐxYw#t`$rW}tjcd&|›�d ¬'«te|«xsd(}t
dd|dœ«­–—t
d |ddœ«­–—Yd}~yd}~wwxYw7�Œ
2026-04-14 10:28:22 +08:00
7�Œ½#t`$rY�ŒºwxYw7�Œ•7�Œ
6�Œ#t`$rY�ŒwxYw­w)5Né�r–Úsql_genr³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=%sr…r¥r©Úlast_turn_was_data_queryr‹Ú
2026-04-14 10:28:22 +08:00
llm_clientu\[API/stream] 对è¯�æ„�图 conversation(跳过 Text2SQL): reply_chars=%s reply_preview=%réôrÚr£r•rérêrërìrírîÚllmÚsuccessr‚rƒézW[GEN/API/stream] dialect=%s top_k=%s dialog_context_chars=%s question_len=%s preview=%rr„Fé có•— ‰j‰j«‰‰‰ˆˆfd„¬«‰d<‰j‰jd«y#t$r}|‰d<Yd}~Œ0d}~wwxYw#‰j‰jd«wxYw)Ncó<•—‰j‰j|«Sr[)Úcall_soon_threadsafeÚ
put_nowait)r Ú chunk_queueÚloops €€r6Ú<lambda>zA_chat_stream_events.<locals>._run_generate_sync.<locals>.<lambda><sø€°d×6OÑ6OØ'×2Ñ2°Aô7r8)rˆr‰rŠr‹Úsql_stream_callbackrvÚerror)rŒrfr2rªr«) r8r¬Údc_ctxr‰Úholderr­rŽr4r�s €€€€€€€€r6Ú_run_generate_syncz/_chat_stream_events.<locals>._run_generate_sync5s„ø€ð
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&Á&BTz<data>éÿÿÿÿz</data>r°rvuPI/stream] 生æˆ�异常: ©Úexc_infozstream generate erroruZ[API/stream] Text2SQL 完æˆ�: valid=%s attempts=%s tables_used=%s sql_chars=%s sql_head=%ru[API/stream] 错误列表: %su[API/stream] 警告列表: %sr™r—ÚSSE_APPEND_SQL_DATA_TAG>rIrÊrJrHrŒr½Ú
Úpartial)r0ÚNone)Brxrfr r|r rÓrÃrqrTrmrnr‚r�r€rzrZrârErãr1r!rór‡r Ú CONVERSATIONÚreply_suggestionrr˜rÎrßràrárärçrñrÿrXrrWrXÚget_running_loopÚQueueÚ create_taskrNÚfindrorsrœr2r°rwrŒrtÚattemptsrurrr3rpÚ
isinstancernÚdictr9r€rbr¿rÀ)(rûr?r¦r.Ú dialog_blockrQÚ
classifiedrïÚpktrår—ræÚpieceÚ data_dictÚ
in_data_blockÚcarryÚ carry_lenr³Úgen_taskÚ
stream_accÚbufÚ out_partsÚstartÚendÚout_textÚchunkrvr8ÚerrÚsql_outrŒÚdata_tagr¬r±r‰r²r­rŽr4r�s( @@@@@@@@r6Ú_chat_stream_eventsr×Òs ÿèø€Ø �?Š? '§/¡/×"7Ñ"7Ô"9Ü# G×$5Ñ$5Ó6ˆÜ*¨4Ó0ˆÜ *Ô ,Ü S°¸dÑCÓDÓ Dð ô iÀ ÐVYÑZÓ[Ó [Ü S°¸dÑCÓDÓ DØØ �?‰?× Ñ Ó "€DÜ Ó €DÜ$BÀ7ÈDÓ$Q×QÑ€L�)Ü
2026-04-14 10:28:22 +08:00
‡K�Kð cà�‰Ø×ÑØ×ÑØ×ÑØ�
‰