@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/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 models_1 = require("./langchain/models");
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
- const zod_1 = __importDefault(require("zod"));
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
- const tools_1 = require("./langchain/tools");
11
+ var tools_1 = require("./langchain/tools");
14
12
  Object.defineProperty(exports, "AITools", { enumerable: true, get: function () { return tools_1.AITools; } });
15
- class AI {
16
- tokens;
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":"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"}
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.0",
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,3 @@
1
+ import type { createAgent } from "langchain";
2
+
3
+ export type AIAgent = ReturnType<typeof createAgent>;
@@ -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
+ }>;