Documentation
¶
Index ¶
- Variables
- func CoerceNullableTypes(props map[string]any)
- func ExtractBoolean(llm LLM, f Fragment, opts ...Option) (*structures.Boolean, error)
- func ExtractGoal(llm LLM, f Fragment, opts ...Option) (*structures.Goal, error)
- func ExtractKnowledgeGaps(llm LLM, f Fragment, opts ...Option) ([]string, error)
- func ExtractPlan(llm LLM, f Fragment, goal *structures.Goal, opts ...Option) (*structures.Plan, error)
- func ExtractTODOs(llm LLM, plan *structures.Plan, goal *structures.Goal, opts ...Option) (*structures.TODOList, error)
- func IsGoalAchieved(llm LLM, f Fragment, goal *structures.Goal, opts ...Option) (*structures.Boolean, error)
- func ReEvaluatePlan(llm LLM, f, subtaskFragment Fragment, goal *structures.Goal, ...) (*structures.Plan, error)
- func SetAgentDone(a *AgentState, ch chan struct{})
- func WithCompactionKeepMessages(count int) func(o *Options)
- func WithCompactionThreshold(threshold int) func(o *Options)
- func WithContext(ctx context.Context) func(o *Options)
- func WithFeedbackCallback(fn func() *Fragment) func(o *Options)
- func WithForceReasoning() func(o *Options)
- func WithForceReasoningTool() func(o *Options)
- func WithGaps(gaps ...string) func(o *Options)
- func WithGuidelines(guidelines ...Guideline) func(o *Options)
- func WithIterations(i int) func(o *Options)
- func WithLoopDetection(steps int) func(o *Options)
- func WithMCPArgs(args map[string]string) func(o *Options)
- func WithMCPToolFilter(fn MCPToolFilter) func(o *Options)
- func WithMCPs(sessions ...*mcp.ClientSession) func(o *Options)
- func WithMaxAdjustmentAttempts(attempts int) func(o *Options)
- func WithMaxAttempts(i int) func(o *Options)
- func WithMaxRetries(retries int) func(o *Options)
- func WithMessageInjectionChan(ch chan openai.ChatCompletionMessage) func(o *Options)
- func WithMessageInjectionResultChan(ch chan MessageInjectionResult) func(o *Options)
- func WithMessagesManipulator(fn func([]openai.ChatCompletionMessage) []openai.ChatCompletionMessage) func(o *Options)
- func WithPrompt(t prompt.PromptType, p prompt.StaticPrompt) func(o *Options)
- func WithReasoningCallback(fn func(string)) func(o *Options)
- func WithReviewerLLM(reviewerLLMs ...LLM) func(o *Options)
- func WithSinkState(tool ToolDefinitionInterface) func(o *Options)
- func WithStartWithAction(tool ...*ToolChoice) func(o *Options)
- func WithStatusCallback(fn func(string)) func(o *Options)
- func WithStreamCallback(fn StreamCallback) func(o *Options)
- func WithTODOPersistence(path string) func(o *Options)
- func WithTODOs(todoList *structures.TODOList) func(o *Options)
- func WithToolCallBack(fn func(*ToolChoice, *SessionState) ToolCallDecision) func(o *Options)
- func WithToolCallResultCallback(fn func(ToolStatus)) func(o *Options)
- func WithTools(tools ...ToolDefinitionInterface) func(o *Options)
- type AgentDefinition
- type AgentDispatcher
- type AgentEvent
- type AgentManager
- func (m *AgentManager) Detach(id string) error
- func (m *AgentManager) Get(id string) (*AgentState, bool)
- func (m *AgentManager) HasRunning() bool
- func (m *AgentManager) Inject(id, message string) error
- func (m *AgentManager) List() []*AgentState
- func (m *AgentManager) Register(agent *AgentState)
- func (m *AgentManager) Wait(id string) (*AgentState, error)
- type AgentRunSpec
- type AgentState
- type AgentStatusType
- type AutoImproveState
- type CheckAgentArgs
- type CheckAgentRunnerForTest
- type Fragment
- func ContentReview(llm LLM, originalFragment Fragment, opts ...Option) (Fragment, error)
- func ExecutePlan(llm LLM, conv Fragment, plan *structures.Plan, goal *structures.Goal, ...) (Fragment, error)
- func ExecuteTools(llm LLM, f Fragment, opts ...Option) (result Fragment, retErr error)
- func NewEmptyFragment() Fragment
- func NewFragment(messages ...openai.ChatCompletionMessage) Fragment
- func (f Fragment) AddLastMessage(f2 Fragment) Fragment
- func (r Fragment) AddMessage(role MessageRole, content string, mm ...Multimedia) Fragment
- func (r Fragment) AddStartMessage(role MessageRole, content string, mm ...Multimedia) Fragment
- func (r Fragment) AddToolMessage(content, toolCallID string) Fragment
- func (f Fragment) AllFragmentsStrings() string
- func (r Fragment) Extract(ctx context.Context, llm LLM, obj any) error
- func (r Fragment) ExtractStructure(ctx context.Context, llm LLM, s structures.Structure) error
- func (f Fragment) GetMessages() []openai.ChatCompletionMessage
- func (f Fragment) LastAssistantAndToolMessages() []openai.ChatCompletionMessage
- func (f Fragment) LastMessage() *openai.ChatCompletionMessage
- func (f Fragment) SelectTool(ctx context.Context, llm LLM, availableTools Tools, forceTool string) (Fragment, *ToolChoice, error)
- func (f Fragment) String() string
- type GetAgentResultArgs
- type GetAgentResultRunnerForTest
- type Guideline
- type GuidelineMetadata
- type GuidelineMetadataList
- type Guidelines
- type InjectedMessage
- type IntentionResponseMultiple
- type IntentionResponseSingle
- type LLM
- type LLMReply
- type LLMUsage
- type MCPToolFilter
- type MessageInjectionResult
- type MessageRole
- type Multimedia
- type Option
- func WithAgentCompletionCallback(fn func(*AgentState)) Option
- func WithAgentCompletionFormatter(fn func(*AgentState) string) Option
- func WithAgentDefinitions(defs ...AgentDefinition) Option
- func WithAgentDispatcher(d AgentDispatcher) Option
- func WithAgentLLM(llm LLM) Option
- func WithAgentLLMFactory(fn func(model string, temperature float32, metadata map[string]string) LLM) Option
- func WithAgentManager(m *AgentManager) Option
- func WithAgentSpawnCallback(fn func(*AgentState)) Option
- func WithAutoImproveReviewerLLM(llm LLM) Option
- func WithAutoImproveState(state *AutoImproveState) Option
- func WithOnPark(fn func(reply string)) Option
- func WithOnResume(fn func()) Option
- func WithPendingWork(fn func() bool) Option
- type Options
- type PlanStatus
- type ReasoningResponse
- type SendAgentMessageArgs
- type SessionState
- type SpawnAgentArgs
- type Status
- type StreamCallback
- type StreamEvent
- type StreamEventType
- type StreamingLLM
- type Tool
- type ToolCallDecision
- type ToolChoice
- type ToolDefinition
- type ToolDefinitionInterface
- type ToolStatus
- type Tools
Constants ¶
This section is empty.
Variables ¶
var ( ErrNoToolSelected error = errors.New("no tool selected by the LLM") ErrLoopDetected error = errors.New("loop detected: same tool called repeatedly with same parameters") ErrToolCallCallbackInterrupted error = errors.New("interrupted via ToolCallCallback") )
var ErrDispatchFallback = errors.New("cogito: dispatch fallback to in-process")
ErrDispatchFallback signals that an AgentDispatcher declined to handle a run and cogito should execute it in-process instead.
var (
ErrGoalNotAchieved error = errors.New("goal not achieved")
)
Functions ¶
func CoerceNullableTypes ¶ added in v0.10.0
CoerceNullableTypes is an exported alias for the same workaround so downstream tests can verify their own MCP servers stay compatible with the import path. Most callers won't need it.
func ExtractBoolean ¶
ExtractBoolean extracts a boolean from a conversation
func ExtractGoal ¶
ExtractGoal extracts a goal from a conversation
func ExtractKnowledgeGaps ¶
func ExtractPlan ¶
func ExtractPlan(llm LLM, f Fragment, goal *structures.Goal, opts ...Option) (*structures.Plan, error)
ExtractPlan extracts a plan from a conversation To override the prompt, define a PromptPlanType, PromptReEvaluatePlanType and PromptSubtaskExtractionType
func ExtractTODOs ¶ added in v0.8.0
func ExtractTODOs(llm LLM, plan *structures.Plan, goal *structures.Goal, opts ...Option) (*structures.TODOList, error)
ExtractTODOs generates a TODO list from plan subtasks using the LLM
func IsGoalAchieved ¶
func IsGoalAchieved(llm LLM, f Fragment, goal *structures.Goal, opts ...Option) (*structures.Boolean, error)
IsGoalAchieved checks if a goal has been achieved
func ReEvaluatePlan ¶
func ReEvaluatePlan(llm LLM, f, subtaskFragment Fragment, goal *structures.Goal, toolStatuses []ToolStatus, subtask string, opts ...Option) (*structures.Plan, error)
ExtractPlan extracts a plan from a conversation to override the prompt, define a PromptReEvaluatePlanType and PromptSubtaskExtractionType
func SetAgentDone ¶ added in v0.10.0
func SetAgentDone(a *AgentState, ch chan struct{})
SetAgentDone sets the done channel on an AgentState. Used for testing.
func WithCompactionKeepMessages ¶ added in v0.9.2
WithCompactionKeepMessages sets the number of recent messages to keep after compaction. Default is 10. This only applies when WithCompactionThreshold is set.
func WithCompactionThreshold ¶ added in v0.9.2
WithCompactionThreshold sets the token count threshold that triggers automatic conversation compaction. When total tokens in the response >= threshold, the conversation will be compacted to stay within the limit. Set to 0 (default) to disable automatic compaction.
func WithContext ¶
WithContext sets the execution context for the agent
func WithFeedbackCallback ¶
WithFeedbackCallback sets a callback to get continous feedback during execution of plans
func WithForceReasoning ¶ added in v0.4.0
func WithForceReasoning() func(o *Options)
WithForceReasoning enables forcing the LLM to reason before selecting tools
func WithForceReasoningTool ¶ added in v0.9.1
func WithForceReasoningTool() func(o *Options)
WithForceReasoningTool enables forcing the LLM to use the reasoning tool before selecting tools. This ensures structured output from the LLM instead of free text that might accidentally contain tool call JSON.
func WithGuidelines ¶
WithGuidelines adds behavioral guidelines for the agent to follow. The guildelines allows a more curated selection of the tool to use and only relevant are shown to the LLM during tool selection.
func WithIterations ¶
WithIterations allows to set the number of refinement iterations
func WithLoopDetection ¶ added in v0.4.0
WithLoopDetection enables loop detection to prevent repeated tool calls If the same tool with the same parameters is called more than 'steps' times, it will be detected
func WithMCPArgs ¶ added in v0.3.0
WithMCPArgs sets the arguments for the MCP prompts
func WithMCPToolFilter ¶ added in v0.10.0
func WithMCPToolFilter(fn MCPToolFilter) func(o *Options)
WithMCPToolFilter installs a per-tool gate applied during the initial tool-discovery pass over each MCP session. fn is invoked once per (session, tool) pair after ListTools returns; tools for which fn returns false are dropped from the agent's discovered set and the LLM never sees them.
The filter is not invoked on subsequent CallTool requests — the LLM can only request tools it learned about during discovery, so dropping at discovery time is sufficient. A nil fn (or no option set) means every tool from every session is exposed.
Example: per-user enable/disable of remote MCP server tools.
enabled := map[*mcp.ClientSession]map[string]bool{ ... }
cogito.WithMCPToolFilter(func(s *mcp.ClientSession, tool string) bool {
if e, ok := enabled[s]; ok {
return e[tool]
}
return true // sessions not in the map are unfiltered
})
func WithMCPs ¶ added in v0.2.0
func WithMCPs(sessions ...*mcp.ClientSession) func(o *Options)
WithMCPs adds Model Context Protocol client sessions for external tool integration. When specified, the tools available in the MCPs will be available to the cogito pipelines
func WithMaxAdjustmentAttempts ¶ added in v0.7.0
WithMaxAdjustmentAttempts sets the maximum number of adjustment attempts when using tool call callbacks This prevents infinite loops when the user provides adjustment feedback Default is 5 attempts
func WithMaxAttempts ¶
WithMaxAttempts sets the maximum number of execution attempts
func WithMaxRetries ¶ added in v0.4.0
WithMaxRetries sets the maximum number of retries for LLM calls
func WithMessageInjectionChan ¶ added in v0.9.2
func WithMessageInjectionChan(ch chan openai.ChatCompletionMessage) func(o *Options)
WithMessageInjectionChan sets a channel for injecting new messages during tool loop execution. Users can send messages through this channel, and they will be appended to the fragment after each iteration. Passing nil (default) disables this feature. When the channel is closed, no more messages will be accepted.
func WithMessageInjectionResultChan ¶ added in v0.9.2
func WithMessageInjectionResultChan(ch chan MessageInjectionResult) func(o *Options)
WithMessageInjectionResultChan sets a channel to receive feedback about injected messages. For each message injection attempt, a MessageInjectionResult is sent back indicating: - Count: number of messages successfully added - Position: where in the fragment they were added - Err: error if validation or injection failed Passing nil (default) disables feedback.
func WithMessagesManipulator ¶ added in v0.9.0
func WithMessagesManipulator(fn func([]openai.ChatCompletionMessage) []openai.ChatCompletionMessage) func(o *Options)
WithMessagesManipulator allows to manipulate the messages before they are sent to the LLM This is useful to add additional system messages or other context to the messages that needs to change during execution
func WithPrompt ¶
func WithPrompt(t prompt.PromptType, p prompt.StaticPrompt) func(o *Options)
WithPrompt allows to set a custom prompt for a given PromptType
func WithReasoningCallback ¶ added in v0.4.1
WithReasoningCallback sets a callback function to receive reasoning updates during execution
func WithReviewerLLM ¶ added in v0.8.0
WithReviewerLLM specifies a judge LLM for Planning with TODOs. When provided along with a plan, enables Planning with TODOs where the judge LLM reviews work after each iteration and decides whether goal execution is completed or needs rework.
func WithSinkState ¶ added in v0.6.0
func WithSinkState(tool ToolDefinitionInterface) func(o *Options)
func WithStartWithAction ¶ added in v0.7.0
func WithStartWithAction(tool ...*ToolChoice) func(o *Options)
WithStartWithAction sets the initial tool choice to start with
func WithStatusCallback ¶
WithStatusCallback sets a callback function to receive status updates during execution
func WithStreamCallback ¶ added in v0.10.0
func WithStreamCallback(fn StreamCallback) func(o *Options)
WithStreamCallback sets a callback to receive streaming events during execution. When set alongside a StreamingLLM, final answer generation will stream token-by-token.
func WithTODOPersistence ¶ added in v0.8.0
WithTODOPersistence enables file-based TODO persistence. TODOs will be saved to and loaded from the specified file path.
func WithTODOs ¶ added in v0.8.0
func WithTODOs(todoList *structures.TODOList) func(o *Options)
WithTODOs provides an in-memory TODO list for TODO-based iterative execution. If not provided, TODOs will be automatically generated from plan subtasks.
func WithToolCallBack ¶
func WithToolCallBack(fn func(*ToolChoice, *SessionState) ToolCallDecision) func(o *Options)
WithToolCallBack allows to set a callback to intercept and modify tool calls before execution The callback receives the proposed tool choice and session state, and returns a ToolCallDecision that can approve, reject, provide adjustment feedback, or directly modify the tool choice
func WithToolCallResultCallback ¶
func WithToolCallResultCallback(fn func(ToolStatus)) func(o *Options)
WithToolCallResultCallback runs the callback on every tool result
func WithTools ¶
func WithTools(tools ...ToolDefinitionInterface) func(o *Options)
WithTools allows to set the tools available to the Agent. Pass *ToolDefinition[T] instances - they will automatically generate openai.Tool via their Tool() method. Example: WithTools(&ToolDefinition[SearchArgs]{...}, &ToolDefinition[WeatherArgs]{...})
Types ¶
type AgentDefinition ¶ added in v0.11.0
type AgentDefinition struct {
Name string // unique identifier referenced by spawn_agent.agent_type
Description string // shown to the LLM in the spawn tool description
SystemPrompt string // seeded as the sub-agent's first system message
Tools []string // tool-name allow-list for this type (empty = all parent tools)
Model string // optional model override resolved via the agent LLM factory
Temperature float32 // optional sampling temperature for this type
// Metadata is an optional per-request metadata object for this type,
// passed to the agent LLM factory and attached to its requests.
Metadata map[string]string
Iterations int // optional per-type iteration cap (0 = inherit parent)
MaxAttempts int // optional per-type attempt cap (0 = inherit parent)
MaxRetries int // optional per-type retry cap (0 = inherit parent)
}
AgentDefinition is a named sub-agent "type" (persona). The embedder registers definitions via WithAgentDefinitions; spawn_agent selects one by Name.
type AgentDispatcher ¶ added in v0.11.0
type AgentDispatcher func(ctx context.Context, spec AgentRunSpec) (Fragment, error)
AgentDispatcher is the execution seam: when set via WithAgentDispatcher, cogito calls it instead of running the sub-agent in-process. It must return the sub-agent's final Fragment (whose last message content becomes the agent's Result). Returning ErrDispatchFallback makes cogito transparently fall back to the in-process ExecuteTools path. Any other error marks the agent failed. The context governs the sub-agent's lifetime.
type AgentEvent ¶ added in v0.11.0
type AgentEvent struct {
AgentID string // the sub-agent's registry ID
Kind string // one of: running | delta | done | error
Delta string // incremental text (for kind=delta)
Result string // terminal result text (for kind=done)
Err string // error message (for kind=error)
}
AgentEvent is a transport-friendly progress event emitted by an out-of-process executor through AgentRunSpec.Emit. cogito translates it into a tagged StreamEvent for the parent stream callback.
type AgentManager ¶ added in v0.10.0
type AgentManager struct {
// contains filtered or unexported fields
}
AgentManager is a thread-safe registry of background sub-agents.
func NewAgentManager ¶ added in v0.10.0
func NewAgentManager() *AgentManager
NewAgentManager creates a new AgentManager.
func (*AgentManager) Detach ¶ added in v0.11.0
func (m *AgentManager) Detach(id string) error
Detach promotes a running foreground agent to background. The blocked spawn_agent call returns immediately with the agent ID; the agent's goroutine keeps running and the agent becomes an ordinary background agent. Returns an error if the agent is unknown or not detachable (already-background agents carry a nil detach channel).
func (*AgentManager) Get ¶ added in v0.10.0
func (m *AgentManager) Get(id string) (*AgentState, bool)
Get retrieves an agent by ID.
func (*AgentManager) HasRunning ¶ added in v0.10.0
func (m *AgentManager) HasRunning() bool
HasRunning returns true if any registered agent is still running.
func (*AgentManager) Inject ¶ added in v0.11.0
func (m *AgentManager) Inject(id, message string) error
Inject pushes a user-role follow-up message into a running agent's loop. Returns an error if the agent is unknown or has no injection channel.
func (*AgentManager) List ¶ added in v0.10.0
func (m *AgentManager) List() []*AgentState
List returns all registered agents.
func (*AgentManager) Register ¶ added in v0.10.0
func (m *AgentManager) Register(agent *AgentState)
Register adds an agent to the manager.
func (*AgentManager) Wait ¶ added in v0.10.0
func (m *AgentManager) Wait(id string) (*AgentState, error)
Wait blocks until the agent with the given ID completes, then returns it.
type AgentRunSpec ¶ added in v0.11.0
type AgentRunSpec struct {
ID string // registry ID assigned by cogito
Type string // requested agent type name (empty for generic)
Task string // the user task driving the sub-agent
SystemPrompt string // resolved system prompt (from definition or empty)
Model string // resolved model override (may be empty)
Temperature float32 // resolved sampling temperature (may be 0)
Metadata map[string]string // per-request metadata (may be nil)
Tools []string // tool-name allow-list for this run
Background bool // whether spawned in the background
// Emit, when non-nil, lets the executor stream progress back to the
// embedder. cogito wires this to forward tagged sub-agent StreamEvents to
// the parent stream callback. It is safe to ignore.
Emit func(AgentEvent)
}
AgentRunSpec is a portable, self-contained description of a single sub-agent run. It carries everything an out-of-process executor needs to reproduce the run that cogito would otherwise perform in-process via ExecuteTools. cogito still owns all lifecycle bookkeeping (registration, status, done channel, callbacks, completion injection, detach) regardless of where execution happens — the spec is only the execution payload.
type AgentState ¶ added in v0.10.0
type AgentState struct {
ID string
Task string
Type string // requested agent type name (empty for generic)
Status AgentStatusType
Result string
Fragment *Fragment
Error error
Cancel context.CancelFunc
// Background reports whether the agent was spawned to run in the background
// (spawn_agent background=true) rather than in the foreground. Embedders use
// it to tell unattended background work apart from a foreground sub-agent
// whose result is consumed inline by the spawn call.
Background bool
// contains filtered or unexported fields
}
AgentState tracks the lifecycle of a single sub-agent.
type AgentStatusType ¶ added in v0.10.0
type AgentStatusType string
AgentStatusType represents the lifecycle state of a sub-agent.
const ( AgentStatusRunning AgentStatusType = "running" AgentStatusCompleted AgentStatusType = "completed" AgentStatusFailed AgentStatusType = "failed" )
type AutoImproveState ¶ added in v0.10.0
type AutoImproveState struct {
SystemPrompt string `json:"system_prompt"`
ReviewCount int `json:"review_count"`
}
AutoImproveState holds the state for the autoimproving feature. The caller owns this struct and passes a pointer to ExecuteTools via WithAutoImproveState. The state is mutated in-place through the pointer across executions.
type CheckAgentArgs ¶ added in v0.10.0
type CheckAgentArgs struct {
AgentID string `json:"agent_id" description:"The ID of the background agent to check"`
}
CheckAgentArgs are the arguments for checking a background agent's status.
type CheckAgentRunnerForTest ¶ added in v0.10.0
type CheckAgentRunnerForTest struct {
Manager *AgentManager
}
CheckAgentRunnerForTest exposes the checkAgentRunner for testing.
func (*CheckAgentRunnerForTest) Run ¶ added in v0.10.0
func (r *CheckAgentRunnerForTest) Run(args CheckAgentArgs) (string, any, error)
type Fragment ¶
type Fragment struct {
Messages []openai.ChatCompletionMessage
ParentFragment *Fragment
Status *Status
Multimedia []Multimedia
}
func ContentReview ¶
ContentReview refines an LLM response until for a fixed number of iterations or if the LLM doesn't find anymore gaps
func ExecutePlan ¶
func ExecutePlan(llm LLM, conv Fragment, plan *structures.Plan, goal *structures.Goal, opts ...Option) (Fragment, error)
ExecutePlan Executes an already-defined plan with a set of options. To override its prompt, configure PromptPlanExecutionType, PromptPlanType, PromptReEvaluatePlanType and PromptSubtaskExtractionType
func ExecuteTools ¶
ExecuteTools runs a fragment through an LLM, and executes Tools. It returns a new fragment with the tool result at the end The result is guaranteed that can be called afterwards with llm.Ask() to explain the result to the user.
func NewEmptyFragment ¶
func NewEmptyFragment() Fragment
func NewFragment ¶
func NewFragment(messages ...openai.ChatCompletionMessage) Fragment
func (Fragment) AddLastMessage ¶
func (Fragment) AddMessage ¶
func (r Fragment) AddMessage(role MessageRole, content string, mm ...Multimedia) Fragment
func (Fragment) AddStartMessage ¶
func (r Fragment) AddStartMessage(role MessageRole, content string, mm ...Multimedia) Fragment
func (Fragment) AddToolMessage ¶ added in v0.5.1
AddToolMessage adds a tool result message with the specified tool_call_id
func (Fragment) AllFragmentsStrings ¶
AllFragmentsStrings walks through all the fragment parents to retrieve all the conversations and represent that as a string This is particularly useful if chaining different fragments and want to still feed the conversation as a context to the LLM.
func (Fragment) ExtractStructure ¶
ExtractStructure extracts a structure from the result using the provided JSON schema definition and unmarshals it into the provided destination
func (Fragment) GetMessages ¶ added in v0.4.0
func (f Fragment) GetMessages() []openai.ChatCompletionMessage
Messages returns the chat completion messages from this fragment, automatically prepending a force-text-reply system message if tool calls are detected. This ensures LLMs provide natural language responses instead of JSON tool syntax when Ask() is called after ExecuteTools().
func (Fragment) LastAssistantAndToolMessages ¶ added in v0.3.0
func (f Fragment) LastAssistantAndToolMessages() []openai.ChatCompletionMessage
func (Fragment) LastMessage ¶
func (f Fragment) LastMessage() *openai.ChatCompletionMessage
type GetAgentResultArgs ¶ added in v0.10.0
type GetAgentResultArgs struct {
AgentID string `json:"agent_id" description:"The ID of the background agent"`
Wait bool `json:"wait" description:"If true, blocks until the agent finishes. If false, returns immediately with current status."`
}
GetAgentResultArgs are the arguments for retrieving a background agent's result.
type GetAgentResultRunnerForTest ¶ added in v0.10.0
type GetAgentResultRunnerForTest struct {
Manager *AgentManager
Ctx context.Context
}
GetAgentResultRunnerForTest exposes the getAgentResultRunner for testing.
func (*GetAgentResultRunnerForTest) Run ¶ added in v0.10.0
func (r *GetAgentResultRunnerForTest) Run(args GetAgentResultArgs) (string, any, error)
type GuidelineMetadata ¶
type GuidelineMetadataList ¶
type GuidelineMetadataList []GuidelineMetadata
type Guidelines ¶
type Guidelines []Guideline
func GetRelevantGuidelines ¶
func GetRelevantGuidelines(llm LLM, guidelines Guidelines, fragment Fragment, opts ...Option) (Guidelines, error)
func (Guidelines) ToMetadata ¶
func (g Guidelines) ToMetadata() GuidelineMetadataList
type InjectedMessage ¶ added in v0.9.2
type InjectedMessage struct {
Message openai.ChatCompletionMessage
Iteration int // Iteration number when message was injected
}
type IntentionResponseMultiple ¶ added in v0.9.0
type IntentionResponseMultiple struct {
Tools []string `json:"tools"`
Reasoning string `json:"reasoning"`
}
IntentionResponseMultiple is used to extract multiple tool choices from the intention tool
type IntentionResponseSingle ¶ added in v0.9.0
type IntentionResponseSingle struct {
Tool string `json:"tool"`
Reasoning string `json:"reasoning"`
}
IntentionResponseSingle is used to extract a single tool choice from the intention tool
type LLMReply ¶ added in v0.9.2
type LLMReply struct {
ChatCompletionResponse openai.ChatCompletionResponse
ReasoningContent string
}
type MCPToolFilter ¶ added in v0.10.0
type MCPToolFilter = func(session *mcp.ClientSession, toolName string) bool
MCPToolFilter is invoked once per (session, tool) pair during the initial tool-discovery pass. Return false to drop the tool from the agent's discovered set (the LLM never sees it). A nil filter is equivalent to "always allow".
type MessageInjectionResult ¶ added in v0.9.2
type MessageInjectionResult struct {
Count int // Number of messages successfully injected
Position int // Position in fragment where messages were added
}
MessageInjectionResult provides feedback about injected messages
type MessageRole ¶ added in v0.9.0
type MessageRole string
const ( AssistantMessageRole MessageRole = "assistant" UserMessageRole MessageRole = "user" ToolMessageRole MessageRole = "tool" SystemMessageRole MessageRole = "system" )
func (MessageRole) String ¶ added in v0.9.0
func (m MessageRole) String() string
type Option ¶
type Option func(*Options)
var ( // EnableDeepContext enables full context to the LLM when chaining conversations // It might yield to better results to the cost of bigger context use. EnableDeepContext Option = func(o *Options) { o.deepContext = true } // EnableToolReasoner enables the reasoning about the need to call other tools // before each tool call, preventing calling more tools than necessary. EnableToolReasoner Option = func(o *Options) { o.toolReasoner = true } // DisableSinkState disables the use of a sink state // when the LLM decides that no tool is needed DisableSinkState Option = func(o *Options) { o.sinkState = false } // EnableInfiniteExecution enables infinite, long-term execution on Plans EnableInfiniteExecution Option = func(o *Options) { o.infiniteExecution = true } // EnableStrictGuidelines enforces cogito to pick tools only from the guidelines EnableStrictGuidelines Option = func(o *Options) { o.strictGuidelines = true } // EnableAutoPlan enables cogito to automatically use planning if needed EnableAutoPlan Option = func(o *Options) { o.autoPlan = true } // EnableAutoPlanReEvaluator enables cogito to automatically re-evaluate the need to use planning EnableAutoPlanReEvaluator Option = func(o *Options) { o.planReEvaluator = true } // EnableMCPPrompts enables the use of MCP prompts EnableMCPPrompts Option = func(o *Options) { o.mcpPrompts = true } // EnableGuidedTools enables filtering tools through guidance using their descriptions. // When no guidelines exist, creates virtual guidelines for all tools using their descriptions. // When guidelines exist, creates virtual guidelines for tools not in any guideline. EnableGuidedTools Option = func(o *Options) { o.guidedTools = true } // EnableParallelToolExecution enables parallel execution of multiple tool calls. // When enabled, the LLM can select multiple tools and they will be executed concurrently. EnableParallelToolExecution Option = func(o *Options) { o.parallelToolExecution = true } )
EnableAgentSpawning enables sub-agent spawning tools (spawn_agent, check_agent, get_agent_result). When enabled, the LLM can delegate tasks to sub-agents that run in foreground (blocking) or background (non-blocking).
func WithAgentCompletionCallback ¶ added in v0.10.0
func WithAgentCompletionCallback(fn func(*AgentState)) Option
WithAgentCompletionCallback sets a callback that fires when any background sub-agent finishes. Useful for external monitoring or UI updates outside the LLM loop.
func WithAgentCompletionFormatter ¶ added in v0.10.0
func WithAgentCompletionFormatter(fn func(*AgentState) string) Option
WithAgentCompletionFormatter overrides the message a finished background sub-agent injects into the parent loop. By default cogito injects a fixed prose notification ("Background agent <id> has completed…"); set this to control exactly what the parent LLM sees on wake — e.g. a clean structured summary, or a marker a host application can intercept and render itself rather than leaving the model to re-parse prose. The returned string is injected verbatim as a user-role message; returning "" injects an empty message (the default prose is only used when no formatter is set).
func WithAgentDefinitions ¶ added in v0.11.0
func WithAgentDefinitions(defs ...AgentDefinition) Option
WithAgentDefinitions registers named sub-agent types (personas). spawn_agent can select one via its agent_type argument; the chosen definition supplies the system prompt, tool allow-list, model, temperature, and per-type execution limits.
func WithAgentDispatcher ¶ added in v0.11.0
func WithAgentDispatcher(d AgentDispatcher) Option
WithAgentDispatcher installs an execution seam for spawned sub-agents. When set, cogito calls the dispatcher instead of running the sub-agent in-process (e.g. to dispatch the run to a remote worker), while still owning every part of the sub-agent lifecycle: registration, status transitions, the done channel, completion/spawn callbacks, completion-message injection, and foreground detach. A nil dispatcher (the default) preserves the in-process behavior exactly. Returning ErrDispatchFallback from the dispatcher makes cogito run the sub-agent in-process for that call.
func WithAgentLLM ¶ added in v0.10.0
WithAgentLLM sets a separate LLM for sub-agents to use. If not set, sub-agents share the parent's LLM.
func WithAgentLLMFactory ¶ added in v0.11.0
func WithAgentLLMFactory(fn func(model string, temperature float32, metadata map[string]string) LLM) Option
WithAgentLLMFactory sets a factory that builds an LLM for a sub-agent from a model name, temperature, and per-request metadata. Used to resolve per-agent-type or per-spawn model/metadata overrides while reusing the parent's endpoint/credentials.
func WithAgentManager ¶ added in v0.10.0
func WithAgentManager(m *AgentManager) Option
WithAgentManager provides an existing AgentManager for sharing across multiple ExecuteTools calls. If not provided and EnableAgentSpawning is set, a new AgentManager is created automatically.
func WithAgentSpawnCallback ¶ added in v0.11.0
func WithAgentSpawnCallback(fn func(*AgentState)) Option
WithAgentSpawnCallback sets a callback that fires when a sub-agent starts (is registered and about to run), for both foreground and background spawns. Useful for UIs that show running agents. The AgentState has Status=running.
func WithAutoImproveReviewerLLM ¶ added in v0.10.0
WithAutoImproveReviewerLLM sets a separate LLM for the autoimprove review step. If not set, the same LLM passed to ExecuteTools is used.
func WithAutoImproveState ¶ added in v0.10.0
func WithAutoImproveState(state *AutoImproveState) Option
WithAutoImproveState enables the autoimproving feature. The provided state is mutated in-place: after ExecuteTools returns, state.SystemPrompt may have been updated by the review step. Persist and reuse the same pointer across calls.
func WithOnPark ¶ added in v0.10.0
WithOnPark registers a callback fired immediately BEFORE the loop blocks on the message-injection channel at a park gate (i.e. when background work — cogito's own running agents or an embedder's WithPendingWork predicate — is still pending). The callback receives the assistant reply text that preceded the park — the no-tool text reply recorded in the fragment just before the loop blocked — or "" when the model produced none (e.g. a sink-state park). An embedder can use this to surface the parked reply and finalize the current assistant turn the instant the loop parks.
Across a single run the loop may park and resume multiple times (e.g. several injected messages), so onPark may fire multiple times — that is expected.
func WithOnResume ¶ added in v0.10.0
func WithOnResume(fn func()) Option
WithOnResume registers a callback fired immediately AFTER an injected message wakes the loop at a park gate (the resume path). It does NOT fire when the loop unblocks because the injection channel was closed or the context was cancelled. An embedder can use this to start a fresh assistant turn the instant the loop resumes.
Across a single run the loop may park and resume multiple times (e.g. several injected messages), so onResume may fire multiple times — that is expected.
func WithPendingWork ¶ added in v0.10.0
WithPendingWork makes the loop park (waiting on the message-injection channel) while fn returns true, even when cogito's own AgentManager has no running agents. For embedder-owned background work whose completion is delivered by injecting a message (see WithMessageInjectionChan). Pair it with WithMessageInjectionChan so there is a channel to wake on.
type Options ¶
type Options struct {
// contains filtered or unexported fields
}
Options contains all configuration options for the Cogito agent It allows customization of behavior, tools, prompts, and execution parameters
type PlanStatus ¶ added in v0.3.2
type PlanStatus struct {
Plan structures.Plan
Tools []ToolStatus
}
type ReasoningResponse ¶ added in v0.9.1
type ReasoningResponse struct {
Reasoning string `json:"reasoning"`
}
ReasoningResponse is used to extract reasoning from the reasoning tool
type SendAgentMessageArgs ¶ added in v0.11.0
type SendAgentMessageArgs struct {
AgentID string `json:"agent_id" description:"The ID of the agent to message"`
Message string `` /* 150-byte string literal not displayed */
}
SendAgentMessageArgs is the argument for the unified resume/inject tool.
type SessionState ¶ added in v0.7.0
type SessionState struct {
ToolChoice *ToolChoice `json:"tool_choice"`
Fragment Fragment `json:"fragment"`
// AgentID identifies the sub-agent whose tool call is being evaluated.
// Empty for the root agent. Set when the tool-call callback is invoked
// from within a spawned sub-agent (see WithToolCallBack propagation).
AgentID string `json:"agent_id,omitempty"`
}
type SpawnAgentArgs ¶ added in v0.10.0
type SpawnAgentArgs struct {
AgentType string `` /* 140-byte string literal not displayed */
Task string `json:"task" description:"The task or prompt for the sub-agent to execute"`
Background bool `` /* 148-byte string literal not displayed */
Tools []string `` /* 149-byte string literal not displayed */
Model string `json:"model" description:"Optional model override for this sub-agent."`
}
SpawnAgentArgs are the arguments the LLM provides when spawning a sub-agent.
type Status ¶
type Status struct {
LastUsage LLMUsage // Track token usage from the last LLM call
CumulativeUsage LLMUsage // Sum of token usage across every LLM call in the run
Iterations int
ToolsCalled Tools
ToolResults []ToolStatus
Plans []PlanStatus
PastActions []ToolStatus // Track past actions for loop detections
ReasoningLog []string // Track reasoning for each iteration
TODOs *structures.TODOList // TODO tracking for iterative execution
TODOIteration int // Current TODO iteration
TODOPhase string // Current phase: "work" or "review"
InjectedMessages []InjectedMessage // Track successfully injected messages with timing
}
type StreamCallback ¶ added in v0.10.0
type StreamCallback func(StreamEvent)
StreamCallback is a function that receives streaming events.
type StreamEvent ¶ added in v0.10.0
type StreamEvent struct {
Type StreamEventType
Content string // text delta (reasoning/content)
ToolName string // for tool_call/tool_result — name (first chunk only)
ToolArgs string // for tool_call: argument delta string
ToolCallID string // OpenAI tool_call ID (first chunk only)
ToolCallIndex int // which tool call (for parallel tool calls)
ToolResult string // tool result text
FinishReason string // "stop", "tool_calls", etc. (populated on done)
Error error // populated on error
Usage LLMUsage // populated on done
AgentID string // populated for sub-agent events
}
StreamEvent represents a single streaming event from the LLM or tool pipeline.
type StreamEventType ¶ added in v0.10.0
type StreamEventType string
StreamEventType identifies the kind of streaming event.
const ( StreamEventReasoning StreamEventType = "reasoning" // LLM thinking delta StreamEventContent StreamEventType = "content" // answer text delta StreamEventToolCall StreamEventType = "tool_call" // tool selected + args StreamEventToolResult StreamEventType = "tool_result" // tool execution result StreamEventStatus StreamEventType = "status" // status message StreamEventDone StreamEventType = "done" // stream complete StreamEventError StreamEventType = "error" // error StreamEventSubAgent StreamEventType = "sub_agent" // sub-agent event )
type StreamingLLM ¶ added in v0.10.0
type StreamingLLM interface {
LLM
CreateChatCompletionStream(ctx context.Context, request openai.ChatCompletionRequest) (<-chan StreamEvent, error)
}
StreamingLLM extends LLM with streaming support. Consumers should type-assert: if sllm, ok := llm.(StreamingLLM); ok { ... }
type ToolCallDecision ¶ added in v0.7.0
type ToolCallDecision struct {
// Approved: true to proceed with the tool call, false to interrupt execution
Approved bool
// Adjustment: feedback string for the LLM to interpret and adjust the tool call
// Empty string means no adjustment needed. If provided, the LLM will re-evaluate
// the tool call based on this feedback.
Adjustment string
// Modified: directly modified tool choice that takes precedence over Adjustment
// If set, this tool choice is used directly without re-querying the LLM
// This allows programmatic modification of tool arguments
Modified *ToolChoice
// Skip: skip this tool call but continue execution (alternative to Approved: false)
// When true, the tool call is skipped and execution continues
Skip bool
}
ToolCallDecision represents the decision made by a tool call callback It allows the callback to approve, reject, provide adjustment feedback, or directly modify the tool choice
type ToolChoice ¶
type ToolDefinition ¶ added in v0.5.0
type ToolDefinition[T any] struct { ToolRunner Tool[T] InputArguments any Name, Description string }
func (*ToolDefinition[T]) Execute ¶ added in v0.5.0
Execute implements ToolDef.Execute by marshaling the arguments map to type T and calling ToolRunner.Run
func (ToolDefinition[T]) Tool ¶ added in v0.5.0
func (t ToolDefinition[T]) Tool() openai.Tool
type ToolDefinitionInterface ¶ added in v0.5.0
type ToolDefinitionInterface interface {
Tool() openai.Tool
// Execute runs the tool with the given arguments (as JSON map) and returns the result
Execute(args map[string]any) (string, any, error)
}
func NewToolDefinition ¶ added in v0.5.0
func NewToolDefinition[T any](toolRunner Tool[T], inputArguments any, name, description string) ToolDefinitionInterface
type ToolStatus ¶
type ToolStatus struct {
Executed bool
ToolArguments ToolChoice
Result string
Name string
ResultData any
}
type Tools ¶
type Tools []ToolDefinitionInterface
func FilterToolsForSubAgent ¶ added in v0.10.0
FilterToolsForSubAgent returns a subset of parent tools suitable for a sub-agent. If requestedTools is non-empty, only those named tools are included. Agent management tools are excluded by default.
func (Tools) Definitions ¶
func (t Tools) Definitions() []*openai.FunctionDefinition
func (Tools) Find ¶
func (t Tools) Find(name string) ToolDefinitionInterface