union-app-chat-stream 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app/.env CHANGED
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.47.214.188:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.47.214.188:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=https://10.47.214.188:8443/api/getjiraData
8
+ GET_BIGDATA_URL=http://172.31.3.134:8080/vmock/ai/fullLinkData
9
+ GET_UNION_BASE_URL=http://127.0.0.1:8089/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=TRUE
19
+ LOG_DIR=/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=dev
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=https://open.bigmodel.cn/api/paas/v4/
29
+ LLM_KEY=f024b21a682248999b42f696a42dfaad.PIySxpJN8xM1evpZ
30
+ LLM_MODEL=GLM-4.7-Flash
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
package/app/.env.dev CHANGED
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.47.214.188:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.47.214.188:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=http://172.31.3.134:8080/vmock/jira-data
8
+ GET_BIGDATA_URL=http://172.31.3.134:8080/vmock/ai/fullLinkData
9
+ GET_UNION_BASE_URL=http://127.0.0.1:8089/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=TRUE
19
+ LOG_DIR=/Users/simon/code/union-py-app/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=dev
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=https://open.bigmodel.cn/api/paas/v4/
29
+ LLM_KEY=f024b21a682248999b42f696a42dfaad.PIySxpJN8xM1evpZ
30
+ LLM_MODEL=GLM-4.7-Flash
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.16.100.236:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.16.100.236:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=https://10.16.100.236:8443/api/getjiraData
8
+ GET_BIGDATA_URL=https://10.16.100.236:8443/union-op/bigdata/query
9
+ GET_UNION_BASE_URL=https://10.16.100.236:8443/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=FALSE
19
+ LOG_DIR=/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=prod.bj11
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=<LLM_URL>
29
+ LLM_KEY=<LLM_KEY>
30
+ LLM_MODEL=glm-5
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.32.100.236:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.32.100.236:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=https://10.32.100.236:8443/api/getjiraData
8
+ GET_BIGDATA_URL=https://10.32.100.236:8443/union-op/bigdata/query
9
+ GET_UNION_BASE_URL=https://10.16.100.236:8443/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=FALSE
19
+ LOG_DIR=/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=prod.sh20
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=<LLM_URL>
29
+ LLM_KEY=<LLM_KEY>
30
+ LLM_MODEL=glm-5
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.80.100.236:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.80.100.236:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=https://10.80.100.236:8443/api/getjiraData
8
+ GET_BIGDATA_URL=https://10.80.100.236:8443/union-op/bigdata/query
9
+ GET_UNION_BASE_URL=https://10.16.100.236:8443/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=FALSE
19
+ LOG_DIR=/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=prod.sz31
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=<LLM_URL>
29
+ LLM_KEY=<LLM_KEY>
30
+ LLM_MODEL=glm-5
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
@@ -1,63 +1,63 @@
1
1
  # Flask and request authentication
2
- SECRET_KEY=__MASKED_FOR_NPM__
2
+ SECRET_KEY=<SECRET_KEY>
3
3
 
4
4
  # External API endpoints
5
- GET_USE_INFO_URL=__MASKED_FOR_NPM__
6
- GET_ORG_INFO_URL=__MASKED_FOR_NPM__
7
- GET_JIRA_INFO_URL=__MASKED_FOR_NPM__
8
- GET_BIGDATA_URL=__MASKED_FOR_NPM__
9
- GET_UNION_BASE_URL=__MASKED_FOR_NPM__
5
+ GET_USE_INFO_URL=https://10.47.214.188:8443/common/getUserInfo
6
+ GET_ORG_INFO_URL=https://10.47.214.188:8443/api/getOrgInfoByOrgCode
7
+ GET_JIRA_INFO_URL=http://172.31.3.134:8080/vmock/jira-data
8
+ GET_BIGDATA_URL=http://172.31.3.134:8080/vmock/ai/fullLinkData
9
+ GET_UNION_BASE_URL=http://172.31.3.134:8080/
10
10
 
11
11
  # Legacy external API tokens
12
- GET_ORG_INFO_URL_TOKEN=__MASKED_FOR_NPM__
13
- GET_JIRA_INFO_URL_TOKEN=__MASKED_FOR_NPM__
12
+ GET_ORG_INFO_URL_TOKEN=<GET_ORG_INFO_URL_TOKEN>
13
+ GET_JIRA_INFO_URL_TOKEN=<GET_JIRA_INFO_URL_TOKEN>
14
14
 
