Agent Development

Чеклист создания нового агента. Следуем Policy E: draft → review → approval → deploy.

Governance (Policy E)

Policy E — Draft Before Deploy: Новые агенты/процессы/workflows: draft → review → approval → deploy. No auto-deploy for critical things.

1

Draft

Черновик в миграции

2

Review

Код-ревью + тест

3

Approval

Подтверждение

4

Deploy

is_active=true

Чеклист создания агента

1

Определить цель и описание

  • Сформулировать goal — что агент делает (добавляется в system prompt)
  • Написать description — человеческое описание для документации
  • Определить уникальный agent_code (snake_case)
-- Пример: agent для финансовой аналитики
agent_code: 'finance_analyst'
goal: 'Analyze financial data and produce investment insights'
description: 'Runs financial calculations, risk assessments, and portfolio analysis'
2

Определить инструменты

  • allowed_tools — что агент МОЖЕТ использовать
  • forbidden_tools — что агент НЕ МОЖЕТ использовать (safety)
  • Проверить, что инструменты реализованы в internal_api или n8n
-- finance_analyst: может читать данные, но не может web_search
allowed_tools: ARRAY['db_query', 'rag_search']
forbidden_tools: ARRAY['web_search']  -- Safety: нет внешних запросов
3

Выбрать модели

  • preferred_models — модели в порядке предпочтения
  • Учитывать задачу: код → qwen2.5-coder, анализ → gemma3:4b
  • Указать fallback модель (обычно phi4-mini)
-- Для финансового анализа нужна точность
preferred_models: ARRAY['gemma3:4b', 'phi4-mini']
default_temperature: 0.3  -- Низкая для точности
4

Определить response_contract

  • format — markdown / json / code
  • max_tokens — максимальная длина ответа
  • language — auto / en / ru
response_contract: '{
  "format": "markdown",
  "max_tokens": 2048,
  "language": "auto"
}'::jsonb
5

Определить поведенческие параметры

  • chat_mode — both / interactive / background
  • max_delegation_depth — 0-3 (глубина делегирования)
  • can_create_methods — true/false (может создавать методы)
-- Финансовый агент: интерактивный, не делегирует
chat_mode: 'interactive'
max_delegation_depth: 0
can_create_methods: false
6

Создать миграцию

  • Файл: db/init/XXX_my_agent.sql (XXX — номер миграции)
  • INSERT INTO agent_profile с is_active=false (draft)
  • INSERT INTO agent_selection_policy для маппинга intent
-- db/init/400_finance_analyst.sql
INSERT INTO clowbot.agent_profile (
  agent_code, goal, description,
  allowed_tools, forbidden_tools, preferred_models,
  default_temperature, response_contract,
  chat_mode, max_delegation_depth, can_create_methods,
  is_active
) VALUES (
  'finance_analyst',
  'Analyze financial data and produce investment insights',
  'Runs financial calculations, risk assessments, and portfolio analysis',
  ARRAY['db_query', 'rag_search'],
  ARRAY['web_search'],
  ARRAY['gemma3:4b', 'phi4-mini'],
  0.3,
  '{"format": "markdown", "max_tokens": 2048}'::jsonb,
  'interactive',
  0,
  false,
  false  -- Draft mode
);

INSERT INTO clowbot.agent_selection_policy (
  agent_code, match_intent, match_process_code, match_scope, priority
) VALUES (
  'finance_analyst',
  ARRAY['finance', 'investment', 'portfolio'],
  ARRAY[],
  ARRAY['direct'],
  80
);
7

Добавить методы (опционально)

  • Если нужны специфичные методы — INSERT INTO agent_methods
  • Определить method_type: n8n_workflow / internal_api / process / llm_direct
  • Указать input_contract и output_contract
INSERT INTO clowbot.agent_methods (
  agent_code, method_type, method_name, method_ref,
  description, priority, input_contract, output_contract
) VALUES (
  'finance_analyst', 'internal_api', 'portfolio_analysis',
  '/internal/finance/portfolio',
  'Portfolio risk analysis', 100,
  '{"portfolio_id": "uuid"}'::jsonb,
  '{"risk_score": "number", "recommendations": "array"}'::jsonb
);
8

Тестирование (smoke test)

  • Вызвать POST /internal/agent/select с intent агента
  • Проверить, что вернулся правильный agent_code
  • Вызвать POST /internal/process/execute с тестовым запросом
  • Проверить ответ в Telegram
# Smoke test
curl -X POST http://localhost:28000/internal/agent/select \
  -H "Authorization: Bearer $INTERNAL_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"intent": "finance", "scope": "direct"}'

# Ожидаем: selected_agent_code = "finance_analyst"
9

Review и Approval

  • Отправить на code review
  • Получить approval от владельца
  • Документировать в wiki
10

Deploy

  • UPDATE agent_profile SET is_active = true WHERE agent_code = '...'
  • Создать финальную миграцию с is_active=true
  • Протестировать в production
-- Миграция для активации
UPDATE clowbot.agent_profile
SET is_active = true, updated_at = now()
WHERE agent_code = 'finance_analyst';

Полный пример: Создание telegram_notifier

-- db/init/401_telegram_notifier.sql
-- Agent for scheduled Telegram notifications

INSERT INTO clowbot.agent_profile (
  agent_code, goal, description,
  allowed_tools, forbidden_tools, preferred_models,
  default_temperature, response_contract,
  chat_mode, max_delegation_depth, can_create_methods,
  is_active
) VALUES (
  'telegram_notifier',
  'Send scheduled notifications and reminders to users via Telegram',
  'Handles recurring reminders, daily digests, and scheduled messages',
  ARRAY['db_query'],                    -- Can read DB for schedules
  ARRAY['web_search'],                  -- No web access needed
  ARRAY['phi4-mini'],
  0.5,
  '{"format": "markdown", "max_tokens": 1024, "language": "auto"}'::jsonb,
  'background',                         -- Only triggered by scheduler
  0,                                    -- No delegation
  false,
  true                                  -- Active immediately (non-critical)
);

-- Selection policy
INSERT INTO clowbot.agent_selection_policy (
  agent_code, match_intent, match_process_code, match_scope, priority
) VALUES (
  'telegram_notifier',
  ARRAY['notify', 'reminder', 'schedule'],
  ARRAY['daily_digest', 'content_factory_digest'],
  ARRAY['direct', 'group'],
  60
);

-- Methods
INSERT INTO clowbot.agent_methods (
  agent_code, method_type, method_name, method_ref, description, priority
) VALUES
  ('telegram_notifier', 'process', 'daily_digest', 'daily_digest', 'Daily digest process', 100),
  ('telegram_notifier', 'internal_api', 'send_reminder', '/internal/reminder/send', 'Send reminder', 90);

Quick Reference

ПолеОбязательноеПример
agent_code'my_agent'
goal'Do X and produce Y'
description'Human readable description'
allowed_toolsARRAY['db_query']
forbidden_toolsARRAY['web_search']
preferred_modelsARRAY['phi4-mini']
default_temperature0.7
response_contract{format: markdown}
chat_mode❌ default: both'background'
max_delegation_depth❌ default: 02
is_active❌ default: truefalse (draft)

Связи