Skip to content

Commit ec5c076

Browse files
committed
chore: add mcp_output_enable field to application and applicationversion models
1 parent 4a8cd95 commit ec5c076

File tree

12 files changed

+85
-25
lines changed

12 files changed

+85
-25
lines changed

apps/application/chat_pipeline/step/chat_step/i_chat_step.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class InstanceSerializer(serializers.Serializer):
8888
mcp_source = serializers.CharField(label="MCP Source", required=False, default="referencing")
8989
tool_enable = serializers.BooleanField(label="工具是否启用", required=False, default=False)
9090
tool_ids = serializers.JSONField(label="工具ID列表", required=False, default=list)
91+
mcp_output_enable = serializers.BooleanField(label="MCP输出是否启用", required=False, default=True)
9192

9293
def is_valid(self, *, raise_exception=False):
9394
super().is_valid(raise_exception=True)
@@ -114,6 +115,6 @@ def execute(self, message_list: List[BaseMessage],
114115
padding_problem_text: str = None, stream: bool = True, chat_user_id=None, chat_user_type=None,
115116
no_references_setting=None, model_params_setting=None, model_setting=None,
116117
mcp_enable=False, mcp_tool_ids=None, mcp_servers='', mcp_source="referencing",
117-
tool_enable=False, tool_ids=None,
118+
tool_enable=False, tool_ids=None, mcp_output_enable=True,
118119
**kwargs):
119120
pass

apps/application/chat_pipeline/step/chat_step/impl/base_chat_step.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ def execute(self, message_list: List[BaseMessage],
181181
mcp_source="referencing",
182182
tool_enable=False,
183183
tool_ids=None,
184+
mcp_output_enable=True,
184185
**kwargs):
185186
chat_model = get_model_instance_by_model_workspace_id(model_id, workspace_id,
186187
**model_params_setting) if model_id is not None else None
@@ -190,13 +191,13 @@ def execute(self, message_list: List[BaseMessage],
190191
manage, padding_problem_text, chat_user_id, chat_user_type,
191192
no_references_setting,
192193
model_setting,
193-
mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids)
194+
mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids, mcp_output_enable)
194195
else:
195196
return self.execute_block(message_list, chat_id, problem_text, post_response_handler, chat_model,
196197
paragraph_list,
197198
manage, padding_problem_text, chat_user_id, chat_user_type, no_references_setting,
198199
model_setting,
199-
mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids)
200+
mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids, mcp_output_enable)
200201

201202
def get_details(self, manage, **kwargs):
202203
# 删除临时生成的MCP代码文件
@@ -229,7 +230,7 @@ def reset_message_list(message_list: List[BaseMessage], answer_text):
229230
return result
230231

231232
def _handle_mcp_request(self, mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_ids, tool_ids,
232-
chat_model, message_list):
233+
mcp_output_enable, chat_model, message_list):
233234
if not mcp_enable and not tool_enable:
234235
return None
235236

@@ -269,7 +270,7 @@ def _handle_mcp_request(self, mcp_enable, tool_enable, mcp_source, mcp_servers,
269270
mcp_servers_config[str(tool.id)] = tool_config
270271

271272
if len(mcp_servers_config) > 0:
272-
return mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config))
273+
return mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable)
273274

274275
return None
275276