15
15
  # Authorization and logging
16
- PERMISSIONS=__MASKED_FOR_NPM__
17
- LOG_LEVEL=__MASKED_FOR_NPM__
18
- CONSOLE_STDOUT=__MASKED_FOR_NPM__
19
- LOG_DIR=__MASKED_FOR_NPM__
16
+ PERMISSIONS=
17
+ LOG_LEVEL=INFO
18
+ CONSOLE_STDOUT=FALSE
19
+ LOG_DIR=/data/appLogs
20
20
 
21
21
  # Runtime environment and JWT
22
- FLASK_ENV=__MASKED_FOR_NPM__
23
- JWT_SECRET_KEY=__MASKED_FOR_NPM__
24
- JWT_EXPIRATION_SECOND=__MASKED_FOR_NPM__
25
- JWT_RENEW_SECOND=__MASKED_FOR_NPM__
22
+ FLASK_ENV=test.prod.bj12
23
+ JWT_SECRET_KEY=<JWT_SECRET_KEY>
24
+ JWT_EXPIRATION_SECOND=900
25
+ JWT_RENEW_SECOND=700
26
26
 
27
27
  # LLM provider
28
- LLM_URL=__MASKED_FOR_NPM__
29
- LLM_KEY=__MASKED_FOR_NPM__
30
- LLM_MODEL=__MASKED_FOR_NPM__
31
- LLM_MAX_TOKENS=__MASKED_FOR_NPM__
32
- LLM_TEMPERATURE=__MASKED_FOR_NPM__
33
- LLM_TOP_P=__MASKED_FOR_NPM__
28
+ LLM_URL=<LLM_URL>
29
+ LLM_KEY=<LLM_KEY>
30
+ LLM_MODEL=glm-5
31
+ LLM_MAX_TOKENS=4096
32
+ LLM_TEMPERATURE=0.7
33
+ LLM_TOP_P=0.9
34
34
 
35
35
  # Chat behavior
36
- SYSTEM_PROMPT=__MASKED_FOR_NPM__
36
+ SYSTEM_PROMPT=你是网络支付清算平台(网联平台)联合运维的智能客服助手,面向联合运维成员单位提供咨询与指引服务。
37
37
 
38
38
  # Business filter
39
- FILTER_ENABLED=__MASKED_FOR_NPM__
40
- FILTER_ALLOWED_KEYWORDS=__MASKED_FOR_NPM__
41
- FILTER_REJECTION_MESSAGE=__MASKED_FOR_NPM__
39
+ FILTER_ENABLED=false
40
+ FILTER_ALLOWED_KEYWORDS=网联,联合运维,运维,生产变更,变更,生产运行,运行,系统成功率,业务成功率,异常,故障,定级,关闭渠道,联合处置,大型单位,中型单位,小型单位,银行,支付,清算
41
+ FILTER_REJECTION_MESSAGE=抱歉,我是联合运维智能客服,只能回答与联合运维相关的问题,例如生产变更、生产运行、故障定级、周期评价、业务范围等。请重新描述您的问题。
42
42
 
43
43
  # Tool and conversation settings
44
- TOOLS_MAX_ROUNDS=__MASKED_FOR_NPM__
45
- CONVERSATION_MAX_HISTORY=__MASKED_FOR_NPM__
46
- CONVERSATION_TTL=__MASKED_FOR_NPM__
44
+ TOOLS_MAX_ROUNDS=5
45
+ CONVERSATION_MAX_HISTORY=20
46
+ CONVERSATION_TTL=3600
47
47
 
48
48
  # RAG settings
