36 lines
1.1 KiB
Go
36 lines
1.1 KiB
Go
package agent
|
|
|
|
// I see two types of agents possible:
|
|
// ones who do their own tools calls
|
|
// ones that works only with the output
|
|
|
|
// A: main chat -> agent (handles everything: tool + processing)
|
|
// B: main chat -> tool -> agent (process tool output)
|
|
|
|
// AgenterA gets a task "find out weather in london"
|
|
// proceeds to make tool calls on its own
|
|
type AgenterA interface {
|
|
ProcessTask(task string) []byte
|
|
}
|
|
|
|
// AgenterB defines an interface for processing tool outputs
|
|
type AgenterB interface {
|
|
// Process takes the original tool arguments and the raw output from the tool,
|
|
// and returns a cleaned/summarized version suitable for the main LLM context
|
|
Process(args map[string]string, rawOutput []byte) []byte
|
|
}
|
|
|
|
// registry holds mapping from tool names to agents
|
|
var RegistryB = make(map[string]AgenterB)
|
|
var RegistryA = make(map[AgenterA][]string)
|
|
|
|
// Register adds an agent for a specific tool name
|
|
// If an agent already exists for the tool, it will be replaced
|
|
func RegisterB(toolName string, a AgenterB) {
|
|
RegistryB[toolName] = a
|
|
}
|
|
|
|
func RegisterA(toolNames []string, a AgenterA) {
|
|
RegistryA[a] = toolNames
|
|
}
|