- Update `forceSkipForSubAgent` to respect caller's `skip.output` setting, allowing for silent internal worker agent execution. - Refactor error handling in `callAgentWithContext` to utilize a new `NewResult` function for consistent result construction. - Introduce `ProcessCallRequest` structure for improved agent call parameters, including a default timeout constant for process calls.
79 lines
3.9 KiB
Go
79 lines
3.9 KiB
Go
// Package caller provides types and utilities for agent-to-agent calls
|
|
package caller
|
|
|
|
import (
|
|
agentContext "github.com/yaoapp/yao/agent/context"
|
|
)
|
|
|
|
// DefaultProcessTimeout is the default timeout (in seconds) for agent.Call Process.
|
|
// LLM calls with tool use can take minutes; 10 minutes provides safe headroom.
|
|
const DefaultProcessTimeout = 600
|
|
|
|
// Request represents a request to call an agent
|
|
type Request struct {
|
|
AgentID string `json:"agent"` // Target agent ID
|
|
Messages []agentContext.Message `json:"messages"` // Messages to send
|
|
Options *CallOptions `json:"options,omitempty"` // Call options
|
|
Handler agentContext.OnMessageFunc `json:"-"` // OnMessage handler for this request (not serialized)
|
|
}
|
|
|
|
// CallOptions represents options for an agent call
|
|
type CallOptions struct {
|
|
Connector string `json:"connector,omitempty"` // Override connector
|
|
Mode string `json:"mode,omitempty"` // Agent mode (chat, etc.)
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"` // Custom metadata passed to hooks
|
|
Skip *agentContext.Skip `json:"skip,omitempty"` // Skip configuration (history, trace, output, etc.)
|
|
}
|
|
|
|
// Result represents the result of an agent call
|
|
type Result struct {
|
|
AgentID string `json:"agent_id"` // Agent ID that was called
|
|
Response *agentContext.Response `json:"response,omitempty"` // Full response from agent
|
|
Content string `json:"content,omitempty"` // Final text content (extracted from completion)
|
|
Error string `json:"error,omitempty"` // Error message if call failed
|
|
}
|
|
|
|
// ProcessCallRequest is the parameter structure for the agent.Call Process.
|
|
// Fields mirror CompletionRequest + HTTP header semantics, enabling headless
|
|
// agent calls from contexts without agent.Context (e.g., YaoJob async tasks).
|
|
type ProcessCallRequest struct {
|
|
AssistantID string `json:"assistant_id"` // Required: target assistant ID (maps to X-Yao-Assistant header)
|
|
Messages []map[string]interface{} `json:"messages"` // Required: message list (maps to CompletionRequest.Messages)
|
|
Model string `json:"model,omitempty"` // Optional: connector ID override (maps to CompletionRequest.Model)
|
|
Skip *agentContext.Skip `json:"skip,omitempty"` // Optional: skip config (maps to CompletionRequest.Skip)
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"` // Optional: passed to hooks (maps to CompletionRequest.Metadata)
|
|
Locale string `json:"locale,omitempty"` // Optional (maps to locale query param)
|
|
Route string `json:"route,omitempty"` // Optional (maps to CompletionRequest.Route)
|
|
ChatID string `json:"chat_id,omitempty"` // Optional: auto-generated if empty (maps to chat_id query/header)
|
|
Timeout int `json:"timeout,omitempty"` // Optional: timeout in seconds (default: DefaultProcessTimeout = 600)
|
|
}
|
|
|
|
// NewResult builds a Result from an agent call response.
|
|
// Used by both ctx.agent.Call (orchestrator) and Process("agent.Call") to
|
|
// ensure consistent result construction.
|
|
func NewResult(agentID string, resp *agentContext.Response, err error) *Result {
|
|
result := &Result{AgentID: agentID}
|
|
if err != nil {
|
|
result.Error = err.Error()
|
|
return result
|
|
}
|
|
result.Response = resp
|
|
if resp != nil && resp.Completion != nil {
|
|
result.Content = extractContentFromCompletion(resp.Completion)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// ToContextOptions converts CallOptions to context.Options for the agent call
|
|
func (o *CallOptions) ToContextOptions() *agentContext.Options {
|
|
if o == nil {
|
|
return nil
|
|
}
|
|
|
|
return &agentContext.Options{
|
|
Connector: o.Connector,
|
|
Mode: o.Mode,
|
|
Metadata: o.Metadata,
|
|
Skip: o.Skip,
|
|
}
|
|
}
|