@@ -284,7 +285,8 @@ def get_stream_result(self, message_list: List[BaseMessage],
284285
mcp_servers='',
285286
mcp_source="referencing",
286287
tool_enable=False,
287-
tool_ids=None):
288+
tool_ids=None,
289+
mcp_output_enable=True):
288290
if paragraph_list is None:
289291
paragraph_list = []
290292
directly_return_chunk_list = [AIMessageChunk(content=paragraph.content)
@@ -302,7 +304,7 @@ def get_stream_result(self, message_list: List[BaseMessage],
302304
else:
303305
# 处理 MCP 请求
304306
mcp_result = self._handle_mcp_request(
305-
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_ids, tool_ids, chat_model, message_list,
307+
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_ids, tool_ids, mcp_output_enable, chat_model, message_list,
306308
)
307309
if mcp_result:
308310
return mcp_result, True
@@ -324,9 +326,11 @@ def execute_stream(self, message_list: List[BaseMessage],
324326
mcp_servers='',
325327
mcp_source="referencing",
326328
tool_enable=False,
327-
tool_ids=None):
329+
tool_ids=None,
330+
mcp_output_enable=True):
328331
chat_result, is_ai_chat = self.get_stream_result(message_list, chat_model, paragraph_list,
329-
no_references_setting, problem_text, mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids)
332+
no_references_setting, problem_text, mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids,
333+
mcp_output_enable)
330334
chat_record_id = uuid.uuid7()
331335
r = StreamingHttpResponse(
332336
streaming_content=event_content(chat_result, chat_id, chat_record_id, paragraph_list,
@@ -348,7 +352,9 @@ def get_block_result(self, message_list: List[BaseMessage],
348352
mcp_servers='',
349353
mcp_source="referencing",
350354
tool_enable=False,
351-
tool_ids=None):
355+
tool_ids=None,
356+
mcp_output_enable=True
357+
):
352358
if paragraph_list is None:
353359
paragraph_list = []
354360
directly_return_chunk_list = [AIMessageChunk(content=paragraph.content)
@@ -365,7 +371,8 @@ def get_block_result(self, message_list: List[BaseMessage],
365371
else:
366372
# 处理 MCP 请求
367373
mcp_result = self._handle_mcp_request(
368-
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_ids, tool_ids, chat_model, message_list,
374+
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_ids, tool_ids, mcp_output_enable,
375+
chat_model, message_list,
369376
)
370377
if mcp_result:
371378
return mcp_result, True
@@ -386,7 +393,8 @@ def execute_block(self, message_list: List[BaseMessage],
386393
mcp_servers='',
387394
mcp_source="referencing",
388395
tool_enable=False,
389-
tool_ids=None):
396+
tool_ids=None,
397+
mcp_output_enable=True):
390398
reasoning_content_enable = model_setting.get('reasoning_content_enable', False)
391399
reasoning_content_start = model_setting.get('reasoning_content_start', '<think>')
392400
reasoning_content_end = model_setting.get('reasoning_content_end', '</think>')
@@ -396,7 +404,7 @@ def execute_block(self, message_list: List[BaseMessage],
396404
# 调用模型
397405
try:
398406
chat_result, is_ai_chat = self.get_block_result(message_list, chat_model, paragraph_list,
399-
no_references_setting, problem_text, mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids)
407+
no_references_setting, problem_text, mcp_enable, mcp_tool_ids, mcp_servers, mcp_source, tool_enable, tool_ids, mcp_output_enable)
400408
if is_ai_chat:
401409
request_token = chat_model.get_num_tokens_from_messages(message_list)
402410
response_token = chat_model.get_num_tokens(chat_result.content)

apps/application/flow/step_node/ai_chat_step_node/i_chat_node.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ChatNodeSerializer(serializers.Serializer):
4040
tool_enable = serializers.BooleanField(required=False, default=False, label=_("Whether to enable tools"))
4141
tool_ids = serializers.ListField(child=serializers.UUIDField(), required=False, allow_empty=True,
4242
label=_("Tool IDs"), )
43-
43+
mcp_output_enable = serializers.BooleanField(required=False, default=True, label=_("Whether to enable MCP output"))
4444

4545
class IChatNode(INode):
4646
type = 'ai-chat-node'
@@ -63,5 +63,6 @@ def execute(self, model_id, system, prompt, dialogue_number, history_chat_record
6363
mcp_source=None,
6464
tool_enable=False,
6565
tool_ids=None,
66+
mcp_output_enable=True,
6667
**kwargs) -> NodeResult:
6768
pass

apps/application/flow/step_node/ai_chat_step_node/impl/base_chat_node.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def execute(self, model_id, system, prompt, dialogue_number, history_chat_record
159159
mcp_source=None,
160160
tool_enable=False,
161161
tool_ids=None,
162+
mcp_output_enable=True,
162163
**kwargs) -> NodeResult:
163164
if dialogue_type is None:
164165
dialogue_type = 'WORKFLOW'
@@ -184,8 +185,8 @@ def execute(self, model_id, system, prompt, dialogue_number, history_chat_record
184185

185186
# 处理 MCP 请求
186187
mcp_result = self._handle_mcp_request(
187-
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids, tool_ids, chat_model, message_list,
188-
history_message, question
188+
mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids, tool_ids, mcp_output_enable,
189+
chat_model, message_list, history_message, question
189190
)
190191
if mcp_result:
191192
return mcp_result
@@ -202,7 +203,7 @@ def execute(self, model_id, system, prompt, dialogue_number, history_chat_record
202203
_write_context=write_context)
203204

204205
def _handle_mcp_request(self, mcp_enable, tool_enable, mcp_source, mcp_servers, mcp_tool_id, mcp_tool_ids, tool_ids,
205-
chat_model, message_list, history_message, question):
206+
mcp_output_enable, chat_model, message_list, history_message, question):
206207
if not mcp_enable and not tool_enable:
207208
return None
208209

@@ -244,7 +245,7 @@ def _handle_mcp_request(self, mcp_enable, tool_enable, mcp_source, mcp_servers,
244245
mcp_servers_config[str(tool.id)] = tool_config
245246

246247
if len(mcp_servers_config) > 0:
247-
r = mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config))
248+
r = mcp_response_generator(chat_model, message_list, json.dumps(mcp_servers_config), mcp_output_enable)
248249
return NodeResult(
249250
{'result': r, 'chat_model': chat_model, 'message_list': message_list,
250251
'history_message': history_message, 'question': question.content}, {},

apps/application/flow/tools.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,24 +227,24 @@ def generate_tool_message_template(name, context):
227227
return tool_message_template % (name, tool_message_json_template % (context))
228228

229229

230-
async def _yield_mcp_response(chat_model, message_list, mcp_servers):
230+
async def _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable=True):
231231
client = MultiServerMCPClient(json.loads(mcp_servers))
232232
tools = await client.get_tools()
233233
agent = create_react_agent(chat_model, tools)
234234
response = agent.astream({"messages": message_list}, stream_mode='messages')
235235
async for chunk in response:
236-
if isinstance(chunk[0], ToolMessage):
236+
if mcp_output_enable and isinstance(chunk[0], ToolMessage):
237237
content = generate_tool_message_template(chunk[0].name, chunk[0].content)
238238
chunk[0].content = content
239239
yield chunk[0]
240240
if isinstance(chunk[0], AIMessageChunk):
241241
yield chunk[0]
242242

243243

244-
def mcp_response_generator(chat_model, message_list, mcp_servers):
244+
def mcp_response_generator(chat_model, message_list, mcp_servers, mcp_output_enable=True):
245245
loop = asyncio.new_event_loop()
246246
try:
247-
async_gen = _yield_mcp_response(chat_model, message_list, mcp_servers)
247+
async_gen = _yield_mcp_response(chat_model, message_list, mcp_servers, mcp_output_enable)
248248
while True:
249249
try:
250250
chunk = loop.run_until_complete(anext_async(async_gen))

apps/application/migrations/0002_application_mcp_enable_application_mcp_servers_and_more.py renamed to apps/application/migrations/0002_application_simple_mcp.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ class Migration(migrations.Migration):
4040
name='tool_ids',
4141
field=models.JSONField(default=list, verbose_name='工具ID列表'),
4242
),
43+
migrations.AddField(
44+
model_name='application',
45+
name='mcp_output_enable',
46+
field=models.BooleanField(default=True, verbose_name='MCP输出是否启用'),
47+
),
4348
migrations.AddField(
4449
model_name='applicationversion',
4550
name='mcp_enable',
@@ -70,4 +75,9 @@ class Migration(migrations.Migration):
7075
name='tool_ids',
7176
field=models.JSONField(default=list, verbose_name='工具ID列表'),
7277
),
78+
migrations.AddField(
79+
model_name='applicationversion',
80+
name='mcp_output_enable',
81+
field=models.BooleanField(default=True, verbose_name='MCP输出是否启用'),
82+
),
7383
]

