markdown-flow 0.2.19__py3-none-any.whl → 0.2.31__py3-none-any.whl
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.
- markdown_flow/__init__.py +4 -4
- markdown_flow/constants.py +245 -124
- markdown_flow/core.py +701 -212
- markdown_flow/llm.py +4 -3
- markdown_flow/models.py +1 -17
- markdown_flow/parser/__init__.py +38 -0
- markdown_flow/parser/code_fence_utils.py +190 -0
- markdown_flow/parser/interaction.py +354 -0
- markdown_flow/parser/json_parser.py +50 -0
- markdown_flow/parser/output.py +215 -0
- markdown_flow/parser/preprocessor.py +151 -0
- markdown_flow/parser/validation.py +96 -0
- markdown_flow/parser/variable.py +95 -0
- markdown_flow/providers/__init__.py +16 -0
- markdown_flow/providers/config.py +46 -0
- markdown_flow/providers/openai.py +369 -0
- markdown_flow/utils.py +43 -43
- {markdown_flow-0.2.19.dist-info → markdown_flow-0.2.31.dist-info}/METADATA +45 -52
- markdown_flow-0.2.31.dist-info/RECORD +24 -0
- markdown_flow-0.2.19.dist-info/RECORD +0 -13
- {markdown_flow-0.2.19.dist-info → markdown_flow-0.2.31.dist-info}/WHEEL +0 -0
- {markdown_flow-0.2.19.dist-info → markdown_flow-0.2.31.dist-info}/licenses/LICENSE +0 -0
- {markdown_flow-0.2.19.dist-info → markdown_flow-0.2.31.dist-info}/top_level.txt +0 -0
markdown_flow/__init__.py
CHANGED
|
@@ -9,7 +9,7 @@ Core Features:
|
|
|
9
9
|
- Extract variable placeholders ({{variable}} and %{{variable}} formats)
|
|
10
10
|
- Build LLM-ready prompts and message formats
|
|
11
11
|
- Handle user interaction validation and input processing
|
|
12
|
-
- Support multiple processing modes:
|
|
12
|
+
- Support multiple processing modes: COMPLETE, STREAM
|
|
13
13
|
|
|
14
14
|
Supported Interaction Types:
|
|
15
15
|
- TEXT_ONLY: ?[%{{var}}...question] - Text input only
|
|
@@ -35,7 +35,6 @@ Basic Usage:
|
|
|
35
35
|
result = mf.process(0, variables={'name': 'John'}, mode=ProcessMode.COMPLETE)
|
|
36
36
|
|
|
37
37
|
# Different processing modes
|
|
38
|
-
prompt_result = mf.process(0, mode=ProcessMode.PROMPT_ONLY)
|
|
39
38
|
complete_result = mf.process(0, mode=ProcessMode.COMPLETE)
|
|
40
39
|
stream_result = mf.process(0, mode=ProcessMode.STREAM)
|
|
41
40
|
|
|
@@ -53,7 +52,7 @@ Import Guide:
|
|
|
53
52
|
from .core import MarkdownFlow
|
|
54
53
|
from .enums import BlockType, InputType
|
|
55
54
|
from .llm import LLMProvider, LLMResult, ProcessMode
|
|
56
|
-
from .
|
|
55
|
+
from .parser import (
|
|
57
56
|
InteractionParser,
|
|
58
57
|
InteractionType,
|
|
59
58
|
extract_interaction_question,
|
|
@@ -83,4 +82,5 @@ __all__ = [
|
|
|
83
82
|
"replace_variables_in_text",
|
|
84
83
|
]
|
|
85
84
|
|
|
86
|
-
__version__ = "0.2.
|
|
85
|
+
__version__ = "0.2.31"
|
|
86
|
+
# __version__ = "0.2.30-alpha-1"
|
markdown_flow/constants.py
CHANGED
|
@@ -26,12 +26,6 @@ COMPILED_LAYER3_BUTTON_VALUE_REGEX = re.compile(r"^(.+)//(.+)$") # Layer 3: Par
|
|
|
26
26
|
COMPILED_BRACE_VARIABLE_REGEX = re.compile(
|
|
27
27
|
r"(?<!%)\{\{([^}]+)\}\}" # Match {{variable}} format for replaceable variables
|
|
28
28
|
)
|
|
29
|
-
COMPILED_INTERACTION_CONTENT_RECONSTRUCT_REGEX = re.compile(
|
|
30
|
-
r"(\?\[[^]]*\.\.\.)([^]]*\])" # Reconstruct interaction content: prefix + question + suffix
|
|
31
|
-
)
|
|
32
|
-
COMPILED_BRACKETS_CLEANUP_REGEX = re.compile(r"[\[\]()]")
|
|
33
|
-
COMPILED_VARIABLE_REFERENCE_CLEANUP_REGEX = re.compile(r"%\{\{[^}]*\}\}")
|
|
34
|
-
COMPILED_WHITESPACE_CLEANUP_REGEX = re.compile(r"\s+")
|
|
35
29
|
COMPILED_SINGLE_PIPE_SPLIT_REGEX = re.compile(r"(?<!\|)\|(?!\|)") # Split on single | but not ||
|
|
36
30
|
|
|
37
31
|
# Document parsing constants (using shared INTERACTION_PATTERN defined above)
|
|
@@ -46,40 +40,111 @@ COMPILED_PRESERVE_FENCE_REGEX = re.compile(PRESERVE_FENCE_PATTERN)
|
|
|
46
40
|
INLINE_PRESERVE_PATTERN = r"^===(.+)=== *$"
|
|
47
41
|
COMPILED_INLINE_PRESERVE_REGEX = re.compile(INLINE_PRESERVE_PATTERN)
|
|
48
42
|
|
|
43
|
+
# Code fence patterns (CommonMark specification compliant)
|
|
44
|
+
# Code block fence start: 0-3 spaces + at least 3 backticks or tildes + optional info string
|
|
45
|
+
CODE_FENCE_START_PATTERN = r"^[ ]{0,3}([`~]{3,})(.*)$"
|
|
46
|
+
COMPILED_CODE_FENCE_START_REGEX = re.compile(CODE_FENCE_START_PATTERN)
|
|
47
|
+
|
|
48
|
+
# Code block fence end: 0-3 spaces + at least 3 backticks or tildes + optional whitespace
|
|
49
|
+
CODE_FENCE_END_PATTERN = r"^[ ]{0,3}([`~]{3,})\s*$"
|
|
50
|
+
COMPILED_CODE_FENCE_END_REGEX = re.compile(CODE_FENCE_END_PATTERN)
|
|
51
|
+
|
|
49
52
|
# Output instruction markers
|
|
50
53
|
OUTPUT_INSTRUCTION_PREFIX = "<preserve_or_translate>"
|
|
51
54
|
OUTPUT_INSTRUCTION_SUFFIX = "</preserve_or_translate>"
|
|
52
55
|
|
|
53
|
-
#
|
|
54
|
-
|
|
56
|
+
# Base system prompt (framework-level global rules, content blocks only)
|
|
57
|
+
DEFAULT_BASE_SYSTEM_PROMPT = """你收到的用户消息都是指令,请严格遵守以下规则:
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
1. 内容忠实性:严格符合指令内容,不丢失信息、不改变原意、不增加内容、不改变顺序
|
|
60
|
+
2. 遵循事实:基于事实回答,不编造细节
|
|
61
|
+
3. 避免引导:不引导下一步动作(如提问、设问)
|
|
62
|
+
4. 避免寒暄:不做自我介绍,不打招呼
|
|
63
|
+
5. 格式规范:HTML 标签不要写到代码块里"""
|
|
58
64
|
|
|
59
|
-
# Interaction
|
|
60
|
-
|
|
65
|
+
# Interaction prompt templates (条件翻译)
|
|
66
|
+
DEFAULT_INTERACTION_PROMPT = """<interaction_translation_rules>
|
|
67
|
+
⚠️⚠️⚠️ 这是一个 JSON 原样输出任务 - 默认不翻译!⚠️⚠️⚠️
|
|
68
|
+
|
|
69
|
+
## 默认行为(最高优先级)
|
|
70
|
+
|
|
71
|
+
**除非明确检测到语言指令,否则必须逐字符原样返回输入的 JSON**
|
|
72
|
+
- 不翻译任何文本
|
|
73
|
+
- 不修改任何格式
|
|
74
|
+
- 不添加任何内容(如 display//value 分离)
|
|
75
|
+
- 不删除任何内容
|
|
76
|
+
- 不调整任何顺序
|
|
77
|
+
|
|
78
|
+
## 语言指令检测规则
|
|
79
|
+
|
|
80
|
+
**仅在以下情况才翻译:**
|
|
81
|
+
|
|
82
|
+
1. **检测范围**:仅在 <document_context> 标签内检测
|
|
83
|
+
2. **必须包含明确的语言转换关键词**:
|
|
84
|
+
- 中文:"使用英语"、"用英文"、"英语输出"、"翻译成英语"、"Translate to English"
|
|
85
|
+
- 英文:"use English"、"in English"、"respond in English"、"translate to"
|
|
86
|
+
- 其他语言:类似的明确转换指令
|
|
87
|
+
3. **不算语言指令的情况**:
|
|
88
|
+
- ❌ 风格要求:"用emoji"、"讲故事"、"友好"、"简洁"
|
|
89
|
+
- ❌ 任务描述:"内容营销"、"吸引用户"、"引人入胜"
|
|
90
|
+
- ❌ 输出要求:"内容简洁"、"使用吸引人的语言"
|
|
91
|
+
|
|
92
|
+
## 处理逻辑
|
|
93
|
+
|
|
94
|
+
步骤1:在 <document_context> 中搜索语言转换关键词
|
|
95
|
+
步骤2:
|
|
96
|
+
- 如果找到 → 将 buttons 和 question 翻译成指定语言(仅翻译文本,不改格式)
|
|
97
|
+
- 如果未找到 → 逐字符原样返回输入的 JSON
|
|
98
|
+
|
|
99
|
+
## 输出格式要求
|
|
100
|
+
|
|
101
|
+
- **必须返回纯 JSON**,不要添加任何解释或 markdown 代码块
|
|
102
|
+
- **格式必须与输入完全一致**,包括空格、标点、引号
|
|
103
|
+
|
|
104
|
+
## 示例
|
|
105
|
+
|
|
106
|
+
### 示例 1:无语言指令(默认情况)
|
|
107
|
+
|
|
108
|
+
输入:{"buttons": ["产品经理", "开发者", "大学生"], "question": "其他身份"}
|
|
109
|
+
|
|
110
|
+
<document_context>
|
|
111
|
+
你是一个内容营销,擅长结合用户特点,给到引人入胜的内容。
|
|
112
|
+
任务说明:认真理解给定的内容,站在用户角度...
|
|
113
|
+
输出要求:内容简洁有力,使用吸引用户的语言...
|
|
114
|
+
</document_context>
|
|
61
115
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
核心要求:
|
|
65
|
-
1. **绝对禁止改变问题的含义和方向** - 这是最重要的原则
|
|
66
|
-
2. 只能改变表达方式,不能改变问题的核心内容
|
|
67
|
-
3. 必须保持问题的主体和客体关系不变
|
|
68
|
-
4. 只返回改写后的问题文本,不要包含任何其他内容
|
|
69
|
-
5. 保持专业友好的语气,禁止可爱化表达
|
|
116
|
+
✅ 正确输出:{"buttons": ["产品经理", "开发者", "大学生"], "question": "其他身份"}
|
|
117
|
+
❌ 错误输出:{"buttons": ["Product Manager//产品经理", ...], ...} ← 不要添加翻译!
|
|
70
118
|
|
|
71
|
-
|
|
72
|
-
✅ 正确改写(保持含义):
|
|
73
|
-
- "希望我怎么称呼你?" → "请问我应该如何称呼您?"
|
|
74
|
-
- "请输入您的姓名" → "请告诉我您的姓名"
|
|
75
|
-
- "你的年龄是多少?" → "请问您今年多大了?"
|
|
119
|
+
### 示例 2:有明确语言指令
|
|
76
120
|
|
|
77
|
-
|
|
78
|
-
- "希望我怎么称呼你?" → "你想叫我什么名字?" (方向颠倒)
|
|
79
|
-
- "请输入您的姓名" → "我叫什么好呢?" (主客体颠倒)
|
|
80
|
-
- "你喜欢什么?" → "我应该喜欢什么?" (完全改变意思)
|
|
121
|
+
输入:{"buttons": ["苹果", "香蕉"], "question": "其他水果"}
|
|
81
122
|
|
|
82
|
-
|
|
123
|
+
<document_context>
|
|
124
|
+
请使用英语输出所有内容。
|
|
125
|
+
</document_context>
|
|
126
|
+
|
|
127
|
+
✅ 正确输出:{"buttons": ["Apple", "Banana"], "question": "Other fruit"}
|
|
128
|
+
|
|
129
|
+
### 示例 3:仅有风格指令(不算语言指令)
|
|
130
|
+
|
|
131
|
+
输入:{"buttons": ["选项A", "选项B"], "question": "其他"}
|
|
132
|
+
|
|
133
|
+
<document_context>
|
|
134
|
+
请用emoji和故事化的方式呈现内容。
|
|
135
|
+
</document_context>
|
|
136
|
+
|
|
137
|
+
✅ 正确输出:{"buttons": ["选项A", "选项B"], "question": "其他"} ← 保持原样!
|
|
138
|
+
|
|
139
|
+
⚠️⚠️⚠️ 最终强调 ⚠️⚠️⚠️
|
|
140
|
+
|
|
141
|
+
- 默认行为:原样输出,不做任何改动
|
|
142
|
+
- 只有在 <document_context> 中明确看到"使用XX语言"、"translate to"等关键词时才翻译
|
|
143
|
+
- 如有任何疑问,必须原样输出
|
|
144
|
+
</interaction_translation_rules>"""
|
|
145
|
+
|
|
146
|
+
# Interaction error prompt templates
|
|
147
|
+
DEFAULT_INTERACTION_ERROR_PROMPT = "请将以下错误信息改写得更加友好和个性化,帮助用户理解问题并给出建设性的引导:"
|
|
83
148
|
|
|
84
149
|
# Interaction error rendering instructions
|
|
85
150
|
INTERACTION_ERROR_RENDER_INSTRUCTIONS = """
|
|
@@ -91,111 +156,163 @@ VALIDATION_RESPONSE_ILLEGAL = "illegal"
|
|
|
91
156
|
|
|
92
157
|
# Output instruction processing
|
|
93
158
|
OUTPUT_INSTRUCTION_EXPLANATION = f"""<preserve_or_translate_instruction>
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
</
|
|
159
|
+
⚠️⚠️⚠️ 保留内容输出任务 - 默认原样输出!⚠️⚠️⚠️
|
|
160
|
+
|
|
161
|
+
## 默认行为(最高优先级)
|
|
162
|
+
|
|
163
|
+
**看到 {OUTPUT_INSTRUCTION_PREFIX}...{OUTPUT_INSTRUCTION_SUFFIX} 标记时,必须将标记内的内容输出到回复中(保持原位置)**
|
|
164
|
+
- 默认:逐字符原样输出,不做任何改动
|
|
165
|
+
- 绝对不要输出 {OUTPUT_INSTRUCTION_PREFIX} 和 {OUTPUT_INSTRUCTION_SUFFIX} 标记本身
|
|
166
|
+
- 始终保留 emoji、格式、特殊字符
|
|
167
|
+
|
|
168
|
+
## 语言指令检测规则
|
|
169
|
+
|
|
170
|
+
**仅在以下情况才翻译:**
|
|
171
|
+
|
|
172
|
+
1. **检测范围**:仅在 <document_prompt> 标签内检测
|
|
173
|
+
2. **必须包含明确的语言转换关键词**:
|
|
174
|
+
- 中文:"使用英语"、"用韩文"、"英语输出"、"翻译成英语"、"Translate to English"
|
|
175
|
+
- 英文:"use English"、"in English"、"respond in English"、"translate to"
|
|
176
|
+
- 其他语言:类似的明确转换指令
|
|
177
|
+
3. **不算语言指令的情况**:
|
|
178
|
+
- ❌ 风格要求:"用emoji"、"讲故事"、"友好"、"简洁"
|
|
179
|
+
- ❌ 任务描述:"内容营销"、"吸引用户"、"引人入胜"
|
|
180
|
+
- ❌ 输出要求:"内容简洁"、"使用吸引人的语言"
|
|
181
|
+
|
|
182
|
+
## 处理逻辑
|
|
183
|
+
|
|
184
|
+
步骤1:在 <document_prompt> 中搜索语言转换关键词
|
|
185
|
+
步骤2:
|
|
186
|
+
- 如果找到 → 保持原意与风格,翻译成指定语言
|
|
187
|
+
- 如果未找到 → 逐字符原样输出,不做任何改动
|
|
188
|
+
|
|
189
|
+
## 输出位置规则
|
|
190
|
+
|
|
191
|
+
- 保持内容在原文档中的位置(开头/中间/结尾)
|
|
192
|
+
- 不要强制移到开头或其他位置
|
|
193
|
+
|
|
194
|
+
## 示例
|
|
195
|
+
|
|
196
|
+
### 示例 1:无语言指令(默认情况)
|
|
197
|
+
|
|
198
|
+
输入: {OUTPUT_INSTRUCTION_PREFIX}🌟 欢迎冒险!{OUTPUT_INSTRUCTION_SUFFIX}
|
|
199
|
+
|
|
200
|
+
询问小朋友的名字:
|
|
201
|
+
|
|
202
|
+
<document_prompt>
|
|
203
|
+
你是一个故事大王,擅长讲故事。
|
|
204
|
+
用一些语气词,多用emoji。
|
|
205
|
+
</document_prompt>
|
|
206
|
+
|
|
207
|
+
✅ 正确输出: 🌟 欢迎冒险!
|
|
208
|
+
|
|
209
|
+
询问小朋友的名字:...(保留内容在开头,原样输出)
|
|
210
|
+
|
|
211
|
+
❌ 错误输出: 询问小朋友的名字:...(完全不输出保留内容 ← 绝对禁止!)
|
|
212
|
+
|
|
213
|
+
### 示例 2:有明确语言指令
|
|
214
|
+
|
|
215
|
+
输入: {OUTPUT_INSTRUCTION_PREFIX}🌟 欢迎冒险!{OUTPUT_INSTRUCTION_SUFFIX}
|
|
216
|
+
|
|
217
|
+
询问小朋友的名字:
|
|
218
|
+
|
|
219
|
+
<document_prompt>
|
|
220
|
+
请使用韩语输出所有内容。
|
|
221
|
+
</document_prompt>
|
|
222
|
+
|
|
223
|
+
✅ 正确输出: 🌟 모험에 오신 것을 환영합니다!
|
|
224
|
+
|
|
225
|
+
아이의 이름을 물어보세요:...(保留内容翻译为韩语)
|
|
226
|
+
|
|
227
|
+
### 示例 3:仅有风格指令(不算语言指令)
|
|
228
|
+
|
|
229
|
+
输入: {OUTPUT_INSTRUCTION_PREFIX}**重要提示**{OUTPUT_INSTRUCTION_SUFFIX}
|
|
230
|
+
|
|
231
|
+
后续内容...
|
|
232
|
+
|
|
233
|
+
<document_prompt>
|
|
234
|
+
请用emoji和故事化的方式呈现内容。
|
|
235
|
+
</document_prompt>
|
|
236
|
+
|
|
237
|
+
✅ 正确输出: **重要提示**
|
|
238
|
+
|
|
239
|
+
后续内容...(保持原样!)
|
|
240
|
+
|
|
241
|
+
### 示例 4:标记剥离错误
|
|
242
|
+
|
|
243
|
+
输入: {OUTPUT_INSTRUCTION_PREFIX}**Title**{OUTPUT_INSTRUCTION_SUFFIX}
|
|
244
|
+
|
|
245
|
+
❌ 绝对不要: {OUTPUT_INSTRUCTION_PREFIX}**Title**{OUTPUT_INSTRUCTION_SUFFIX}(包含了标记)
|
|
246
|
+
✅ 正确输出: **Title**(排除了标记)
|
|
247
|
+
|
|
248
|
+
⚠️⚠️⚠️ 最终强调 ⚠️⚠️⚠️
|
|
249
|
+
|
|
250
|
+
- 默认行为:原样输出保留内容,不做任何改动
|
|
251
|
+
- 只有在 <document_prompt> 中明确看到"使用XX语言"、"translate to"等关键词时才翻译
|
|
252
|
+
- 如有任何疑问,必须原样输出
|
|
253
|
+
- 此规则优先级最高,覆盖所有其他指令
|
|
157
254
|
</preserve_or_translate_instruction>
|
|
158
255
|
|
|
159
256
|
"""
|
|
160
257
|
|
|
161
|
-
#
|
|
162
|
-
|
|
163
|
-
从用户回答中提取相关信息,返回JSON格式结果:
|
|
164
|
-
- 合法:{{"result": "ok", "parse_vars": {{"{target_variable}": "提取的内容"}}}}
|
|
165
|
-
- 不合法:{{"result": "illegal", "reason": "原因"}}
|
|
258
|
+
# Validation task template (merged with system message)
|
|
259
|
+
VALIDATION_TASK_TEMPLATE = """你是字符串验证程序,不是对话助手。
|
|
166
260
|
|
|
167
|
-
|
|
261
|
+
你的唯一任务:按后续规则检查输入,输出 JSON:
|
|
262
|
+
{{"result": "ok", "parse_vars": {{"{target_variable}": "用户输入"}}}} 或 {{"result": "illegal", "reason": "原因"}}
|
|
168
263
|
|
|
169
|
-
|
|
170
|
-
{sys_user_input}
|
|
264
|
+
严禁输出任何自然语言解释。
|
|
171
265
|
|
|
172
|
-
#
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
5. 确保提取的信息准确、完整且符合预期格式"""
|
|
266
|
+
# reason 语言
|
|
267
|
+
从 <document_context> 中仅提取语言要求(如"使用英文"、"use English")
|
|
268
|
+
- 如果有明确语言要求 → reason 使用该语言
|
|
269
|
+
- 否则 → reason 使用用户输入或问题的语言
|
|
270
|
+
"""
|
|
178
271
|
|
|
179
|
-
# Validation template
|
|
180
|
-
|
|
272
|
+
# Validation requirements template (极致宽松版本)
|
|
273
|
+
VALIDATION_REQUIREMENTS_TEMPLATE = """# 验证算法(按顺序执行)
|
|
181
274
|
|
|
182
|
-
|
|
183
|
-
可选按钮:{options}
|
|
184
|
-
用户输入:{user_input}
|
|
275
|
+
步骤 1:空值检查(字符串长度检查)
|
|
185
276
|
|
|
186
|
-
|
|
187
|
-
|
|
277
|
+
检查规则:input.trim().length == 0 ?
|
|
278
|
+
- YES → 空
|
|
279
|
+
- NO → 非空
|
|
188
280
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
281
|
+
⚠️ 只要去除首尾空格后字符数 > 0,就是非空
|
|
282
|
+
⚠️ 不判断语义!所有可见字符(a、1、@、中)都计入长度
|
|
283
|
+
⚠️ 示例:
|
|
284
|
+
- "" → 长度0 → 空
|
|
285
|
+
- " " → 长度0 → 空
|
|
286
|
+
- "aa" → 长度2 → 非空
|
|
287
|
+
- "@_@" → 长度3 → 非空
|
|
288
|
+
- "棒棒糖" → 长度3 → 非空
|
|
192
289
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
290
|
+
步骤 2:模糊回答检查
|
|
291
|
+
|
|
292
|
+
拒绝以下模糊回答:"不知道"、"不清楚"、"没有"、"不告诉你"
|
|
293
|
+
|
|
294
|
+
步骤 3:宗教政治检查
|
|
295
|
+
|
|
296
|
+
只拒绝明确的宗教政治立场表达(宗教教义、政治口号等)
|
|
297
|
+
地名,地区等(北京、上海等)、普通词汇都不算
|
|
298
|
+
|
|
299
|
+
步骤 4:输出结果(reason 语言跟随 <document_context> 中的语言要求)
|
|
300
|
+
|
|
301
|
+
伪代码逻辑:
|
|
302
|
+
if 空:
|
|
303
|
+
输出 {{"result": "illegal", "reason": "输入为空(或对应语言的翻译)"}}
|
|
304
|
+
else if 模糊回答:
|
|
305
|
+
输出 {{"result": "illegal", "reason": "请提供具体内容(或对应语言的翻译)"}}
|
|
306
|
+
else if 宗教政治:
|
|
307
|
+
输出 {{"result": "illegal", "reason": "包含敏感内容(或对应语言的翻译)"}}
|
|
308
|
+
else:
|
|
309
|
+
输出 {{"result": "ok", "parse_vars": {{"{target_variable}": "用户输入"}}}}
|
|
310
|
+
|
|
311
|
+
⚠️ 极致重要:
|
|
312
|
+
- len(去除空格后的输入) > 0 → 必须视为非空
|
|
313
|
+
- 符号、数字、品牌名、地名等都不是"空",也不是"无效"
|
|
314
|
+
- 默认通过,只在明确违规时才拒绝
|
|
315
|
+
"""
|
|
199
316
|
|
|
200
317
|
# ========== Error Message Constants ==========
|
|
201
318
|
|
|
@@ -204,7 +321,7 @@ OPTION_SELECTION_ERROR_TEMPLATE = "请选择以下选项之一:{options}"
|
|
|
204
321
|
INPUT_EMPTY_ERROR = "输入不能为空"
|
|
205
322
|
|
|
206
323
|
# System error messages
|
|
207
|
-
UNSUPPORTED_PROMPT_TYPE_ERROR = "不支持的提示词类型: {prompt_type}"
|
|
324
|
+
UNSUPPORTED_PROMPT_TYPE_ERROR = "不支持的提示词类型: {prompt_type} (支持的类型: base_system, document, interaction, interaction_error)"
|
|
208
325
|
BLOCK_INDEX_OUT_OF_RANGE_ERROR = "Block index {index} is out of range; total={total}"
|
|
209
326
|
LLM_PROVIDER_REQUIRED_ERROR = "需要设置 LLMProvider 才能调用 LLM"
|
|
210
327
|
INTERACTION_PARSE_ERROR = "交互格式解析失败: {error}"
|
|
@@ -220,7 +337,11 @@ VARIABLE_DEFAULT_VALUE = "UNKNOWN"
|
|
|
220
337
|
# Context generation constants
|
|
221
338
|
CONTEXT_QUESTION_MARKER = "# 相关问题"
|
|
222
339
|
CONTEXT_CONVERSATION_MARKER = "# 对话上下文"
|
|
340
|
+
CONTEXT_BUTTON_OPTIONS_MARKER = "## 预定义选项"
|
|
223
341
|
|
|
224
342
|
# Context generation templates
|
|
225
343
|
CONTEXT_QUESTION_TEMPLATE = f"{CONTEXT_QUESTION_MARKER}\n{{question}}"
|
|
226
344
|
CONTEXT_CONVERSATION_TEMPLATE = f"{CONTEXT_CONVERSATION_MARKER}\n{{content}}"
|
|
345
|
+
CONTEXT_BUTTON_OPTIONS_TEMPLATE = (
|
|
346
|
+
f"{CONTEXT_BUTTON_OPTIONS_MARKER}\n可选的预定义选项包括:{{button_options}}\n注意:用户如果选择了这些选项,都应该接受;如果输入了自定义内容,只要是对问题的合理回答即可接受。"
|
|
347
|
+
)
|