app: description: F8数据库业务助手-接入AI实验室(去除历史问答记录) icon: face_with_hand_over_mouth icon_background: '#ECE9FE' icon_type: emoji mode: advanced-chat name: 数据库助手v3.12 use_icon_as_answer_icon: true dependencies: - current_identifier: null type: marketplace value: marketplace_plugin_unique_identifier: langgenius/tongyi:0.2.4@72bdf0d70a10b1b9f64746ccd1bd792397598f4536872b310e77532af02ad6a6 version: null kind: app version: 0.6.0 workflow: conversation_variables: - description: 最后一次生成 id: ab2439a1-9b4d-4ede-87b6-a4613f095a78 name: latest_load selector: - conversation - latest_load value: '' value_type: string - description: 当前蚕季ID id: d541aee5-cedd-44f4-8434-5b3845e97a1e name: canjiId selector: - conversation - canjiId value: 未指定 value_type: string - description: 当前蚕季名 id: f8c87483-4d91-4828-a4f4-ab4dec0634a7 name: canjiName selector: - conversation - canjiName value: 未指定 value_type: string - description: Cube表join关系 id: 4d28225d-2249-4390-b9c3-ea4e64184188 name: cube_joins selector: - conversation - cube_joins value: "{\n \"bus_co_breeding_assessment\": [\n \"poc_tenants\",\n \"cz_gyh\"\ ,\n \"nonghu_info\",\n \"batch_canji\"\n ],\n \"bus_farmer_operation\"\ : [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\n ],\n \"bus_farmer_yield\"\ : [\n \"poc_tenants\",\n \"nonghu_info\",\n \"batch_canji\"\n ],\n\ \ \"bus_order_delivery\": [\n \"poc_tenants\",\n \"nonghu_info\",\n \ \ \"batch_canji\",\n \"cbms_rbac_base_departments\"\n ],\n \"bus_payment_transfer\"\ : [\n \"poc_tenants\",\n \"nonghu_info\",\n \"batch_canji\",\n \"\ cbms_rbac_base_departments\"\n ],\n \"bus_purchase_bill\": [\n \"poc_tenants\"\ ,\n \"nonghu_info\",\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"bus_purchase_grade_mode\": [\n \"poc_tenants\",\n \"sg_chengzhong\"\ ,\n \"nonghu_info\",\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"bus_quality_inspection\": [\n \"poc_tenants\",\n \"yp_bill_kpi_item_fix\"\ ,\n \"sg_chengzhong\",\n \"nonghu_info\",\n \"batch_canji\"\n ],\n\ \ \"bus_subsidy_policy\": [\n \"poc_tenants\",\n \"nonghu_info\",\n \ \ \"batch_canji\"\n ],\n \"bank_pay_base\": [\n \"poc_tenants\",\n \ \ \"nonghu_info\",\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"batch_canji\": [\n \"poc_tenants\"\n ],\n \"cbms_rbac_assoc_department_users\"\ : [\n \"poc_tenants\",\n \"cbms_rbac_base_users\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"cbms_rbac_assoc_user_roles\": [\n \"poc_tenants\",\n \"cbms_rbac_base_users\"\ ,\n \"cbms_rbac_base_roles\"\n ],\n \"cbms_rbac_base_departments\": [\n\ \ \"poc_tenants\"\n ],\n \"cbms_rbac_base_roles\": [\n \"poc_tenants\"\ \n ],\n \"cbms_rbac_base_users\": [\n \"poc_tenants\"\n ],\n \"csb_exchange\"\ : [\n \"poc_tenants\",\n \"nonghu_info\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"cz_config_item\": [\n \"poc_tenants\",\n \"batch_canji\"\n\ \ ],\n \"cz_dzbill_list\": [\n \"poc_tenants\",\n \"nonghu_info\",\n\ \ \"batch_canji\",\n \"cz_gyh\",\n \"cbms_rbac_base_departments\"\n\ \ ],\n \"cz_gyh\": [\n \"poc_tenants\",\n \"nonghu_info\",\n \"batch_canji\"\ ,\n \"cbms_rbac_base_departments\"\n ],\n \"dep_xianxiangcun_config\":\ \ [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\n ],\n \"gj_crm_clientinfo\"\ : [\n \"poc_tenants\"\n ],\n \"gj_cy_item\": [\n \"poc_tenants\",\n\ \ \"gj_cy_main\"\n ],\n \"gj_cy_main\": [\n \"poc_tenants\",\n \"\ batch_canji\"\n ],\n \"gj_jianbie\": [\n \"poc_tenants\"\n ],\n \"gj_kc_fbtl_item\"\ : [\n \"poc_tenants\",\n \"gj_kc_fbtl_plan\"\n ],\n \"gj_kc_fbtl_plan\"\ : [\n \"poc_tenants\",\n \"batch_canji\",\n \"gj_jianbie\"\n ],\n\ \ \"gj_kc_fbtl_release\": [\n \"poc_tenants\",\n \"batch_canji\"\n ],\n\ \ \"gyh_kaohe_check_result_bbit\": [\n \"poc_tenants\",\n \"batch_canji\"\ ,\n \"cz_gyh\"\n ],\n \"gyh_kaohe_check_result_item_bbit\": [\n \"poc_tenants\"\ ,\n \"batch_canji\",\n \"gyh_kaohe_check_result_bbit\",\n \"gyh_kaohe_config_bbit\"\ \n ],\n \"gyh_kaohe_config_bbit\": [\n \"poc_tenants\",\n \"batch_canji\"\ \n ],\n \"gyh_kpi_result\": [\n \"poc_tenants\",\n \"batch_canji\",\n\ \ \"cz_gyh\"\n ],\n \"ljtc_nonghu_pinkunhu\": [],\n \"nonghu_extend_con_config\"\ : [\n \"poc_tenants\"\n ],\n \"nonghu_info\": [\n \"poc_tenants\",\n\ \ \"cbms_rbac_base_departments\"\n ],\n \"nonghu_info_temp\": [\n \"\ poc_tenants\",\n \"nonghu_info\",\n \"cbms_rbac_base_departments\"\n \ \ ],\n \"nsl_pinkunhu_info\": [],\n \"poc_tenants\": [],\n \"sangyuan_manage\"\ : [\n \"poc_tenants\",\n \"nonghu_info\"\n ],\n \"sc_worker\": [\n \ \ \"poc_tenants\"\n ],\n \"sc_worker_xianxiangcun_config\": [\n \"poc_tenants\"\ ,\n \"sc_worker\"\n ],\n \"sg_box_config_bydep\": [\n \"poc_tenants\"\ ,\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\n ],\n \"sg_butie_param\"\ : [\n \"poc_tenants\",\n \"batch_canji\"\n ],\n \"sg_canji_config\"\ : [\n \"poc_tenants\",\n \"batch_canji\"\n ],\n \"sg_canji_config_price\"\ : [\n \"poc_tenants\",\n \"batch_canji\",\n \"sg_type_config\",\n \ \ \"cbms_rbac_base_departments\"\n ],\n \"sg_chengzhong\": [\n \"poc_tenants\"\ ,\n \"nonghu_info\",\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\ ,\n \"cz_gyh\"\n ],\n \"sg_chengzhong_extention\": [\n \"poc_tenants\"\ ,\n \"sg_chengzhong\"\n ],\n \"sg_chengzhong_inputdata\": [\n \"poc_tenants\"\ ,\n \"sg_chengzhong\"\n ],\n \"sg_chengzhong_item_sum\": [\n \"poc_tenants\"\ ,\n \"sg_chengzhong\",\n \"sg_type_config\"\n ],\n \"sg_datawall_config\"\ : [\n \"poc_tenants\",\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"sg_fb_dan\": [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"sg_fb_dan_detail\": [\n \"poc_tenants\",\n \"sg_fb_dan\"\n\ \ ],\n \"sg_type_config\": [\n \"poc_tenants\"\n ],\n \"sys_update_log\"\ : [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\n ],\n \"user_xianxiangcun_config\"\ : [\n \"poc_tenants\",\n \"cbms_rbac_base_users\",\n \"cbms_rbac_base_roles\"\ \n ],\n \"wms_kufang\": [\n \"poc_tenants\"\n ],\n \"wms_wanglaidanwei\"\ : [\n \"poc_tenants\"\n ],\n \"wms_wuzi\": [\n \"poc_tenants\",\n \ \ \"wms_wanglaidanwei\"\n ],\n \"wms_wuzikucun\": [\n \"poc_tenants\"\ ,\n \"wms_wuzi\",\n \"wms_kufang\",\n \"wms_wanglaidanwei\"\n ],\n\ \ \"worker\": [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\n\ \ ],\n \"worker_nonghu\": [\n \"poc_tenants\",\n \"worker\",\n \"\ nonghu_info\"\n ],\n \"worker_record\": [\n \"poc_tenants\",\n \"worker\"\ ,\n \"batch_canji\",\n \"cbms_rbac_base_departments\"\n ],\n \"wuzi_archives\"\ : [\n \"poc_tenants\"\n ],\n \"wuzi_commit\": [\n \"poc_tenants\"\n\ \ ],\n \"wuzi_commit_item\": [\n \"poc_tenants\",\n \"wuzi_commit\"\ ,\n \"wuzi_archives\"\n ],\n \"wuzi_config\": [\n \"poc_tenants\"\n\ \ ],\n \"wuzi_inout_bill\": [\n \"poc_tenants\",\n \"nonghu_info\",\n\ \ \"batch_canji\",\n \"cbms_rbac_base_departments\"\n ],\n \"wuzi_inout_bill_item\"\ : [\n \"poc_tenants\",\n \"wuzi_inout_bill\",\n \"wuzi_archives\"\n\ \ ],\n \"wuzi_input\": [\n \"poc_tenants\",\n \"wuzi_warehouse\",\n\ \ \"wuzi_supplier\"\n ],\n \"wuzi_input_item\": [\n \"poc_tenants\"\ ,\n \"wuzi_input\",\n \"wuzi_archives\"\n ],\n \"wuzi_inventory\": [\n\ \ \"poc_tenants\",\n \"wuzi_archives\",\n \"wuzi_warehouse\"\n ],\n\ \ \"wuzi_out\": [\n \"poc_tenants\",\n \"wuzi_warehouse\",\n \"nonghu_info\"\ \n ],\n \"wuzi_out_item\": [\n \"poc_tenants\",\n \"wuzi_out\",\n \ \ \"wuzi_archives\"\n ],\n \"wuzi_supplier\": [\n \"poc_tenants\"\n ],\n\ \ \"wuzi_warehouse\": [\n \"poc_tenants\",\n \"cbms_rbac_base_departments\"\ \n ],\n \"yp_bill_kpi_item\": [\n \"poc_tenants\",\n \"sg_chengzhong\"\ ,\n \"yp_bill_list\"\n ],\n \"yp_bill_kpi_item_fix\": [\n \"poc_tenants\"\ ,\n \"sg_chengzhong\"\n ],\n \"yp_bill_list\": [\n \"poc_tenants\",\n\ \ \"sg_chengzhong\",\n \"sg_type_config\"\n ]\n}\n" value_type: string - description: 用户提问 id: c0ec71d5-7fb5-4279-a8fd-95c94e35a837 name: user_query selector: - conversation - user_query value: '' value_type: string - description: 业务规则 id: 94f312c3-0a47-4d37-970c-aaa2bfbae2a7 name: global_rules selector: - conversation - global_rules value: '【实体与范围】 - 蚕季名称优先按 batch_canji.batchname 查询;需要拆分时使用 bathcyears + batchname,不按自然日期年份替代蚕季年度。 - 茧站名称或编码先查询 cbms_rbac_base_departments;收购站、订种站、支付站、建档站按各业务表 depsysid 或 departmentsysid 区分。 - 常见蚕季名称:2020春三批、2019年正秋季、2024年晚春季等,在遇到类似名称时,要将其视为蚕季名称。且在查询时最好将用户所述的蚕季名分开查询,例如用户查询2026春一的情况,则需要分解”2026春一“为2026与春一,并限定"batch_canji".batchname contain ”春一“ 同时 "batch_canji".batchyear equal ”2026“ - 常见租户名称/简称,在遇到此类名称时视为租户:鎏金铜蚕、南丝路集团/南丝路、主干信息、会东、嘉联、蓉桑里、嘉风、雅天丝、奥立丝绸、安泰茧丝绸。 【默认有效口径】 - 农户数量默认统计 nonghu_info.flag=1;只有明确要求全部档案或包含冻结时才使用未过滤 count。 - 有效收购:sg_chengzhong.flag=1 且 billstate=2。 - 有效订种:cz_dzbill_list.flag=1 且 dzsum>0。 - 鎏金铜蚕租户特殊订种口径:当租户为鎏金铜蚕或 tenantid=603143556655353856,统计订种张数、领种数量、养蚕张数时,默认只统计支付成功订种,即 CZ_DZBILL_LIST.dzpaystate=1;使用业务 Cube 时优先选择 bus_order_delivery.paid_order_quantity_sheet,而不是 bus_order_delivery.order_quantity_sheet。 - 有效支付:bank_pay_base.flag>0;支付成功默认 paystate in (3,6,7)。 【计算与模型选择】 - 选择能完整回答问题的最小 Cube;单纯农户档案、数量、年龄使用 nonghu_info,跨蚕季累计经营使用 bus_farmer_operation。 - 汇总均价、比率、单产必须使用汇总分子/汇总分母,不平均行级比率。 - 默认农户单产=有效售茧净重/全部有效订种张数;排行/Top 类问题默认按目标指标 DESC,大数在前;小于/低于阈值只作为过滤条件,不改变排序方向,只有明确“最低/风险优先”才 ASC。 - 收购新模式使用 sg_chengzhong.sgqudaotype<>0;订种新模式使用 cz_dzbill_list.dzplat<>4,两者不得混用。 - 农户年龄使用 nonghu_info.age_years;该维度从身份证出生日期计算周岁,无效身份证返回空值。 - 补贴金额均为测算,不代表实际发放;仪评加权指标以最终重量为权重。 ' value_type: string environment_variables: [] features: file_upload: allowed_file_extensions: - .XLSX - .XLS allowed_file_types: - custom allowed_file_upload_methods: - local_file enabled: true fileUploadConfig: attachment_image_file_size_limit: 2 audio_file_size_limit: 50 batch_count_limit: 5 file_size_limit: 15 file_upload_limit: 20 image_file_batch_limit: 10 image_file_size_limit: 10 single_chunk_attachment_limit: 10 video_file_size_limit: 100 workflow_file_upload_limit: 10 image: enabled: false number_limits: 3 transfer_methods: - local_file - remote_url number_limits: 1 opening_statement: 您好,我是F8数据助手,请问有什么可以帮到您的呢?🫡 retriever_resource: enabled: false sensitive_word_avoidance: enabled: false speech_to_text: enabled: false suggested_questions: - 有多少农户 - 查询农户张松期的手机号码 - '池河镇2026春一的单产多少 ' - 查询军民村的李志富的订种记录 - 统计当前蚕季的收购情况 - 统计当前蚕季各茧别的收购情况 - 统计石泉县单产中小于70公斤/张的前十农户排行榜 - 按农户乡镇统计新模式中蚕季为”2026春一“的蚕茧收购情况 - 统计农户年龄为小于16岁,大于70岁的农户。 农户名、身份证号 、手机号以及最近一次卖茧时间。 suggested_questions_after_answer: enabled: false model: completion_params: echo: false frequency_penalty: 0 max_tokens: 0 presence_penalty: 0 stop: [] temperature: 0.7 top_p: 0 mode: chat name: qwen3.5-flash-2026-02-23 provider: langgenius/tongyi/tongyi text_to_speech: enabled: false language: '' voice: '' graph: edges: - data: isInIteration: true isInLoop: false iteration_id: '1781599320305' sourceType: iteration-start targetType: knowledge-retrieval id: 1781599320305start-source-1781599540907-target selected: false source: 1781599320305start sourceHandle: source target: '1781599540907' targetHandle: target type: custom zIndex: 1002 - data: isInLoop: false sourceType: iteration targetType: code id: 1781599320305-source-1781594054454-target selected: false source: '1781599320305' sourceHandle: source target: '1781594054454' targetHandle: target type: custom zIndex: 0 - data: isInIteration: true isInLoop: false iteration_id: '17817582339680' sourceType: iteration-start targetType: knowledge-retrieval id: 1781758233968start-source-1781758233968017817582339690-target selected: false source: 1781758233968start sourceHandle: source target: '1781758233968017817582339690' targetHandle: target type: custom zIndex: 1002 - data: isInLoop: false sourceType: iteration targetType: code id: 17817582339680-source-17817583423940-target selected: false source: '17817582339680' sourceHandle: source target: '17817583423940' targetHandle: target type: custom zIndex: 0 - data: isInIteration: false isInLoop: false sourceType: document-extractor targetType: llm id: 1782889122238-source-1782889576269-target selected: false source: '1782889122238' sourceHandle: source target: '1782889576269' targetHandle: target type: custom zIndex: 0 - data: isInIteration: false isInLoop: false sourceType: llm targetType: assigner id: 1782889576269-source-1782889756496-target selected: false source: '1782889576269' sourceHandle: source target: '1782889756496' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: if-else targetType: document-extractor id: 1782889131357-true-1782889122238-target selected: false source: '1782889131357' sourceHandle: 'true' target: '1782889122238' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: if-else targetType: assigner id: 1782889131357-false-17828899879200-target selected: false source: '1782889131357' sourceHandle: 'false' target: '17828899879200' targetHandle: target type: custom zIndex: 0 - data: isInIteration: false isInLoop: false sourceType: llm targetType: code id: 1781581099032-source-1783053752709-target selected: false source: '1781581099032' sourceHandle: source target: '1783053752709' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: code id: 1783053752709-source-1782400000012-target selected: false source: '1783053752709' sourceHandle: source target: '1782400000012' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: http-request targetType: code id: 17830731532390-source-17830731571350-target selected: false source: '17830731532390' sourceHandle: source target: '17830731571350' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: assigner id: 17830731571350-source-17830731406880-target selected: false source: '17830731571350' sourceHandle: source target: '17830731406880' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: if-else id: 1784083007146-source-1783073068957-target selected: false source: '1784083007146' sourceHandle: source target: '1783073068957' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: start targetType: tool id: 1780903664367-source-1781232881963-target selected: false source: '1780903664367' sourceHandle: source target: '1781232881963' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: if-else targetType: http-request id: 1783073068957-true-17830731532390-target selected: false source: '1783073068957' sourceHandle: 'true' target: '17830731532390' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: assigner targetType: llm id: 1782889756496-source-1782351696945-target selected: false source: '1782889756496' sourceHandle: source target: '1782351696945' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: assigner targetType: llm id: 17828899879200-source-1782351696945-target selected: false source: '17828899879200' sourceHandle: source target: '1782351696945' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: answer id: 1782400000011-source-1784098833176-target selected: false source: '1782400000011' sourceHandle: source target: '1784098833176' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: tool targetType: code id: 1781232881963-source-1784083007146-target selected: false source: '1781232881963' sourceHandle: source target: '1784083007146' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: tool targetType: http-request id: 1781232881963-source-1781581167522-target selected: false source: '1781232881963' sourceHandle: source target: '1781581167522' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: tool targetType: if-else id: 1781232881963-source-1782889131357-target selected: false source: '1781232881963' sourceHandle: source target: '1782889131357' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: iteration id: 1782351696945-source-17817582339680-target selected: false source: '1782351696945' sourceHandle: source target: '17817582339680' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: iteration id: 1782351696945-source-1781599320305-target selected: false source: '1782351696945' sourceHandle: source target: '1781599320305' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: llm id: 1781594054454-source-1781581099032-target selected: false source: '1781594054454' sourceHandle: source target: '1781581099032' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: llm id: 17817583423940-source-1781581099032-target selected: false source: '17817583423940' sourceHandle: source target: '1781581099032' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: http-request targetType: code id: 1781581167522-source-1782400000012-target selected: false source: '1781581167522' sourceHandle: source target: '1782400000012' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: if-else id: 1782400000012-source-1784188747804-target selected: false source: '1782400000012' sourceHandle: source target: '1784188747804' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: if-else targetType: llm id: 1784188747804-true-1782400000011-target selected: false source: '1784188747804' sourceHandle: 'true' target: '1782400000011' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: assigner targetType: if-else id: 17830731406880-source-1784188747804-target selected: false source: '17830731406880' sourceHandle: source target: '1784188747804' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: if-else targetType: llm id: 1784188747804-false-17841887361130-target selected: false source: '1784188747804' sourceHandle: 'false' target: '17841887361130' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: code id: 1782400000011-source-1784188957627-target selected: false source: '1782400000011' sourceHandle: source target: '1784188957627' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: code targetType: assigner id: 1784188957627-source-1784183263188-target selected: false source: '1784188957627' sourceHandle: source target: '1784183263188' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: code id: 17841887361130-source-1784188957627-target selected: false source: '17841887361130' sourceHandle: source target: '1784188957627' targetHandle: target type: custom zIndex: 0 - data: isInLoop: false sourceType: llm targetType: answer id: 17841887361130-source-1784098833176-target source: '17841887361130' sourceHandle: source target: '1784098833176' targetHandle: target type: custom zIndex: 0 nodes: - data: selected: false title: 用户提问 type: start variables: - default: '603143556655353856' hint: '' label: 租户ID max_length: 20 options: [] placeholder: '' required: true type: text-input variable: tenant_id - default: 鎏金铜蚕(石泉)茧丝绸有限公司 hint: '' label: 租户名称 max_length: 20 options: [] placeholder: '' required: true type: text-input variable: tenant_name height: 135 id: '1780903664367' position: x: -11347.926845025962 y: -296.5887295533155 positionAbsolute: x: -11347.926845025962 y: -296.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: context: enabled: false variable_selector: [] desc: '' model: completion_params: response_format: json_object mode: chat name: qwen3.7-plus provider: langgenius/tongyi/tongyi prompt_config: jinja2_variables: [] prompt_template: - edition_type: basic id: 99e91b51-0052-4e93-95b5-62e502798f91 jinja2_text: '' role: system text: '你是 Cube load 查询体生成器。 # 任务 根据参考信息,生成可用于Cube `/cubejs-api/v1/load`接口的请求体的请求,以便获取用户想要的数据。 # 规则: - 当查询农户名单、明细、记录或排行榜时,须额外加入当前 Cube 的农户唯一ID维度,如 nhsysid;不要只用农户姓名作为农户粒度。 - 如果选择的 measure 已经包含用户要求的业务状态或口径,不要再额外添加同义 filter。 # 参考知识: ## 当前时间:{{#1781232881963.text#}} ## 当前蚕季ID:{{#conversation.canjiId#}} (当用户提问当前蚕季时,筛选数据时需要明确筛选蚕季ID) ## 业务规则 {{#conversation.global_rules#}} ## Cube数据 {{#1782400000012.result#}}' - edition_type: basic id: c5f6e041-13bd-48f8-b879-f4c2fbd2f183 role: user text: '{{#conversation.user_query#}} 当前租户ID:{{#1780903664367.tenant_id#}} **(如果Cube数据中包含类似tenant_id或租户隔离的字段,必须必须必须加此ID筛选)** ' reasoning_format: separated selected: false structured_output: schema: additionalProperties: false properties: limit_source: description: 如果query中有限制limit的话,此处说明限制来源是系统要求还是用户要求 enum: - system - user type: string message: description: 如果status为false或者无法根据知识完全覆盖用户所需要的字段,则此处说明原因以及缺失的字段,否则填写:“成功生成” type: string query: additionalProperties: false description: Cube的/v1/load请求 properties: dimensions: description: 维度,负责“按什么看、返回哪些分类/明细字段” 来源是 Cube 元数据里的 dimensions[].name。不可放入measures的name items: type: string type: array filters: description: 过滤条件 items: additionalProperties: false properties: and: description: “且”条件时使用 items: additionalProperties: false properties: member: description: 过滤对象 type: string operator: description: 操作符,用户表达“蚕季为/名称为/包含/叫/查某某名称”,优先使用 operator="contains",不要使用 equals,除非用户明确说“精确等于/完全等于/ID enum: - equals - notEquals - contains - startsWith - gt - lt - set - notSet - inDateRange type: string values: description: 过滤值 items: type: string type: array required: [] type: object type: array or: description: “或”条件时使用, items: additionalProperties: false properties: member: description: 过滤对象 type: string operator: description: 操作符,用户表达“蚕季为/名称为/包含/叫/查某某名称”,优先使用 operator="contains",不要使用 equals,除非用户明确说“精确等于/完全等于/ID enum: - equals - notEquals - contains - startsWith - gt - lt - set - notSet - inDateRange type: string values: description: 过滤值 items: type: string type: array required: [] type: object type: array required: [] type: object type: array limit: description: 限制返回数量,最大5 type: number measures: description: 指标,负责“算什么数” 来源是 Cube 元数据里的 measures[].name。不可放入dimensions的name items: type: string type: array offset: description: 跳过前面多少行,可以结合limit实现分页 type: number order: description: 排序,必须是二维数组,例如 [["bus_farmer_yield.yield_kg_per_sheet", "asc"]] items: maxItems: 2 minItems: 2 prefixItems: - description: 排序字段,例如 bus_farmer_yield.yield_kg_per_sheet type: string - description: 排序方向 enum: - asc - desc type: string type: array type: array segments: description: 预先在 Cube 模型中定义好的命名过滤条件 items: type: string type: array timeDimensions: description: 时间维度过滤 items: additionalProperties: false properties: dateRange: items: type: string type: array dimension: description: 时间维度字段,例如 orders.createdAt type: string granularity: description: 如果不写 granularity,只过滤时间,不按时间分组 enum: - year - quarter - month - week - day - hour - minute - second type: string required: [] type: object type: array required: - limit - dimensions type: object status: description: 是否可以生成query。缺失字段时仍然返回true enum: - 'true' - 'false' type: string required: - query - message - status - limit_source type: object structured_output_enabled: true title: 生成数据请求 type: llm vision: enabled: false height: 88 id: '1782400000011' position: x: -7843.845548425899 y: -275.5887295533155 positionAbsolute: x: -7843.845548425899 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: desc: '' is_team_authorization: true paramSchemas: - auto_generate: null default: '%Y-%m-%d %H:%M:%S' form: form human_description: en_US: Time format in strftime standard. ja_JP: Time format in strftime standard. pt_BR: Time format in strftime standard. zh_Hans: strftime 标准的时间格式。 label: en_US: Format ja_JP: Format pt_BR: Format zh_Hans: 格式 llm_description: null max: null min: null name: format options: [] placeholder: null precision: null required: false scope: null template: null type: string - auto_generate: null default: UTC form: form human_description: en_US: Timezone ja_JP: Timezone pt_BR: Timezone zh_Hans: 时区 label: en_US: Timezone ja_JP: Timezone pt_BR: Timezone zh_Hans: 时区 llm_description: null max: null min: null name: timezone options: - icon: null label: en_US: UTC ja_JP: UTC pt_BR: UTC zh_Hans: UTC value: UTC - icon: null label: en_US: America/New_York ja_JP: America/New_York pt_BR: America/New_York zh_Hans: 美洲/纽约 value: America/New_York - icon: null label: en_US: America/Los_Angeles ja_JP: America/Los_Angeles pt_BR: America/Los_Angeles zh_Hans: 美洲/洛杉矶 value: America/Los_Angeles - icon: null label: en_US: America/Chicago ja_JP: America/Chicago pt_BR: America/Chicago zh_Hans: 美洲/芝加哥 value: America/Chicago - icon: null label: en_US: America/Sao_Paulo ja_JP: America/Sao_Paulo pt_BR: América/São Paulo zh_Hans: 美洲/圣保罗 value: America/Sao_Paulo - icon: null label: en_US: Asia/Shanghai ja_JP: Asia/Shanghai pt_BR: Asia/Shanghai zh_Hans: 亚洲/上海 value: Asia/Shanghai - icon: null label: en_US: Asia/Ho_Chi_Minh ja_JP: Asia/Ho_Chi_Minh pt_BR: Ásia/Ho Chi Minh zh_Hans: 亚洲/胡志明市 value: Asia/Ho_Chi_Minh - icon: null label: en_US: Asia/Tokyo ja_JP: Asia/Tokyo pt_BR: Asia/Tokyo zh_Hans: 亚洲/东京 value: Asia/Tokyo - icon: null label: en_US: Asia/Dubai ja_JP: Asia/Dubai pt_BR: Asia/Dubai zh_Hans: 亚洲/迪拜 value: Asia/Dubai - icon: null label: en_US: Asia/Kolkata ja_JP: Asia/Kolkata pt_BR: Asia/Kolkata zh_Hans: 亚洲/加尔各答 value: Asia/Kolkata - icon: null label: en_US: Asia/Seoul ja_JP: Asia/Seoul pt_BR: Asia/Seoul zh_Hans: 亚洲/首尔 value: Asia/Seoul - icon: null label: en_US: Asia/Singapore ja_JP: Asia/Singapore pt_BR: Asia/Singapore zh_Hans: 亚洲/新加坡 value: Asia/Singapore - icon: null label: en_US: Europe/London ja_JP: Europe/London pt_BR: Europe/London zh_Hans: 欧洲/伦敦 value: Europe/London - icon: null label: en_US: Europe/Berlin ja_JP: Europe/Berlin pt_BR: Europe/Berlin zh_Hans: 欧洲/柏林 value: Europe/Berlin - icon: null label: en_US: Europe/Moscow ja_JP: Europe/Moscow pt_BR: Europe/Moscow zh_Hans: 欧洲/莫斯科 value: Europe/Moscow - icon: null label: en_US: Australia/Sydney ja_JP: Australia/Sydney pt_BR: Australia/Sydney zh_Hans: 澳大利亚/悉尼 value: Australia/Sydney - icon: null label: en_US: Pacific/Auckland ja_JP: Pacific/Auckland pt_BR: Pacific/Auckland zh_Hans: 太平洋/奥克兰 value: Pacific/Auckland - icon: null label: en_US: Africa/Cairo ja_JP: Africa/Cairo pt_BR: Africa/Cairo zh_Hans: 非洲/开罗 value: Africa/Cairo placeholder: null precision: null required: false scope: null template: null type: select params: format: '' timezone: '' plugin_id: null plugin_unique_identifier: '' provider_icon: http://10.10.12.101:8095/console/api/workspaces/current/tool-provider/builtin/time/icon provider_id: time provider_name: time provider_type: builtin selected: false title: 获取当前时间 tool_configurations: format: type: mixed value: '%Y-%m-%d %H:%M:%S' timezone: type: constant value: Asia/Shanghai tool_description: 一个用于获取当前时间的工具。 tool_label: 获取当前时间 tool_name: current_time tool_node_version: '2' tool_parameters: {} type: tool height: 114 id: '1781232881963' position: x: -11092.366793451323 y: -275.5887295533155 positionAbsolute: x: -11092.366793451323 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: context: enabled: false variable_selector: [] desc: '' model: completion_params: response_format: json_object temperature: 0 top_p: 0.1 mode: chat name: qwen3.5-plus provider: langgenius/tongyi/tongyi prompt_config: jinja2_variables: [] prompt_template: - edition_type: basic id: 47a93af5-5c9f-463d-bc6d-009ab0a498c7 role: system text: '你是 Cube 核心业务口径识别器。 根据用户问题和知识库召回结果,识别本次查询最核心的业务 Cube,用于后续扩展可 join 的 Cube Meta。 # 任务 只输出“核心 Cube”,也就是决定本次查询业务口径、数据粒度和主事实来源的 Cube。 # 生成规则 - 输出的 name 必须来自业务 Cube CSV 的“业务Cube名”列,或基础 Cube CSV 的“主表”列。 - 优先输出 1 个核心 Cube; - 不要输出仅用于补充字段的 join 表,例如租户表、农户档案、蚕季表、部门表、用户表等。 - 用户问题包含“手机/电话/身份证”时,不要因此输出 nonghu_info;这些是补充字段,由后续可 join 扩展自动判断。 # 业务提示 - 看到“订种、领种、养蚕张数、订种模式、订种清单、农户订种明细”,核心 Cube 必须优先输出 bus_order_delivery。 - 如果问题是普通农户档案、农户名单、农户手机号、身份证号,且不涉及订种/收购/补助等业务事实,核心 Cube 可输出 nonghu_info。 - 如果问题是农户经营画像、累计订种、累计售茧、经营蚕季数,核心 Cube 优先输出 bus_farmer_operation。 - 如果问题是售茧、收购、交售、收购金额,核心 Cube 优先输出 bus_purchase_bill。 - 如果问题是补助、补贴政策、补贴金额,核心 Cube 优先输出 bus_subsidy_policy。 - 如果用户问题包含以下任何一种茧别:茧别、正茧、普茧、普通正茧、方格正茧、口评茧、双宫、双宫茧、黄斑、黄斑茧、血茧、下茧、下足茧、上茧、品类、分类净重、分类金额问题,同时涉及收购、售茧、鲜茧、茧款、重量、金额、均价、收购情况等语义,使用bus_purchase_grade_mode。 # 业务规则 {{#conversation.global_rules#}} # 业务逻辑知识库召回结果(CSV结构) 业务词或别名,业务含义,业务Cube名,核心成员,可用维度,数据粒度,默认规则,不适用情况,应用场景 {{#17817583423940.csv#}} # 基础表知识库召回结果(CSV结构) 业务名词或别名,含义解释,主表,涉及的其他表,涉及字段,不适用的情况 {{#1781594054454.csv#}}' - id: 3f574f4c-73ff-4de5-8a00-724830b23ed7 role: user text: '{{#conversation.user_query#}}' reasoning_format: separated selected: false structured_output: schema: additionalProperties: false properties: core_cube: description: '' type: string required: - core_cube type: object structured_output_enabled: true title: 获取重点表 type: llm vision: enabled: false height: 88 id: '1781581099032' position: x: -8868.424816665049 y: -109.81201181221708 positionAbsolute: x: -8868.424816665049 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: authorization: config: null type: no-auth body: data: [] type: none headers: '' method: get params: '' retry_config: max_retries: 3 retry_enabled: false retry_interval: 100 selected: false ssl_verify: false timeout: max_connect_timeout: 0 max_read_timeout: 0 max_write_timeout: 0 title: 获取最新表结构 type: http-request url: http://10.10.12.101:4001/cubejs-api/v1/meta variables: [] height: 108 id: '1781581167522' position: x: -10836.84627996062 y: -466.4249608991162 positionAbsolute: x: -10836.84627996062 y: -466.4249608991162 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main({ schema_json, cube_names }) {\n let schema = schema_json;\n\ \n if (typeof schema_json === \"string\") {\n try {\n schema =\ \ JSON.parse(schema_json);\n } catch {\n return { result: \"[]\"\ \ };\n }\n }\n\n const cubes =\n schema && Array.isArray(schema.cubes)\n\ \ ? schema.cubes\n : [];\n\n const nameSet = parseCubeNameSet(cube_names);\n\ \n if (nameSet.size === 0) {\n return { result: \"[]\" };\n }\n\n \ \ // 筛选和转换合并为一次遍历,避免 selectedCubes 中间数组\n const slimCubes = [];\n\n for\ \ (let i = 0; i < cubes.length; i++) {\n const cube = cubes[i];\n\n \ \ if (nameSet.has(normalizeName(cube.name))) {\n slimCubes.push(toLLMSchemaCube(cube));\n\ \ }\n }\n\n return {\n result: JSON.stringify(slimCubes)\n };\n\ }\n\n/**\n * 直接生成标准化后的 Set,避免:\n * normalizeList → map → filter → new Set\n\ \ */\nfunction parseCubeNameSet(value, result) {\n const nameSet = result\ \ || new Set();\n\n if (!value) {\n return nameSet;\n }\n\n if (Array.isArray(value))\ \ {\n addNamesToSet(value, nameSet);\n return nameSet;\n }\n\n if\ \ (typeof value === \"string\") {\n const text = value.trim();\n\n \ \ if (!text) {\n return nameSet;\n }\n\n /*\n * 只有看起来可能是合法\ \ JSON 时才调用 JSON.parse。\n * 普通的 \"orders,users\" 不再通过异常进入降级路径。\n \ \ */\n if (looksLikeJson(text)) {\n try {\n const parsed\ \ = JSON.parse(text);\n\n if (Array.isArray(parsed)) {\n \ \ addNamesToSet(parsed, nameSet);\n return nameSet;\n }\n\ \n if (typeof parsed === \"string\") {\n addNameToSet(parsed,\ \ nameSet);\n return nameSet;\n }\n\n if (parsed\ \ && typeof parsed === \"object\") {\n parseCubeNamesObject(parsed,\ \ nameSet);\n }\n\n // JSON 解析成功,但类型不受支持时,与原逻辑一样返回空结果\n \ \ return nameSet;\n } catch {\n // 解析失败时按逗号字符串处理\n \ \ }\n }\n\n addCommaSeparatedNames(text, nameSet);\n return nameSet;\n\ \ }\n\n if (typeof value === \"object\") {\n parseCubeNamesObject(value,\ \ nameSet);\n }\n\n return nameSet;\n}\n\nfunction parseCubeNamesObject(value,\ \ nameSet) {\n // 保持原来的判断优先级\n if (Array.isArray(value.cubes)) {\n \ \ addNamesToSet(value.cubes, nameSet);\n return;\n }\n\n if (Array.isArray(value.cube_names))\ \ {\n addNamesToSet(value.cube_names, nameSet);\n return;\n }\n\n\ \ if (\n typeof value.result === \"string\" ||\n Array.isArray(value.result)\n\ \ ) {\n parseCubeNameSet(value.result, nameSet);\n }\n}\n\nfunction\ \ addCommaSeparatedNames(text, nameSet) {\n let start = 0;\n\n for (let\ \ i = 0; i <= text.length; i++) {\n if (i === text.length || text.charCodeAt(i)\ \ === 44) {\n addNameToSet(text.slice(start, i), nameSet);\n start\ \ = i + 1;\n }\n }\n}\n\nfunction addNamesToSet(values, nameSet) {\n\ \ for (let i = 0; i < values.length; i++) {\n addNameToSet(values[i],\ \ nameSet);\n }\n}\n\nfunction addNameToSet(value, nameSet) {\n if (typeof\ \ value !== \"string\") {\n return;\n }\n\n const text = value.trim();\n\ \n if (!text) {\n return;\n }\n\n const key = normalizeName(text);\n\ \n if (key) {\n nameSet.add(key);\n }\n}\n\nfunction looksLikeJson(text)\ \ {\n const first = text.charCodeAt(0);\n\n // { [ \" -\n if (\n first\ \ === 123 ||\n first === 91 ||\n first === 34 ||\n first === 45\n\ \ ) {\n return true;\n }\n\n // 0-9\n if (first >= 48 && first <=\ \ 57) {\n return true;\n }\n\n // JSON 原始值\n return (\n text ===\ \ \"true\" ||\n text === \"false\" ||\n text === \"null\"\n );\n\ }\n\nfunction normalizeName(name) {\n if (typeof name === \"string\") {\n\ \ return name.trim().toLowerCase();\n }\n\n return String(name || \"\ \")\n .trim()\n .toLowerCase();\n}\n\nfunction toLLMSchemaCube(cube)\ \ {\n const result = {};\n\n assignNonEmpty(result, \"name\", cube.name);\n\ \ assignNonEmpty(result, \"title\", cube.title);\n assignNonEmpty(result,\ \ \"description\", cube.description);\n\n if (Array.isArray(cube.joins)\ \ && cube.joins.length > 0) {\n result.joins = mapArray(cube.joins, toLLMJoin);\n\ \ }\n\n if (Array.isArray(cube.measures) && cube.measures.length > 0)\ \ {\n result.measures = mapArray(cube.measures, toLLMMeasure);\n }\n\ \n if (\n Array.isArray(cube.dimensions) &&\n cube.dimensions.length\ \ > 0\n ) {\n result.dimensions = mapArray(\n cube.dimensions,\n\ \ toLLMDimension\n );\n }\n\n return result;\n}\n\nfunction toLLMJoin(join)\ \ {\n const result = {};\n\n assignNonEmpty(result, \"name\", join.name);\n\ \ assignNonEmpty(result, \"relationship\", join.relationship);\n\n return\ \ result;\n}\n\nfunction toLLMMeasure(measure) {\n const result = {};\n\ \n assignNonEmpty(result, \"name\", measure.name);\n assignNonEmpty(result,\ \ \"title\", measure.title);\n assignNonEmpty(result, \"description\",\ \ measure.description);\n assignNonEmpty(result, \"type\", measure.type);\n\ \ assignNonEmpty(result, \"aggType\", measure.aggType);\n assignNonEmpty(result,\ \ \"format\", measure.format);\n\n return result;\n}\n\nfunction toLLMDimension(dimension)\ \ {\n const result = {};\n\n assignNonEmpty(result, \"name\", dimension.name);\n\ \ assignNonEmpty(result, \"title\", dimension.title);\n assignNonEmpty(result,\ \ \"description\", dimension.description);\n assignNonEmpty(result, \"\ type\", dimension.type);\n\n return result;\n}\n\n/**\n * 替代 removeEmpty\ \ + Object.entries。\n * 保留原 removeEmpty 的判断语义:\n * - 跳过 undefined/null\n\ \ * - 跳过空白字符串\n * - 跳过空数组\n * - 保留 0、false、NaN、空对象等值\n */\nfunction assignNonEmpty(target,\ \ key, value) {\n if (value === undefined || value === null) {\n return;\n\ \ }\n\n if (typeof value === \"string\") {\n if (value.trim() === \"\ \") {\n return;\n }\n } else if (Array.isArray(value) && value.length\ \ === 0) {\n return;\n }\n\n target[key] = value;\n}\n\n/**\n * 与 Array.prototype.map\ \ 一样保留稀疏数组结构。\n */\nfunction mapArray(source, mapper) {\n const result\ \ = new Array(source.length);\n\n for (let i = 0; i < source.length; i++)\ \ {\n if (i in source) {\n result[i] = mapper(source[i]);\n }\n\ \ }\n\n return result;\n}" code_language: javascript outputs: result: children: null type: string selected: false title: 筛选所需表 type: code variables: - value_selector: - '1781581167522' - body value_type: string variable: schema_json - value_selector: - '1783053752709' - result value_type: string variable: cube_names height: 52 id: '1782400000012' position: x: -8375.53288280137 y: -466.4249608991162 positionAbsolute: x: -8375.53288280137 y: -466.4249608991162 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main({ input }) {\n let data = input;\n\n // 如果 input 是字符串,先尝试转\ \ JSON\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n\ \ } catch (e) {\n return {\n csv: '',\n count: 0\n\ \ };\n }\n }\n\n const contents = [];\n const seen = new Set();\n\ \n // 递归提取所有 content\n function collect(value) {\n if (!value) return;\n\ \n // 兼容字符串形式的 JSON\n if (typeof value === 'string') {\n const\ \ text = value.trim();\n if (!text) return;\n\n try {\n \ \ const parsed = JSON.parse(text);\n collect(parsed);\n } catch\ \ (e) {\n // 如果本身就是一行 CSV 文本,也允许收集\n addContent(text);\n \ \ }\n\n return;\n }\n\n // 数组:逐项递归\n if (Array.isArray(value))\ \ {\n for (const item of value) {\n collect(item);\n }\n\ \ return;\n }\n\n // 对象:优先处理 content\n if (typeof value ===\ \ 'object') {\n if (typeof value.content === 'string') {\n addContent(value.content);\n\ \ }\n\n // 兼容 Dify 常见包装结构\n if (Array.isArray(value.input))\ \ collect(value.input);\n if (Array.isArray(value.result)) collect(value.result);\n\ \ if (Array.isArray(value.results)) collect(value.results);\n \ \ if (Array.isArray(value.data)) collect(value.data);\n if (Array.isArray(value.items))\ \ collect(value.items);\n if (Array.isArray(value.output)) collect(value.output);\n\ \ }\n }\n\n function addContent(content) {\n const text = String(content).trim();\n\ \ if (!text) return;\n\n // 归一化 key:去掉所有空白,降低重复误差\n const key =\ \ text.replace(/\\s+/g, '');\n\n if (seen.has(key)) return;\n\n seen.add(key);\n\ \ contents.push(text);\n }\n\n collect(data);\n\n return {\n csv:\ \ contents.join('\\n')\n };\n}" code_language: javascript desc: '' outputs: csv: children: null type: string selected: false title: 格式化基础表知识 type: code variables: - value_selector: - '1781599320305' - output value_type: array[object] variable: input height: 52 id: '1781594054454' position: x: -9124.069219455127 y: -109.81201181221708 positionAbsolute: x: -9124.069219455127 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: error_handle_mode: terminated flatten_output: true height: 181 is_parallel: true iterator_input_type: object iterator_selector: - '1782351696945' - structured_output - base_queries output_selector: - '1781599540907' - result output_type: array[object] parallel_nums: 10 selected: false start_node_id: 1781599320305start title: 深度检索基础表知识库 type: iteration width: 387 height: 181 id: '1781599320305' position: x: -9518.358462826265 y: -109.81201181221708 positionAbsolute: x: -9518.358462826265 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 387 zIndex: 1 - data: desc: '' isInIteration: true selected: false title: '' type: iteration-start draggable: false height: 48 id: 1781599320305start parentId: '1781599320305' position: x: 24 y: 68 positionAbsolute: x: -9494.358462826265 y: -41.81201181221708 selectable: false selected: false sourcePosition: right targetPosition: left type: custom-iteration-start width: 44 zIndex: 1002 - data: dataset_ids: - BCdSJboJ+yZpNXBm4gDUIqxRo7DFaNkkrfR2/ccOpsUknXvLnp5xVzH81WRrWHsR isInIteration: true isInLoop: false iteration_id: '1781599320305' multiple_retrieval_config: reranking_enable: true reranking_mode: reranking_model reranking_model: model: qwen3-rerank provider: langgenius/tongyi/tongyi score_threshold: null top_k: 1 weights: keyword_setting: keyword_weight: 0.8 vector_setting: embedding_model_name: text-embedding-v4 embedding_provider_name: langgenius/tongyi/tongyi vector_weight: 0.2 weight_type: customized query_attachment_selector: [] query_variable_selector: - '1781599320305' - item retrieval_mode: multiple selected: false title: 检索基础表知识库 type: knowledge-retrieval height: 90 id: '1781599540907' parentId: '1781599320305' position: x: 16 y: 65 positionAbsolute: x: -9502.358462826265 y: -44.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 zIndex: 1002 - data: desc: '' error_handle_mode: terminated flatten_output: true height: 180 isInIteration: false isInLoop: false is_parallel: true iterator_input_type: object iterator_selector: - '1782351696945' - structured_output - business_queries output_selector: - '1781758233968017817582339690' - result output_type: array[object] parallel_nums: 10 selected: false start_node_id: 1781758233968start title: 深度检索业务知识库 type: iteration width: 389 height: 180 id: '17817582339680' position: x: -9518.358462826265 y: 86.07331027256038 positionAbsolute: x: -9518.358462826265 y: 86.07331027256038 selected: false sourcePosition: right targetPosition: left type: custom width: 389 zIndex: 1 - data: dataset_ids: - vPpPaNv/0AGRcN8EkOHLdghdF945aY9k9WiMl95EPLEl1rvgcTneSjK6S7VhRsmr desc: '' isInIteration: true isInLoop: false iteration_id: '17817582339680' multiple_retrieval_config: reranking_enable: true reranking_mode: reranking_model reranking_model: model: qwen3-rerank provider: langgenius/tongyi/tongyi score_threshold: null top_k: 1 weights: keyword_setting: keyword_weight: 0.8 vector_setting: embedding_model_name: text-embedding-v4 embedding_provider_name: langgenius/tongyi/tongyi vector_weight: 0.2 weight_type: customized query_attachment_selector: [] query_variable_selector: - '17817582339680' - item retrieval_mode: multiple selected: false title: 检索业务知识库 type: knowledge-retrieval height: 90 id: '1781758233968017817582339690' parentId: '17817582339680' position: x: 118 y: 68 positionAbsolute: x: -9400.358462826265 y: 154.07331027256038 selected: false sourcePosition: right targetPosition: left type: custom width: 242 zIndex: 1002 - data: desc: '' isInIteration: true selected: false title: '' type: iteration-start draggable: false height: 48 id: 1781758233968start parentId: '17817582339680' position: x: 24 y: 68 positionAbsolute: x: -9494.358462826265 y: 154.07331027256038 selectable: false selected: false sourcePosition: right targetPosition: left type: custom-iteration-start width: 44 zIndex: 1002 - data: code: "function main({ input }) {\n let data = input;\n\n // 如果 input 是字符串,先尝试转\ \ JSON\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n\ \ } catch (e) {\n return {\n csv: '',\n count: 0\n\ \ };\n }\n }\n\n const contents = [];\n const seen = new Set();\n\ \n // 递归提取所有 content\n function collect(value) {\n if (!value) return;\n\ \n // 兼容字符串形式的 JSON\n if (typeof value === 'string') {\n const\ \ text = value.trim();\n if (!text) return;\n\n try {\n \ \ const parsed = JSON.parse(text);\n collect(parsed);\n } catch\ \ (e) {\n // 如果本身就是一行 CSV 文本,也允许收集\n addContent(text);\n \ \ }\n\n return;\n }\n\n // 数组:逐项递归\n if (Array.isArray(value))\ \ {\n for (const item of value) {\n collect(item);\n }\n\ \ return;\n }\n\n // 对象:优先处理 content\n if (typeof value ===\ \ 'object') {\n if (typeof value.content === 'string') {\n addContent(value.content);\n\ \ }\n\n // 兼容 Dify 常见包装结构\n if (Array.isArray(value.input))\ \ collect(value.input);\n if (Array.isArray(value.result)) collect(value.result);\n\ \ if (Array.isArray(value.results)) collect(value.results);\n \ \ if (Array.isArray(value.data)) collect(value.data);\n if (Array.isArray(value.items))\ \ collect(value.items);\n if (Array.isArray(value.output)) collect(value.output);\n\ \ }\n }\n\n function addContent(content) {\n const text = String(content).trim();\n\ \ if (!text) return;\n\n // 归一化 key:去掉所有空白,降低重复误差\n const key =\ \ text.replace(/\\s+/g, '');\n\n if (seen.has(key)) return;\n\n seen.add(key);\n\ \ contents.push(text);\n }\n\n collect(data);\n\n return {\n csv:\ \ contents.join('\\n')\n };\n}" code_language: javascript desc: '' isInIteration: false isInLoop: false outputs: csv: children: null type: string selected: false title: 格式化业务知识 type: code variables: - value_selector: - '17817582339680' - output value_type: array[object] variable: input height: 52 id: '17817583423940' position: x: -9124.069219455127 y: 86.07331027256038 positionAbsolute: x: -9124.069219455127 y: 86.07331027256038 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: context: enabled: false variable_selector: [] model: completion_params: response_format: json_object temperature: 0.7 mode: chat name: qwen3.5-plus provider: langgenius/tongyi/tongyi prompt_template: - id: 47b4da58-d911-439e-b970-3e3f2486b74f role: system text: "你是业务知识库检索词生成器。\n\n根据用户原始问题,分别生成:\n\n- business_queries:用于检索“业务逻辑知识库”\n\ - base_queries:用于检索“基础表知识库”\n- qa_queries:用于检索历史问答知识库\n- \n\n业务逻辑知识库主要包含:\n\ - 业务指标和业务含义\n- 核心成员和可用维度\n- 数据粒度\n- 适用和不适用场景\n\n基础表知识库主要包含:\n- 业务名词和别名\n\ - 实体所在表\n- 原始字段含义\n- 表关系\n- 状态字段\n- 实体定位方式\n\n生成要求:\n\n1. 每类最多生成2条检索词,简短明确。\n\ 3. 不要把具体租户名、人名、身份证号、编号、日期或数值放入检索词。\n4. 保留影响业务含义的条件,例如“有效农户”“年龄”“低产”“已支付”。\n\ 5. business_queries重点描述查询指标、维度和业务场景。\n6. base_queries重点描述实体定位、字段含义和原始数据关系。\n\ 7. qa_queries 只参考用户原始问题,提取 1~5 个核心业务关键词或短语,用于召回相似历史问题。\n8. 不要生成含义重复的检索词。\n\ \n其他规则:\n{{#conversation.global_rules#}}" - id: e83796ca-f021-41d2-85b3-91790d1db984 role: user text: '{{#conversation.user_query#}}' selected: false structured_output: schema: additionalProperties: false properties: base_queries: items: type: string type: array business_queries: items: type: string type: array qa_queries: items: type: string type: array required: - business_queries - base_queries - qa_queries type: object structured_output_enabled: true title: 意图理解 type: llm vision: enabled: false height: 88 id: '1782351696945' position: x: -9793.33434626631 y: 27.746422531720228 positionAbsolute: x: -9793.33434626631 y: 27.746422531720228 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: is_array_file: true selected: false title: 文档解析 type: document-extractor variable_selector: - sys - files height: 104 id: '1782889122238' position: x: -10582.764943990636 y: -109.81201181221708 positionAbsolute: x: -10582.764943990636 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: cases: - case_id: 'true' conditions: - comparison_operator: not empty id: f16c19d2-12b2-4890-b13a-95ab9ff3c102 sub_variable_condition: case_id: 596e5c2a-c188-490c-a210-10bf05151805 conditions: - comparison_operator: '>' id: 8278eaf8-c597-4023-8a61-616164ec2fcf key: size value: '0' varType: string logical_operator: and value: '' varType: array[file] variable_selector: - sys - files id: 'true' logical_operator: and selected: false title: 判断用户文件输入 type: if-else height: 124 id: '1782889131357' position: x: -10836.84627996062 y: -109.81201181221708 positionAbsolute: x: -10836.84627996062 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: context: enabled: false variable_selector: [] model: completion_params: temperature: 0.7 mode: chat name: qwen3.5-flash provider: langgenius/tongyi/tongyi prompt_template: - id: cd5e2e74-1424-4f74-83ba-ee5366f71130 role: system text: '你是一个数据查询问题整理助手。请结合用户原始问题和用户提供的表格字段信息,将其整理成一个语义完整、条件明确、可直接用于数据查询或自然语言转 SQL 的问题。 整理要求: - 保留用户原始问题中的查询对象、范围、筛选条件和业务含义。 - 根据表格字段补充查询所需的返回内容,但不要虚构表格中不存在的字段。 - 对用户问题中的口语化、模糊或不完整表达进行规范化。 - 只输出整理后的完整问题,不要输出分析过程、解释或 SQL。 - 不要将示例数据、字段说明或无关内容加入最终问题。' - id: fddcbfa6-abf2-4030-b331-951a739fdd4a role: user text: '用户提问: {{#sys.query#}} 用户提供的表格: {{#1782889122238.text#}}' selected: false title: 整理文件 type: llm vision: enabled: false height: 88 id: '1782889576269' position: x: -10317.383808423989 y: -109.81201181221708 positionAbsolute: x: -10317.383808423989 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: items: - input_type: variable operation: over-write value: - '1782889576269' - text variable_selector: - conversation - user_query selected: false title: 整理问题 type: assigner version: '2' height: 84 id: '1782889756496' position: x: -10049.790484827632 y: -109.81201181221708 positionAbsolute: x: -10049.790484827632 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: desc: '' isInIteration: false isInLoop: false items: - input_type: variable operation: over-write value: - sys - query variable_selector: - conversation - user_query selected: false title: 整理问题 type: assigner version: '2' height: 84 id: '17828899879200' position: x: -10582.764943990636 y: 27.746422531720228 positionAbsolute: x: -10582.764943990636 y: 27.746422531720228 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main({ cube_joins, core_name }) {\n const joinMap = parseJsonObject(cube_joins);\n\ \ const coreName = parseCoreName(core_name);\n\n if (!coreName) {\n \ \ return {\n result: \"[]\"\n };\n }\n\n const normalizedCore\ \ = normalizeName(coreName);\n const keyMap = buildKeyMap(joinMap);\n\n\ \ const actualCoreKey = keyMap[normalizedCore] || coreName;\n const joinNames\ \ = Array.isArray(joinMap[actualCoreKey])\n ? joinMap[actualCoreKey]\n\ \ : [];\n\n const result = unique([\n actualCoreKey,\n ...joinNames\n\ \ ]);\n\n return {\n result: JSON.stringify(result)\n };\n}\n\nfunction\ \ parseJsonObject(value) {\n if (!value) {\n return {};\n }\n\n if\ \ (typeof value === \"object\" && !Array.isArray(value)) {\n return value;\n\ \ }\n\n if (typeof value !== \"string\") {\n return {};\n }\n\n try\ \ {\n const parsed = JSON.parse(value);\n return parsed && typeof\ \ parsed === \"object\" && !Array.isArray(parsed)\n ? parsed\n \ \ : {};\n } catch (e) {\n return {};\n }\n}\n\nfunction parseCoreName(value)\ \ {\n if (!value) {\n return \"\";\n }\n\n if (typeof value === \"\ string\") {\n const text = value.trim();\n\n if (!text) {\n return\ \ \"\";\n }\n\n try {\n const parsed = JSON.parse(text);\n\n\ \ if (typeof parsed === \"string\") {\n return parsed.trim();\n\ \ }\n\n if (Array.isArray(parsed)) {\n return String(parsed[0]\ \ || \"\").trim();\n }\n\n if (parsed && Array.isArray(parsed.cubes))\ \ {\n return String(parsed.cubes[0] || \"\").trim();\n }\n\n\ \ if (parsed && typeof parsed.core_name === \"string\") {\n \ \ return parsed.core_name.trim();\n }\n\n if (parsed && typeof\ \ parsed.name === \"string\") {\n return parsed.name.trim();\n \ \ }\n } catch (e) {\n return text;\n }\n\n return text;\n\ \ }\n\n if (Array.isArray(value)) {\n return String(value[0] || \"\"\ ).trim();\n }\n\n if (typeof value === \"object\") {\n if (Array.isArray(value.cubes))\ \ {\n return String(value.cubes[0] || \"\").trim();\n }\n\n if\ \ (typeof value.core_name === \"string\") {\n return value.core_name.trim();\n\ \ }\n\n if (typeof value.name === \"string\") {\n return value.name.trim();\n\ \ }\n }\n\n return \"\";\n}\n\nfunction buildKeyMap(object) {\n const\ \ result = {};\n\n for (const key of Object.keys(object || {})) {\n \ \ result[normalizeName(key)] = key;\n }\n\n return result;\n}\n\nfunction\ \ normalizeName(name) {\n return String(name || \"\")\n .trim()\n \ \ .toLowerCase();\n}\n\nfunction unique(values) {\n const result = [];\n\ \ const seen = new Set();\n\n for (const value of values) {\n if (typeof\ \ value !== \"string\") {\n continue;\n }\n\n const text = value.trim();\n\ \n if (!text) {\n continue;\n }\n\n const key = normalizeName(text);\n\ \n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n\ \ result.push(text);\n }\n\n return result;\n}" code_language: javascript outputs: result: children: null type: string selected: false title: 查询joins type: code variables: - value_selector: - conversation - cube_joins value_type: string variable: cube_joins - value_selector: - '1781581099032' - structured_output - core_cube value_type: object variable: core_name height: 52 id: '1783053752709' position: x: -8614.489525771321 y: -109.81201181221708 positionAbsolute: x: -8614.489525771321 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: cases: - case_id: 'true' conditions: - comparison_operator: is id: d1187a47-b9e2-4637-b3d8-2d93cb55613b value: 'true' varType: string variable_selector: - '1784083007146' - need_current_batch id: 'true' logical_operator: and selected: false title: 是否要求当前蚕季 type: if-else height: 148 id: '1783073068957' position: x: -10582.764943990636 y: -275.5887295533155 positionAbsolute: x: -10582.764943990636 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: desc: '' isInIteration: false isInLoop: false items: - input_type: variable operation: over-write value: - '17830731571350' - canjiId variable_selector: - conversation - canjiId - input_type: variable operation: over-write value: - '17830731571350' - canjiName variable_selector: - conversation - canjiName selected: false title: '确定蚕季ID ' type: assigner version: '2' height: 110 id: '17830731406880' position: x: -9793.33434626631 y: -275.5887295533155 positionAbsolute: x: -9793.33434626631 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: authorization: config: null type: no-auth body: data: - id: key-value-323 key: '' type: text value: '{   "query": {     "dimensions": [       "sg_canji_config.cjsysid",       "sg_canji_config.cjname",       "sg_canji_config.sgstartdatettime",       "sg_canji_config.sgenddatettime"     ],     "filters": [       {         "member": "sg_canji_config.tenantid",         "operator": "equals",         "values": ["{{#conversation.default_tenant_id#}}"]       },       {         "member": "sg_canji_config.flag",         "operator": "gt",         "values": ["0"]       },       {         "or": [           {             "and": [               {                 "member": "sg_canji_config.sgstartdatettime",                 "operator": "beforeOrOnDate",                 "values": ["{{#1781232881963.text#}}"]               },               {                 "member": "sg_canji_config.sgenddatettime",                 "operator": "afterOrOnDate",                 "values": ["{{#1781232881963.text#}}"]               }             ]           },           {             "member": "sg_canji_config.sgenddatettime",             "operator": "beforeDate",             "values": ["{{#1781232881963.text#}}"]           }         ]       }     ],     "order": [       ["sg_canji_config.sgenddatettime", "desc"],       ["sg_canji_config.sgstartdatettime", "desc"],       ["sg_canji_config.cjsysid", "desc"]     ],     "limit": 1   } }' type: json desc: '' headers: '' isInIteration: false isInLoop: false method: post params: '' retry_config: max_retries: 3 retry_enabled: false retry_interval: 100 selected: false ssl_verify: false timeout: connect: 2 max_connect_timeout: 0 max_read_timeout: 0 max_write_timeout: 0 read: 10 write: 10 title: 查询当前蚕季ID type: http-request url: http://10.10.12.101:4001/cubejs-api/v1/load variables: [] height: 108 id: '17830731532390' position: x: -10317.383808423989 y: -275.5887295533155 positionAbsolute: x: -10317.383808423989 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main({ input }) {\n let data = input;\n\n if (typeof input\ \ === \"string\") {\n try {\n data = JSON.parse(input);\n } catch\ \ (e) {\n return {\n canjiId: \"\",\n canjiName: \"\"\ \n };\n }\n }\n\n const firstItem = data?.data?.[0] ?? {};\n\n\ \ return {\n canjiId: firstItem[\"sg_canji_config.cjsysid\"] ?? \"\"\ ,\n canjiName: firstItem[\"sg_canji_config.cjname\"] ?? \"\"\n };\n}" code_language: javascript desc: '' isInIteration: false isInLoop: false outputs: canjiId: children: null type: string canjiName: children: null type: string selected: false title: 提取蚕季ID type: code variables: - value_selector: - '17830731532390' - body value_type: string variable: input height: 52 id: '17830731571350' position: x: -10049.790484827632 y: -275.5887295533155 positionAbsolute: x: -10049.790484827632 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main(inputs) {\n const question = inputs.question;\n\n return\ \ {\n need_current_batch: String(\n typeof question === \"string\"\ \ &&\n question.includes(\"当前蚕季\")\n )\n };\n}" code_language: javascript outputs: need_current_batch: children: null type: string selected: false title: 判断当前蚕季 type: code variables: - value_selector: - sys - query value_type: string variable: question height: 52 id: '1784083007146' position: x: -10836.84627996062 y: -275.5887295533155 positionAbsolute: x: -10836.84627996062 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: answer: '{{#1782400000011.structured_output#}} {{#17841887361130.structured_output#}}' selected: false title: 返回load请求 type: answer variables: [] height: 122 id: '1784098833176' position: x: -7585.9671110161225 y: -377.5887295533152 positionAbsolute: x: -7585.9671110161225 y: -377.5887295533152 selected: true sourcePosition: right targetPosition: left type: custom width: 242 - data: items: - input_type: variable operation: over-write value: - '1784188957627' - result variable_selector: - conversation - latest_load selected: false title: 保存上次Load type: assigner version: '2' height: 84 id: '1784183263188' position: x: -7296.9671110161225 y: -109.81201181221708 positionAbsolute: x: -7296.9671110161225 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: context: enabled: false variable_selector: [] desc: '' isInIteration: false isInLoop: false model: completion_params: response_format: json_object mode: chat name: qwen3.7-plus provider: langgenius/tongyi/tongyi prompt_config: jinja2_variables: [] prompt_template: - edition_type: basic id: 99e91b51-0052-4e93-95b5-62e502798f91 jinja2_text: '' role: system text: '你是 Cube load 查询体生成器。 # 任务 根据参考信息,生成可用于Cube `/cubejs-api/v1/load`接口的请求体的请求,以便获取用户想要的数据。 # 规则: - 当查询农户名单、明细、记录或排行榜时,须额外加入当前 Cube 的农户唯一ID维度,如 nhsysid;不要只用农户姓名作为农户粒度。 - 如果选择的 measure 已经包含用户要求的业务状态或口径,不要再额外添加同义 filter。 - 去掉/不要 XXX 为空的"、"排除 XXX 为空"、"只保留 XXX 不为空"均表示修改 filter,不得删除该 dimension。只有用户明确要求"不要显示 XXX"、"去掉 XXX 列"、"隐藏 XXX"时,才能从 dimensions 中删除字段。 # 参考知识: ## 当前时间:{{#1781232881963.text#}} ## 当前蚕季ID:{{#conversation.canjiId#}} (当用户提问当前蚕季时,筛选数据时需要明确筛选蚕季ID) ## 业务规则 {{#conversation.global_rules#}} ## Cube数据 {{#1782400000012.result#}}' - edition_type: basic id: c5f6e041-13bd-48f8-b879-f4c2fbd2f183 role: user text: '当前的Cube请求: {{#conversation.latest_load#}} 用户的新要求: {{#conversation.user_query#}} 当前租户ID:{{#1780903664367.tenant_id#}} **(如果Cube数据中包含类似tenant_id或租户隔离的字段,必须必须必须加此ID筛选)** ' reasoning_format: separated selected: false structured_output: schema: additionalProperties: false properties: limit_source: description: 如果query中有限制limit的话,此处说明限制来源是系统要求还是用户要求 enum: - system - user type: string message: description: 如果status为false或者无法根据知识完全覆盖用户所需要的字段,则此处说明原因以及缺失的字段,否则填写:“成功生成” type: string query: additionalProperties: false description: Cube的/v1/load请求 properties: dimensions: description: 维度,负责“按什么看、返回哪些分类/明细字段” 来源是 Cube 元数据里的 dimensions[].name。不可放入measures的name items: type: string type: array filters: description: 过滤条件 items: additionalProperties: false properties: and: description: “且”条件时使用 items: additionalProperties: false properties: member: description: 过滤对象 type: string operator: description: 操作符,用户表达“蚕季为/名称为/包含/叫/查某某名称”,优先使用 operator="contains",不要使用 equals,除非用户明确说“精确等于/完全等于/ID enum: - equals - notEquals - contains - startsWith - gt - lt - set - notSet - inDateRange type: string values: description: 过滤值 items: type: string type: array required: [] type: object type: array or: description: “或”条件时使用, items: additionalProperties: false properties: member: description: 过滤对象 type: string operator: description: 操作符,用户表达“蚕季为/名称为/包含/叫/查某某名称”,优先使用 operator="contains",不要使用 equals,除非用户明确说“精确等于/完全等于/ID enum: - equals - notEquals - contains - startsWith - gt - lt - set - notSet - inDateRange type: string values: description: 过滤值 items: type: string type: array required: [] type: object type: array required: [] type: object type: array limit: description: 限制返回数量,最大5 type: number measures: description: 指标,负责“算什么数” 来源是 Cube 元数据里的 measures[].name。不可放入dimensions的name items: type: string type: array offset: description: 跳过前面多少行,可以结合limit实现分页 type: number order: description: 排序,必须是二维数组,例如 [["bus_farmer_yield.yield_kg_per_sheet", "asc"]] items: maxItems: 2 minItems: 2 prefixItems: - description: 排序字段,例如 bus_farmer_yield.yield_kg_per_sheet type: string - description: 排序方向 enum: - asc - desc type: string type: array type: array segments: description: 预先在 Cube 模型中定义好的命名过滤条件 items: type: string type: array timeDimensions: description: 时间维度过滤 items: additionalProperties: false properties: dateRange: items: type: string type: array dimension: description: 时间维度字段,例如 orders.createdAt type: string granularity: description: 如果不写 granularity,只过滤时间,不按时间分组 enum: - year - quarter - month - week - day - hour - minute - second type: string required: [] type: object type: array required: - limit - dimensions type: object status: description: 是否可以生成query。缺失字段时仍然返回true enum: - 'true' - 'false' type: string required: - query - message - status - limit_source type: object structured_output_enabled: true title: 修正数据请求 type: llm vision: enabled: false height: 88 id: '17841887361130' position: x: -7843.845548425899 y: -109.81201181221708 positionAbsolute: x: -7843.845548425899 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: cases: - case_id: 'true' conditions: - comparison_operator: empty id: 1bbb3588-583e-43d7-9214-446c406370d6 value: '' varType: string variable_selector: - conversation - latest_load id: 'true' logical_operator: and selected: false title: 条件分支 3 type: if-else height: 124 id: '1784188747804' position: x: -8107.816891509001 y: -275.5887295533155 positionAbsolute: x: -8107.816891509001 y: -275.5887295533155 selected: false sourcePosition: right targetPosition: left type: custom width: 242 - data: code: "function main({ input }) {\n return {\n result: JSON.stringify(input)\n\ \ };\n}" code_language: javascript outputs: result: children: null type: string selected: false title: 代码执行 7 type: code variables: - value_selector: - '1782400000011' - structured_output value_type: object variable: input height: 52 id: '1784188957627' position: x: -7576.967111016122 y: -109.81201181221708 positionAbsolute: x: -7576.967111016122 y: -109.81201181221708 selected: false sourcePosition: right targetPosition: left type: custom width: 242 viewport: x: 5449.14149570833 y: 542.9157509872703 zoom: 0.6597539553864491 rag_pipeline_variables: []