Agent Methods

Метод — это способ исполнения задачи агентом. Один агент может иметь несколько методов с разными приоритетами.

Концепция

Методы хранятся в таблице agent_methods. Каждый метод имеет тип (type), ссылку (method_ref) и приоритет. При выполнении задачи агент выбирает метод с наивысшим приоритетом.

n8n_workflow

Исполнение через n8n workflow. method_ref = имя workflow

internal_api

Вызов внутреннего API endpoint. method_ref = путь

process

Запуск процесса через /internal/process/execute

llm_direct

Прямой вызов LLM. method_ref = модель

Структура agent_methods

Файл: db/init/374_agent_methods.sql

CREATE TABLE clowbot.agent_methods (
  method_id       uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  agent_code      text NOT NULL REFERENCES agent_profile(agent_code) ON DELETE CASCADE,
  method_type     text NOT NULL DEFAULT 'n8n_workflow',  -- Тип метода
  method_name     text NOT NULL,                         -- Имя метода
  method_ref      text NOT NULL,                         -- Ссылка (workflow name / API path / model)
  description     text NOT NULL DEFAULT '',
  input_contract  jsonb NOT NULL DEFAULT '{}'::jsonb,    -- Контракт входа
  output_contract jsonb NOT NULL DEFAULT '{}'::jsonb,    -- Контракт выхода
  is_enabled      boolean NOT NULL DEFAULT true,
  priority        integer NOT NULL DEFAULT 100,          -- Приоритет (выше = лучше)
  created_at      timestamptz NOT NULL DEFAULT now(),
  updated_at      timestamptz NOT NULL DEFAULT now(),
  UNIQUE (agent_code, method_name)
);

CREATE INDEX idx_agent_methods_agent
  ON clowbot.agent_methods (agent_code, priority DESC)
  WHERE is_enabled = true;

Пример INSERT

Файл: db/init/376_seed_agent_methods.sql

-- web_researcher имеет 4 метода с разным приоритетом
INSERT INTO clowbot.agent_methods (agent_code, method_type, method_name, method_ref, description, priority)
VALUES
  ('web_researcher', 'n8n_workflow', 'web_search', 'web-search', 'Web search via n8n workflow', 100),
  ('web_researcher', 'n8n_workflow', 'web_research_brief', 'web-research-brief', 'Deep web research via n8n', 90),
  ('web_researcher', 'process', 'web_search_local', 'web_search', 'Local web search process fallback', 80),
  ('web_researcher', 'internal_api', 'web_search_api', '/internal/web/search', 'Direct web search API', 70);

При выполнении web_researcher сначала попробует n8n workflow (p=100), если не доступен — fallback на process (p=80).

Каталог методов по агентам

Данные из db/init/376_seed_agent_methods.sql

core_orchestrator

processdefault_chat
p:100
default_chat
Default LLM chat process
internal_apiagent_select
p:90
/internal/agent/select
Select agent for intent/process
internal_apiprocess_execute
p:80
/internal/process/execute
Execute any process

web_researcher

n8n_workflowweb_search
p:100
web-search
Web search via n8n workflow
n8n_workflowweb_research_brief
p:90
web-research-brief
Deep web research via n8n
processweb_search_local
p:80
web_search
Local web search process fallback
internal_apiweb_search_api
p:70
/internal/web/search
Direct web search API

coder_executor

internal_apidb_query
p:100
/internal/tool/db-query
SQL sandbox query
processcode_execute
p:90
default_chat
Code generation via LLM
llm_directllm_code
p:80
qwen2.5-coder:3b
Direct LLM call with coder model

sql_analyst

internal_apidb_query
p:100
/internal/tool/db-query
SQL sandbox query
internal_apikpi_summary
p:90
/internal/kpi/summary
KPI summary from tracking data

task_decomposer

internal_apitask_decompose
p:100
/internal/task/decompose
Decompose task into subtasks
internal_apitask_execute_next
p:90
/internal/task/execute-next
Execute next pending subtask
internal_apitask_aggregate
p:80
/internal/task/aggregate
Aggregate subtask results

summarizer

processdaily_digest
p:100
daily_digest
Daily digest process
llm_directllm_summarize
p:90
phi4-mini
Direct LLM summarization

critic_reviewer

llm_directllm_review
p:100
gemma3:4b
LLM review and evaluation

memory_keeper

internal_apirag_search
p:100
/internal/rag/search
Semantic search over RAG
internal_apirag_index
p:90
/internal/rag/index-document
Index document for RAG
internal_apidb_query
p:80
/internal/tool/db-query
SQL query for context

n8n_composer

internal_apislot_rotate
p:100
/internal/n8n/slot-rotate
Rotate n8n workflow slots
internal_apiprocess_execute
p:90
/internal/process/execute
Execute process for testing
llm_directllm_compose
p:80
qwen2.5-coder:3b
Generate n8n workflow JSON

Sub-agent отношения

Таблица agent_sub_agents определяет, какие агенты могут делегировать задачи другим.

CREATE TABLE clowbot.agent_sub_agents (
  parent_agent_code text REFERENCES agent_profile(agent_code),
  child_agent_code  text REFERENCES agent_profile(agent_code),
  delegation_rules  jsonb NOT NULL DEFAULT '{}'::jsonb,  -- Условия делегирования
  priority          integer NOT NULL DEFAULT 100,
  PRIMARY KEY (parent_agent_code, child_agent_code)
);

Примеры delegation_rules:

-- core_orchestrator делегирует task_decomposer при высокой сложности
INSERT INTO agent_sub_agents VALUES (
  'core_orchestrator', 'task_decomposer',
  '{"when_complexity": "high", "when_execution_mode": "multi_step", "auto_delegate": true}',
  100
);

-- core_orchestrator делегирует web_researcher при web_search
INSERT INTO agent_sub_agents VALUES (
  'core_orchestrator', 'web_researcher',
  '{"when_task_type": ["web_search", "research"], "auto_delegate": true}',
  90
);

-- memory_keeper не делегируется автоматически
INSERT INTO agent_sub_agents VALUES (
  'core_orchestrator', 'memory_keeper',
  '{"when_task_type": ["memory", "context"], "auto_delegate": false}',
  50
);
ParentChildConditionAuto
core_orchestratortask_decomposercomplexity=high, multi_steptrue
core_orchestratorweb_researchertask_type=[web_search, research]true
core_orchestratorcoder_executortask_type=[code, sql]true
task_decomposerweb_researchersubtask_type=web_searchtrue
coder_executorcritic_reviewersubtask_type=reviewtrue

Как добавить новый метод

  1. 1. Определить тип метода (n8n_workflow / internal_api / process / llm_direct)
  2. 2. Создать миграцию в db/init/:
    INSERT INTO clowbot.agent_methods (
      agent_code, method_type, method_name, method_ref,
      description, priority, input_contract, output_contract
    ) VALUES (
      'my_agent', 'internal_api', 'my_method', '/internal/my/endpoint',
      'Description of what this method does', 100,
      '{"param": "string"}'::jsonb,
      '{"result": "object"}'::jsonb
    );
  3. 3. Если internal_api — реализовать endpoint в bot/app/api/
  4. 4. Если n8n_workflow — создать workflow в n8n/workflows/
  5. 5. Протестировать через /internal/agent/select + /internal/process/execute

Связи