@luanpoppe/ai 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/dist/@types/agent.d.ts +3 -0
- package/dist/@types/agent.d.ts.map +1 -0
- package/dist/@types/agent.js +3 -0
- package/dist/@types/agent.js.map +1 -0
- package/dist/@types/ai-call.d.ts +32 -0
- package/dist/@types/ai-call.d.ts.map +1 -0
- package/dist/@types/ai-call.js +3 -0
- package/dist/@types/ai-call.js.map +1 -0
- package/dist/@types/checkpointers.d.ts +106 -0
- package/dist/@types/checkpointers.d.ts.map +1 -0
- package/dist/@types/checkpointers.js +3 -0
- package/dist/@types/checkpointers.js.map +1 -0
- package/dist/ai.d.ts +49 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +206 -0
- package/dist/ai.js.map +1 -0
- package/dist/index.d.ts +10 -52
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -135
- package/dist/index.js.map +1 -1
- package/dist/langchain/checkpointers.d.ts +86 -0
- package/dist/langchain/checkpointers.d.ts.map +1 -0
- package/dist/langchain/checkpointers.js +242 -0
- package/dist/langchain/checkpointers.js.map +1 -0
- package/package.json +9 -1
- package/src/@types/agent.ts +3 -0
- package/src/@types/ai-call.ts +38 -0
- package/src/@types/checkpointers.ts +117 -0
- package/src/ai.ts +306 -0
- package/src/index.ts +34 -214
- package/src/langchain/checkpointers.ts +331 -0
- package/tests/e2e/ai-retry-fallback.test.ts +213 -0
- package/tests/e2e/ai.test.ts +125 -38
- package/tests/unit/index.test.ts +310 -13
- package/tests/unit/langchain/checkpointers.test.ts +147 -0
- package/tests/unit/langchain/tools.test.ts +2 -1
package/dist/index.js
CHANGED
|
@@ -1,143 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.LangchainAudioTranscription = exports.LangchainTools = exports.LangchainMessages = exports.LangchainModels = exports.Langchain = exports.AudioUtils = exports.AIAudioTranscription = exports.AITools = exports.AIMessages = exports.AIModels = exports.AI = void 0;
|
|
7
|
-
const
|
|
3
|
+
exports.LangchainAudioTranscription = exports.LangchainTools = exports.LangchainMessages = exports.LangchainModels = exports.Langchain = exports.AudioUtils = exports.AIAudioTranscription = exports.AIMemory = exports.AITools = exports.AIMessages = exports.AIModels = exports.AI = void 0;
|
|
4
|
+
const ai_1 = require("./ai");
|
|
5
|
+
Object.defineProperty(exports, "AI", { enumerable: true, get: function () { return ai_1.AI; } });
|
|
6
|
+
Object.defineProperty(exports, "Langchain", { enumerable: true, get: function () { return ai_1.AI; } });
|
|
7
|
+
var models_1 = require("./langchain/models");
|
|
8
8
|
Object.defineProperty(exports, "AIModels", { enumerable: true, get: function () { return models_1.AIModels; } });
|
|
9
|
-
|
|
10
|
-
const langchain_1 = require("langchain");
|
|
11
|
-
const messages_1 = require("./langchain/messages");
|
|
9
|
+
var messages_1 = require("./langchain/messages");
|
|
12
10
|
Object.defineProperty(exports, "AIMessages", { enumerable: true, get: function () { return messages_1.AIMessages; } });
|
|
13
|
-
|
|
11
|
+
var tools_1 = require("./langchain/tools");
|
|
14
12
|
Object.defineProperty(exports, "AITools", { enumerable: true, get: function () { return tools_1.AITools; } });
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
constructor(tokens) {
|
|
18
|
-
this.tokens = tokens;
|
|
19
|
-
}
|
|
20
|
-
async call(params) {
|
|
21
|
-
const { messages } = params;
|
|
22
|
-
const agent = (0, langchain_1.createAgent)({
|
|
23
|
-
...this.standardAgent(params),
|
|
24
|
-
});
|
|
25
|
-
const response = await agent.invoke({ messages });
|
|
26
|
-
const rawContent = response.messages.at(-1)?.content;
|
|
27
|
-
const text = typeof rawContent === "string" && rawContent.trim()
|
|
28
|
-
? rawContent
|
|
29
|
-
: "Empty response from the model";
|
|
30
|
-
return {
|
|
31
|
-
text,
|
|
32
|
-
messages: response.messages,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
async callStructuredOutput(params) {
|
|
36
|
-
const { outputSchema, messages, aiModel } = params;
|
|
37
|
-
// Normaliza o schema para compatibilidade com OpenAI/OpenRouter
|
|
38
|
-
// OpenAI exige que todos os campos em properties estejam no array required
|
|
39
|
-
const normalizedSchema = this.normalizeSchemaForOpenAI(outputSchema, aiModel);
|
|
40
|
-
const agent = (0, langchain_1.createAgent)({
|
|
41
|
-
...this.standardAgent(params),
|
|
42
|
-
responseFormat: normalizedSchema,
|
|
43
|
-
});
|
|
44
|
-
const response = await agent.invoke({
|
|
45
|
-
messages,
|
|
46
|
-
});
|
|
47
|
-
const parsedResponse = outputSchema.parse(response?.structuredResponse);
|
|
48
|
-
return { response: parsedResponse };
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Normaliza schemas Zod para compatibilidade com OpenAI/OpenRouter
|
|
52
|
-
* OpenAI exige que todos os campos em properties estejam no array required
|
|
53
|
-
* quando usa response_format: 'extract'
|
|
54
|
-
*/
|
|
55
|
-
normalizeSchemaForOpenAI(schema, aiModel) {
|
|
56
|
-
// Apenas normaliza para modelos OpenAI/OpenRouter
|
|
57
|
-
const isOpenAIModel = aiModel.startsWith("gpt") || aiModel.startsWith("openrouter/openai/");
|
|
58
|
-
if (!isOpenAIModel) {
|
|
59
|
-
return schema;
|
|
60
|
-
}
|
|
61
|
-
// Se o schema é um objeto Zod, precisamos normalizar campos opcionais
|
|
62
|
-
if (schema instanceof zod_1.default.ZodObject) {
|
|
63
|
-
const shape = schema.shape;
|
|
64
|
-
const newShape = {};
|
|
65
|
-
// Converte campos opcionais para nullable para compatibilidade com OpenAI
|
|
66
|
-
// OpenAI requer que todos os campos estejam no array required
|
|
67
|
-
for (const [key, value] of Object.entries(shape)) {
|
|
68
|
-
if (value instanceof zod_1.default.ZodOptional) {
|
|
69
|
-
// Converte .optional() para .nullable() para compatibilidade com OpenAI
|
|
70
|
-
const innerType = value._def.innerType;
|
|
71
|
-
// Usa z.union para criar um tipo nullable
|
|
72
|
-
newShape[key] = zod_1.default.union([innerType, zod_1.default.null()]);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
newShape[key] = value;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return zod_1.default.object(newShape);
|
|
79
|
-
}
|
|
80
|
-
return schema;
|
|
81
|
-
}
|
|
82
|
-
getRawAgent(params, outputSchema) {
|
|
83
|
-
const agent = (0, langchain_1.createAgent)({
|
|
84
|
-
...this.standardAgent(params),
|
|
85
|
-
responseFormat: outputSchema,
|
|
86
|
-
});
|
|
87
|
-
return { agent };
|
|
88
|
-
}
|
|
89
|
-
getModel(params) {
|
|
90
|
-
const { aiModel, modelConfig } = params;
|
|
91
|
-
const config = {
|
|
92
|
-
model: aiModel,
|
|
93
|
-
maxTokens: modelConfig?.maxTokens,
|
|
94
|
-
temperature: modelConfig?.temperature,
|
|
95
|
-
};
|
|
96
|
-
if (aiModel.startsWith("gpt")) {
|
|
97
|
-
config.apiKey = this.tokens.openAIApiKey;
|
|
98
|
-
return models_1.AIModels.gpt(config);
|
|
99
|
-
}
|
|
100
|
-
if (aiModel.startsWith("gemini")) {
|
|
101
|
-
config.apiKey = this.tokens.googleGeminiToken;
|
|
102
|
-
return models_1.AIModels.gemini(config);
|
|
103
|
-
}
|
|
104
|
-
if (aiModel.startsWith("openrouter/")) {
|
|
105
|
-
const modelName = aiModel.replace(/^openrouter\//, "");
|
|
106
|
-
return models_1.AIModels.openrouter({
|
|
107
|
-
...config,
|
|
108
|
-
model: modelName,
|
|
109
|
-
apiKey: this.tokens.openRouterApiKey,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
throw new Error("Model not supported");
|
|
113
|
-
}
|
|
114
|
-
standardAgent(params) {
|
|
115
|
-
const { systemPrompt, maxRetries = 3 } = params;
|
|
116
|
-
const model = this.getModel(params);
|
|
117
|
-
return {
|
|
118
|
-
model,
|
|
119
|
-
systemPrompt: systemPrompt ?? "",
|
|
120
|
-
middleware: [
|
|
121
|
-
...this.standardMiddlewares(maxRetries),
|
|
122
|
-
...(params.agent?.middleware ?? []),
|
|
123
|
-
],
|
|
124
|
-
tools: params.agent?.tools ?? [],
|
|
125
|
-
responseFormat: undefined,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
standardMiddlewares(maxRetries) {
|
|
129
|
-
return [
|
|
130
|
-
(0, langchain_1.modelRetryMiddleware)({
|
|
131
|
-
maxRetries,
|
|
132
|
-
backoffFactor: 2.0,
|
|
133
|
-
initialDelayMs: 1000,
|
|
134
|
-
}),
|
|
135
|
-
(0, langchain_1.modelFallbackMiddleware)("gemini-2.5-flash", "gpt-4o-mini"),
|
|
136
|
-
];
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
exports.AI = AI;
|
|
140
|
-
exports.Langchain = AI;
|
|
13
|
+
var checkpointers_1 = require("./langchain/checkpointers");
|
|
14
|
+
Object.defineProperty(exports, "AIMemory", { enumerable: true, get: function () { return checkpointers_1.AIMemory; } });
|
|
141
15
|
var audio_transcription_1 = require("./langchain/audio-transcription");
|
|
142
16
|
Object.defineProperty(exports, "AIAudioTranscription", { enumerable: true, get: function () { return audio_transcription_1.AIAudioTranscription; } });
|
|
143
17
|
var audio_utils_1 = require("./utils/audio-utils");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,6BAA0B;AAQjB,mFARA,OAAE,OAQA;AAwCI,0FAhDN,OAAE,OAgDa;AA/BxB,6CAA8C;AAArC,kGAAA,QAAQ,OAAA;AACjB,iDAAkD;AAAzC,sGAAA,UAAU,OAAA;AACnB,2CAA4C;AAAnC,gGAAA,OAAO,OAAA;AAChB,2DAAqD;AAA5C,yGAAA,QAAQ,OAAA;AAcjB,uEAAuE;AAA9D,2HAAA,oBAAoB,OAAA;AAC7B,mDAAiD;AAAxC,yGAAA,UAAU,OAAA;AAwBnB,iEAAiE;AACjE,6CAAiE;AAAxD,yGAAA,QAAQ,OAAmB;AACpC,mEAAmE;AACnE,iDAAuE;AAA9D,6GAAA,UAAU,OAAqB;AACxC,gEAAgE;AAChE,2CAA8D;AAArD,uGAAA,OAAO,OAAkB;AAClC,6EAA6E;AAC7E,uEAAsG;AAA7F,kIAAA,oBAAoB,OAA+B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BaseCheckpointSaver, type StateSnapshot } from "@langchain/langgraph";
|
|
2
|
+
import type { GetHistoryResult, GraphWithStateHistory, MemoryConfig } from "../@types/checkpointers";
|
|
3
|
+
export type { BaseCheckpointSaver };
|
|
4
|
+
export type { MemoryConfig, MemoryCheckpointerConfig, SqliteCheckpointerConfig, PostgresCheckpointerConfig, RedisCheckpointerConfig, MongoDBCheckpointerConfig, GraphWithStateHistory, MessageRole, HistoryMessageItem, GetHistoryResult, } from "../@types/checkpointers";
|
|
5
|
+
/**
|
|
6
|
+
* Classe para gerenciar memória e checkpointers de conversas LangGraph.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Memória (desenvolvimento)
|
|
10
|
+
* const memory = new AIMemory({ type: "memory" });
|
|
11
|
+
* const checkpointer = await memory.getCheckpointer();
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // SQLite
|
|
15
|
+
* const memory = new AIMemory({ type: "sqlite", connectionString: "./data.db" });
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // Acessar histórico de conversa
|
|
19
|
+
* const { agent } = await ai.getRawAgent({ ... });
|
|
20
|
+
* const history = await memory.getHistory("thread-1", agent);
|
|
21
|
+
* const messages = history[0]?.values?.messages ?? [];
|
|
22
|
+
*/
|
|
23
|
+
export declare class AIMemory {
|
|
24
|
+
private config;
|
|
25
|
+
private checkpointer;
|
|
26
|
+
private checkpointerPromise;
|
|
27
|
+
private agent;
|
|
28
|
+
constructor(config: MemoryConfig, agent?: GraphWithStateHistory);
|
|
29
|
+
/**
|
|
30
|
+
* Define o agent/grafo para uso em getHistory quando graph não é passado.
|
|
31
|
+
* Chamado automaticamente por AI.getRawAgent() quando a instância está vinculada ao AI.
|
|
32
|
+
*/
|
|
33
|
+
setAgent(agent: GraphWithStateHistory): void;
|
|
34
|
+
/**
|
|
35
|
+
* Cria ou retorna a instância de checkpointer baseada na configuração.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* const cp = await memory.getCheckpointer();
|
|
39
|
+
* const graph = workflow.compile({ checkpointer: cp });
|
|
40
|
+
*/
|
|
41
|
+
getCheckpointer(): Promise<BaseCheckpointSaver>;
|
|
42
|
+
/**
|
|
43
|
+
* Retorna o histórico de checkpoints e lista de mensagens de uma thread.
|
|
44
|
+
*
|
|
45
|
+
* @param threadId - ID da thread/conversa
|
|
46
|
+
* @param graph - Opcional. Grafo compilado com checkpointer. Se não passado, usa o agent
|
|
47
|
+
* definido no construtor ou via setAgent (ex: agent de ai.getRawAgent).
|
|
48
|
+
* @returns Objeto com fullHistory (checkpoints) e messages (lista com role, createdAt, content)
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // Com ai.memory (agent definido automaticamente em call/getRawAgent)
|
|
52
|
+
* await ai.call({ messages: [...], threadId: "1" });
|
|
53
|
+
* const { fullHistory, messages } = await ai.memory.getHistory("1");
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* // Passando graph explicitamente
|
|
57
|
+
* const { fullHistory, messages } = await memory.getHistory("1", agent);
|
|
58
|
+
*
|
|
59
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/persistence#get-state-history
|
|
60
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/add-memory#manage-checkpoints
|
|
61
|
+
*/
|
|
62
|
+
getHistory(threadId: string, graph?: GraphWithStateHistory): Promise<GetHistoryResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Extrai lista de mensagens com role, createdAt e content a partir do histórico.
|
|
65
|
+
* Percorre os checkpoints do mais antigo ao mais recente para atribuir createdAt correto.
|
|
66
|
+
*/
|
|
67
|
+
private extractMessagesFromHistory;
|
|
68
|
+
private getMessageRole;
|
|
69
|
+
private extractContent;
|
|
70
|
+
/**
|
|
71
|
+
* Retorna o estado atual (último checkpoint) de uma thread.
|
|
72
|
+
*
|
|
73
|
+
* @param threadId - ID da thread/conversa
|
|
74
|
+
* @param graph - Grafo compilado com checkpointer
|
|
75
|
+
* @param checkpointId - Opcional: ID de um checkpoint específico
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* const state = await memory.getState("1", agent);
|
|
79
|
+
* const messages = state?.values?.messages ?? [];
|
|
80
|
+
*
|
|
81
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/persistence#get-state
|
|
82
|
+
*/
|
|
83
|
+
getState(threadId: string, graph?: GraphWithStateHistory, checkpointId?: string): Promise<StateSnapshot | null>;
|
|
84
|
+
private createCheckpointer;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=checkpointers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointers.d.ts","sourceRoot":"","sources":["../../src/langchain/checkpointers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAEnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EAErB,YAAY,EAEb,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EAAE,mBAAmB,EAAE,CAAC;AACpC,YAAY,EACV,YAAY,EACZ,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,QAAQ;IAMjB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,mBAAmB,CAA2C;IACtE,OAAO,CAAC,KAAK,CAAoC;gBAGvC,MAAM,EAAE,YAAY,EAC5B,KAAK,CAAC,EAAE,qBAAqB;IAK/B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAI5C;;;;;;OAMG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IASrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,qBAAqB,GAC5B,OAAO,CAAC,gBAAgB,CAAC;IAiB5B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAwClC,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,cAAc;IAgBtB;;;;;;;;;;;;OAYG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,qBAAqB,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;YAiBlB,kBAAkB;CA4FjC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AIMemory = void 0;
|
|
4
|
+
const langgraph_1 = require("@langchain/langgraph");
|
|
5
|
+
/**
|
|
6
|
+
* Classe para gerenciar memória e checkpointers de conversas LangGraph.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Memória (desenvolvimento)
|
|
10
|
+
* const memory = new AIMemory({ type: "memory" });
|
|
11
|
+
* const checkpointer = await memory.getCheckpointer();
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // SQLite
|
|
15
|
+
* const memory = new AIMemory({ type: "sqlite", connectionString: "./data.db" });
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* // Acessar histórico de conversa
|
|
19
|
+
* const { agent } = await ai.getRawAgent({ ... });
|
|
20
|
+
* const history = await memory.getHistory("thread-1", agent);
|
|
21
|
+
* const messages = history[0]?.values?.messages ?? [];
|
|
22
|
+
*/
|
|
23
|
+
class AIMemory {
|
|
24
|
+
config;
|
|
25
|
+
checkpointer;
|
|
26
|
+
checkpointerPromise;
|
|
27
|
+
agent;
|
|
28
|
+
constructor(config, agent) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.agent = agent;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Define o agent/grafo para uso em getHistory quando graph não é passado.
|
|
34
|
+
* Chamado automaticamente por AI.getRawAgent() quando a instância está vinculada ao AI.
|
|
35
|
+
*/
|
|
36
|
+
setAgent(agent) {
|
|
37
|
+
this.agent = agent;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cria ou retorna a instância de checkpointer baseada na configuração.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const cp = await memory.getCheckpointer();
|
|
44
|
+
* const graph = workflow.compile({ checkpointer: cp });
|
|
45
|
+
*/
|
|
46
|
+
async getCheckpointer() {
|
|
47
|
+
if (this.checkpointer)
|
|
48
|
+
return this.checkpointer;
|
|
49
|
+
if (!this.checkpointerPromise) {
|
|
50
|
+
this.checkpointerPromise = this.createCheckpointer();
|
|
51
|
+
}
|
|
52
|
+
this.checkpointer = await this.checkpointerPromise;
|
|
53
|
+
return this.checkpointer;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Retorna o histórico de checkpoints e lista de mensagens de uma thread.
|
|
57
|
+
*
|
|
58
|
+
* @param threadId - ID da thread/conversa
|
|
59
|
+
* @param graph - Opcional. Grafo compilado com checkpointer. Se não passado, usa o agent
|
|
60
|
+
* definido no construtor ou via setAgent (ex: agent de ai.getRawAgent).
|
|
61
|
+
* @returns Objeto com fullHistory (checkpoints) e messages (lista com role, createdAt, content)
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Com ai.memory (agent definido automaticamente em call/getRawAgent)
|
|
65
|
+
* await ai.call({ messages: [...], threadId: "1" });
|
|
66
|
+
* const { fullHistory, messages } = await ai.memory.getHistory("1");
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Passando graph explicitamente
|
|
70
|
+
* const { fullHistory, messages } = await memory.getHistory("1", agent);
|
|
71
|
+
*
|
|
72
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/persistence#get-state-history
|
|
73
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/add-memory#manage-checkpoints
|
|
74
|
+
*/
|
|
75
|
+
async getHistory(threadId, graph) {
|
|
76
|
+
const graphToUse = graph ?? this.agent;
|
|
77
|
+
if (!graphToUse) {
|
|
78
|
+
throw new Error("É necessário passar graph em getHistory ou definir o agent no construtor/setAgent do AIMemory.");
|
|
79
|
+
}
|
|
80
|
+
const config = { configurable: { thread_id: threadId } };
|
|
81
|
+
const fullHistory = [];
|
|
82
|
+
for await (const snapshot of graphToUse.getStateHistory(config)) {
|
|
83
|
+
fullHistory.push(snapshot);
|
|
84
|
+
}
|
|
85
|
+
const messages = this.extractMessagesFromHistory(fullHistory);
|
|
86
|
+
return { fullHistory, messages };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extrai lista de mensagens com role, createdAt e content a partir do histórico.
|
|
90
|
+
* Percorre os checkpoints do mais antigo ao mais recente para atribuir createdAt correto.
|
|
91
|
+
*/
|
|
92
|
+
extractMessagesFromHistory(history) {
|
|
93
|
+
const result = [];
|
|
94
|
+
let previousMessageCount = 0;
|
|
95
|
+
// history[0] = mais recente, history[length-1] = mais antigo
|
|
96
|
+
// Cada snapshot acumula mensagens; só adicionamos as novas
|
|
97
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
98
|
+
const snapshot = history[i];
|
|
99
|
+
const snapshotMessages = (snapshot.values?.messages ?? []);
|
|
100
|
+
const createdAt = snapshot.createdAt ??
|
|
101
|
+
new Date().toISOString();
|
|
102
|
+
for (let j = previousMessageCount; j < snapshotMessages.length; j++) {
|
|
103
|
+
const msg = snapshotMessages[j];
|
|
104
|
+
if (!msg)
|
|
105
|
+
continue;
|
|
106
|
+
const role = this.getMessageRole(msg);
|
|
107
|
+
if (role === "system")
|
|
108
|
+
continue;
|
|
109
|
+
result.push({
|
|
110
|
+
role: role,
|
|
111
|
+
createdAt,
|
|
112
|
+
content: this.extractContent(msg),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
previousMessageCount = snapshotMessages.length;
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
getMessageRole(msg) {
|
|
120
|
+
const role = msg.role?.toLowerCase();
|
|
121
|
+
if (role === "human" || role === "user")
|
|
122
|
+
return "human";
|
|
123
|
+
if (role === "ai" || role === "assistant")
|
|
124
|
+
return "ai";
|
|
125
|
+
if (role === "tool")
|
|
126
|
+
return "tool";
|
|
127
|
+
const type = msg.getType?.() ??
|
|
128
|
+
msg._getType?.() ??
|
|
129
|
+
msg.constructor?.name?.toLowerCase() ?? "";
|
|
130
|
+
const normalized = type.toLowerCase().replace("message", "").trim();
|
|
131
|
+
if (normalized === "human" || normalized === "user")
|
|
132
|
+
return "human";
|
|
133
|
+
if (normalized === "ai" || normalized === "assistant")
|
|
134
|
+
return "ai";
|
|
135
|
+
if (normalized === "tool")
|
|
136
|
+
return "tool";
|
|
137
|
+
return "system";
|
|
138
|
+
}
|
|
139
|
+
extractContent(msg) {
|
|
140
|
+
const c = msg.content;
|
|
141
|
+
if (typeof c === "string")
|
|
142
|
+
return c;
|
|
143
|
+
if (Array.isArray(c)) {
|
|
144
|
+
return c
|
|
145
|
+
.map((block) => typeof block === "string" ? block : block?.text ?? "")
|
|
146
|
+
.filter(Boolean)
|
|
147
|
+
.join("\n");
|
|
148
|
+
}
|
|
149
|
+
return "";
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Retorna o estado atual (último checkpoint) de uma thread.
|
|
153
|
+
*
|
|
154
|
+
* @param threadId - ID da thread/conversa
|
|
155
|
+
* @param graph - Grafo compilado com checkpointer
|
|
156
|
+
* @param checkpointId - Opcional: ID de um checkpoint específico
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* const state = await memory.getState("1", agent);
|
|
160
|
+
* const messages = state?.values?.messages ?? [];
|
|
161
|
+
*
|
|
162
|
+
* @see https://docs.langchain.com/oss/javascript/langgraph/persistence#get-state
|
|
163
|
+
*/
|
|
164
|
+
async getState(threadId, graph, checkpointId) {
|
|
165
|
+
const graphToUse = graph ?? this.agent;
|
|
166
|
+
if (!graphToUse) {
|
|
167
|
+
throw new Error("É necessário passar graph em getState ou definir o agent no construtor/setAgent do AIMemory.");
|
|
168
|
+
}
|
|
169
|
+
if (!graphToUse.getState) {
|
|
170
|
+
const { fullHistory } = await this.getHistory(threadId, graphToUse);
|
|
171
|
+
return fullHistory[0] ?? null;
|
|
172
|
+
}
|
|
173
|
+
const config = {
|
|
174
|
+
configurable: { thread_id: threadId, ...(checkpointId && { checkpoint_id: checkpointId }) },
|
|
175
|
+
};
|
|
176
|
+
return (await graphToUse.getState(config)) ?? null;
|
|
177
|
+
}
|
|
178
|
+
async createCheckpointer() {
|
|
179
|
+
if (this.checkpointer)
|
|
180
|
+
return this.checkpointer;
|
|
181
|
+
switch (this.config.type) {
|
|
182
|
+
case "memory": {
|
|
183
|
+
return new langgraph_1.MemorySaver();
|
|
184
|
+
}
|
|
185
|
+
case "sqlite": {
|
|
186
|
+
try {
|
|
187
|
+
const { SqliteSaver } = await import("@langchain/langgraph-checkpoint-sqlite");
|
|
188
|
+
return SqliteSaver.fromConnString(this.config.connectionString);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
throw new Error('Checkpointer SQLite requer o pacote "@langchain/langgraph-checkpoint-sqlite". ' +
|
|
192
|
+
"Instale com: pnpm add @langchain/langgraph-checkpoint-sqlite", { cause: err });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
case "postgres": {
|
|
196
|
+
try {
|
|
197
|
+
const { PostgresSaver } = await import("@langchain/langgraph-checkpoint-postgres");
|
|
198
|
+
const checkpointer = PostgresSaver.fromConnString(this.config.connectionString);
|
|
199
|
+
await checkpointer.setup();
|
|
200
|
+
return checkpointer;
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
throw new Error('Checkpointer Postgres requer o pacote "@langchain/langgraph-checkpoint-postgres". ' +
|
|
204
|
+
"Instale com: pnpm add @langchain/langgraph-checkpoint-postgres", { cause: err });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
case "redis": {
|
|
208
|
+
try {
|
|
209
|
+
const { RedisSaver } = await import("@langchain/langgraph-checkpoint-redis");
|
|
210
|
+
return (await RedisSaver.fromUrl(this.config.url, this.config.options ?? {}));
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
throw new Error('Checkpointer Redis requer o pacote "@langchain/langgraph-checkpoint-redis". ' +
|
|
214
|
+
"Instale com: pnpm add @langchain/langgraph-checkpoint-redis", { cause: err });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
case "mongodb": {
|
|
218
|
+
try {
|
|
219
|
+
const { MongoDBSaver } = await import("@langchain/langgraph-checkpoint-mongodb");
|
|
220
|
+
if ("client" in this.config) {
|
|
221
|
+
return new MongoDBSaver({
|
|
222
|
+
client: this.config.client,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const { MongoClient } = await import("mongodb");
|
|
226
|
+
const client = new MongoClient(this.config.url);
|
|
227
|
+
return new MongoDBSaver({ client });
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
throw new Error('Checkpointer MongoDB requer os pacotes "@langchain/langgraph-checkpoint-mongodb" e "mongodb". ' +
|
|
231
|
+
"Instale com: pnpm add @langchain/langgraph-checkpoint-mongodb mongodb", { cause: err });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
default: {
|
|
235
|
+
const _exhaustive = this.config;
|
|
236
|
+
throw new Error(`Tipo de checkpointer não suportado: ${_exhaustive?.type}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.AIMemory = AIMemory;
|
|
242
|
+
//# sourceMappingURL=checkpointers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpointers.js","sourceRoot":"","sources":["../../src/langchain/checkpointers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luanpoppe/ai",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"keywords": [],
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"license": "ISC",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@langchain/community": "^1.1.10",
|
|
11
|
+
"@langchain/langgraph": "^1.1.1",
|
|
11
12
|
"openai": "^6.17.0",
|
|
12
13
|
"@langchain/core": "^1.1.16",
|
|
13
14
|
"@langchain/google-genai": "^2.1.12",
|
|
@@ -15,6 +16,13 @@
|
|
|
15
16
|
"langchain": "^1.2.12",
|
|
16
17
|
"zod": "^4.3.6"
|
|
17
18
|
},
|
|
19
|
+
"optionalDependencies": {
|
|
20
|
+
"@langchain/langgraph-checkpoint-mongodb": "^1.1.7",
|
|
21
|
+
"@langchain/langgraph-checkpoint-postgres": "^1.0.0",
|
|
22
|
+
"@langchain/langgraph-checkpoint-redis": "^1.0.2",
|
|
23
|
+
"@langchain/langgraph-checkpoint-sqlite": "^1.0.1",
|
|
24
|
+
"mongodb": "^7.1.0"
|
|
25
|
+
},
|
|
18
26
|
"devDependencies": {
|
|
19
27
|
"@types/node": "^25.0.10",
|
|
20
28
|
"@vitest/coverage-v8": "^4.0.18",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentMiddleware, BaseMessage } from "langchain";
|
|
2
|
+
import type { ClientTool, ServerTool } from "@langchain/core/tools";
|
|
3
|
+
import type { LLMModelConfig } from "../langchain/models";
|
|
4
|
+
import type { AIModelNames } from "./model-names";
|
|
5
|
+
import type { MessageInput } from "../langchain/messages";
|
|
6
|
+
import type z from "zod";
|
|
7
|
+
|
|
8
|
+
export type AICallParams = {
|
|
9
|
+
agent?: {
|
|
10
|
+
middleware?: AgentMiddleware[];
|
|
11
|
+
tools?: (ServerTool | ClientTool)[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
modelConfig?: Omit<LLMModelConfig, "apiKey" | "model">;
|
|
15
|
+
|
|
16
|
+
aiModel: AIModelNames;
|
|
17
|
+
/** Lista de modelos de fallback quando o principal falhar após todos os retries (suporta OpenRouter, Gemini, GPT) */
|
|
18
|
+
aiModelsFallback?: AIModelNames[];
|
|
19
|
+
messages: MessageInput[];
|
|
20
|
+
systemPrompt?: string;
|
|
21
|
+
maxRetries?: number;
|
|
22
|
+
/** ID da thread/conversa para persistência de histórico (obrigatório quando memory/checkpointer está ativo) */
|
|
23
|
+
threadId?: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type AICallReturn = Promise<{
|
|
27
|
+
text: string;
|
|
28
|
+
messages: BaseMessage[];
|
|
29
|
+
}>;
|
|
30
|
+
|
|
31
|
+
export type AICallStructuredOutputParams<T extends z.ZodSchema> =
|
|
32
|
+
AICallParams & {
|
|
33
|
+
outputSchema: T;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type AICallStructuredOutputReturn<T> = Promise<{
|
|
37
|
+
response: z.infer<T>;
|
|
38
|
+
}>;
|