49
- RAG_ENABLED=__MASKED_FOR_NPM__
50
- RAG_KNOWLEDGE_DIR=__MASKED_FOR_NPM__
51
- RAG_PERSIST_DIR=__MASKED_FOR_NPM__
52
- RAG_COLLECTION=__MASKED_FOR_NPM__
53
- RAG_EMBEDDING_MODEL=__MASKED_FOR_NPM__
54
- RAG_EMBEDDING_MAX_CHARS=__MASKED_FOR_NPM__
55
- RAG_EMBEDDING_BATCH_SIZE=__MASKED_FOR_NPM__
56
- RAG_TOP_K=__MASKED_FOR_NPM__
57
- RAG_SEMANTIC_CANDIDATE_K=__MASKED_FOR_NPM__
58
- RAG_CONTEXT_K=__MASKED_FOR_NPM__
59
- RAG_EXACT_CONTEXT_K=__MASKED_FOR_NPM__
60
- RAG_EXACT_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
61
- RAG_PER_FILE_CONTEXT_K=__MASKED_FOR_NPM__
62
- RAG_CHUNK_SIZE=__MASKED_FOR_NPM__
63
- RAG_REBUILD_ON_STARTUP=__MASKED_FOR_NPM__
49
+ RAG_ENABLED=true
50
+ RAG_KNOWLEDGE_DIR=knowledge
51
+ RAG_PERSIST_DIR=.chroma
52
+ RAG_COLLECTION=ops_knowledge
53
+ RAG_EMBEDDING_MODEL=embedding-3
54
+ RAG_EMBEDDING_MAX_CHARS=6000
55
+ RAG_EMBEDDING_BATCH_SIZE=8
56
+ RAG_TOP_K=5
57
+ RAG_SEMANTIC_CANDIDATE_K=40
58
+ RAG_CONTEXT_K=8
59
+ RAG_EXACT_CONTEXT_K=3
60
+ RAG_EXACT_PER_FILE_CONTEXT_K=1
61
+ RAG_PER_FILE_CONTEXT_K=2
62
+ RAG_CHUNK_SIZE=1200
63
+ RAG_REBUILD_ON_STARTUP=false
@@ -18,6 +18,9 @@ def _preview(text: str, limit: int = 300) -> str:
18
18
  return str(text).replace("\n", " ")[:limit]
19
19
 
20
20
 
21
+ PUBLIC_TOOL_RESULT_FIELDS = ("tool_name", "display_name", "arguments", "status", "message")
22
+
23
+
21
24
  def _public_tool_result(tool_result: str) -> str:
22
25
  try:
23
26
  payload = json.loads(tool_result)
@@ -27,15 +30,15 @@ def _public_tool_result(tool_result: str) -> str:
27
30
  if not isinstance(payload, dict):
28
31
  payload = {}
29
32
 
30
- public_payload = {
31
- key: payload[key]
32
- for key in ("tool_name", "display_name", "arguments", "message")
33
- if key in payload
34
- }
33
+ public_payload = {key: payload[key] for key in PUBLIC_TOOL_RESULT_FIELDS if key in payload}
35
34
  public_payload.setdefault("message", "工具调用完成")
36
35
  return json.dumps(public_payload, ensure_ascii=False)
37
36
 
38
37
 
38
+
39
+
40
+
41
+
39
42
  def _time_context() -> str:
40
43
  now = datetime.now(timezone.utc).astimezone(timezone(timedelta(hours=8)))
41
44
  return (
@@ -153,14 +156,14 @@ class ChatService:
153
156
  def tool_result_event(tool_result: str) -> ChatResponse:
154
157
  return ChatResponse(conversationId=conversation_id, tool_result=_public_tool_result(tool_result))
155
158
 
156
- def heartbeat_event(tool_name: str, elapsed_seconds: float) -> ChatResponse:
159
+ def heartbeat_event(tool_name: str, elapsed_seconds: float, message: str = "") -> ChatResponse:
157
160
  return ChatResponse(
158
161
  conversationId=conversation_id,
159
162
  heartbeat={
160
163
  "type": "tool_call_running",
161
164
  "tool": tool_name,
162
165
  "elapsedSeconds": round(elapsed_seconds, 3),
163
- "message": f"工具 {tool_name} 仍在执行,请继续等待。",
166
+ "message": message or f"工具 {tool_name} 仍在执行,请继续等待。",
164
167
  },
165
168
  )
166
169
 
@@ -238,16 +241,23 @@ class ChatService:
238
241
  logger.info(f"执行工具调用。conversation_id={conversation_id} tool={name} args={_preview(args, 200)}")
239
242
  yield tool_call_event(f"\n[调用工具: {name}({args})]\n")
240
243
 
244
+ retry_notice = {"message": ""}
245
+
246
+ def retry_callback(message: str) -> None:
247
+ retry_notice["message"] = message
248
+
241
249
  tool_context = ToolContext(
242
250
  union_service=self._union_service,
243
251
  rag_service=self._rag,
244
252
  jsessionid=jsessionid,
253
+ retry_callback=retry_callback,
245
254
  )
246
255
  result = yield from self._call_function_with_heartbeats(
247
256
  name,
248
257
  args,
249
258
  tool_context,
250
259
  heartbeat_event,
260
+ retry_notice,
251
261
  )
252
262
  logger.info(f"工具调用完成。conversation_id={conversation_id} tool={name} result_preview={_preview(result, 300)}")
253
263
  yield tool_result_event(result)
@@ -288,6 +298,7 @@ class ChatService:
288
298
  args: str,
289
299
  tool_context: ToolContext,
290
300
  heartbeat_event,
301
+ retry_notice,
291
302
  ) -> Generator[ChatResponse, None, str]:
