Skip to content

Commit 67a854d

Browse files
committed
add server name icon and desc
1 parent 77e524d commit 67a854d

File tree

11 files changed

+264
-223
lines changed

11 files changed

+264
-223
lines changed

src/main/presenter/llmProviderPresenter/baseProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export interface ChatMessageContent {
2525

2626
export abstract class BaseLLMProvider {
2727
// 最大工具调用次数限制
28-
protected static readonly MAX_TOOL_CALLS = 20
28+
protected static readonly MAX_TOOL_CALLS = 2
2929

3030
protected provider: LLM_PROVIDER
3131
protected models: MODEL_META[] = []

src/main/presenter/llmProviderPresenter/providers/anthropicProvider.ts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ ${messages.map((m) => `${m.role}: ${m.content}`).join('\n')}
261261
if (toolUse) {
262262
// 将Anthropic工具调用转换为MCP工具调用
263263
const mcpToolCall = await presenter.mcpPresenter.anthropicToolUseToMcpTool(
264-
mcpTools,
265264
{ name: toolUse.name, input: toolUse.input },
266265
this.provider.id
267266
)
@@ -621,7 +620,6 @@ ${context}
621620
console.log('执行工具调用:', toolCall)
622621

623622
const mcpToolCall = await presenter.mcpPresenter.anthropicToolUseToMcpTool(
624-
mcpTools,
625623
{ name: toolCall.name, input: toolCall.input },
626624
this.provider.id
627625
)
@@ -636,17 +634,23 @@ ${context}
636634
maximum_tool_calls_reached: true,
637635
tool_call_id: mcpToolCall.id,
638636
tool_call_name: mcpToolCall.function.name,
639-
tool_call_params: mcpToolCall.function.arguments
637+
tool_call_params: mcpToolCall.function.arguments,
638+
tool_call_server_name: mcpToolCall.server.name,
639+
tool_call_server_icons: mcpToolCall.server.icons,
640+
tool_call_server_description: mcpToolCall.server.description
640641
}
641642
needContinueConversation = false
642643
break
643644
}
644645
yield {
645-
content: `\n<tool_call_start name="${toolCall.name}">\n`,
646-
reasoning_content: undefined,
646+
content: '',
647+
tool_call: 'start',
647648
tool_call_name: toolCall.name,
648649
tool_call_params: JSON.stringify(toolCall.input),
649-
tool_call_id: `anthropic-${toolCall.id}`
650+
tool_call_id: `anthropic-${toolCall.id}`,
651+
tool_call_server_name: mcpToolCall.server.name,
652+
tool_call_server_icons: mcpToolCall.server.icons,
653+
tool_call_server_description: mcpToolCall.server.description
650654
}
651655

652656
try {
@@ -669,24 +673,30 @@ ${context}
669673
})
670674

