zhouhui.jiang

update

...@@ -170,6 +170,24 @@ def create_waybill_d(consignmentCode: str, Authorization: str = None) -> str: ...@@ -170,6 +170,24 @@ def create_waybill_d(consignmentCode: str, Authorization: str = None) -> str:
170 return _create_error_response(f"创建运单失败: {str(e)}", consignmentCode) 170 return _create_error_response(f"创建运单失败: {str(e)}", consignmentCode)
171 171
172 172
173 +def create_waybill_c(consignmentCode: str, Authorization: str = None) -> str:
174 + """根据运单号创建C类运单
175 +
176 + Args:
177 + consignmentCode: 运单号(必填)
178 + Authorization: 授权令牌,如果提供则使用该值,否则使用 API_CONFIG 中的默认值
179 +
180 + Returns:
181 + 创建结果信息(JSON字符串),包含:
182 + - message: 创建结果描述
183 + """
184 + # 暂时不支持AI创建C类运单
185 + result_data = {
186 + "message": "暂不支持AI创建"
187 + }
188 + return json.dumps(result_data, ensure_ascii=False, indent=2)
189 +
190 +
173 def create_waybill_d_with_id( 191 def create_waybill_d_with_id(
174 consignmentCode: str, 192 consignmentCode: str,
175 consignmentId: str, 193 consignmentId: str,
......
...@@ -12,7 +12,7 @@ from langchain_core.messages import AnyMessage ...@@ -12,7 +12,7 @@ from langchain_core.messages import AnyMessage
12 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 12 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
13 13
14 # 导入 API 模块 14 # 导入 API 模块
15 -from API.waybill_api import query_waybill_list, create_waybill_d, push_waybill_for_ocr, query_waybill_info, create_waybill_d_with_id 15 +from API.waybill_api import query_waybill_list, create_waybill_d, create_waybill_c, push_waybill_for_ocr, query_waybill_info, create_waybill_d_with_id
16 from API.paperless_api import upload_clearance_file, upload_file_for_ocr 16 from API.paperless_api import upload_clearance_file, upload_file_for_ocr
17 17
18 # 导入工具类 18 # 导入工具类
...@@ -196,9 +196,15 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List ...@@ -196,9 +196,15 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
196 1. **运单查询**:根据用户需求查询运单信息 196 1. **运单查询**:根据用户需求查询运单信息
197 - **查询运单列表**:当用户查询运单但不提供运单号时,使用 query_waybill_list 查询运单列表,支持按状态、时间等条件筛选,结果以JSON形式展示,AI不用对返回数据JSON进行加工 197 - **查询运单列表**:当用户查询运单但不提供运单号时,使用 query_waybill_list 查询运单列表,支持按状态、时间等条件筛选,结果以JSON形式展示,AI不用对返回数据JSON进行加工
198 - **查询单个运单详情**:当用户提供运单号查询时,使用 query_waybill_info 查询该运单的详细信息(包括运单基本信息、公司信息、商品明细等),返回格式与 create_waybill_d 相同 198 - **查询单个运单详情**:当用户提供运单号查询时,使用 query_waybill_info 查询该运单的详细信息(包括运单基本信息、公司信息、商品明细等),返回格式与 create_waybill_d 相同
199 -2. **运单创建**:协助用户创建D类运单,确保信息完整准确 199 +2. **运单创建**:协助用户创建运单,确保信息完整准确
200 - - **create_waybill_d**:根据运单号创建D类运单,运单编号必须从用户输入中获取(不是从提示词中获取)。当用户输入"创建运单"或"申报"时,则使用此工具创建运单 200 + - **运单类型选择**:当用户输入"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单。询问时应提供选项,如"请选择运单类型:1.创建D类运单 2.创建C类运单"
201 - - **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号,直接使用该运单编号调用 create_waybill_d 工具创建运单,不需要询问用户确认 201 + - **数字选择理解**:当用户输入"1"、"2"等数字时,应理解为用户选择了对应选项。例如:如果提供了"1.创建D类运单 2.创建C类运单",用户回复"1"表示选择创建D类运单,回复"2"表示选择创建C类运单
202 + - **create_waybill_d**:根据运单号创建D类运单,运单编号必须从用户输入中获取(不是从提示词中获取)。当用户选择创建D类运单时,使用此工具创建运单
203 + - **create_waybill_c**:根据运单号创建C类运单,运单编号必须从用户输入中获取。当用户选择创建C类运单时,使用此工具。注意:此工具目前暂不支持AI创建,会返回"暂不支持AI创建"的提示
204 + - **用户选择后的处理**:
205 + - 如果用户选择创建D类运单(回复"1"或明确表示创建D类运单):使用用户输入的运单编号调用 create_waybill_d 工具,不再询问其他参数
206 + - 如果用户选择创建C类运单(回复"2"或明确表示创建C类运单):使用用户输入的运单编号调用 create_waybill_c 工具,不再询问其他参数
207 + - **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号。但在调用工具之前,需要先询问用户选择运单类型(D类或C类),然后使用该运单编号调用相应的工具
202 3. **运单修改**:协助用户修改D类运单,确保信息完整准确 208 3. **运单修改**:协助用户修改D类运单,确保信息完整准确
203 - **create_waybill_d_with_id**:根据运单ID及运单号修改D类运单,参数获取方式: 209 - **create_waybill_d_with_id**:根据运单ID及运单号修改D类运单,参数获取方式:
204 - consignmentCode(运单编号)和 consignmentId(运单ID)可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,该工具会返回 chmCode(运单编号)和 chmId(运单ID),需要从返回结果中提取 chmCode 映射为 consignmentCode,提取 chmId 映射为 consignmentId 210 - consignmentCode(运单编号)和 consignmentId(运单ID)可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,该工具会返回 chmCode(运单编号)和 chmId(运单ID),需要从返回结果中提取 chmCode 映射为 consignmentCode,提取 chmId 映射为 consignmentId
...@@ -218,12 +224,13 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List ...@@ -218,12 +224,13 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
218 224
219 ## 工作原则: 225 ## 工作原则:
220 - **运单操作工具选择规则(重要)**: 226 - **运单操作工具选择规则(重要)**:
221 - - **创建运单**:当用户说"创建运单"或"申报"时,使用 create_waybill_d 工具,运单编号从用户输入中获取。运单编号一般为9-12位数字。如果用户说"创建运单"后输入了数字(一般为9-12位),应理解该数字就是运单编号,直接使用该运单编号调用工具,不需要询问用户确认 227 + - **创建运单**:当用户说"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单。询问时应提供选项,如"请选择运单类型:1.创建D类运单 2.创建C类运单"。运单编号从用户输入中获取,运单编号一般为9-12位数字。如果用户说"创建运单"后输入了数字(一般为9-12位),应理解该数字就是运单编号,但在调用工具之前,需要先询问用户选择运单类型,然后使用该运单编号调用相应的工具
228 + - **数字选择理解**:当用户输入"1"、"2"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.创建D类运单 2.创建C类运单"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和运单编号
222 - **修改运单**:当用户说"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用 create_waybill_d_with_id 修改运单,禁止询问用户或使用其他工具(loginName 和 userId 已硬编码,不需要传递) 229 - **修改运单**:当用户说"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用 create_waybill_d_with_id 修改运单,禁止询问用户或使用其他工具(loginName 和 userId 已硬编码,不需要传递)
223 - **图文识别后修改运单**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号"的提示,且用户回答"是"、"确认"、"使用"等肯定回答时,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,直接修改运单(loginName 和 userId 已硬编码,不需要传递),不需要再次询问用户 230 - **图文识别后修改运单**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号"的提示,且用户回答"是"、"确认"、"使用"等肯定回答时,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,直接修改运单(loginName 和 userId 已硬编码,不需要传递),不需要再次询问用户
224 - **参数获取**:consignmentCode 和 consignmentId 可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,可以从该工具的返回结果中提取 chmCode 和 chmId,并映射为 consignmentCode 和 consignmentId 231 - **参数获取**:consignmentCode 和 consignmentId 可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,可以从该工具的返回结果中提取 chmCode 和 chmId,并映射为 consignmentCode 和 consignmentId
225 -- **上下文理解能力(重要)**:必须主动理解用户输入的上下文,从用户输入中识别运单编号(运单编号一般为9-12位数字)、从工具调用结果中提取参数,不需要询问用户确认,直接使用识别到的参数调用相应工具。例外:在文件上传场景中,如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择 232 +- **上下文理解能力(重要)**:必须主动理解用户输入的上下文,从用户输入中识别运单编号(运单编号一般为9-12位数字)、从工具调用结果中提取参数,不需要询问用户确认,直接使用识别到的参数调用相应工具。例外:1) 在文件上传场景中,如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择;2) 在创建运单场景中,当用户输入"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单
226 -- **数字选择理解(重要)**:当用户输入"1"、"2"、"3"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.上传清关文件 2.上传图文识别文件"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和参数 233 +- **数字选择理解(重要)**:当用户输入"1"、"2"、"3"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.上传清关文件 2.上传图文识别文件"或"1.创建D类运单 2.创建C类运单"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和参数
227 - **文件上传工具选择规则(重要)**:如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择。询问时应提供选项,如"请选择:1.上传清关文件 2.上传图文识别文件"。如果用户已经明确表示要上传清关文件或进行图文识别,则直接使用相应工具,不需要询问。用户选择后: 234 - **文件上传工具选择规则(重要)**:如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择。询问时应提供选项,如"请选择:1.上传清关文件 2.上传图文识别文件"。如果用户已经明确表示要上传清关文件或进行图文识别,则直接使用相应工具,不需要询问。用户选择后:
228 - 如果用户选择图文识别(回复"2"或明确表示图文识别):直接使用上下文中的 pdf_path 调用 upload_file_for_ocr 工具,不再询问参数 235 - 如果用户选择图文识别(回复"2"或明确表示图文识别):直接使用上下文中的 pdf_path 调用 upload_file_for_ocr 工具,不再询问参数
229 - 如果用户选择上传清关文件(回复"1"或明确表示上传清关文件):从上下文(create_waybill_d 或 query_waybill_info 的返回结果)中提取 consignmentCode 映射为 code,提取 waybill_id 映射为 slip_id,加上上下文中的 pdf_path,直接调用 upload_clearance_file 工具,不再询问其他参数 236 - 如果用户选择上传清关文件(回复"1"或明确表示上传清关文件):从上下文(create_waybill_d 或 query_waybill_info 的返回结果)中提取 consignmentCode 映射为 code,提取 waybill_id 映射为 slip_id,加上上下文中的 pdf_path,直接调用 upload_clearance_file 工具,不再询问其他参数
...@@ -243,11 +250,20 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List ...@@ -243,11 +250,20 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
243 - **使用场景**:当用户提供运单号查询运单详情时使用此工具 250 - **使用场景**:当用户提供运单号查询运单详情时使用此工具
244 - **运单编号格式**:运单编号一般为9-12位数字 251 - **运单编号格式**:运单编号一般为9-12位数字
245 - **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数) 252 - **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数)
253 + - **返回数据说明**:此工具返回的数据中包含 message 字段,用于描述查询结果(成功时:"查询详情成功",失败时:具体的失败原因)
246 - create_waybill_d: 根据运单号创建D类运单,需要提供参数(运单号、Authorization) 254 - create_waybill_d: 根据运单号创建D类运单,需要提供参数(运单号、Authorization)
247 - - **使用场景**:当用户输入"创建运单"或"申报"时使用此工具创建运单 255 + - **使用场景**:当用户选择创建D类运单时使用此工具创建运单
248 - **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字 256 - **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字
249 - - **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号,直接使用该运单编号调用此工具创建运单,不需要询问用户确认。在识别运单编号时,应以9-12位数字作为判断标准,避免将其他数字(如1-3位的选择数字)误判为运单编号 257 + - **选择流程**:当用户输入"创建运单"或"申报"时,需要先询问用户选择运单类型。如果用户选择创建D类运单(回复"1"或明确表示创建D类运单),则使用用户输入的运单编号调用此工具创建运单
258 + - **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号。但在调用工具之前,需要先询问用户选择运单类型(D类或C类),然后使用该运单编号调用相应的工具。在识别运单编号时,应以9-12位数字作为判断标准,避免将其他数字(如1-3位的选择数字)误判为运单编号
250 - **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数) 259 - **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数)
260 + - **返回数据说明**:此工具返回的数据中包含 message 字段,用于描述创建结果(成功时:"创建运单成功",失败时:具体的失败原因)
261 +- create_waybill_c: 根据运单号创建C类运单,需要提供参数(运单号、Authorization)
262 + - **使用场景**:当用户选择创建C类运单时使用此工具
263 + - **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字
264 + - **选择流程**:当用户输入"创建运单"或"申报"时,需要先询问用户选择运单类型。如果用户选择创建C类运单(回复"2"或明确表示创建C类运单),则使用用户输入的运单编号调用此工具创建运单
265 + - **当前状态**:此工具目前暂不支持AI创建,调用后会返回 message 字段,值为"暂不支持AI创建"
266 + - **返回数据说明**:此工具返回的数据中只包含 message 字段,值为"暂不支持AI创建"。AI可以根据此信息向用户说明当前暂不支持创建C类运单
251 - create_waybill_d_with_id: 根据运单ID及运单号修改D类运单,需要提供参数(运单编号、运单ID、Authorization) 267 - create_waybill_d_with_id: 根据运单ID及运单号修改D类运单,需要提供参数(运单编号、运单ID、Authorization)
252 - **使用场景**: 268 - **使用场景**:
253 - 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用此工具修改运单 269 - 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用此工具修改运单
...@@ -273,11 +289,16 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List ...@@ -273,11 +289,16 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
273 - 空字段会显示为空单元格 289 - 空字段会显示为空单元格
274 290
275 ## query_waybill_info数据展示说明: 291 ## query_waybill_info数据展示说明:
276 -- 返回格式与 create_waybill_d 相同,包含:运单编号、运单ID、公司名称、公司编码、商品明细列表 292 +- 返回格式与 create_waybill_d 相同,包含:message(查询结果描述)、运单编号、运单ID、运单状态、公司名称、公司编码、商品明细列表
277 - 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容 293 - 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
278 294
279 ## create_waybill_d数据展示说明: 295 ## create_waybill_d数据展示说明:
280 -- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容。 296 +- 返回数据包含:message(创建结果描述)、运单编号、运单ID、运单状态、公司名称、公司编码、商品明细列表
297 +- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
298 +
299 +## create_waybill_c数据展示说明:
300 +- 返回数据只包含:message(创建结果描述),值为"暂不支持AI创建"
301 +- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
281 302
282 ## create_waybill_d_with_id数据展示说明: 303 ## create_waybill_d_with_id数据展示说明:
283 - 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容。 304 - 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容。
...@@ -297,7 +318,7 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List ...@@ -297,7 +318,7 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
297 # 创建 ReAct 智能体 318 # 创建 ReAct 智能体
298 agent = create_react_agent( 319 agent = create_react_agent(
299 model=model, 320 model=model,
300 - tools=[query_waybill_list, query_waybill_info, create_waybill_d, create_waybill_d_with_id, upload_clearance_file, upload_file_for_ocr, push_waybill_for_ocr], 321 + tools=[query_waybill_list, query_waybill_info, create_waybill_d, create_waybill_c, create_waybill_d_with_id, upload_clearance_file, upload_file_for_ocr, push_waybill_for_ocr],
301 pre_model_hook=pre_model_inspect_attachments, 322 pre_model_hook=pre_model_inspect_attachments,
302 prompt=_create_system_prompt, 323 prompt=_create_system_prompt,
303 ) 324 )
......