@luanpoppe/ai 1.0.0
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/.env.example +2 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/src/@types/model-names.d.ts +5 -0
- package/dist/src/@types/model-names.d.ts.map +1 -0
- package/dist/src/@types/model-names.js +3 -0
- package/dist/src/@types/model-names.js.map +1 -0
- package/dist/src/core/env.d.ts +6 -0
- package/dist/src/core/env.d.ts.map +1 -0
- package/dist/src/core/env.js +17 -0
- package/dist/src/core/env.js.map +1 -0
- package/dist/src/langchain/messages.d.ts +8 -0
- package/dist/src/langchain/messages.d.ts.map +1 -0
- package/dist/src/langchain/messages.js +17 -0
- package/dist/src/langchain/messages.js.map +1 -0
- package/dist/src/langchain/models.d.ts +7 -0
- package/dist/src/langchain/models.d.ts.map +1 -0
- package/dist/src/langchain/models.js +26 -0
- package/dist/src/langchain/models.js.map +1 -0
- package/dist/src/langchain/tools.d.ts +12 -0
- package/dist/src/langchain/tools.d.ts.map +1 -0
- package/dist/src/langchain/tools.js +17 -0
- package/dist/src/langchain/tools.js.map +1 -0
- package/index.ts +138 -0
- package/package.json +25 -0
- package/src/@types/model-names.ts +16 -0
- package/src/core/env.ts +13 -0
- package/src/langchain/messages.ts +15 -0
- package/src/langchain/models.ts +26 -0
- package/src/langchain/tools.ts +22 -0
- package/tsconfig.json +43 -0
package/.env.example
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AIModelNames } from "./src/@types/model-names";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import { MessageInput } from "./src/langchain/messages";
|
|
4
|
+
import { AgentMiddleware, BaseMessage } from "langchain";
|
|
5
|
+
import { ClientTool, ServerTool } from "@langchain/core/tools";
|
|
6
|
+
export type CallParams = {
|
|
7
|
+
aiModel: AIModelNames;
|
|
8
|
+
messages: MessageInput[];
|
|
9
|
+
systemPrompt?: string;
|
|
10
|
+
maxRetries?: number;
|
|
11
|
+
middleware?: AgentMiddleware[];
|
|
12
|
+
tools?: (ServerTool | ClientTool)[];
|
|
13
|
+
};
|
|
14
|
+
export type CallReturn = Promise<{
|
|
15
|
+
text: string;
|
|
16
|
+
messages: BaseMessage[];
|
|
17
|
+
}>;
|
|
18
|
+
export type CallStructuredOutputParams<T extends z.ZodSchema> = CallParams & {
|
|
19
|
+
outputSchema: T;
|
|
20
|
+
};
|
|
21
|
+
export type CallStructuredOutputReturn<T> = Promise<{
|
|
22
|
+
response: z.infer<T>;
|
|
23
|
+
}>;
|
|
24
|
+
export declare class Langchain {
|
|
25
|
+
constructor();
|
|
26
|
+
call(params: CallParams): CallReturn;
|
|
27
|
+
callStructuredOutput<T extends z.ZodSchema>(params: CallStructuredOutputParams<T>): CallStructuredOutputReturn<typeof params.outputSchema>;
|
|
28
|
+
private getModel;
|
|
29
|
+
private standardAgent;
|
|
30
|
+
private standardMiddlewares;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,CAAC,MAAM,KAAK,CAAC;AACpB,OAAO,EAAqB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,WAAW,EAIZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,IAAI,UAAU,GAAG;IAC3E,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI,OAAO,CAAC;IAClD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CACtB,CAAC,CAAC;AAEH,qBAAa,SAAS;;IAGd,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IAepC,oBAAoB,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAC9C,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACpC,0BAA0B,CAAC,OAAO,MAAM,CAAC,YAAY,CAAC;IAiBzD,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,mBAAmB;CAU5B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Langchain = void 0;
|
|
7
|
+
const models_1 = require("./src/langchain/models");
|
|
8
|
+
const zod_1 = __importDefault(require("zod"));
|
|
9
|
+
const messages_1 = require("./src/langchain/messages");
|
|
10
|
+
const langchain_1 = require("langchain");
|
|
11
|
+
class Langchain {
|
|
12
|
+
constructor() { }
|
|
13
|
+
async call(params) {
|
|
14
|
+
const { messages } = params;
|
|
15
|
+
const agent = (0, langchain_1.createAgent)({
|
|
16
|
+
...this.standardAgent(params),
|
|
17
|
+
});
|
|
18
|
+
const response = await agent.invoke({ messages });
|
|
19
|
+
return {
|
|
20
|
+
text: response.messages[0]?.text ?? "Empty response from the model",
|
|
21
|
+
messages: response.messages,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async callStructuredOutput(params) {
|
|
25
|
+
const { outputSchema, messages } = params;
|
|
26
|
+
const agent = (0, langchain_1.createAgent)({
|
|
27
|
+
...this.standardAgent(params),
|
|
28
|
+
responseFormat: outputSchema,
|
|
29
|
+
});
|
|
30
|
+
const response = await agent.invoke({
|
|
31
|
+
messages,
|
|
32
|
+
});
|
|
33
|
+
const parsedResponse = outputSchema.parse(response?.structuredResponse);
|
|
34
|
+
return { response: parsedResponse };
|
|
35
|
+
}
|
|
36
|
+
getModel(aiModel) {
|
|
37
|
+
if (aiModel.startsWith("gpt")) {
|
|
38
|
+
return models_1.LangchainModels.gpt({
|
|
39
|
+
modelName: aiModel,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (aiModel.startsWith("gemini")) {
|
|
43
|
+
return models_1.LangchainModels.gemini({
|
|
44
|
+
model: aiModel,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
throw new Error("Model not supported");
|
|
48
|
+
}
|
|
49
|
+
standardAgent(params) {
|
|
50
|
+
const { aiModel, systemPrompt, maxRetries = 3, middleware, tools } = params;
|
|
51
|
+
const model = this.getModel(aiModel);
|
|
52
|
+
return {
|
|
53
|
+
model,
|
|
54
|
+
systemPrompt: systemPrompt ?? "",
|
|
55
|
+
middleware: [
|
|
56
|
+
...this.standardMiddlewares(maxRetries),
|
|
57
|
+
...(middleware ?? []),
|
|
58
|
+
],
|
|
59
|
+
tools: tools ?? [],
|
|
60
|
+
responseFormat: undefined,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
standardMiddlewares(maxRetries) {
|
|
64
|
+
return [
|
|
65
|
+
(0, langchain_1.modelRetryMiddleware)({
|
|
66
|
+
maxRetries,
|
|
67
|
+
backoffFactor: 2.0,
|
|
68
|
+
initialDelayMs: 1000,
|
|
69
|
+
}),
|
|
70
|
+
(0, langchain_1.modelFallbackMiddleware)("gemini-2.5-flash", "gpt-4o-mini"),
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.Langchain = Langchain;
|
|
75
|
+
const example = async () => {
|
|
76
|
+
const langchain = new Langchain();
|
|
77
|
+
const outputSchema = zod_1.default.object({
|
|
78
|
+
answer: zod_1.default.string(),
|
|
79
|
+
});
|
|
80
|
+
const messages = [
|
|
81
|
+
messages_1.LangchainMessages.system("You are a helpful assistant."),
|
|
82
|
+
messages_1.LangchainMessages.human("What is the capital of France?"),
|
|
83
|
+
];
|
|
84
|
+
const { response } = await langchain.callStructuredOutput({
|
|
85
|
+
aiModel: "gemini-2.5-flash",
|
|
86
|
+
outputSchema,
|
|
87
|
+
messages,
|
|
88
|
+
});
|
|
89
|
+
console.log({ response });
|
|
90
|
+
};
|
|
91
|
+
example();
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type ChatGPTModels = "gpt-4" | "gpt-4o" | "gpt-4.1" | "gpt-5" | "gpt-5.1" | "gpt-5-mini" | "gpt-5-nano";
|
|
2
|
+
type GeminiModels = "gemini-2.5-flash" | "gemini-2.5-pro" | "gemini-3-flash" | "gemini-3-pro";
|
|
3
|
+
export type AIModelNames = ChatGPTModels | GeminiModels;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=model-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-names.d.ts","sourceRoot":"","sources":["../../../src/@types/model-names.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GACd,OAAO,GACP,QAAQ,GACR,SAAS,GACT,OAAO,GACP,SAAS,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,KAAK,YAAY,GACb,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-names.js","sourceRoot":"","sources":["../../../src/@types/model-names.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/core/env.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAYvB,eAAO,MAAM,GAAG;;;CAAO,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.env = void 0;
|
|
7
|
+
require("dotenv/config");
|
|
8
|
+
const zod_1 = __importDefault(require("zod"));
|
|
9
|
+
const envSchema = zod_1.default.object({
|
|
10
|
+
OPENAI_API_KEY: zod_1.default.string().optional().default(""),
|
|
11
|
+
GOOGLE_GENAI_API_KEY: zod_1.default.string().optional().default(""),
|
|
12
|
+
});
|
|
13
|
+
const { error, data } = envSchema.safeParse(process.env);
|
|
14
|
+
if (error)
|
|
15
|
+
throw new Error(`Invalid environment variables:\n${error.message}`);
|
|
16
|
+
exports.env = data;
|
|
17
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/core/env.ts"],"names":[],"mappings":";;;;;;AAAA,yBAAuB;AACvB,8CAAoB;AAEpB,MAAM,SAAS,GAAG,aAAC,CAAC,MAAM,CAAC;IACzB,cAAc,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,oBAAoB,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEzD,IAAI,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAElE,QAAA,GAAG,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SystemMessage, HumanMessage, AIMessage } from "langchain";
|
|
2
|
+
export type MessageInput = SystemMessage | HumanMessage | AIMessage;
|
|
3
|
+
export declare class LangchainMessages {
|
|
4
|
+
static system(message: string): SystemMessage;
|
|
5
|
+
static human(message: string): HumanMessage;
|
|
6
|
+
static ai(message: string): AIMessage;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/langchain/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpE,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAG7C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAG3C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;CAGtC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LangchainMessages = void 0;
|
|
4
|
+
const langchain_1 = require("langchain");
|
|
5
|
+
class LangchainMessages {
|
|
6
|
+
static system(message) {
|
|
7
|
+
return new langchain_1.SystemMessage(message);
|
|
8
|
+
}
|
|
9
|
+
static human(message) {
|
|
10
|
+
return new langchain_1.HumanMessage(message);
|
|
11
|
+
}
|
|
12
|
+
static ai(message) {
|
|
13
|
+
return new langchain_1.AIMessage(message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.LangchainMessages = LangchainMessages;
|
|
17
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/langchain/messages.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AAInE,MAAa,iBAAiB;IAC5B,MAAM,CAAC,MAAM,CAAC,OAAe;QAC3B,OAAO,IAAI,yBAAa,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,IAAI,wBAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,OAAe;QACvB,OAAO,IAAI,qBAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AAVD,8CAUC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ChatGoogleGenerativeAI, GoogleGenerativeAIChatInput } from "@langchain/google-genai";
|
|
2
|
+
import { ChatOpenAI, ChatOpenAIFields } from "@langchain/openai";
|
|
3
|
+
export declare class LangchainModels {
|
|
4
|
+
static gpt(params: ChatOpenAIFields): ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions>;
|
|
5
|
+
static gemini(params: GoogleGenerativeAIChatInput): ChatGoogleGenerativeAI;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/langchain/models.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGjE,qBAAa,eAAe;IAC1B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB;IAUnC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B;CAOlD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LangchainModels = void 0;
|
|
4
|
+
const google_genai_1 = require("@langchain/google-genai");
|
|
5
|
+
const openai_1 = require("@langchain/openai");
|
|
6
|
+
const env_1 = require("../core/env");
|
|
7
|
+
class LangchainModels {
|
|
8
|
+
static gpt(params) {
|
|
9
|
+
console.log({ env: env_1.env });
|
|
10
|
+
return new openai_1.ChatOpenAI({
|
|
11
|
+
temperature: 0,
|
|
12
|
+
maxTokens: 2048,
|
|
13
|
+
apiKey: env_1.env.OPENAI_API_KEY,
|
|
14
|
+
...params,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
static gemini(params) {
|
|
18
|
+
return new google_genai_1.ChatGoogleGenerativeAI({
|
|
19
|
+
maxOutputTokens: 2048,
|
|
20
|
+
apiKey: env_1.env.GOOGLE_GENAI_API_KEY,
|
|
21
|
+
...params,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.LangchainModels = LangchainModels;
|
|
26
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/langchain/models.ts"],"names":[],"mappings":";;;AAAA,0DAGiC;AACjC,8CAAiE;AACjE,qCAAkC;AAElC,MAAa,eAAe;IAC1B,MAAM,CAAC,GAAG,CAAC,MAAwB;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAH,SAAG,EAAE,CAAC,CAAC;QACrB,OAAO,IAAI,mBAAU,CAAC;YACpB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,SAAG,CAAC,cAAc;YAC1B,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAmC;QAC/C,OAAO,IAAI,qCAAsB,CAAC;YAChC,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,SAAG,CAAC,oBAAoB;YAChC,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;CACF;AAlBD,0CAkBC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { tool } from "langchain";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
export type CreateToolParams = {
|
|
4
|
+
toolFunction: Parameters<typeof tool>[0];
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
schema: z.ZodSchema;
|
|
8
|
+
};
|
|
9
|
+
export declare class LangchainTools {
|
|
10
|
+
createTool(params: CreateToolParams): import("langchain").DynamicStructuredTool<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, unknown, unknown, unknown>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/langchain/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC;CACrB,CAAC;AAEF,qBAAa,cAAc;IACzB,UAAU,CAAC,MAAM,EAAE,gBAAgB;CAUpC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LangchainTools = void 0;
|
|
4
|
+
const langchain_1 = require("langchain");
|
|
5
|
+
class LangchainTools {
|
|
6
|
+
createTool(params) {
|
|
7
|
+
const { toolFunction } = params;
|
|
8
|
+
const { name, description, schema } = params;
|
|
9
|
+
return (0, langchain_1.tool)(toolFunction, {
|
|
10
|
+
name,
|
|
11
|
+
description,
|
|
12
|
+
schema,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.LangchainTools = LangchainTools;
|
|
17
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/langchain/tools.ts"],"names":[],"mappings":";;;AAAA,yCAAiC;AAUjC,MAAa,cAAc;IACzB,UAAU,CAAC,MAAwB;QACjC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAChC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE7C,OAAO,IAAA,gBAAI,EAAC,YAAY,EAAE;YACxB,IAAI;YACJ,WAAW;YACX,MAAM;SACP,CAAC,CAAC;IACL,CAAC;CACF;AAXD,wCAWC"}
|
package/index.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { LangchainModels } from "./src/langchain/models";
|
|
2
|
+
import { AIModelNames } from "./src/@types/model-names";
|
|
3
|
+
import z from "zod";
|
|
4
|
+
import { LangchainMessages, MessageInput } from "./src/langchain/messages";
|
|
5
|
+
import {
|
|
6
|
+
AgentMiddleware,
|
|
7
|
+
BaseMessage,
|
|
8
|
+
createAgent,
|
|
9
|
+
modelFallbackMiddleware,
|
|
10
|
+
modelRetryMiddleware,
|
|
11
|
+
} from "langchain";
|
|
12
|
+
import { ClientTool, ServerTool } from "@langchain/core/tools";
|
|
13
|
+
|
|
14
|
+
export type CallParams = {
|
|
15
|
+
aiModel: AIModelNames;
|
|
16
|
+
messages: MessageInput[];
|
|
17
|
+
systemPrompt?: string;
|
|
18
|
+
maxRetries?: number;
|
|
19
|
+
middleware?: AgentMiddleware[];
|
|
20
|
+
tools?: (ServerTool | ClientTool)[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type CallReturn = Promise<{
|
|
24
|
+
text: string;
|
|
25
|
+
messages: BaseMessage[];
|
|
26
|
+
}>;
|
|
27
|
+
|
|
28
|
+
export type CallStructuredOutputParams<T extends z.ZodSchema> = CallParams & {
|
|
29
|
+
outputSchema: T;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type CallStructuredOutputReturn<T> = Promise<{
|
|
33
|
+
response: z.infer<T>;
|
|
34
|
+
}>;
|
|
35
|
+
|
|
36
|
+
export class Langchain {
|
|
37
|
+
constructor() {}
|
|
38
|
+
|
|
39
|
+
async call(params: CallParams): CallReturn {
|
|
40
|
+
const { messages } = params;
|
|
41
|
+
|
|
42
|
+
const agent = createAgent({
|
|
43
|
+
...this.standardAgent(params),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const response = await agent.invoke({ messages });
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
text: response.messages[0]?.text ?? "Empty response from the model",
|
|
50
|
+
messages: response.messages,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async callStructuredOutput<T extends z.ZodSchema>(
|
|
55
|
+
params: CallStructuredOutputParams<T>
|
|
56
|
+
): CallStructuredOutputReturn<typeof params.outputSchema> {
|
|
57
|
+
const { outputSchema, messages } = params;
|
|
58
|
+
|
|
59
|
+
const agent = createAgent({
|
|
60
|
+
...this.standardAgent(params),
|
|
61
|
+
responseFormat: outputSchema as any,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const response = await agent.invoke({
|
|
65
|
+
messages,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const parsedResponse = outputSchema.parse(response?.structuredResponse);
|
|
69
|
+
|
|
70
|
+
return { response: parsedResponse };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private getModel(aiModel: AIModelNames) {
|
|
74
|
+
if (aiModel.startsWith("gpt")) {
|
|
75
|
+
return LangchainModels.gpt({
|
|
76
|
+
modelName: aiModel,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (aiModel.startsWith("gemini")) {
|
|
81
|
+
return LangchainModels.gemini({
|
|
82
|
+
model: aiModel,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
throw new Error("Model not supported");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private standardAgent(params: CallParams): Parameters<typeof createAgent>[0] {
|
|
90
|
+
const { aiModel, systemPrompt, maxRetries = 3, middleware, tools } = params;
|
|
91
|
+
|
|
92
|
+
const model = this.getModel(aiModel);
|
|
93
|
+
return {
|
|
94
|
+
model,
|
|
95
|
+
systemPrompt: systemPrompt ?? "",
|
|
96
|
+
middleware: [
|
|
97
|
+
...this.standardMiddlewares(maxRetries),
|
|
98
|
+
...(middleware ?? []),
|
|
99
|
+
],
|
|
100
|
+
tools: tools ?? [],
|
|
101
|
+
responseFormat: undefined as any,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private standardMiddlewares(maxRetries: number) {
|
|
106
|
+
return [
|
|
107
|
+
modelRetryMiddleware({
|
|
108
|
+
maxRetries,
|
|
109
|
+
backoffFactor: 2.0,
|
|
110
|
+
initialDelayMs: 1000,
|
|
111
|
+
}),
|
|
112
|
+
modelFallbackMiddleware("gemini-2.5-flash", "gpt-4o-mini"),
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const example = async () => {
|
|
118
|
+
const langchain = new Langchain();
|
|
119
|
+
|
|
120
|
+
const outputSchema = z.object({
|
|
121
|
+
answer: z.string(),
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const messages = [
|
|
125
|
+
LangchainMessages.system("You are a helpful assistant."),
|
|
126
|
+
LangchainMessages.human("What is the capital of France?"),
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
const { response } = await langchain.callStructuredOutput({
|
|
130
|
+
aiModel: "gemini-2.5-flash",
|
|
131
|
+
outputSchema,
|
|
132
|
+
messages,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
console.log({ response });
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
example();
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@luanpoppe/ai",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"keywords": [],
|
|
7
|
+
"author": "",
|
|
8
|
+
"license": "ISC",
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@langchain/core": "^1.1.8",
|
|
11
|
+
"@langchain/google-genai": "^2.1.3",
|
|
12
|
+
"@langchain/openai": "^1.2.0",
|
|
13
|
+
"dotenv": "^17.2.3",
|
|
14
|
+
"langchain": "^1.2.3",
|
|
15
|
+
"typescript": "^5.9.3",
|
|
16
|
+
"zod": "^4.2.1"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^25.0.3",
|
|
20
|
+
"tsx": "^4.21.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type ChatGPTModels =
|
|
2
|
+
| "gpt-4"
|
|
3
|
+
| "gpt-4o"
|
|
4
|
+
| "gpt-4.1"
|
|
5
|
+
| "gpt-5"
|
|
6
|
+
| "gpt-5.1"
|
|
7
|
+
| "gpt-5-mini"
|
|
8
|
+
| "gpt-5-nano";
|
|
9
|
+
|
|
10
|
+
type GeminiModels =
|
|
11
|
+
| "gemini-2.5-flash"
|
|
12
|
+
| "gemini-2.5-pro"
|
|
13
|
+
| "gemini-3-flash"
|
|
14
|
+
| "gemini-3-pro";
|
|
15
|
+
|
|
16
|
+
export type AIModelNames = ChatGPTModels | GeminiModels;
|
package/src/core/env.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
|
|
4
|
+
const envSchema = z.object({
|
|
5
|
+
OPENAI_API_KEY: z.string().optional().default(""),
|
|
6
|
+
GOOGLE_GENAI_API_KEY: z.string().optional().default(""),
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const { error, data } = envSchema.safeParse(process.env);
|
|
10
|
+
|
|
11
|
+
if (error) throw new Error(`Invalid environment variables:\n${error.message}`);
|
|
12
|
+
|
|
13
|
+
export const env = data;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SystemMessage, HumanMessage, AIMessage } from "langchain";
|
|
2
|
+
|
|
3
|
+
export type MessageInput = SystemMessage | HumanMessage | AIMessage;
|
|
4
|
+
|
|
5
|
+
export class LangchainMessages {
|
|
6
|
+
static system(message: string): SystemMessage {
|
|
7
|
+
return new SystemMessage(message);
|
|
8
|
+
}
|
|
9
|
+
static human(message: string): HumanMessage {
|
|
10
|
+
return new HumanMessage(message);
|
|
11
|
+
}
|
|
12
|
+
static ai(message: string): AIMessage {
|
|
13
|
+
return new AIMessage(message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChatGoogleGenerativeAI,
|
|
3
|
+
GoogleGenerativeAIChatInput,
|
|
4
|
+
} from "@langchain/google-genai";
|
|
5
|
+
import { ChatOpenAI, ChatOpenAIFields } from "@langchain/openai";
|
|
6
|
+
import { env } from "../core/env";
|
|
7
|
+
|
|
8
|
+
export class LangchainModels {
|
|
9
|
+
static gpt(params: ChatOpenAIFields) {
|
|
10
|
+
console.log({ env });
|
|
11
|
+
return new ChatOpenAI({
|
|
12
|
+
temperature: 0,
|
|
13
|
+
maxTokens: 2048,
|
|
14
|
+
apiKey: env.OPENAI_API_KEY,
|
|
15
|
+
...params,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static gemini(params: GoogleGenerativeAIChatInput) {
|
|
20
|
+
return new ChatGoogleGenerativeAI({
|
|
21
|
+
maxOutputTokens: 2048,
|
|
22
|
+
apiKey: env.GOOGLE_GENAI_API_KEY,
|
|
23
|
+
...params,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { tool } from "langchain";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
|
|
4
|
+
export type CreateToolParams = {
|
|
5
|
+
toolFunction: Parameters<typeof tool>[0];
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
schema: z.ZodSchema;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export class LangchainTools {
|
|
12
|
+
createTool(params: CreateToolParams) {
|
|
13
|
+
const { toolFunction } = params;
|
|
14
|
+
const { name, description, schema } = params;
|
|
15
|
+
|
|
16
|
+
return tool(toolFunction, {
|
|
17
|
+
name,
|
|
18
|
+
description,
|
|
19
|
+
schema,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
// "rootDir": "./src",
|
|
6
|
+
// "outDir": "./dist",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
"types": ["@types/node"],
|
|
13
|
+
// For nodejs:
|
|
14
|
+
// "lib": ["esnext"],
|
|
15
|
+
// "types": ["node"],
|
|
16
|
+
// and npm install -D @types/node
|
|
17
|
+
|
|
18
|
+
// Other Outputs
|
|
19
|
+
"sourceMap": true,
|
|
20
|
+
"declaration": true,
|
|
21
|
+
"declarationMap": true,
|
|
22
|
+
|
|
23
|
+
// Stricter Typechecking Options
|
|
24
|
+
"noUncheckedIndexedAccess": true,
|
|
25
|
+
"exactOptionalPropertyTypes": true,
|
|
26
|
+
|
|
27
|
+
// Style Options
|
|
28
|
+
// "noImplicitReturns": true,
|
|
29
|
+
// "noImplicitOverride": true,
|
|
30
|
+
// "noUnusedLocals": true,
|
|
31
|
+
// "noUnusedParameters": true,
|
|
32
|
+
// "noFallthroughCasesInSwitch": true,
|
|
33
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
34
|
+
|
|
35
|
+
// Recommended Options
|
|
36
|
+
"strict": true,
|
|
37
|
+
"verbatimModuleSyntax": false,
|
|
38
|
+
"isolatedModules": true,
|
|
39
|
+
"noUncheckedSideEffectImports": true,
|
|
40
|
+
"moduleDetection": "force",
|
|
41
|
+
"skipLibCheck": true
|
|
42
|
+
}
|
|
43
|
+
}
|