671675
yield {
672-
content: `\n<tool_call_end name="${toolCall.name}">\n`,
673-
reasoning_content: undefined,
676+
content: '',
677+
tool_call: 'end',
674678
tool_call_name: toolCall.name,
675679
tool_call_params: JSON.stringify(toolCall.input),
676680
tool_call_response: responseContent,
677-
tool_call_id: `anthropic-${toolCall.id}`
681+
tool_call_id: `anthropic-${toolCall.id}`,
682+
tool_call_server_name: mcpToolCall.server.name,
683+
tool_call_server_icons: mcpToolCall.server.icons,
684+
tool_call_server_description: mcpToolCall.server.description
678685
}
679686
} catch (error) {
680687
console.error('工具调用失败:', error)
681688
const errorMessage = error instanceof Error ? error.message : String(error)
682689

683690
yield {
684-
content: `\n<tool_call_error name="${toolCall.name}" error="${errorMessage}">\n`,
685-
reasoning_content: undefined,
691+
content: '',
692+
tool_call: 'error',
686693
tool_call_name: toolCall.name,
687694
tool_call_params: JSON.stringify(toolCall.input),
688695
tool_call_response: errorMessage,
689-
tool_call_id: `anthropic-${toolCall.id}`
696+
tool_call_id: `anthropic-${toolCall.id}`,
697+
tool_call_server_name: mcpToolCall.server.name,
698+
tool_call_server_icons: mcpToolCall.server.icons,
699+
tool_call_server_description: mcpToolCall.server.description
690700
}
691701

692702
// 添加错误响应到消息中

src/main/presenter/llmProviderPresenter/providers/geminiProvider.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,6 @@ export class GeminiProvider extends BaseLLMProvider {
721721
}
722722

723723
const mcpToolCall = await presenter.mcpPresenter.geminiFunctionCallToMcpTool(
724-
mcpTools,
725724
geminiFunctionCall,
726725
this.provider.id
727726
)
@@ -737,7 +736,10 @@ export class GeminiProvider extends BaseLLMProvider {
737736
maximum_tool_calls_reached: true,
738737
tool_call_id: mcpToolCall.id,
739738
tool_call_name: mcpToolCall.function.name,
740-
tool_call_params: mcpToolCall.function.arguments
739+
tool_call_params: mcpToolCall.function.arguments,
740+
tool_call_server_name: mcpToolCall.server.name,
741+
tool_call_server_icons: mcpToolCall.server.icons,
742+
tool_call_server_description: mcpToolCall.server.description
741743
}
742744
needContinueConversation = false
743745
break
@@ -746,11 +748,14 @@ export class GeminiProvider extends BaseLLMProvider {
746748
// 通知正在调用工具
747749
const toolCallId = `gemini-${Date.now()}`
748750
yield {
749-
content: `\n<tool_call_start name="${functionName}">\n`,
750-
reasoning_content: undefined,
751+
content: '',
752+
tool_call: 'start',
751753
tool_call_name: functionName,
752754
tool_call_params: JSON.stringify(functionArgs),
753-
tool_call_id: toolCallId
755+
tool_call_id: toolCallId,
756+
tool_call_server_name: mcpToolCall.server.name,
757+
tool_call_server_icons: mcpToolCall.server.icons,
758+
tool_call_server_description: mcpToolCall.server.description
754759
}
755760

756761
// 调用工具并获取响应
@@ -774,12 +779,15 @@ export class GeminiProvider extends BaseLLMProvider {
774779

775780
// 通知工具调用结束
776781
yield {
777-
content: `\n<tool_call_end name="${functionName}">\n`,
778-
reasoning_content: undefined,
782+
content: '',
783+
tool_call: 'end',
779784
tool_call_name: functionName,
780785
tool_call_params: JSON.stringify(functionArgs),
781786
tool_call_response: responseContent,
782-
tool_call_id: toolCallId
787+
tool_call_id: toolCallId,
788+
tool_call_server_name: mcpToolCall.server.name,
789+
tool_call_server_icons: mcpToolCall.server.icons,
790+
tool_call_server_description: mcpToolCall.server.description
783791
}
784792

785793
// 设置需要继续对话的标志
@@ -789,12 +797,15 @@ export class GeminiProvider extends BaseLLMProvider {
789797
const errorMessage = error instanceof Error ? error.message : String(error)
790798

791799
yield {
792-
content: `\n<tool_call_error name="${functionName}" error="${errorMessage}">\n`,
793-
reasoning_content: undefined,
800+
content: '',
801+
tool_call: 'error',
794802
tool_call_name: functionName,
795803
tool_call_params: JSON.stringify(functionArgs),
796804
tool_call_response: errorMessage,
797-
tool_call_id: `gemini-${Date.now()}`
805+
tool_call_id: `gemini-${Date.now()}`,
806+
tool_call_server_name: mcpToolCall.server.name,
807+
tool_call_server_icons: mcpToolCall.server.icons,
808+
tool_call_server_description: mcpToolCall.server.description
798809
}
799810

800811
// 添加错误消息到上下文

src/main/presenter/llmProviderPresenter/providers/ollamaProvider.ts

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,22 @@ export class OllamaProvider extends BaseLLMProvider {
376376
}
377377

378378
processedToolCallIds.add(toolCall.id)
379-
379+
const mcpTool = await presenter.mcpPresenter.openAIToolsToMcpTool(
380+
{
381+
function: {
382+
name: toolCall.function.name,
383+
arguments: toolCall.function.arguments
384+
}
385+
},
386+
this.provider.id
387+
)
380388
try {
389+
// 转换为MCP工具
390+
391+
if (!mcpTool) {
392+
console.warn(`Tool not found: ${toolCall.function.name}`)
393+
continue
394+
}
381395
// 增加工具调用计数
382396
toolCallCount++
383397

@@ -387,47 +401,40 @@ export class OllamaProvider extends BaseLLMProvider {
387401
maximum_tool_calls_reached: true,
388402
tool_call_id: toolCall.id,
389403
tool_call_name: toolCall.function.name,
390-
tool_call_params: toolCall.function.arguments
404+
tool_call_params: toolCall.function.arguments,
405+
tool_call_server_name: mcpTool.server.name,
406+
tool_call_server_icons: mcpTool.server.icons,
407+
tool_call_server_description: mcpTool.server.description
391408
}
392409
needContinueConversation = false
393410
break
394411
}
395-
396-
// 转换为MCP工具
397-
const mcpTool = await presenter.mcpPresenter.openAIToolsToMcpTool(
398-
mcpTools,
399-
{
400-
function: {
401-
name: toolCall.function.name,
402-
arguments: toolCall.function.arguments
403-
}
404-
},
405-
this.provider.id
406-
)
407-
408-
if (!mcpTool) {
409-
console.warn(`Tool not found: ${toolCall.function.name}`)
410-
continue
411-
}
412-
413412
yield {
414-
content: `\n<tool_call_start name="${toolCall.function.name}">\n`,
413+
content: '',
414+
tool_call: 'start',
415415
tool_call_name: toolCall.function.name,
416416
tool_call_params: toolCall.function.arguments,
417+
tool_call_server_name: mcpTool.server.name,
418+
tool_call_server_icons: mcpTool.server.icons,
419+
tool_call_server_description: mcpTool.server.description,
417420
tool_call_id: `ollama-${toolCall.id}`
418421
}
419422
// 调用工具
420423
const toolCallResponse = await presenter.mcpPresenter.callTool(mcpTool)
421424
// 通知调用工具结束
422425
yield {
423-
content: `\n<tool_call_end name="${toolCall.function.name}">\n`,
426+
content: '',
427+
tool_call: 'end',
424428
tool_call_name: toolCall.function.name,
425429
tool_call_params: toolCall.function.arguments,
426430
tool_call_response:
427431
typeof toolCallResponse.content === 'string'
428432
? toolCallResponse.content
429433
: JSON.stringify(toolCallResponse.content),
430-
tool_call_id: `ollama-${toolCall.id}`
434+
tool_call_id: `ollama-${toolCall.id}`,
435+
tool_call_server_name: mcpTool.server.name,
436+
tool_call_server_icons: mcpTool.server.icons,
437+
tool_call_server_description: mcpTool.server.description
431438
}
432439
// 将工具响应添加到消息中
433440
conversationMessages.push({
@@ -443,11 +450,15 @@ export class OllamaProvider extends BaseLLMProvider {
443450

444451
// 通知工具调用失败
445452
yield {
446-
content: `\n<tool_call_error name="${toolCall.function.name}" error="${errorMessage}">\n`,
453+
content: '',
454+
tool_call: 'error',
447455
tool_call_name: toolCall.function.name,
448456
tool_call_params: toolCall.function.arguments,
449457
tool_call_response: errorMessage,
450-
tool_call_id: `ollama-${toolCall.id}`
458+
tool_call_id: `ollama-${toolCall.id}`,
459+
tool_call_server_name: mcpTool?.server.name,
460+
tool_call_server_icons: mcpTool?.server.icons,
461+
tool_call_server_description: mcpTool?.server.description
451462
}
452463

453464
// 添加错误响应到消息中

src/main/presenter/llmProviderPresenter/providers/openAICompatibleProvider.ts

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -454,20 +454,16 @@ export class OpenAICompatibleProvider extends BaseLLMProvider {
454454
}
455455

456456
processedToolCallIds.add(toolCall.id)
457-
457+
const mcpTool = await presenter.mcpPresenter.openAIToolsToMcpTool(
458+
{
459+
function: {
460+
name: toolCall.function.name,
461+
arguments: toolCall.function.arguments
462+
}
463+
},
464+
this.provider.id
465+
)
458466
try {
459-
// 转换为MCP工具
460-
const mcpTool = await presenter.mcpPresenter.openAIToolsToMcpTool(
461-
mcpTools,
462-
{
463-
function: {
464-
name: toolCall.function.name,
465-
arguments: toolCall.function.arguments
466-
}
467-
},
468-
this.provider.id
469-
)
470-
471467
if (!mcpTool) {
472468
console.warn(`Tool not found: ${toolCall.function.name}`)
473469
continue
@@ -481,26 +477,37 @@ export class OpenAICompatibleProvider extends BaseLLMProvider {
481477
maximum_tool_calls_reached: true,
482478
tool_call_id: mcpTool.id,
483479
tool_call_name: mcpTool.function.name,
484-
tool_call_params: mcpTool.function.arguments
480+
tool_call_params: mcpTool.function.arguments,
481+
tool_call_server_name: mcpTool.server.name,
482+
tool_call_server_icons: mcpTool.server.icons,
483+
tool_call_server_description: mcpTool.server.description
485484
}
486485
needContinueConversation = false
487486
break
488487
}
489488
yield {
490-
content: `\n<tool_call_start name="${toolCall.function.name}">\n`,
489+
content: '',
490+
tool_call: 'start',
491491
tool_call_id: toolCallRenderId,
492492
tool_call_name: toolCall.function.name,
493-
tool_call_params: toolCall.function.arguments
493+
tool_call_params: toolCall.function.arguments,
494+
tool_call_server_name: mcpTool.server.name,
495+
tool_call_server_icons: mcpTool.server.icons,
496+
tool_call_server_description: mcpTool.server.description
494497
}
495498
// 调用工具
496499
const toolCallResponse = await presenter.mcpPresenter.callTool(mcpTool)
497500
console.log('toolCallResponse', toolCallResponse)
498501
yield {
499-
content: `\n<tool_call_end name="${toolCall.function.name}">\n`,
502+
content: '',
503+
tool_call: 'end',
500504
tool_call_id: toolCallRenderId,
501505
tool_call_response: toolCallResponse.content,
502506
tool_call_name: toolCall.function.name,
503-
tool_call_params: toolCall.function.arguments
507+
tool_call_params: toolCall.function.arguments,
508+
tool_call_server_name: mcpTool.server.name,
509+
tool_call_server_icons: mcpTool.server.icons,
510+
tool_call_server_description: mcpTool.server.description
504511
}
505512
// 将工具响应添加到消息中
506513
if (supportsFunctionCall) {
@@ -529,12 +536,15 @@ export class OpenAICompatibleProvider extends BaseLLMProvider {
529536

530537
// 通知工具调用失败 - 扩展LLMResponseStream类型
531538
yield {
532-
content: `\n<tool_call_error name="${toolCall.function.name}" error="${errorMessage}">\n`,
539+
content: '',
540+
tool_call: 'error',
533541
tool_call_id: toolCallRenderId,
534542
tool_call_name: toolCall.function.name,
535543
tool_call_params: toolCall.function.arguments,
536-
tool_call_response: errorMessage
537-
// 注意:tool_call_status属性可能需要添加到LLMResponseStream接口
544+
tool_call_response: errorMessage,
545+
tool_call_server_name: mcpTool?.server.name,
546+
tool_call_server_icons: mcpTool?.server.icons,
547+
tool_call_server_description: mcpTool?.server.description
538548
}
539549

540550
// 添加错误响应到消息中
@@ -637,7 +647,6 @@ export class OpenAICompatibleProvider extends BaseLLMProvider {
637647
(tc) => tc.index === indexKey || (tc.id && tc.id === toolCallDelta.id)
638648
)
639649

640-
console.log('update', existingToolCall, indexKey)
641650
if (existingToolCall) {
642651
// 更新现有工具调用
643652
if (toolCallDelta.id && !existingToolCall.id) {

0 commit comments

Comments
 (0)