feat: add ProjectInstructionProvider and ToolAppendixProvider for enhanced instruction handling
This commit is contained in:
@@ -24,6 +24,8 @@ type AgentFactory struct {
|
|||||||
chatModelFactory *ChatModelFactory
|
chatModelFactory *ChatModelFactory
|
||||||
toolFactory *ToolFactory
|
toolFactory *ToolFactory
|
||||||
instructionAssembler *InstructionAssembler
|
instructionAssembler *InstructionAssembler
|
||||||
|
projectInstructionProvider *ProjectInstructionProvider
|
||||||
|
toolAppendixProvider *ToolAppendixProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// BuildCustomerServiceAgentInput 定义客服 Agent 的装配输入。
|
// BuildCustomerServiceAgentInput 定义客服 Agent 的装配输入。
|
||||||
@@ -60,6 +62,8 @@ func NewAgentFactory() *AgentFactory {
|
|||||||
chatModelFactory: NewChatModelFactory(),
|
chatModelFactory: NewChatModelFactory(),
|
||||||
toolFactory: NewToolFactory(),
|
toolFactory: NewToolFactory(),
|
||||||
instructionAssembler: NewInstructionAssembler(),
|
instructionAssembler: NewInstructionAssembler(),
|
||||||
|
projectInstructionProvider: NewProjectInstructionProvider(),
|
||||||
|
toolAppendixProvider: NewToolAppendixProvider(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +106,7 @@ func (f *AgentFactory) BuildCustomerServiceAgent(ctx context.Context, input Buil
|
|||||||
}
|
}
|
||||||
handlers = append(handlers, einocallbacks.NewRuntimeTraceHandler(input.Collector, toolMetadataBy))
|
handlers = append(handlers, einocallbacks.NewRuntimeTraceHandler(input.Collector, toolMetadataBy))
|
||||||
}
|
}
|
||||||
instructionResult := assembleAgentInstruction(input.AIAgent, input.SelectedSkill, input.InstructionToolDefinitions, input.StaticToolCodes)
|
instructionResult := f.assembleAgentInstruction(input.AIAgent, input.SelectedSkill, input.InstructionToolDefinitions, input.StaticToolCodes)
|
||||||
if input.Collector != nil {
|
if input.Collector != nil {
|
||||||
input.Collector.SetInstructionSummary(einocallbacks.InstructionTraceSummary{
|
input.Collector.SetInstructionSummary(einocallbacks.InstructionTraceSummary{
|
||||||
SectionTitles: append([]string(nil), instructionResult.Summary.SectionTitles...),
|
SectionTitles: append([]string(nil), instructionResult.Summary.SectionTitles...),
|
||||||
@@ -144,16 +148,25 @@ func (f *AgentFactory) buildSelectedSkillMiddleware(ctx context.Context, selecte
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func assembleAgentInstruction(aiAgent *models.AIAgent, selectedSkill *models.SkillDefinition, toolDefinitions []einoadapter.MCPToolDefinition, extraToolCodes map[string]string) InstructionAssemblyResult {
|
func (f *AgentFactory) assembleAgentInstruction(aiAgent *models.AIAgent, selectedSkill *models.SkillDefinition, toolDefinitions []einoadapter.MCPToolDefinition, extraToolCodes map[string]string) InstructionAssemblyResult {
|
||||||
baseInstruction := ""
|
baseInstruction := ""
|
||||||
if aiAgent != nil {
|
if aiAgent != nil {
|
||||||
baseInstruction = strings.TrimSpace(aiAgent.SystemPrompt)
|
baseInstruction = strings.TrimSpace(aiAgent.SystemPrompt)
|
||||||
}
|
}
|
||||||
appendixParts := buildInstructionAppendices(selectedSkill, toolDefinitions, extraToolCodes)
|
appendixParts := buildInstructionAppendices(selectedSkill, toolDefinitions, extraToolCodes)
|
||||||
return NewInstructionAssembler().Assemble(InstructionAssemblerInput{
|
projectInstruction := ""
|
||||||
|
if f != nil && f.projectInstructionProvider != nil {
|
||||||
|
projectInstruction = f.projectInstructionProvider.Resolve()
|
||||||
|
}
|
||||||
|
assembler := NewInstructionAssembler()
|
||||||
|
if f != nil && f.instructionAssembler != nil {
|
||||||
|
assembler = f.instructionAssembler
|
||||||
|
}
|
||||||
|
return assembler.Assemble(InstructionAssemblerInput{
|
||||||
AgentInstruction: baseInstruction,
|
AgentInstruction: baseInstruction,
|
||||||
SkillInstruction: firstAppendixPart(appendixParts),
|
SkillInstruction: firstAppendixPart(appendixParts),
|
||||||
ToolAppendices: remainingAppendixParts(appendixParts),
|
ToolAppendices: remainingAppendixParts(appendixParts),
|
||||||
|
ProjectInstruction: projectInstruction,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package factory
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
einoadapter "cs-agent/internal/ai/runtime/internal/impl/adapter"
|
||||||
|
"cs-agent/internal/models"
|
||||||
|
"cs-agent/internal/pkg/toolx"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProjectInstructionProvider struct{}
|
||||||
|
|
||||||
|
func NewProjectInstructionProvider() *ProjectInstructionProvider {
|
||||||
|
return &ProjectInstructionProvider{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ProjectInstructionProvider) Resolve() string {
|
||||||
|
return strings.TrimSpace(DefaultProjectInstruction)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ToolAppendixProvider struct{}
|
||||||
|
|
||||||
|
func NewToolAppendixProvider() *ToolAppendixProvider {
|
||||||
|
return &ToolAppendixProvider{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *ToolAppendixProvider) Build(selectedSkill *models.SkillDefinition, toolDefinitions []einoadapter.MCPToolDefinition, extraToolCodes map[string]string) []string {
|
||||||
|
appendixParts := make([]string, 0, 2)
|
||||||
|
if skillInstruction := buildSelectedSkillActivationInstruction(selectedSkill); skillInstruction != "" {
|
||||||
|
appendixParts = append(appendixParts, skillInstruction)
|
||||||
|
}
|
||||||
|
toolCodes := make([]string, 0, len(toolDefinitions)+len(extraToolCodes))
|
||||||
|
for _, item := range toolDefinitions {
|
||||||
|
toolCodes = append(toolCodes, item.ToolCode)
|
||||||
|
}
|
||||||
|
for _, item := range extraToolCodes {
|
||||||
|
toolCodes = append(toolCodes, item)
|
||||||
|
}
|
||||||
|
appendixParts = append(appendixParts, toolx.BuildToolAppendicesForCodes(len(toolDefinitions) > 0, toolCodes)...)
|
||||||
|
return appendixParts
|
||||||
|
}
|
||||||
@@ -57,17 +57,5 @@ func buildRuntimeTraceToolMetadata(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func buildInstructionAppendices(selectedSkill *models.SkillDefinition, toolDefinitions []einoadapter.MCPToolDefinition, extraToolCodes map[string]string) []string {
|
func buildInstructionAppendices(selectedSkill *models.SkillDefinition, toolDefinitions []einoadapter.MCPToolDefinition, extraToolCodes map[string]string) []string {
|
||||||
appendixParts := make([]string, 0, 2)
|
return NewToolAppendixProvider().Build(selectedSkill, toolDefinitions, extraToolCodes)
|
||||||
if skillInstruction := buildSelectedSkillActivationInstruction(selectedSkill); skillInstruction != "" {
|
|
||||||
appendixParts = append(appendixParts, skillInstruction)
|
|
||||||
}
|
|
||||||
toolCodes := make([]string, 0, len(toolDefinitions)+len(extraToolCodes))
|
|
||||||
for _, item := range toolDefinitions {
|
|
||||||
toolCodes = append(toolCodes, item.ToolCode)
|
|
||||||
}
|
|
||||||
for _, item := range extraToolCodes {
|
|
||||||
toolCodes = append(toolCodes, item)
|
|
||||||
}
|
|
||||||
appendixParts = append(appendixParts, toolx.BuildToolAppendicesForCodes(len(toolDefinitions) > 0, toolCodes)...)
|
|
||||||
return appendixParts
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user