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-16 09:38:47 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
46a702c8a8498d557b5d093fa1cf2552963f0190
46a702c8
1 parent
ba655357
update
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
16 additions
and
57 deletions
API/waybill_api.py
langgraph_examples/api_agent.py
API/waybill_api.py
View file @
46a702c
...
...
@@ -136,8 +136,6 @@ def create_waybill_d(consignmentCode: str, Authorization: str = None) -> str:
def
create_waybill_d_with_id
(
consignmentCode
:
str
,
consignmentId
:
str
,
loginName
:
str
,
userId
:
int
,
Authorization
:
str
=
None
,
)
->
str
:
"""根据运单ID及运单号创建D类运单
...
...
@@ -145,8 +143,6 @@ def create_waybill_d_with_id(
Args:
consignmentCode: 运单号(必填)
consignmentId: 运单ID(必填)
loginName: 登录名(必填)
userId: 用户ID(必填)
Authorization: 授权令牌,如果提供则使用该值,否则使用 API_CONFIG 中的默认值
Returns:
...
...
@@ -160,8 +156,8 @@ def create_waybill_d_with_id(
"consignmentCode"
:
consignmentCode
,
"consignmentId"
:
consignmentId
,
"isAIRecognition"
:
1
,
# 写死为1
"loginName"
:
loginName
,
"userId"
:
userId
"loginName"
:
"CL1"
,
# 硬编码
"userId"
:
73768
# 硬编码
}
# 构建 headers,优先使用传入的 Authorization
...
...
langgraph_examples/api_agent.py
View file @
46a702c
...
...
@@ -104,11 +104,7 @@ def extract_token(state: Dict[str, Any]) -> Dict[str, Any]:
包含所有参数的字典,如果未找到则返回空字符串或None
"""
result
=
{
"token"
:
""
,
"consignmentCode"
:
None
,
"consignmentId"
:
None
,
"loginName"
:
None
,
"userId"
:
None
"token"
:
""
}
messages
=
state
.
get
(
"messages"
,
[])
...
...
@@ -146,14 +142,6 @@ def extract_token(state: Dict[str, Any]) -> Dict[str, Any]:
# 从 additional_kwargs 中提取参数
if
"token"
in
additional_kwargs
and
additional_kwargs
.
get
(
"token"
):
result
[
"token"
]
=
additional_kwargs
.
get
(
"token"
)
if
"consignmentCode"
in
additional_kwargs
:
result
[
"consignmentCode"
]
=
additional_kwargs
.
get
(
"consignmentCode"
)
if
"consignmentId"
in
additional_kwargs
:
result
[
"consignmentId"
]
=
additional_kwargs
.
get
(
"consignmentId"
)
if
"loginName"
in
additional_kwargs
:
result
[
"loginName"
]
=
additional_kwargs
.
get
(
"loginName"
)
if
"userId"
in
additional_kwargs
:
result
[
"userId"
]
=
additional_kwargs
.
get
(
"userId"
)
# 如果 additional_kwargs 中没有某些参数,再从 content 中提取(作为备选)
if
isinstance
(
last_human_msg
,
dict
):
...
...
@@ -168,26 +156,10 @@ def extract_token(state: Dict[str, Any]) -> Dict[str, Any]:
if
isinstance
(
part
,
dict
):
if
not
result
[
"token"
]
and
"token"
in
part
and
part
.
get
(
"token"
):
result
[
"token"
]
=
part
.
get
(
"token"
)
if
result
[
"consignmentCode"
]
is
None
and
"consignmentCode"
in
part
:
result
[
"consignmentCode"
]
=
part
.
get
(
"consignmentCode"
)
if
result
[
"consignmentId"
]
is
None
and
"consignmentId"
in
part
:
result
[
"consignmentId"
]
=
part
.
get
(
"consignmentId"
)
if
result
[
"loginName"
]
is
None
and
"loginName"
in
part
:
result
[
"loginName"
]
=
part
.
get
(
"loginName"
)
if
result
[
"userId"
]
is
None
and
"userId"
in
part
:
result
[
"userId"
]
=
part
.
get
(
"userId"
)
elif
isinstance
(
content
,
dict
):
# content 是字典,直接获取参数
if
not
result
[
"token"
]
and
"token"
in
content
and
content
.
get
(
"token"
):
result
[
"token"
]
=
content
.
get
(
"token"
)
if
result
[
"consignmentCode"
]
is
None
and
"consignmentCode"
in
content
:
result
[
"consignmentCode"
]
=
content
.
get
(
"consignmentCode"
)
if
result
[
"consignmentId"
]
is
None
and
"consignmentId"
in
content
:
result
[
"consignmentId"
]
=
content
.
get
(
"consignmentId"
)
if
result
[
"loginName"
]
is
None
and
"loginName"
in
content
:
result
[
"loginName"
]
=
content
.
get
(
"loginName"
)
if
result
[
"userId"
]
is
None
and
"userId"
in
content
:
result
[
"userId"
]
=
content
.
get
(
"userId"
)
return
result
...
...
@@ -210,22 +182,13 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
# 从 state 中提取动态参数
params
=
extract_token
(
state
)
token
=
params
.
get
(
"token"
,
""
)
consignmentCode
=
params
.
get
(
"consignmentCode"
)
consignmentId
=
params
.
get
(
"consignmentId"
)
loginName
=
params
.
get
(
"loginName"
)
userId
=
params
.
get
(
"userId"
)
# 如果从 state 中提取的 token 为空,则从 api_config.py 中获取 Authorization 作为备选
if
not
token
:
from
API.api_config
import
API_CONFIG
token
=
API_CONFIG
.
get
(
"headers"
,
{})
.
get
(
"Authorization"
,
""
)
# 格式化参数值用于提示词显示
consignmentCode_str
=
str
(
consignmentCode
)
if
consignmentCode
is
not
None
else
"无"
consignmentId_str
=
str
(
consignmentId
)
if
consignmentId
is
not
None
else
"无"
loginName_str
=
str
(
loginName
)
if
loginName
is
not
None
else
"无"
userId_str
=
str
(
userId
)
if
userId
is
not
None
else
"无"
# 创建系统提示词(使用 f-string 以便插入 token)
system_msg
=
f
"""你是一个专业的出口物流系统智能助手,专门帮助用户处理运单相关的业务操作。
...
...
@@ -239,8 +202,8 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
3. **运单修改**:协助用户修改D类运单,确保信息完整准确
- **create_waybill_d_with_id**:根据运单ID及运单号修改D类运单,参数获取方式:
- consignmentCode(运单编号)和 consignmentId(运单ID)可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,该工具会返回 chmCode(运单编号)和 chmId(运单ID),需要从返回结果中提取 chmCode 映射为 consignmentCode,提取 chmId 映射为 consignmentId
- loginName 和 userId
从提示词中获取(注意:这与 create_waybill_d 不同,create_waybill_d 的运单编号从用户输入获取,而 create_waybill_d_with_id 的参数从提示词中获取)
- 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId
、loginName、userId
且都不为None时,必须立即使用此工具修改运单,禁止询问用户或使用其他工具
- loginName 和 userId
已硬编码为固定值(loginName="CL1",userId=73768),不需要从提示词中获取,调用工具时不需要传递这两个参数
- 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即使用此工具修改运单,禁止询问用户或使用其他工具
4. **文件上传**:根据用户需求上传文件
- **工具选择规则**:如果用户意图不明确(即用户没有明确表示要上传清关文件或进行图文识别),即使有 slip_id 和 pdf_path 这两个值,也要询问用户选择。询问时应提供选项,如"请选择:1.上传清关文件 2.上传图文识别文件"。如果用户已经明确表示要上传清关文件或进行图文识别,则直接使用相应工具,不需要询问
- **数字选择理解**:当用户输入"1"、"2"、"3"等数字时,应理解为用户选择了对应选项。例如:如果提供了"1.上传清关文件 2.上传图文识别文件",用户回复"1"表示选择上传清关文件,回复"2"表示选择上传图文识别文件
...
...
@@ -249,15 +212,15 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
- 如果用户选择上传清关文件(回复"1"或明确表示上传清关文件):使用上下文中的 slip_id 和 pdf_path,加上用户输入的 code,调用 upload_clearance_file 工具,不再询问其他参数
- **上传清关文件**:当用户明确需要上传清关文件并关联运单信息(code、slip_id)时,使用 upload_clearance_file 工具
- **上传文件图文识别**:当用户需要进行图文识别时,使用 upload_file_for_ocr 工具,即使有 slip_id 也可以使用此工具进行图文识别
- **图文识别后修改运单流程**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号:******,运单ID:******"的提示时,如果用户回答"是"、"确认"、"使用"等肯定回答,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,
加上提示词中的 loginName 和 userId,直接修改运单
,不需要再次询问用户
- **图文识别后修改运单流程**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号:******,运单ID:******"的提示时,如果用户回答"是"、"确认"、"使用"等肯定回答,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,
直接修改运单(loginName 和 userId 已硬编码,不需要传递)
,不需要再次询问用户
5. **业务咨询**:解答用户关于出口物流流程、运单状态、操作规范等问题
6. **您当前访问工具Authorization的传参为 Authorization= {token}
## 工作原则:
- **运单操作工具选择规则(重要)**:
- **创建运单**:当用户说"创建运单"或"申报"时,使用 create_waybill_d 工具,运单编号从用户输入中获取。运单编号一般为9-12位数字。如果用户说"创建运单"后输入了数字(一般为9-12位),应理解该数字就是运单编号,直接使用该运单编号调用工具,不需要询问用户确认
- **修改运单**:当用户说"修改运单"或提示词中已有 consignmentCode、consignmentId
、loginName、userId 且都不为None时,必须立即调用 create_waybill_d_with_id 修改运单,禁止询问用户或使用其他工具
- **图文识别后修改运单**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号"的提示,且用户回答"是"、"确认"、"使用"等肯定回答时,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,
加上提示词中的 loginName 和 userId,直接修改运单
,不需要再次询问用户
- **修改运单**:当用户说"修改运单"或提示词中已有 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.上传图文识别文件"),用户回复数字时应理解为选择了对应选项,并直接使用相应工具和参数
...
...
@@ -283,15 +246,15 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
- **使用场景**:当用户输入"创建运单"或"申报"时使用此工具创建运单
- **重要说明**:运单编号需要从用户输入中获取,不是从提示词中获取。运单编号一般为9-12位数字
- **上下文理解**:当用户说"创建运单"后,如果用户输入了数字(一般为9-12位,如"2025102904"),应理解该数字就是运单编号,直接使用该运单编号调用此工具创建运单,不需要询问用户确认。在识别运单编号时,应以9-12位数字作为判断标准,避免将其他数字(如1-3位的选择数字)误判为运单编号
- create_waybill_d_with_id: 根据运单ID及运单号修改D类运单,需要提供参数(运单编号、运单ID、
登录名、用户ID、
Authorization)
- create_waybill_d_with_id: 根据运单ID及运单号修改D类运单,需要提供参数(运单编号、运单ID、Authorization)
- **使用场景**:
- 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId
、loginName、userId
且都不为None时,必须立即调用此工具修改运单
- 当用户输入"修改运单"或提示词中已有 consignmentCode、consignmentId 且都不为None时,必须立即调用此工具修改运单
- **重要场景**:当 upload_file_for_ocr 工具返回"图文识别成功,请确认是否使用该运单编号"的提示,且用户回答"是"、"确认"、"使用"等肯定回答时,必须立即调用此工具修改运单,禁止询问用户或使用其他工具
- **重要说明**:此工具用于修改运单,
参数从提示词中获取,不需要用户再次输入。当提示词中这些参数
齐全且都不为None时,必须立即使用此工具修改运单。禁止向用户询问任何参数,直接使用提示词中的参数调用工具
- **重要说明**:此工具用于修改运单,
consignmentCode 和 consignmentId 从提示词或上下文中获取,不需要用户再次输入。loginName 和 userId 已硬编码为固定值(loginName="CL1",userId=73768),调用工具时不需要传递这两个参数。当提示词中 consignmentCode 和 consignmentId
齐全且都不为None时,必须立即使用此工具修改运单。禁止向用户询问任何参数,直接使用提示词中的参数调用工具
- **参数获取方式**:
- consignmentCode(运单编号)和 consignmentId(运单ID)可从上下文中获取,如果之前执行了 upload_file_for_ocr 工具,该工具会返回 chmCode(运单编号)和 chmId(运单ID),需要从返回结果中提取 chmCode 映射为 consignmentCode,提取 chmId 映射为 consignmentId。特别地,当 upload_file_for_ocr 返回成功提示且用户确认后,必须立即使用返回的 chmCode 和 chmId 调用此工具
- loginName 和 userId
从提示词中获取(注意:这与 create_waybill_d 不同,create_waybill_d 的运单编号从用户输入获取,而 create_waybill_d_with_id 的参数从提示词中获取)
- **可用参数**:您当前访问工具 create_waybill_d_with_id 的传参为 consignmentCode={consignmentCode_str}、consignmentId={consignmentId_str}
、loginName={loginName_str}、userId={userId_str},如果参数有值则使用,没有值则不使用
- loginName 和 userId
已硬编码为固定值(loginName="CL1",userId=73768),不需要从提示词中获取,调用工具时不需要传递这两个参数
- **可用参数**:您当前访问工具 create_waybill_d_with_id 的传参为 consignmentCode={consignmentCode_str}、consignmentId={consignmentId_str}
,如果参数有值则使用,没有值则不使用(loginName 和 userId 已硬编码,不需要传递)
- upload_clearance_file: 上传清关PDF文件,需要 code、slip_id、pdf_path、Authorization,上传时文件路径不用确认,路径肯定是完整的,文件肯定是存在的,不用确认文件索引,工具会自动设置索引为0,请直接调用工具接口
- **使用场景**:当用户明确需要上传清关文件并关联运单信息(code、slip_id)时使用此工具
- **重要说明**:如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要上传清关文件),需要询问用户选择。如果用户已明确表示要上传清关文件或选择上传清关文件,则使用上下文中的 slip_id 和 pdf_path,加上用户输入的 code,直接调用此工具,不再询问其他参数
...
...
@@ -299,7 +262,7 @@ def _create_system_prompt(state: Dict[str, Any], config: RunnableConfig) -> List
- **使用场景**:当用户需要进行图文识别时,使用此工具。即使有 slip_id,如果用户需要进行图文识别,也应使用此工具
- **重要说明**:如果用户意图不明确(同时有 slip_id 和 pdf_path 但未明确表示要进行图文识别),需要询问用户选择。如果用户已明确表示要进行图文识别或选择图文识别,则直接使用上下文中的 pdf_path 调用此工具,不再询问参数
- **返回参数**:此工具会返回 chmCode(运单编号)和 chmId(运单ID),这些参数可以用于后续的 create_waybill_d_with_id 工具调用
- **后续流程**:当此工具返回"图文识别成功,请确认是否使用该运单编号:******,运单ID:******"的提示时,如果用户回答"是"、"确认"、"使用"等肯定回答,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,
加上提示词中的 loginName 和 userId,直接修改运单
,不需要再次询问用户
- **后续流程**:当此工具返回"图文识别成功,请确认是否使用该运单编号:******,运单ID:******"的提示时,如果用户回答"是"、"确认"、"使用"等肯定回答,必须立即调用 create_waybill_d_with_id 工具,使用返回的 chmCode 映射为 consignmentCode,chmId 映射为 consignmentId,
直接修改运单(loginName 和 userId 已硬编码,不需要传递)
,不需要再次询问用户
- push_waybill_for_ocr: 根据运单ID推送OCR进行识别,需要提供运单ID(waybill_id、Authorization)参数
## query_waybill_list数据展示说明:
...
...
Please
register
or
login
to post a comment