292
303
  interval = self._tool_heartbeat_interval
293
304
  if interval <= 0:
@@ -301,7 +312,7 @@ class ChatService:
301
312
  try:
302
313
  return future.result(timeout=interval)
303
314
  except FutureTimeoutError:
304
- yield heartbeat_event(name, time.monotonic() - started_at)
315
+ yield heartbeat_event(name, time.monotonic() - started_at, retry_notice.get("message", ""))
305
316
  finally:
306
317
  executor.shutdown(wait=False, cancel_futures=True)
307
318
 
@@ -71,6 +71,8 @@ class UnionService:
71
71
  jsessionid: str,
72
72
  description: str = "查询联合运维数据",
73
73
  path: str = "",
74
+ timeout: Optional[int] = None,
75
+ retry_callback=None,
74
76
  ) -> Tuple[Optional[Any], str]:
75
77
  """按 tool definition 中配置的 path 和 JSON 参数查询联合运维 API。"""
76
78
  url = self._build_union_url(self._union_base_url, path)
@@ -80,12 +82,22 @@ class UnionService:
80
82
  return None, f"{description}失败: 登录态ID为空"
81
83
 
82
84
  try:
83
- response = common_utils.call_https_api(
84
- url=url,
85
- headers=self._get_union_headers(jsessionid),
86
- json_data=payload,
87
- max_retries=self.API_MAX_RETRIES,
88
- )
85
+ kwargs = {
86
+ "url": url,
87
+ "headers": self._get_union_headers(jsessionid),
88
+ "json_data": payload,
89
+ "max_retries": self.API_MAX_RETRIES,
90
+ }
91
+ if timeout is not None:
92
+ kwargs["timeout"] = timeout
93
+ if retry_callback:
94
+ kwargs["retry_callback"] = retry_callback
95
+ response = common_utils.call_https_api(**kwargs)
96
+ if not response.get("success", True):
97
+ raise RuntimeError(response.get("error_msg", "请求失败"))
98
+ status_code = response.get("status_code")
99
+ if status_code and status_code >= 400:
100
+ raise RuntimeError(f"请求失败:HTTP {status_code}")
89
101
  logger.info(f"{description}成功")
90
102
  return self._extract_response_data(response), "success"
91
103
  except Exception as e:
@@ -1,5 +1,5 @@
1
1
  import requests
2
- from typing import Optional, Dict, Any
2
+ from typing import Optional, Dict, Any, Callable
3
3
  from requests.exceptions import RequestException, Timeout, ConnectionError
4
4
  import json
5
5
  import time
@@ -30,12 +30,13 @@ def call_https_api(
30
30
  data: Optional[Dict[str, Any]] = None,
31
31
  json_data: Optional[Dict[str, Any]] = None,
32
32
  headers: Optional[Dict[str, str]] = None,
33
- timeout: int = 30,
33
+ timeout: int = 10,
34
34
  verify_ssl: bool = False,
35
35
  auth: Optional[tuple] = None,
36
36
  proxies: Optional[Dict[str, Any]] = None,
37
37
  max_retries: int = 0,
38
- retry_delay: float = 1.0
38
+ retry_delay: float = 1.0,
39
+ retry_callback: Optional[Callable[[str], None]] = None,
39
40
 
40
41
  ) -> Dict[str, Any]:
41
42
  default_headers = {
@@ -81,14 +82,20 @@ def call_https_api(
81
82
  logger.info(f"请求成功:{response.status_code},返回值:{response.text}")
82
83
  return result
83
84
  except ConnectionError as e:
84
- logger.error(f"连接失败:{e}")
85
+ error_msg = f"连接失败:{e}"
86
+ logger.error(error_msg)
85
87
  except Timeout as e:
86
- logger.error(f"请求超时:{e}")
88
+ error_msg = f"请求超时:{e}"
89
+ logger.error(error_msg)
87
90
  except RequestException as e:
88
- logger.error(f"请求异常:{e}")
91
+ error_msg = f"请求异常:{e}"
92
+ logger.error(error_msg)
89
93
  except Exception as e:
90
- logger.error(f"未知错误:{e}")
94
+ error_msg = f"未知错误:{e}"
95
+ logger.error(error_msg)
91
96
  if attempt < max_retries:
97
+ if retry_callback:
98
+ retry_callback(f"{error_msg},正在重试(第{attempt + 2}次)")
92
99
  time.sleep(retry_delay)
93
100
  else:
94
101
  break
@@ -21,6 +21,7 @@ class ToolContext:
21
21
  union_service: Optional[Any] = None
22
22
  rag_service: Optional[Any] = None
23
23
  jsessionid: str = ""
24
+ retry_callback: Optional[Callable[[str], None]] = None
24
25
 
25
26
 
26
27
  ToolFunction = Callable[[Dict[str, Any], ToolContext], Dict[str, Any]]
@@ -213,7 +214,12 @@ def _run_backend_tool(
213
214
  if context.union_service is None:
214
215
  raise ValueError("Union服务未初始化")
215
216
  method = getattr(context.union_service, method_name)
216
- data, message = method(payload, context.jsessionid, description=description, path=path)
217
+ kwargs = {"description": description, "path": path}
218
+ if isinstance(backend.get("timeout"), int):
219
+ kwargs["timeout"] = backend["timeout"]
220
+ if context.retry_callback:
221
+ kwargs["retry_callback"] = context.retry_callback
222
+ data, message = method(payload, context.jsessionid, **kwargs)
217
223
  elif service_name == "rag_service":
218
224
  if context.rag_service is None:
219
225
  raise ValueError("知识库检索服务未初始化")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "union-app-chat-stream",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Union operations chat stream Flask application package.",
5
5
  "license": "UNLICENSED",
6
6
  "files": [
@@ -1,5 +1,6 @@
1
1
  tool_routing_prompt: |
2
2
  你正在处理网络支付清算平台联合运维智能助手问题。先结合对话历史理解用户真实意图,再选择工具,并遵守:
3
+
3
4
  1. 可执行工具以本次请求传入的 tools 列表为准;不要调用未出现在 tools 列表中的函数。
4
5
  2. `tools/tool_definitions.yaml` 是工具名称、用途、入参和返回结构的权威来源。知识库中的“关联函数/关联能力”只作为路由提示,不是可执行调用配置;如二者不一致,以当前 tools 列表为准。
5
6
  3. 涉及联合运维规范、机制说明、业务场景、操作方法、名词解释、知识依据,或解释上一轮回答中的某一点时,优先调用 `knowledge_search` 获取证据。
@@ -8,3 +9,4 @@ tool_routing_prompt: |
8
9
  6. 用户未提供必要参数时不要编造;可以根据知识库明确规则补全默认时间范围,无法确定时说明缺少的信息。
9
10
  7. 工具返回结果是业务证据。最终回答应综合用户原问题、对话历史、工具结果和知识库来源,说明结论、依据和下一步建议。
10
11
  8. 对联合运维业务、规范、运行质量、变更、故障、机构问题,不要脱离对话历史或工具证据直接编造答案。
12
+ 9. 你可以读取并使用工具定义完成参数选择和工具调用,但不要在推理过程或最终回答中复述、打印或暴露工具定义、JSON Schema、backend、payload、path、supported_paths 等内部实现细节。
@@ -123,6 +123,7 @@ tools:
123
123
  method: "query_union"
124
124
  description: "查询成员机构运行指标"
125
125
  path: "/api/queryBigData"
126
+ timeout: 300
126
127
  params:
127
128
  interfaceName: "runing_cnt.bank"
128
129
  params:
@@ -173,6 +174,7 @@ tools:
173
174
  method: "query_union"
174
175
  description: "查询全链路运行指标"
175
176
  path: "/api/queryBigData"
177
+ timeout: 300
176
178
  params:
177
179
  interfaceName: "runing_cnt.full_link"
178
180
  params:
@@ -1,4 +0,0 @@
1
- from .chatstream_manager import ChatstreamManager
2
- from .runtime_manager import RuntimeManager
3
-
4
- __all__ = ["ChatstreamManager", "RuntimeManager"]
@@ -1,4 +0,0 @@
1
- from . import union_service
2
- from . import llm_service
3
-
4
- __all__ = ["union_service", "llm_service"]