apps/application/models/application.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class Application(AppModelMixin):
9999
mcp_source = models.CharField(verbose_name="MCP Source", max_length=20, default="referencing")
100100
tool_enable = models.BooleanField(verbose_name="工具是否启用", default=False)
101101
tool_ids = models.JSONField(verbose_name="工具ID列表", default=list)
102+
mcp_output_enable = models.BooleanField(verbose_name="MCP输出是否启用", default=True)
102103

103104
@staticmethod
104105
def get_default_model_prompt():
@@ -170,6 +171,7 @@ class ApplicationVersion(AppModelMixin):
170171
mcp_source = models.CharField(verbose_name="MCP Source", max_length=20, default="referencing")
171172
tool_enable = models.BooleanField(verbose_name="工具是否启用", default=False)
172173
tool_ids = models.JSONField(verbose_name="工具ID列表", default=list)
174+
mcp_output_enable = models.BooleanField(verbose_name="MCP输出是否启用", default=True)
173175

174176
class Meta:
175177
db_table = "application_version"

apps/application/serializers/application.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ def reset_application_version(application_version, application):
707707
'tts_autoplay': 'tts_autoplay', 'stt_autosend': 'stt_autosend', 'file_upload_enable': 'file_upload_enable',
708708
'file_upload_setting': 'file_upload_setting',
709709
'mcp_enable': 'mcp_enable', 'mcp_tool_ids': 'mcp_tool_ids', 'mcp_servers': 'mcp_servers',
710-
'mcp_source': 'mcp_source', 'tool_enable': 'tool_enable', 'tool_ids': 'tool_ids',
710+
'mcp_source': 'mcp_source', 'tool_enable': 'tool_enable', 'tool_ids': 'tool_ids', 'mcp_output_enable': 'mcp_output_enable',
711711
'type': 'type'
712712
}
713713

