- Introduced a new global phase agent resolver to streamline agent ID retrieval for various robot pipeline phases, enhancing flexibility in agent configuration. - Updated existing phase agent retrieval logic to prioritize per-robot configurations, falling back to global settings when necessary. - Enhanced error handling to provide clearer messages when no agent is configured for specific phases. - Added tests to validate the new resolution logic and ensure proper functionality across different configurations.
75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
package standard
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
robottypes "github.com/yaoapp/yao/agent/robot/types"
|
|
)
|
|
|
|
// RunInspiration executes P0: Inspiration phase
|
|
// Calls the Inspiration Agent to generate daily briefing
|
|
//
|
|
// Input:
|
|
// - ClockContext from trigger input or current time
|
|
// - Robot identity and resources
|
|
//
|
|
// Output:
|
|
// - InspirationReport with markdown content
|
|
func (e *Executor) RunInspiration(ctx *robottypes.Context, exec *robottypes.Execution, _ interface{}) error {
|
|
// Get robot for identity and resources
|
|
robot := exec.GetRobot()
|
|
if robot == nil {
|
|
return fmt.Errorf("robot not found in execution")
|
|
}
|
|
|
|
// Update UI field with i18n
|
|
locale := getEffectiveLocale(robot, exec.Input)
|
|
e.updateUIFields(ctx, exec, "", getLocalizedMessage(locale, "analyzing_context"))
|
|
|
|
// Build clock context from trigger input or current time
|
|
var clock *robottypes.ClockContext
|
|
if exec.Input != nil && exec.Input.Clock != nil {
|
|
clock = exec.Input.Clock
|
|
} else {
|
|
clock = robottypes.NewClockContext(time.Now(), "")
|
|
}
|
|
|
|
// Get agent ID for inspiration phase (per-robot config > global Uses > empty)
|
|
agentID := robottypes.ResolvePhaseAgent(robot.Config, robottypes.PhaseInspiration)
|
|
if agentID == "" {
|
|
return fmt.Errorf("no Inspiration Agent configured (set uses.inspiration in agent.yml or resources.phases in robot config)")
|
|
}
|
|
|
|
// Build prompt using InputFormatter
|
|
formatter := NewInputFormatter()
|
|
userContent := formatter.FormatClockContext(clock, robot)
|
|
|
|
// Add available resources - critical for generating achievable insights
|
|
resourcesContent := formatter.FormatAvailableResources(robot)
|
|
if resourcesContent != "" {
|
|
userContent += "\n\n" + resourcesContent
|
|
}
|
|
|
|
// Call agent
|
|
caller := NewAgentCaller()
|
|
caller.Connector = robot.LanguageModel
|
|
result, err := caller.CallWithMessages(ctx, agentID, userContent)
|
|
if err != nil {
|
|
return fmt.Errorf("inspiration agent (%s) call failed: %w", agentID, err)
|
|
}
|
|
|
|
// Parse response - get markdown content
|
|
content := result.GetText()
|
|
if content == "" {
|
|
return fmt.Errorf("inspiration agent (%s) returned empty response", agentID)
|
|
}
|
|
|
|
// Build InspirationReport
|
|
exec.Inspiration = &robottypes.InspirationReport{
|
|
Clock: clock,
|
|
Content: content,
|
|
}
|
|
|
|
return nil
|
|
}
|