Skip to content

SimpleORM 3.03.01 — Agents, Skills & Rules

Choose a tag to compare

@bittencourtthulio bittencourtthulio released this 10 Mar 11:15
· 83 commits to master since this release

SimpleORM 3.03.01 — Agents, Skills & Rules

O SimpleORM agora conta com um pipeline de middleware completo no DAO. Alem de toda a inteligencia artificial da versao anterior, esta versao traz Rules (regras declarativas), Skills (plugins reutilizaveis) e Agents (orquestradores reativos e proativos) — tudo opcional e retrocompativel.


🎯 Rules (Regras Declarativas) — NOVO!

Regras de negocio como atributos na entidade. Avaliadas automaticamente durante CRUD — sem configuracao no DAO.

Atributo O que faz
[Rule('VALOR > 0', raBeforeInsert, 'msg')] Regra deterministica com parser de expressoes
[AIRule('Verificar se endereco e valido', raBeforeInsert)] Regra inteligente avaliada pelo LLM
[Tabela('PEDIDOS')]
[Rule('VALOR > 0', raBeforeInsert, 'Valor deve ser positivo')]
[Rule('STATUS <> ''CANCELADO''', raBeforeUpdate, 'Pedido cancelado nao pode ser alterado')]
[AIRule('Verificar se a combinacao de produtos faz sentido comercial', raBeforeInsert)]
TPedido = class
published
  [Campo('VALOR')]
  property VALOR: Currency;
  [Campo('STATUS')]
  property STATUS: String;
end;

// Rules sao avaliadas AUTOMATICAMENTE no Insert/Update/Delete
DAOPedido.Insert(Pedido);  // Se VALOR <= 0, lanca ESimpleRuleViolation
  • 6 momentos de execucao: raBeforeInsert, raAfterInsert, raBeforeUpdate, raAfterUpdate, raBeforeDelete, raAfterDelete
  • Parser de expressoes suporta: >, <, >=, <=, =, <> com propriedades, numeros e strings
  • AIRule envia contexto da entidade ao LLM para validacao inteligente

⚡ Skills (Plugins Reutilizaveis) — NOVO!

Unidades de comportamento que se plugam ao DAO via fluent API. Executam antes ou depois de operacoes CRUD.

Skills Built-in

Skill O que faz
TSkillLog Loga operacoes com detalhes da entidade
TSkillNotify Dispara callback/evento apos operacao
TSkillAudit Grava registro de auditoria em tabela do banco
DAOPedido := TSimpleDAO<TPedido>.New(Conn)
  .Skill(TSkillLog.New('app', srAfterInsert))
  .Skill(TSkillAudit.New('AUDIT_LOG', srAfterInsert))
  .Skill(TSkillNotify.New(
    procedure(aObj: TObject)
    begin
      EnviarEmail('Novo pedido inserido!');
    end, srAfterInsert));

DAOPedido.Insert(Pedido);  // Skills executam automaticamente!

Criar Skill Customizado

TSkillEnviarEmail = class(TInterfacedObject, iSimpleSkill)
  function Execute(aEntity: TObject; aContext: iSimpleSkillContext): iSimpleSkill;
  function Name: String;
  function RunAt: TSkillRunAt;
end;

🤖 Agents (Orquestradores) — NOVO!

Agentes que combinam Rules, Skills e operacoes CRUD. Dois modos de operacao:

Modo Reativo — Reage a eventos do DAO

LAgent := TSimpleAgent.New;
LAgent.When(TPedido, aoAfterInsert)
  .Condition(function(aEntity: TObject): Boolean
    begin
      Result := TPedido(aEntity).VALOR > 5000;
    end)
  .Execute(TSkillEnviarEmail.New('gerente@empresa.com'))
  .Execute(TSkillLog.New('alto-valor'));

DAOPedido := TSimpleDAO<TPedido>.New(Conn).Agent(LAgent);
DAOPedido.Insert(Pedido);  // Agent reage se VALOR > 5000

Modo Proativo — Linguagem natural via LLM

LAgent := TSimpleAgent.New(Conn, AIClient);
LAgent.RegisterEntity<TPedido>.RegisterEntity<TCliente>;

// SafeMode: planejar antes de executar
LPlan := LAgent.Plan('Listar pedidos pendentes de hoje');
Writeln(LPlan.Description);  // "Consultar pedidos com status PENDENTE"
Writeln(LPlan.Risk);         // LOW, MEDIUM ou HIGH
LPlan.Execute;

🔄 Pipeline do DAO

Toda operacao CRUD agora passa por um pipeline completo:

1. Rules (Before)        — [Rule] e [AIRule] com raBeforeInsert/Update/Delete
2. AI Attributes         — [AIGenerated], [AISummarize], etc.
3. Skills (Before)       — Skills com srBeforeInsert/Update/Delete
4. SQL Execution         — INSERT/UPDATE/DELETE real no banco
5. Skills (After)        — Skills com srAfterInsert/Update/Delete
6. Agent (React)         — Reactions para aoAfterInsert/Update/Delete