@@ -831,7 +831,7 @@ def edit(self, instance: Dict, with_valid=True):
831831
'stt_model_id', 'tts_model_id', 'tts_model_enable', 'stt_model_enable', 'tts_type',
832832
'tts_autoplay', 'stt_autosend', 'file_upload_enable', 'file_upload_setting',
833833
'api_key_is_active', 'icon', 'work_flow', 'model_params_setting', 'tts_model_params_setting',
834-
'mcp_enable', 'mcp_tool_ids', 'mcp_servers', 'mcp_source', 'tool_enable', 'tool_ids',
834+
'mcp_enable', 'mcp_tool_ids', 'mcp_servers', 'mcp_source', 'tool_enable', 'tool_ids', 'mcp_output_enable',
835835
'problem_optimization_prompt', 'clean_time', 'folder_id']
836836
for update_key in update_keys:
837837
if update_key in instance and instance.get(update_key) is not None:

apps/application/serializers/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ def to_base_pipeline_manage_params(self):
161161
'mcp_source': self.application.mcp_source,
162162
'tool_enable': self.application.tool_enable,
163163
'tool_ids': self.application.tool_ids,
164+
'mcp_output_enable': self.application.mcp_output_enable,
164165
}
165166

166167
def to_pipeline_manage_params(self, problem_text: str, post_response_handler: PostResponseHandler,

ui/src/api/type/application.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ interface ApplicationFormType {
3232
mcp_source?: string
3333
tool_enable?: boolean
3434
tool_ids?: string[]
35+
mcp_output_enable?: boolean
3536
}
3637
interface Chunk {
3738
real_node_id: string

0 commit comments

Comments
 (0)