module LittleGhost::Agent::Delegation::ClassMethods
Exposes delegation declarations on agent classes. These methods become inheritable DSL entries when the capability is included.
Public Instance Methods
# File lib/little_ghost/agent/delegation.rb, line 96 def agent_as_tool(agent_class, name: nil, description: nil, model: nil, tools: nil, preserve_context: false) assembly_as_tool( agent_class, name:, description:, model:, tools:, preserve_context: ) end
Exposes agent_class as one ordinary tool.
Pass preserve_context: true to retain the delegated agentโs conversational history between calls to that tool instance.
# File lib/little_ghost/agent/delegation.rb, line 131 def agents_as_tools(*agent_classes, **options) agent_classes.each { |agent_class| agent_as_tool(agent_class, **options) } assembly_tool_declarations end
Exposes several agent classes as ordinary tools with shared options.
# File lib/little_ghost/agent/delegation.rb, line 137 def assemblies_as_tools(*assembly_classes, **options) assembly_classes.each { |assembly_class| assembly_as_tool(assembly_class, **options) } assembly_tool_declarations end
Exposes several assembly classes as ordinary tools with shared options.
# File lib/little_ghost/agent/delegation.rb, line 110 def assembly_as_tool(assembly_class, name: nil, description: nil, model: nil, tools: nil, preserve_context: false) unless assembly_class.is_a?(Class) && assembly_class <= Assembly raise ConfigurationError, "Delegated assemblies must inherit from LittleGhost::Assembly" end validate_delegated_tools!(tools) if !(assembly_class <= Agent) && (model || tools) raise ConfigurationError, "Composite assemblies do not accept delegated model or tool overrides" end declaration = { assembly: assembly_class, name: (name || assembly_class.assembly_id).to_s, description: description || assembly_class.description, model:, tools:, preserve_context: } self.assembly_tool_declarations_value = [*assembly_tool_declarations, declaration] end
# File lib/little_ghost/agent/delegation.rb, line 67 def subagent(agent_class, kind: nil, description: nil, model: nil, tools: nil, factory: nil, persist: true) validate_delegated_tools!(tools) declaration = { agent: agent_class, kind: (kind || agent_class.agent_id).to_s, description: description || agent_class.description, model:, tools:, factory:, persist: } self.subagent_declarations_value = [*subagent_declarations, declaration] end
Adds agent_class as an available managed subagent.
kind defaults to the agent ID and description defaults to the agent description. Conversations persist when a session store exists; pass persist: false for invocation-local work.
subagent ResearchAgent, kind: "research"
# File lib/little_ghost/agent/delegation.rb, line 47 def subagent_long_poll_duration(*values) return subagent_long_poll_duration_value if values.empty? timeout = Float(values.fetch(0)) unless timeout.positive? && timeout.finite? raise ConfigurationError, "subagent_long_poll_duration must be a positive finite number" end self.subagent_long_poll_duration_value = timeout rescue ArgumentError, TypeError raise ConfigurationError, "subagent_long_poll_duration must be a positive finite number" end
How long wait_for_subagents watches for progress before returning.
The default comes from Subagents::Manager. Values must be positive, finite numbers and are normalized to Float.
# File lib/little_ghost/agent/delegation.rb, line 82 def subagents(*agent_classes, **options, &resolver) agent_classes.each { |agent_class| subagent(agent_class, **options) } self.subagent_resolvers_value = [*subagent_resolvers, resolver] if resolver subagent_declarations end
Adds several static subagents and an optional dynamic definition resolver.