n8n-nodes-tembory 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -151
- package/dist/nodes/Tembory/GenericFunctions.js +12 -1
- package/dist/nodes/Tembory/TemboryMemory.node.js +16 -135
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,198 +2,75 @@
|
|
|
2
2
|
|
|
3
3
|
Node de memoria operacional da Tembory para agentes de IA no n8n.
|
|
4
4
|
|
|
5
|
-
Versao atual: `1.
|
|
5
|
+
Versao atual: `1.1.1`.
|
|
6
6
|
|
|
7
|
-
## 1.
|
|
7
|
+
## 1.1.1
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
- Torna a entrada `LLM` obrigatoria no node.
|
|
10
|
+
- Remove opcoes visiveis de vetor, grafo e configuracao legada da interface do node.
|
|
11
|
+
- Forca o resumo SLM como parte do contrato de producao.
|
|
12
|
+
- Mantem o registro de tools, inputs, outputs, status, action ledger, working memory e decision state por fluxo operacional.
|
|
12
13
|
|
|
13
|
-
##
|
|
14
|
+
## Visao geral
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
- Torna `next_expected_action` mais coercitivo para agenda: usa `MUST call ...` e proibe respostas como "se quiser/posso" no lugar da tool obrigatoria.
|
|
17
|
-
- Reduz o peso instrucional de `first_user_message`; o foco passa a ser mensagem atual, mensagem anterior e transcript cronologico recente.
|
|
16
|
+
O Tembory entrega contexto operacional para o AI Agent sem depender apenas do historico textual da conversa. Ele combina transcript curto, profile facts, tool history, estado operacional, action ledger, working memory, decision state, active summary persistente, compressao de memoria e diagnosticos.
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- Considera disponibilidade recente no transcript como contexto operacional valido quando `tool_history` ainda nao foi recuperado no turno.
|
|
22
|
-
- Evita repetir `agenda_consultar_disponibilidade` apos o agente ja ter respondido vagas no historico recente.
|
|
23
|
-
- Direciona selecao de horario como "quero dia 13" para `agenda_pre_reservar_horario` quando ha vagas recentes, mesmo sem marker estruturado no contexto atual.
|
|
24
|
-
|
|
25
|
-
## 1.0.28
|
|
26
|
-
|
|
27
|
-
- Limpa blocos tecnicos de tool (`Used tools` / `Calling ...`) antes de salvar mensagens do assistente no transcript.
|
|
28
|
-
- Mantem tool history estruturado separado do texto da conversa, inclusive no modo com embedding conectado pelo n8n.
|
|
29
|
-
- Ordena o frame de conversa com mensagem do usuario antes da resposta do assistente quando o timestamp empata.
|
|
30
|
-
- Extrai fatos basicos do usuario como nome, idade, cidade e interesses a partir de mensagens normais.
|
|
31
|
-
- Reduz duplicacao no contexto compacto removendo markers de recent message/tool quando ja ha secoes estruturadas.
|
|
32
|
-
|
|
33
|
-
## 1.0.27
|
|
34
|
-
|
|
35
|
-
- Aumenta a janela deterministica de conversa para 30 mensagens por padrao em todos os presets de producao.
|
|
36
|
-
- Entrega `conversation_history_chronological` e `all_user_messages_chronological` no frame de conversa.
|
|
37
|
-
- Para conversas curtas/medias, o historico completo recente vira a fonte primaria; vetor e resumo ficam como complemento.
|
|
38
|
-
|
|
39
|
-
## 1.0.26
|
|
40
|
-
|
|
41
|
-
- Adiciona `first_user_message` ao frame de conversa para perguntas como "qual foi minha primeira mensagem?".
|
|
42
|
-
- Preserva a primeira mensagem do usuario mesmo quando a janela recente e podada.
|
|
43
|
-
- Amplia a busca vetorial auxiliar de transcript para recuperar mensagens iniciais da sessao.
|
|
44
|
-
|
|
45
|
-
## 1.0.25
|
|
46
|
-
|
|
47
|
-
- Carrega a janela recente tambem a partir de memorias vetoriais com `kind=recent_message`.
|
|
48
|
-
- Adiciona uma busca auxiliar de transcript recente no modo BYO-AI para perguntas como "qual foi minha ultima mensagem" e "o que eu ja disse".
|
|
49
|
-
- Evita depender do endpoint legado `/v1/memories/` para reconstruir conversa curta.
|
|
50
|
-
|
|
51
|
-
## 1.0.24
|
|
52
|
-
|
|
53
|
-
- Corrige falha `409 Backend LLM/embedder is disabled` no `saveContext` quando o node usa embeddings conectados pelo n8n.
|
|
54
|
-
- Writes legados de transcript/tool markers agora sao best-effort no modo BYO-AI, sem derrubar a execucao do agente.
|
|
55
|
-
- Remove o prefixo tecnico `THREAD:<id>` usado em testes MCP antes de montar query/contexto de memoria.
|
|
56
|
-
|
|
57
|
-
## 1.0.23
|
|
58
|
-
|
|
59
|
-
- Corrige o frame de conversa para nao repetir a mensagem atual em `previous_user_message` quando ainda nao existe mensagem anterior real.
|
|
60
|
-
- Mantem `previous_user_message: null` explicitamente em perguntas de recall no primeiro turno, evitando respostas erradas sobre "ultima mensagem".
|
|
61
|
-
|
|
62
|
-
## 1.0.22
|
|
63
|
-
|
|
64
|
-
- Corrige persistencia do transcript quando ha embedding conectado: mensagens recentes tambem sao gravadas como markers estruturados em `/v1/memories/`.
|
|
65
|
-
- Persiste tool history estruturado por padrao quando `includeToolHistory` esta ativo, mesmo sem `persistToolFactsToTembory`.
|
|
66
|
-
- Resolve falha real em n8n onde cada execucao carregava apenas a mensagem atual no `Conversation frame`.
|
|
67
|
-
|
|
68
|
-
## 1.0.21
|
|
69
|
-
|
|
70
|
-
- O contexto principal passa a anexar o input atual do agente ao transcript antes de renderizar memoria.
|
|
71
|
-
- `Conversation frame` agora inclui `recent_messages_chronological`, com janela curta usuario/assistente em ordem.
|
|
72
|
-
- Mesmo antes do `saveContext`, o agente recebe a mensagem atual e a mensagem anterior do cliente no contexto estrutural.
|
|
73
|
-
|
|
74
|
-
## 1.0.20
|
|
75
|
-
|
|
76
|
-
- Torna `Conversation frame` obrigatorio em todo contexto estruturado, antes de estado operacional e historico de tools.
|
|
77
|
-
- Expõe `current_user_message`, `previous_user_message` e ultimas mensagens do cliente como fonte autoritativa de curto prazo.
|
|
78
|
-
- Remove a dependencia de detectar termos como `msg`/`mensagem` para o agente conseguir responder sobre a ultima mensagem do cliente.
|
|
79
|
-
|
|
80
|
-
## 1.0.19
|
|
81
|
-
|
|
82
|
-
- Amplia a deteccao de metaconversa para abreviacoes como `msg` e `msgs`.
|
|
83
|
-
- Adiciona regressao para "qual foia minha ultima msg?" com disponibilidade carregada, garantindo resposta pela mensagem anterior e nao pela agenda.
|
|
84
|
-
|
|
85
|
-
## 1.0.18
|
|
86
|
-
|
|
87
|
-
- Corrige perguntas de metaconversa como "qual foi minha ultima mensagem?" para priorizar a mensagem recente exata, mesmo quando existe estado de agenda ativo.
|
|
88
|
-
- Corrige perguntas de status como "eu nao tinha agendado ainda, neh?" para responder se ha reserva/agendamento confirmado ou pendente, em vez de repetir disponibilidade.
|
|
89
|
-
- Inclui um bloco `Current turn focus` no contexto para proteger a intencao atual contra tool state antigo.
|
|
90
|
-
- Adiciona regressao para typos comuns como `agnedamento`/`ganedado` em perguntas de agenda.
|
|
91
|
-
|
|
92
|
-
## 1.0.17
|
|
93
|
-
|
|
94
|
-
- Oculta `Avançado Legado (Compatibilidade)` da interface normal para evitar duplicidade visual com `Configuração Tembory`.
|
|
95
|
-
- Mantem o campo legado no descriptor e no runtime para workflows antigos que ja salvaram parametros em `advanced`.
|
|
96
|
-
- A UI normal passa a mostrar apenas a configuracao agrupada.
|
|
97
|
-
|
|
98
|
-
## 1.0.16
|
|
99
|
-
|
|
100
|
-
- Corrige compatibilidade da UI agrupada com o processamento de parametros do n8n.
|
|
101
|
-
- Mantem `Configuração Tembory` como `fixedCollection`, mas remove o default estrutural pre-preenchido que podia quebrar a renderizacao do editor em alguns runtimes.
|
|
102
|
-
- Preserva os defaults de producao no runtime via `productionBalanced`, mesmo quando os grupos da UI ainda nao foram adicionados manualmente.
|
|
103
|
-
- Adiciona validacao local com `NodeHelpers.getNodeParameters` do `n8n-workflow` para evitar regressao de tela em branco.
|
|
104
|
-
|
|
105
|
-
## 1.0.15
|
|
106
|
-
|
|
107
|
-
- Reorganiza a interface do node em `Configuração Tembory`, com grupos para Essenciais, Mais Inteligência, Controles Avançados de Busca, Resumo e Estado Persistente, e Diagnóstico e Auditoria.
|
|
108
|
-
- Mantém a coleção legada `Avançado` para compatibilidade com workflows já existentes.
|
|
109
|
-
- Define `Produção Balanceada` como preset padrão para novas configurações.
|
|
110
|
-
- Prioriza IDs estáveis de thread/conversa/contato/cliente antes de `sessionId` na expressão padrão do `ID da Thread`.
|
|
111
|
-
- Adiciona teste para validar a mesclagem dos grupos da nova UI com os presets operacionais.
|
|
112
|
-
|
|
113
|
-
## 1.0.14
|
|
114
|
-
|
|
115
|
-
- Adiciona Active Summary persistente por namespace/thread para continuar conversas depois de minutos, horas ou dias.
|
|
116
|
-
- Separa cache tecnico curto do resumo SLM da memoria ativa persistente.
|
|
117
|
-
- Aumenta os defaults do resumo SLM nos presets de producao para preservar mais inteligencia antes de comprimir para o agente.
|
|
118
|
-
- Adiciona diagnosticos para saber se o contexto veio de SLM novo, active summary ou cache tecnico.
|
|
119
|
-
- Expõe controles avancados de Active Summary e cache tecnico no node.
|
|
120
|
-
|
|
121
|
-
O Tembory entrega contexto rico para o AI Agent sem depender apenas do historico textual da conversa. Ele combina memoria semantica, working memory, decision state, fatos estaveis do lead, historico de tools, estado operacional, action ledger, timeline de entidades, compressao de memoria, grafo, mensagens recentes e diagnosticos.
|
|
122
|
-
|
|
123
|
-
Nos presets de producao, o contexto e organizado como um pacote acionavel: secoes vazias sao removidas, evidencias de tools ficam canonicas em `tool_history`/`operational_state`, e blocos como `decision_state`, `working_memory` e `memory_compression` sao compactados sem perder IDs, proximas acoes, slots, reservas, confirmacoes e bloqueios de repeticao.
|
|
124
|
-
|
|
125
|
-
Quando um modelo barato esta conectado ao Tembory, os presets de producao usam esse SLM para gerar um resumo ativo do contexto. Em modo `auto`, ele organiza tanto o estado atual (`working_memory`, `tool_history`, `operational_state`, `decision_state`) quanto memorias vetoriais recuperadas. Assim o primeiro turno ja pode receber highlights uteis mesmo antes de haver resultados do banco vetorial.
|
|
126
|
-
|
|
127
|
-
O resumo do SLM usa limites conservadores e cache curto por input para evitar chamadas duplicadas quando o AI Agent carrega a memoria mais de uma vez no mesmo turno.
|
|
128
|
-
|
|
129
|
-
## Smoke tecnico
|
|
130
|
-
|
|
131
|
-
Antes de publicar uma versao, rode:
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
npm run smoke:n8n:multiturn
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
O smoke simula 12 trocas com tools de agenda, valida tool history, working memory, decision state, memory compression e exige `contextHealth` com score minimo de `970/1000`.
|
|
18
|
+
A SLM conectada ao node organiza o estado ativo em bullets curtos e persistentes. Ela e contexto auxiliar read-only: nao decide politica de negocio, nao escolhe tools e nao substitui o prompt do agente.
|
|
138
19
|
|
|
139
20
|
## Principais recursos
|
|
140
21
|
|
|
141
22
|
- Porta `ai_memory` para conectar direto no AI Agent do n8n.
|
|
142
|
-
-
|
|
143
|
-
-
|
|
23
|
+
- Entrada `LLM` obrigatoria para gerar e atualizar o resumo ativo.
|
|
24
|
+
- Campo `Projeto` para isolar memorias por cliente/workspace.
|
|
144
25
|
- Profile facts: nome, empresa, email, telefone, preferencias e contexto comercial.
|
|
145
|
-
- Tool history:
|
|
146
|
-
- Tool guard: bloqueia acoes dependentes quando falta contexto previo.
|
|
26
|
+
- Tool history: tools chamadas, inputs, outputs, status e ordem.
|
|
147
27
|
- Working memory: objetivo atual, intencao recente, entidades ativas, ultimo erro e proxima acao esperada.
|
|
148
|
-
- Decision state: decisoes ativas, ferramentas que nao devem ser repetidas e politica de
|
|
28
|
+
- Decision state: decisoes ativas, ferramentas que nao devem ser repetidas e politica de conflitos.
|
|
149
29
|
- Operational state: resumo deterministico do estado atual das tools e do proximo passo seguro.
|
|
150
30
|
- Action ledger: linha cronologica das acoes executadas pelo agente.
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
- Vector memories com scores, recent messages, highlights, graph e resumo.
|
|
31
|
+
- Memory compression: resumos de turno, sessao, entidades e workflow.
|
|
32
|
+
- Active summary persistente gerado pela SLM.
|
|
154
33
|
|
|
155
34
|
## Custo de IA
|
|
156
35
|
|
|
157
|
-
O node
|
|
36
|
+
O node usa o modelo de linguagem conectado no proprio n8n. Para esse papel, um modelo pequeno e barato costuma ser suficiente, porque a tarefa e resumir, organizar e compactar contexto operacional.
|
|
158
37
|
|
|
159
38
|
## Credencial
|
|
160
39
|
|
|
161
|
-
Use
|
|
40
|
+
Use a credencial `Tembory API` com a API key gerada no SaaS. A API key identifica a conta e o projeto comercial no Tembory.
|
|
162
41
|
|
|
163
42
|
## Presets operacionais
|
|
164
43
|
|
|
165
|
-
O campo
|
|
44
|
+
O campo `Preset Operacional` preenche defaults de producao:
|
|
166
45
|
|
|
167
|
-
- `
|
|
168
|
-
- `
|
|
169
|
-
- `
|
|
170
|
-
- `
|
|
46
|
+
- `Produção Rápida (Thread + SLM)`: padrao recomendado.
|
|
47
|
+
- `Produção Balanceada`: mais contexto, ainda compacto.
|
|
48
|
+
- `Produção Econômica`: reduz resultados e secoes para economizar tokens, mantendo SLM obrigatoria.
|
|
49
|
+
- `Produção Nano/SLM`: otimizado para modelo pequeno.
|
|
50
|
+
- `Diagnóstico Completo`: teste e auditoria.
|
|
171
51
|
- `Auditoria`: payload detalhado para depuracao.
|
|
172
52
|
|
|
173
53
|
## Blocos de contexto
|
|
174
54
|
|
|
175
55
|
Quando habilitados, o agente recebe:
|
|
176
56
|
|
|
57
|
+
- `Conversation frame`
|
|
177
58
|
- `Profile facts`
|
|
178
59
|
- `Working memory`
|
|
179
60
|
- `Decision state`
|
|
180
61
|
- `Operational state`
|
|
181
62
|
- `Action ledger`
|
|
182
|
-
- `Entity timeline`
|
|
183
63
|
- `Memory compression`
|
|
184
|
-
- `Tool guard`
|
|
185
|
-
- `Vector memories`
|
|
186
|
-
- `Graph`
|
|
187
64
|
- `Recent messages`
|
|
188
65
|
- `Recent highlights`
|
|
189
66
|
- `Tool history`
|
|
67
|
+
- `Active summary`
|
|
68
|
+
- `SLM summary`
|
|
190
69
|
- `Diagnostics`
|
|
191
70
|
|
|
192
|
-
##
|
|
71
|
+
## Validacao local
|
|
193
72
|
|
|
194
73
|
```bash
|
|
195
74
|
npm test
|
|
196
|
-
npm
|
|
75
|
+
npm run simulate:n8n-agent
|
|
197
76
|
```
|
|
198
|
-
|
|
199
|
-
Site: https://tembory.com
|
|
@@ -2,8 +2,19 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.temboryApiRequest = temboryApiRequest;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
async function getTemboryCredentials(ctx) {
|
|
6
|
+
try {
|
|
7
|
+
return await ctx.getCredentials('temboryApi');
|
|
8
|
+
}
|
|
9
|
+
catch { }
|
|
10
|
+
try {
|
|
11
|
+
return await ctx.getCredentials('mem0Api');
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Credentials for Tembory are not set. Select a Tembory API credential and save the workflow.');
|
|
15
|
+
}
|
|
5
16
|
async function temboryApiRequest(method, endpoint, body = {}, qs = {}) {
|
|
6
|
-
const credentials = await this
|
|
17
|
+
const credentials = await getTemboryCredentials(this);
|
|
7
18
|
const baseUrl = 'https://api.tembory.com';
|
|
8
19
|
const operation = resolveGatewayOperation(method, endpoint);
|
|
9
20
|
const payload = {
|
|
@@ -33,13 +33,7 @@ const truncate = (value, max = MAX_TEXT) => {
|
|
|
33
33
|
return `${text.slice(0, max)}\n... [truncated ${text.length - max} chars]`;
|
|
34
34
|
};
|
|
35
35
|
const getConnectedEmbedding = async (ctx, itemIndex) => {
|
|
36
|
-
|
|
37
|
-
const embedding = await ctx.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiEmbedding, itemIndex);
|
|
38
|
-
return embedding && typeof embedding.embedQuery === 'function' ? embedding : null;
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
36
|
+
return null;
|
|
43
37
|
};
|
|
44
38
|
const createClientVectorMemory = async (embedding, text, metadata, ids = {}) => ({
|
|
45
39
|
text: truncate(text, 4000),
|
|
@@ -1458,11 +1452,17 @@ const applyOperationalPreset = (advanced = {}) => {
|
|
|
1458
1452
|
if (resolved.summarySource === 'vectorOnly' || resolved.summarySource === 'vectors')
|
|
1459
1453
|
resolved.summarySource = 'activeContext';
|
|
1460
1454
|
}
|
|
1455
|
+
resolved.useVectorMemory = false;
|
|
1456
|
+
resolved.includeRelations = false;
|
|
1457
|
+
resolved.includeConnectedModelSummary = true;
|
|
1458
|
+
resolved.includeSummary = true;
|
|
1459
|
+
if (resolved.summarySource === 'off' || resolved.summarySource === 'vectorOnly' || resolved.summarySource === 'vectors')
|
|
1460
|
+
resolved.summarySource = 'activeContext';
|
|
1461
1461
|
return resolved;
|
|
1462
1462
|
};
|
|
1463
1463
|
const flattenAdvancedGroups = (groups = {}) => {
|
|
1464
1464
|
const flattened = {};
|
|
1465
|
-
const groupNames = ['essentials', 'intelligence', '
|
|
1465
|
+
const groupNames = ['essentials', 'intelligence', 'summaryState', 'diagnosticsAudit'];
|
|
1466
1466
|
for (const groupName of groupNames) {
|
|
1467
1467
|
const value = groups === null || groups === void 0 ? void 0 : groups[groupName];
|
|
1468
1468
|
const groupValue = Array.isArray(value) ? value[0] : value;
|
|
@@ -2654,20 +2654,20 @@ class TemboryMemory {
|
|
|
2654
2654
|
displayName: 'LLM',
|
|
2655
2655
|
maxConnections: 1,
|
|
2656
2656
|
type: n8n_workflow_1.NodeConnectionTypes.AiLanguageModel,
|
|
2657
|
-
required:
|
|
2657
|
+
required: true,
|
|
2658
2658
|
},
|
|
2659
2659
|
],
|
|
2660
2660
|
outputs: [n8n_workflow_1.NodeConnectionTypes.AiMemory],
|
|
2661
2661
|
outputNames: ['Mem'],
|
|
2662
2662
|
builderHint: {
|
|
2663
2663
|
inputs: {
|
|
2664
|
-
ai_languageModel: { required:
|
|
2664
|
+
ai_languageModel: { required: true },
|
|
2665
2665
|
},
|
|
2666
2666
|
},
|
|
2667
2667
|
credentials: [
|
|
2668
2668
|
{
|
|
2669
2669
|
name: 'temboryApi',
|
|
2670
|
-
required:
|
|
2670
|
+
required: false,
|
|
2671
2671
|
},
|
|
2672
2672
|
],
|
|
2673
2673
|
codex: {
|
|
@@ -2792,29 +2792,11 @@ class TemboryMemory {
|
|
|
2792
2792
|
{ displayName: 'Persistir Memórias no Backend', name: 'persistBackendMemories', type: 'boolean', default: true },
|
|
2793
2793
|
],
|
|
2794
2794
|
},
|
|
2795
|
-
{
|
|
2796
|
-
name: 'retrievalControls',
|
|
2797
|
-
displayName: 'Controles Avançados de Busca',
|
|
2798
|
-
values: [
|
|
2799
|
-
{ displayName: 'Top K', name: 'topK', type: 'number', typeOptions: { minValue: 1 }, default: 6 },
|
|
2800
|
-
{ displayName: 'Rerank', name: 'rerank', type: 'boolean', default: true },
|
|
2801
|
-
{ displayName: 'Fields (lista separada por vírgula)', name: 'fields', type: 'string', default: '' },
|
|
2802
|
-
{ displayName: 'Filters (JSON)', name: 'filters', type: 'json', default: '{}' },
|
|
2803
|
-
{ displayName: 'Last N (recentes)', name: 'lastN', type: 'number', default: 8 },
|
|
2804
|
-
{ displayName: 'Alpha (peso semântico)', name: 'alpha', type: 'number', typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 }, default: 0.65 },
|
|
2805
|
-
{ displayName: 'Half-life (horas)', name: 'halfLifeHours', type: 'number', typeOptions: { minValue: 1 }, default: 48 },
|
|
2806
|
-
{ displayName: 'Máximo a retornar', name: 'maxReturn', type: 'number', typeOptions: { minValue: 1 }, default: 12 },
|
|
2807
|
-
{ displayName: 'MMR (diversidade)', name: 'mmr', type: 'boolean', default: true },
|
|
2808
|
-
{ displayName: 'MMR Lambda', name: 'mmrLambda', type: 'number', typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 }, default: 0.5 },
|
|
2809
|
-
{ displayName: 'Compactar Contexto Para Agente', name: 'compactForAgent', type: 'boolean', default: false },
|
|
2810
|
-
],
|
|
2811
|
-
},
|
|
2812
2795
|
{
|
|
2813
2796
|
name: 'summaryState',
|
|
2814
2797
|
displayName: 'Resumo e Estado Persistente',
|
|
2815
2798
|
values: [
|
|
2816
2799
|
{ displayName: 'Incluir Resumo', name: 'includeSummary', type: 'boolean', default: true },
|
|
2817
|
-
{ displayName: 'Incluir Resumo do SLM', name: 'includeConnectedModelSummary', type: 'boolean', default: true },
|
|
2818
2800
|
{
|
|
2819
2801
|
displayName: 'Fonte do Resumo do SLM',
|
|
2820
2802
|
name: 'summarySource',
|
|
@@ -2822,7 +2804,6 @@ class TemboryMemory {
|
|
|
2822
2804
|
options: [
|
|
2823
2805
|
{ name: 'Automático', value: 'auto' },
|
|
2824
2806
|
{ name: 'Contexto Ativo', value: 'activeContext' },
|
|
2825
|
-
{ name: 'Desligado', value: 'off' },
|
|
2826
2807
|
],
|
|
2827
2808
|
default: 'auto',
|
|
2828
2809
|
},
|
|
@@ -2852,99 +2833,6 @@ class TemboryMemory {
|
|
|
2852
2833
|
},
|
|
2853
2834
|
],
|
|
2854
2835
|
},
|
|
2855
|
-
{
|
|
2856
|
-
displayName: 'Avançado Legado (Compatibilidade)',
|
|
2857
|
-
name: 'advanced',
|
|
2858
|
-
type: 'collection',
|
|
2859
|
-
placeholder: 'Opções',
|
|
2860
|
-
default: {},
|
|
2861
|
-
displayOptions: { hide: { '/payloadFormat': ['structured', 'auditText', 'auditJson', 'auditBlocks', 'singleSystemMessage'] } },
|
|
2862
|
-
description: 'Campos legados preservados para workflows existentes. Para novas configuracoes, use Configuração Tembory.',
|
|
2863
|
-
options: [
|
|
2864
|
-
{ displayName: 'User ID', name: 'userId', type: 'string', default: '' },
|
|
2865
|
-
{
|
|
2866
|
-
displayName: 'Preset Operacional',
|
|
2867
|
-
name: 'operationPreset',
|
|
2868
|
-
type: 'options',
|
|
2869
|
-
options: [
|
|
2870
|
-
{ name: 'Custom', value: 'custom' },
|
|
2871
|
-
{ name: 'Diagnóstico Completo', value: 'diagnostic' },
|
|
2872
|
-
{ name: 'Produção Rápida (Thread + SLM)', value: 'productionFast' },
|
|
2873
|
-
{ name: 'Produção Balanceada', value: 'productionBalanced' },
|
|
2874
|
-
{ name: 'Produção Econômica', value: 'productionCheap' },
|
|
2875
|
-
{ name: 'Produção Nano/SLM', value: 'productionNano' },
|
|
2876
|
-
{ name: 'Auditoria', value: 'audit' },
|
|
2877
|
-
],
|
|
2878
|
-
default: 'productionFast',
|
|
2879
|
-
description: 'Preenche defaults seguros para contexto, diagnostico, historico de tools e mensagens recentes. Valores definidos manualmente continuam tendo prioridade.',
|
|
2880
|
-
},
|
|
2881
|
-
{ displayName: 'Agent ID', name: 'agentId', type: 'string', default: '' },
|
|
2882
|
-
{ displayName: 'App ID', name: 'appId', type: 'string', default: '' },
|
|
2883
|
-
{ displayName: 'Run ID', name: 'runId', type: 'string', default: '' },
|
|
2884
|
-
{ displayName: 'Top K', name: 'topK', type: 'number', typeOptions: { minValue: 1 }, default: 25, description: 'Quantidade de memórias a recuperar (modos semânticos e limites de recentes)' },
|
|
2885
|
-
{ displayName: 'Usar Memória Vetorial no Caminho Quente', name: 'useVectorMemory', type: 'boolean', default: false, description: 'Quando ligado, usa busca BYO sob demanda para recuperar histórico longo. O padrão mantém o contexto quente em transcript + SLM e apenas arquiva o turno no vetor.' },
|
|
2886
|
-
{ displayName: 'Persistir Memórias no Backend', name: 'persistBackendMemories', type: 'boolean', default: true, description: 'Quando desligado, mantém o estado no workflow/static data para reduzir latência.' },
|
|
2887
|
-
{ displayName: 'Rerank', name: 'rerank', type: 'boolean', default: true, description: 'Reordenação por relevância (modos semânticos)', displayOptions: { show: { '/retrievalMode': ['semantic', 'semanticV2', 'hybrid'] } } },
|
|
2888
|
-
{ displayName: 'Fields (lista separada por vírgula)', name: 'fields', type: 'string', default: '', description: 'Campos específicos a retornar da API (modos semânticos)', displayOptions: { show: { '/retrievalMode': ['semantic', 'semanticV2', 'hybrid'] } } },
|
|
2889
|
-
{ displayName: 'Filters (JSON)', name: 'filters', type: 'json', default: '{}', description: 'Objeto de filtros avançados para busca v2', displayOptions: { show: { '/retrievalMode': ['semanticV2', 'hybrid'] } } },
|
|
2890
|
-
{ displayName: 'Last N (recentes)', name: 'lastN', type: 'number', default: 20, description: 'Se > 0, retorna apenas as últimas N memórias em Básico/Resumo e compõe a parte de recentes no Híbrido', displayOptions: { show: { '/retrievalMode': ['basic', 'summary', 'hybrid'] } } },
|
|
2891
|
-
{ displayName: 'Alpha (peso semântico)', name: 'alpha', type: 'number', typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 }, default: 0.65, description: 'Peso da relevância semântica na pontuação híbrida', displayOptions: { show: { '/retrievalMode': ['hybrid'] } } },
|
|
2892
|
-
{ displayName: 'Half-life (horas)', name: 'halfLifeHours', type: 'number', typeOptions: { minValue: 1 }, default: 48, description: 'Meia-vida (em horas) usada no decaimento temporal', displayOptions: { show: { '/retrievalMode': ['hybrid'] } } },
|
|
2893
|
-
{ displayName: 'Máximo a retornar', name: 'maxReturn', type: 'number', typeOptions: { minValue: 1 }, default: 30, description: 'Quantidade final de memórias retornadas ao agente', displayOptions: { show: { '/retrievalMode': ['hybrid'] } } },
|
|
2894
|
-
{ displayName: 'MMR (diversidade)', name: 'mmr', type: 'boolean', default: true, description: 'Aplicar diversidade de resultados (Maximal Marginal Relevance)', displayOptions: { show: { '/retrievalMode': ['hybrid'] } } },
|
|
2895
|
-
{ displayName: 'MMR Lambda', name: 'mmrLambda', type: 'number', typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 }, default: 0.5, description: 'Equilíbrio entre relevância e diversidade no MMR', displayOptions: { show: { '/retrievalMode': ['hybrid'] } } },
|
|
2896
|
-
{ displayName: 'Incluir Cabeçalho de Contexto', name: 'includeContextHeader', type: 'boolean', default: true },
|
|
2897
|
-
{ displayName: 'Compactar Contexto Para Agente', name: 'compactForAgent', type: 'boolean', default: false, description: 'Entrega ao agente apenas o estado acionável: working memory, decisões, estado operacional e histórico de tools compacto. Mantém detalhes completos no audit/debug.' },
|
|
2898
|
-
{ displayName: 'Organizar Seções de Produção', name: 'compactStateSections', type: 'boolean', default: false, description: 'Renderiza blocos de produção com campos canônicos, remove seções vazias e evita duplicar evidências já presentes em tool_history/operational_state.' },
|
|
2899
|
-
{ displayName: 'Máximo de Caracteres do Contexto', name: 'contextMaxChars', type: 'number', default: 6000, description: 'Limite final aplicado ao contexto entregue ao agente em modos estruturados de produção.' },
|
|
2900
|
-
{ displayName: 'Incluir Resumo', name: 'includeSummary', type: 'boolean', default: true },
|
|
2901
|
-
{ displayName: 'Incluir Resumo do SLM', name: 'includeConnectedModelSummary', type: 'boolean', default: true, description: 'Usa o modelo barato conectado ao Tembory para organizar contexto ativo e/ou memórias vetoriais em bullets curtos.' },
|
|
2902
|
-
{
|
|
2903
|
-
displayName: 'Fonte do Resumo do SLM',
|
|
2904
|
-
name: 'summarySource',
|
|
2905
|
-
type: 'options',
|
|
2906
|
-
options: [
|
|
2907
|
-
{ name: 'Automático', value: 'auto' },
|
|
2908
|
-
{ name: 'Contexto Ativo', value: 'activeContext' },
|
|
2909
|
-
{ name: 'Somente Vetores', value: 'vectorOnly' },
|
|
2910
|
-
{ name: 'Desligado', value: 'off' },
|
|
2911
|
-
],
|
|
2912
|
-
default: 'auto',
|
|
2913
|
-
description: 'Define se o SLM resume working memory/tool state, memórias vetoriais, ambos ou nada.',
|
|
2914
|
-
},
|
|
2915
|
-
{ displayName: 'Máximo de Caracteres de Entrada do SLM', name: 'connectedModelSummaryInputMaxChars', type: 'number', default: 3000 },
|
|
2916
|
-
{ displayName: 'Máximo de Caracteres do Resumo do SLM', name: 'connectedModelSummaryMaxChars', type: 'number', default: 1200 },
|
|
2917
|
-
{ displayName: 'Incluir Active Summary', name: 'includeActiveSummary', type: 'boolean', default: true, description: 'Carrega o resumo ativo persistente da thread/sessão quando disponível.' },
|
|
2918
|
-
{ displayName: 'Persistir Active Summary', name: 'persistActiveSummary', type: 'boolean', default: true, description: 'Salva o resumo atualizado pelo SLM para continuar a conversa depois de minutos, horas ou dias.' },
|
|
2919
|
-
{ displayName: 'Máximo de Caracteres do Active Summary', name: 'activeSummaryMaxChars', type: 'number', default: 1600 },
|
|
2920
|
-
{ displayName: 'Retenção do Active Summary (Dias)', name: 'activeSummaryRetentionDays', type: 'number', default: 30, description: 'Use 0 para não expirar pelo node. Não é cache técnico; é memória ativa persistente.' },
|
|
2921
|
-
{ displayName: 'Ativar Cache Técnico do Resumo SLM', name: 'enableTransientSummaryCache', type: 'boolean', default: true, description: 'Evita chamadas duplicadas ao SLM para o mesmo pacote de contexto. Não substitui memória persistente.' },
|
|
2922
|
-
{ displayName: 'TTL do Cache Técnico SLM (Segundos)', name: 'transientSummaryCacheTTLSeconds', type: 'number', default: 300 },
|
|
2923
|
-
{ displayName: 'Máximo de Itens no Cache Técnico SLM', name: 'transientSummaryCacheMaxItems', type: 'number', default: 50 },
|
|
2924
|
-
{ displayName: 'Máximo de Fatos no Resumo', name: 'summaryMaxFacts', type: 'number', default: 4 },
|
|
2925
|
-
{ displayName: 'Incluir Scores', name: 'includeScores', type: 'boolean', default: true },
|
|
2926
|
-
{ displayName: 'Incluir Diagnóstico', name: 'includeDiagnostics', type: 'boolean', default: false },
|
|
2927
|
-
{ displayName: 'Incluir Grafo', name: 'includeRelations', type: 'boolean', default: false },
|
|
2928
|
-
{ displayName: 'Máximo de Relações', name: 'maxRelations', type: 'number', default: 10 },
|
|
2929
|
-
{ displayName: 'Incluir Tool History', name: 'includeToolHistory', type: 'boolean', default: true },
|
|
2930
|
-
{ displayName: 'Incluir Resultado Das Tools', name: 'includeToolResults', type: 'boolean', default: true },
|
|
2931
|
-
{ displayName: 'Últimas N Tools', name: 'toolHistoryLastN', type: 'number', default: 15 },
|
|
2932
|
-
{ displayName: 'TTL Das Tools (Segundos)', name: 'toolHistoryTTLSeconds', type: 'number', default: 3600 },
|
|
2933
|
-
{ displayName: 'Persistir Tool Facts no Backend', name: 'persistToolFactsToTembory', type: 'boolean', default: false },
|
|
2934
|
-
{ displayName: 'Fallback Semântico Para Tools', name: 'includeToolHistorySemanticFallback', type: 'boolean', default: false, description: 'Usa memórias vetoriais para tentar inferir histórico de tools quando não houver eventos estruturados. Útil em laboratório, não recomendado como fonte primária em produção.' },
|
|
2935
|
-
{ displayName: 'Incluir Profile Facts', name: 'includeProfileFacts', type: 'boolean', default: true, description: 'Extrai e injeta fatos estáveis do lead/cliente como nome, empresa, email, telefone, preferências, interesses e contexto comercial.' },
|
|
2936
|
-
{ displayName: 'Incluir Working Memory', name: 'includeWorkingMemory', type: 'boolean', default: true, description: 'Injeta objetivo atual, intenção recente, entidades ativas, último erro e próxima ação esperada.' },
|
|
2937
|
-
{ displayName: 'Incluir Decision State', name: 'includeDecisionState', type: 'boolean', default: true, description: 'Injeta decisões ativas, ferramentas que não devem ser repetidas e política de resolução de conflitos.' },
|
|
2938
|
-
{ displayName: 'Incluir Estado Operacional', name: 'includeOperationalState', type: 'boolean', default: true, description: 'Injeta um resumo determinístico do estado das tools, pré-requisitos, reservas pendentes e próximo passo seguro.' },
|
|
2939
|
-
{ displayName: 'Incluir Action Ledger', name: 'includeActionLedger', type: 'boolean', default: true, description: 'Injeta um ledger cronológico e compacto das ações/tools executadas, com input, resultado e status.' },
|
|
2940
|
-
{ displayName: 'Incluir Entity Timeline', name: 'includeEntityTimeline', type: 'boolean', default: true, description: 'Injeta uma timeline compacta de entidades, fatos de perfil, relações do grafo e eventos importantes da sessão.' },
|
|
2941
|
-
{ displayName: 'Incluir Compressão de Memória', name: 'includeMemoryCompression', type: 'boolean', default: true, description: 'Injeta resumos compactos de turno, sessão, entidades e workflow para reduzir ruído.' },
|
|
2942
|
-
{ displayName: 'Incluir Mensagens Recentes', name: 'includeRecentMessages', type: 'boolean', default: true },
|
|
2943
|
-
{ displayName: 'Últimas N Mensagens', name: 'recentMessagesLastN', type: 'number', default: 50 },
|
|
2944
|
-
{ displayName: 'Incluir Highlights Recentes', name: 'includeRecentHighlights', type: 'boolean', default: true },
|
|
2945
|
-
{ displayName: 'Máximo de Highlights', name: 'recentHighlightsMaxItems', type: 'number', default: 6 },
|
|
2946
|
-
],
|
|
2947
|
-
},
|
|
2948
2836
|
],
|
|
2949
2837
|
};
|
|
2950
2838
|
}
|
|
@@ -3434,8 +3322,8 @@ class TemboryMemory {
|
|
|
3434
3322
|
const project = this.getNodeParameter('project', itemIndex, '');
|
|
3435
3323
|
const adv = applyOperationalPreset(readAdvancedOptions(this, itemIndex));
|
|
3436
3324
|
payloadFormat = adv.payloadFormat || payloadFormat;
|
|
3437
|
-
const vectorMemoryEnabled =
|
|
3438
|
-
const retrievalMode =
|
|
3325
|
+
const vectorMemoryEnabled = false;
|
|
3326
|
+
const retrievalMode = requestedRetrievalMode === 'summary' ? 'summary' : 'basic';
|
|
3439
3327
|
const backendPersistenceEnabled = adv.persistBackendMemories !== false;
|
|
3440
3328
|
const store = getMemoryStore(this);
|
|
3441
3329
|
const key = userKeyFrom(threadId, adv, project);
|
|
@@ -3459,17 +3347,10 @@ class TemboryMemory {
|
|
|
3459
3347
|
catch (error) {
|
|
3460
3348
|
connectedAi.errors.push(`languageModel: ${error.message || String(error)}`);
|
|
3461
3349
|
}
|
|
3462
|
-
if (
|
|
3463
|
-
|
|
3464
|
-
connectedEmbedding = await this.getInputConnectionData(n8n_workflow_1.NodeConnectionTypes.AiEmbedding, itemIndex);
|
|
3465
|
-
connectedAi.embedding = true;
|
|
3466
|
-
}
|
|
3467
|
-
catch (error) {
|
|
3468
|
-
connectedAi.errors.push(`embedding: ${error.message || String(error)}`);
|
|
3469
|
-
}
|
|
3350
|
+
if (!connectedLanguageModel || typeof connectedLanguageModel.invoke !== 'function') {
|
|
3351
|
+
throw new Error('Tembory requires a connected LLM/SLM on the LLM input. Connect a small language model, for example nano or mini, to generate the active summary.');
|
|
3470
3352
|
}
|
|
3471
|
-
|
|
3472
|
-
connectedAi.embeddingQuery = vectorMemoryEnabled;
|
|
3353
|
+
connectedEmbedding = null;
|
|
3473
3354
|
try {
|
|
3474
3355
|
this.logger?.debug('Tembory loading memory variables before model invocation', {
|
|
3475
3356
|
itemIndex,
|
package/package.json
CHANGED