Toggle navigation
Toggle navigation
This project
Loading...
Sign in
zhouhui.jiang
/
Test_LangGraph
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
zhouhui.jiang
2025-11-18 14:40:01 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
9395c33b69f22d68fc1e232192d278a8c7cb2df0
9395c33b
1 parent
e021e2df
update
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
12 deletions
API/waybill_api.py
langgraph_examples/api_agent.py
API/waybill_api.py
View file @
9395c33
...
...
@@ -170,6 +170,24 @@ def create_waybill_d(consignmentCode: str, Authorization: str = None) -> str:
return
_create_error_response
(
f
"创建运单失败: {str(e)}"
,
consignmentCode
)
def
create_waybill_c
(
consignmentCode
:
str
,
Authorization
:
str
=
None
)
->
str
:
"""根据运单号创建C类运单
Args:
consignmentCode: 运单号(必填)
Authorization: 授权令牌,如果提供则使用该值,否则使用 API_CONFIG 中的默认值
Returns:
创建结果信息(JSON字符串),包含:
- message: 创建结果描述
"""
# 暂时不支持AI创建C类运单
result_data
=
{
"message"
:
"暂不支持AI创建"
}
return
json
.
dumps
(
result_data
,
ensure_ascii
=
False
,
indent
=
2
)
def
create_waybill_d_with_id
(
consignmentCode
:
str
,
consignmentId
:
str
,
...
...
langgraph_examples/api_agent.py
View file @
9395c33
...
...
@@ -12,7 +12,7 @@ from langchain_core.messages import AnyMessage
sys
.
path
.
append
(
os
.
path
.
dirname
(
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))))
# 导入 API 模块
from
API.waybill_api
import
query_waybill_list
,
create_waybill_d
,
push_waybill_for_ocr
,
query_waybill_info
,
create_waybill_d_with_id
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
from
API.paperless_api
import
upload_clearance_file
,
upload_file_for_ocr
# 导入工具类
...
...
@@ -196,9 +196,15 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
1. **运单查询**:根据用户需求查询运单信息
- **查询运单列表**:当用户查询运单但不提供运单号时,使用 query_waybill_list 查询运单列表,支持按状态、时间等条件筛选,结果以JSON形式展示,AI不用对返回数据JSON进行加工
- **查询单个运单详情**:当用户提供运单号查询时,使用 query_waybill_info 查询该运单的详细信息(包括运单基本信息、公司信息、商品明细等),返回格式与 create_waybill_d 相同
2. **运单创建**:协助用户创建D类运单,确保信息完整准确
- **create_waybill_d**:根据运单号创建D类运单,运单编号必须从用户输入中获取(不是从提示词中获取)。当用户输入"创建运单"或"申报"时,则使用此工具创建运单
- **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号,直接使用该运单编号调用 create_waybill_d 工具创建运单,不需要询问用户确认
2. **运单创建**:协助用户创建运单,确保信息完整准确
- **运单类型选择**:当用户输入"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单。询问时应提供选项,如"请选择运单类型:1.创建D类运单 2.创建C类运单"
- **数字选择理解**:当用户输入"1"、"2"等数字时,应理解为用户选择了对应选项。例如:如果提供了"1.创建D类运单 2.创建C类运单",用户回复"1"表示选择创建D类运单,回复"2"表示选择创建C类运单
- **create_waybill_d**:根据运单号创建D类运单,运单编号必须从用户输入中获取(不是从提示词中获取)。当用户选择创建D类运单时,使用此工具创建运单
- **create_waybill_c**:根据运单号创建C类运单,运单编号必须从用户输入中获取。当用户选择创建C类运单时,使用此工具。注意:此工具目前暂不支持AI创建,会返回"暂不支持AI创建"的提示
- **用户选择后的处理**:
- 如果用户选择创建D类运单(回复"1"或明确表示创建D类运单):使用用户输入的运单编号调用 create_waybill_d 工具,不再询问其他参数
- 如果用户选择创建C类运单(回复"2"或明确表示创建C类运单):使用用户输入的运单编号调用 create_waybill_c 工具,不再询问其他参数
- **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号。但在调用工具之前,需要先询问用户选择运单类型(D类或C类),然后使用该运单编号调用相应的工具
3. **运单修改**:协助用户修改D类运单,确保信息完整准确
- **create_waybill_d_with_id**:根据运单ID及运单号修改D类运单,参数获取方式:
- 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
## 工作原则:
- **运单操作工具选择规则(重要)**:
- **创建运单**:当用户说"创建运单"或"申报"时,使用 create_waybill_d 工具,运单编号从用户输入中获取。运单编号一般为9-12位数字。如果用户说"创建运单"后输入了数字(一般为9-12位),应理解该数字就是运单编号,直接使用该运单编号调用工具,不需要询问用户确认
- **创建运单**:当用户说"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单。询问时应提供选项,如"请选择运单类型:1.创建D类运单 2.创建C类运单"。运单编号从用户输入中获取,运单编号一般为9-12位数字。如果用户说"创建运单"后输入了数字(一般为9-12位),应理解该数字就是运单编号,但在调用工具之前,需要先询问用户选择运单类型,然后使用该运单编号调用相应的工具
- **数字选择理解**:当用户输入"1"、"2"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.创建D类运单 2.创建C类运单"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和运单编号
- **修改运单**:当用户说"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用 create_waybill_d_with_id 修改运单,禁止询问用户或使用其他工具(loginName 和 userId 已硬编码,不需要传递)
- **图文识别后修改运单**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号"的提示,且用户回答"是"、"确认"、"使用"等肯定回答时,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,直接修改运单(loginName 和 userId 已硬编码,不需要传递),不需要再次询问用户
- **参数获取**:consignmentCode 和 consignmentId 可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,可以从该工具的返回结果中提取 chmCode 和 chmId,并映射为 consignmentCode 和 consignmentId
- **上下文理解能力(重要)**:必须主动理解用户输入的上下文,从用户输入中识别运单编号(运单编号一般为9-12位数字)、从工具调用结果中提取参数,不需要询问用户确认,直接使用识别到的参数调用相应工具。例外:
在文件上传场景中,如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择
- **数字选择理解(重要)**:当用户输入"1"、"2"、"3"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.上传清关文件 2.上传图文识别文件"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和参数
- **上下文理解能力(重要)**:必须主动理解用户输入的上下文,从用户输入中识别运单编号(运单编号一般为9-12位数字)、从工具调用结果中提取参数,不需要询问用户确认,直接使用识别到的参数调用相应工具。例外:
1) 在文件上传场景中,如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择;2) 在创建运单场景中,当用户输入"创建运单"或"申报"时,需要询问用户选择创建D类运单还是C类运单
- **数字选择理解(重要)**:当用户输入"1"、"2"、"3"等数字时,应理解为用户选择了对应选项。如果之前提供了选项(如"1.上传清关文件 2.上传图文识别文件"
或"1.创建D类运单 2.创建C类运单"
),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和参数
- **文件上传工具选择规则(重要)**:如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件还是进行图文识别),需要询问用户选择。询问时应提供选项,如"请选择:1.上传清关文件 2.上传图文识别文件"。如果用户已经明确表示要上传清关文件或进行图文识别,则直接使用相应工具,不需要询问。用户选择后:
- 如果用户选择图文识别(回复"2"或明确表示图文识别):直接使用上下文中的 pdf_path 调用 upload_file_for_ocr 工具,不再询问参数
- 如果用户选择上传清关文件(回复"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
- **使用场景**:当用户提供运单号查询运单详情时使用此工具
- **运单编号格式**:运单编号一般为9-12位数字
- **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数)
- **返回数据说明**:此工具返回的数据中包含 message 字段,用于描述查询结果(成功时:"查询详情成功",失败时:具体的失败原因)
- create_waybill_d: 根据运单号创建D类运单,需要提供参数(运单号、Authorization)
- **使用场景**:当用户
输入"创建运单"或"申报"
时使用此工具创建运单
- **使用场景**:当用户
选择创建D类运单
时使用此工具创建运单
- **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字
- **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号,直接使用该运单编号调用此工具创建运单,不需要询问用户确认。在识别运单编号时,应以9-12位数字作为判断标准,避免将其他数字(如1-3位的选择数字)误判为运单编号
- **选择流程**:当用户输入"创建运单"或"申报"时,需要先询问用户选择运单类型。如果用户选择创建D类运单(回复"1"或明确表示创建D类运单),则使用用户输入的运单编号调用此工具创建运单
- **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号。但在调用工具之前,需要先询问用户选择运单类型(D类或C类),然后使用该运单编号调用相应的工具。在识别运单编号时,应以9-12位数字作为判断标准,避免将其他数字(如1-3位的选择数字)误判为运单编号
- **返回参数**:此工具返回的数据中包含 consignmentCode(运单编号)和 waybill_id(运单ID),这些参数可以用于后续的 upload_clearance_file 工具调用(consignmentCode 对应 code 参数,waybill_id 对应 slip_id 参数)
- **返回数据说明**:此工具返回的数据中包含 message 字段,用于描述创建结果(成功时:"创建运单成功",失败时:具体的失败原因)
- create_waybill_c: 根据运单号创建C类运单,需要提供参数(运单号、Authorization)
- **使用场景**:当用户选择创建C类运单时使用此工具
- **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字
- **选择流程**:当用户输入"创建运单"或"申报"时,需要先询问用户选择运单类型。如果用户选择创建C类运单(回复"2"或明确表示创建C类运单),则使用用户输入的运单编号调用此工具创建运单
- **当前状态**:此工具目前暂不支持AI创建,调用后会返回 message 字段,值为"暂不支持AI创建"
- **返回数据说明**:此工具返回的数据中只包含 message 字段,值为"暂不支持AI创建"。AI可以根据此信息向用户说明当前暂不支持创建C类运单
- create_waybill_d_with_id: 根据运单ID及运单号修改D类运单,需要提供参数(运单编号、运单ID、Authorization)
- **使用场景**:
- 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用此工具修改运单
...
...
@@ -273,11 +289,16 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
- 空字段会显示为空单元格
## query_waybill_info数据展示说明:
- 返回格式与 create_waybill_d 相同,包含:
运单编号、运单ID
、公司名称、公司编码、商品明细列表
- 返回格式与 create_waybill_d 相同,包含:
message(查询结果描述)、运单编号、运单ID、运单状态
、公司名称、公司编码、商品明细列表
- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
## create_waybill_d数据展示说明:
- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容。
- 返回数据包含:message(创建结果描述)、运单编号、运单ID、运单状态、公司名称、公司编码、商品明细列表
- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
## create_waybill_c数据展示说明:
- 返回数据只包含:message(创建结果描述),值为"暂不支持AI创建"
- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容
## create_waybill_d_with_id数据展示说明:
- 按照数据返回的原本格式进行展示,不得增删前后缀或改写内容。
...
...
@@ -297,7 +318,7 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
# 创建 ReAct 智能体
agent
=
create_react_agent
(
model
=
model
,
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
],
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
],
pre_model_hook
=
pre_model_inspect_attachments
,
prompt
=
_create_system_prompt
,
)
...
...
Please
register
or
login
to post a comment