Tudo opcional: sem Rules, Skills ou Agents, o DAO funciona exatamente como antes.


🤖 MCP Server (Model Context Protocol)

Servidor MCP embutido que permite AI assistants como Claude, Cursor e GitHub Copilot interagirem diretamente com o banco de dados da sua aplicacao.

  • Registro declarativo de entidades com permissoes granulares (mcpRead, mcpInsert, mcpUpdate, mcpDelete, mcpCount, mcpDDL)
  • Ate 8 tools gerados automaticamente por entidade (describe, query, get, insert, update, delete, count, ddl)
  • Transporte Stdio para integracao local com Claude Desktop e editores
  • Transporte HTTP via Horse com autenticacao Bearer Token
  • Tool raw_query para consultas SQL livres com validacao de seguranca (SELECT-only)
  • Protocolo JSON-RPC 2.0 completo com initialize, tools/list, tools/call e ping
// 3 linhas para expor sua aplicacao para AI
Server := TSimpleMCPServer.Create('MinhaApp', Query);
Server.RegisterEntity<TPedido>([mcpRead, mcpInsert, mcpCount]);
RunStdioLoop(Server);

🧠 AI Entity Enrichment

Enriqueca entidades automaticamente com IA usando atributos declarativos. O processamento acontece automaticamente durante Insert e Update.

5 Atributos AI

Atributo O que faz
[AIGenerated('prompt com {Campo}')] Gera conteudo via LLM com interpolacao de campos
[AISummarize('Campo', maxLen)] Resume o conteudo de outra propriedade
[AITranslate('Campo', 'English')] Traduz automaticamente para outro idioma
[AIClassify('Campo', 'Cat1,Cat2,Cat3')] Classifica em categorias pre-definidas
[AIValidate('regra')] Valida conteudo via LLM, lanca excecao se invalido
[Tabela('PRODUTOS')]
TProduto = class
published
  [Campo('DESCRICAO')]
  property DESCRICAO: String;

  [Campo('RESUMO'), AISummarize('DESCRICAO', 100)]
  property RESUMO: String;               // Resumido automaticamente!

  [Campo('CATEGORIA'), AIClassify('DESCRICAO', 'Eletronico,Vestuario,Alimento')]
  property CATEGORIA: String;            // Classificado automaticamente!

  [Campo('DESCRICAO_EN'), AITranslate('DESCRICAO', 'English')]
  property DESCRICAO_EN: String;         // Traduzido automaticamente!
end;

DAOProduto := TSimpleDAO<TProduto>.New(Conn)
  .AIClient(TSimpleAIClient.New('claude', 'api-key'));
DAOProduto.Insert(Produto);  // AI processa ANTES do INSERT!

💬 AI Query — Linguagem Natural para SQL

Faca perguntas ao banco de dados em linguagem natural. O SimpleORM traduz para SQL, executa e retorna os resultados.

Metodo O que faz
NaturalLanguageQuery(pergunta) Traduz para SQL, executa, retorna TDataSet
AskQuestion(pergunta) Executa e retorna resposta em linguagem natural
ExplainQuery(sql) Explica uma query SQL em linguagem natural
SuggestQuery(objetivo) Sugere SQL baseado em um objetivo
AIQuery := TSimpleAIQuery.New(Query, AIClient);
AIQuery.RegisterEntity<TCliente>.RegisterEntity<TPedido>;

LDataSet := AIQuery.NaturalLanguageQuery('Top 5 clientes por valor de compras');
LResposta := AIQuery.AskQuestion('Qual o ticket medio de vendas?');

🔌 Client AI Generico

TSimpleAIClient funciona com Claude (Anthropic) e OpenAI — basta trocar o provider:

LAI := TSimpleAIClient.New('claude', 'sk-ant-...');  // Claude
LAI := TSimpleAIClient.New('openai', 'sk-...');      // OpenAI

📊 Numeros desta Release

Metrica Valor
Novas units 11 (SimpleRules, SimpleSkill, SimpleAgent, SimpleAIClient, SimpleAIAttributes, SimpleAIProcessor, SimpleAIQuery, SimpleMCPServer, SimpleMCPTypes, SimpleMCPTransport.Stdio, SimpleMCPTransport.Http)
Novos testes 77 DUnit tests (11 Rules + 8 Skills + 9 Agent + 9 MCP + 16 AI Processor + 24 AI Query)
Novos samples 5 projetos (AgentsSkillsRules, MCPServer/Stdio, MCPServer/Http, AIEnrichment, AIQuery)
Providers suportados Claude (Anthropic) e OpenAI
Transportes MCP Stdio e HTTP (Horse)

📖 Documentacao


Compatibilidade: Todas as features sao opcionais. Projetos existentes continuam funcionando sem nenhuma alteracao. O pipeline so e ativado quando Rules, Skills ou Agents sao configurados.

Instalacao: boss install academiadocodigo/SimpleORM