@dawn-ai/langchain 0.0.2 → 0.1.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/dist/agent-adapter.d.ts +19 -0
- package/dist/agent-adapter.d.ts.map +1 -0
- package/dist/agent-adapter.js +80 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/state-adapter.d.ts +7 -0
- package/dist/state-adapter.d.ts.map +1 -0
- package/dist/state-adapter.js +31 -0
- package/package.json +15 -11
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ResolvedStateField } from "./state-adapter.js";
|
|
2
|
+
interface DawnToolDefinition {
|
|
3
|
+
readonly description?: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly run: (input: unknown, context: {
|
|
6
|
+
readonly signal: AbortSignal;
|
|
7
|
+
}) => Promise<unknown> | unknown;
|
|
8
|
+
readonly schema?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare function executeAgent(options: {
|
|
11
|
+
readonly entry: unknown;
|
|
12
|
+
readonly input: unknown;
|
|
13
|
+
readonly routeParamNames: readonly string[];
|
|
14
|
+
readonly signal: AbortSignal;
|
|
15
|
+
readonly stateFields?: readonly ResolvedStateField[];
|
|
16
|
+
readonly tools: readonly DawnToolDefinition[];
|
|
17
|
+
}): Promise<unknown>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=agent-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-adapter.d.ts","sourceRoot":"","sources":["../src/agent-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAGpF,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,CACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KACtC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAuDD,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAA;CAC9C,GAAG,OAAO,CAAC,OAAO,CAAC,CA0CnB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { isDawnAgent } from "@dawn-ai/sdk";
|
|
2
|
+
import { HumanMessage } from "@langchain/core/messages";
|
|
3
|
+
import { materializeStateSchema } from "./state-adapter.js";
|
|
4
|
+
import { convertToolToLangChain } from "./tool-converter.js";
|
|
5
|
+
function assertAgentLike(entry) {
|
|
6
|
+
if (typeof entry !== "object" ||
|
|
7
|
+
entry === null ||
|
|
8
|
+
!("invoke" in entry) ||
|
|
9
|
+
typeof entry.invoke !== "function") {
|
|
10
|
+
throw new Error("Agent entry must expose invoke(input) — expected a LangChain agent");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const materializedAgents = new WeakMap();
|
|
14
|
+
async function materializeAgent(descriptor, tools, stateFields) {
|
|
15
|
+
const cached = materializedAgents.get(descriptor);
|
|
16
|
+
if (cached) {
|
|
17
|
+
return cached;
|
|
18
|
+
}
|
|
19
|
+
const { createReactAgent } = await import("@langchain/langgraph/prebuilt");
|
|
20
|
+
const { ChatOpenAI } = await import("@langchain/openai");
|
|
21
|
+
const langchainTools = tools.map((tool) => convertToolToLangChain(tool));
|
|
22
|
+
const llm = new ChatOpenAI({
|
|
23
|
+
model: descriptor.model,
|
|
24
|
+
});
|
|
25
|
+
const agentOptions = {
|
|
26
|
+
llm,
|
|
27
|
+
tools: langchainTools,
|
|
28
|
+
prompt: descriptor.systemPrompt,
|
|
29
|
+
};
|
|
30
|
+
if (stateFields && stateFields.length > 0) {
|
|
31
|
+
agentOptions.stateSchema = materializeStateSchema(stateFields);
|
|
32
|
+
}
|
|
33
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamically-built options don't satisfy strict StateDefinition type
|
|
34
|
+
const compiled = createReactAgent(agentOptions);
|
|
35
|
+
materializedAgents.set(descriptor, compiled);
|
|
36
|
+
return compiled;
|
|
37
|
+
}
|
|
38
|
+
export async function executeAgent(options) {
|
|
39
|
+
const inputRecord = (options.input ?? {});
|
|
40
|
+
const params = {};
|
|
41
|
+
const agentInput = {};
|
|
42
|
+
for (const [key, value] of Object.entries(inputRecord)) {
|
|
43
|
+
if (options.routeParamNames.includes(key)) {
|
|
44
|
+
params[key] = value;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
agentInput[key] = value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const config = {
|
|
51
|
+
signal: options.signal,
|
|
52
|
+
};
|
|
53
|
+
if (Object.keys(params).length > 0) {
|
|
54
|
+
config.configurable = params;
|
|
55
|
+
}
|
|
56
|
+
// DawnAgent descriptor path — materialize on first use
|
|
57
|
+
if (isDawnAgent(options.entry)) {
|
|
58
|
+
const materializedAgent = await materializeAgent(options.entry, options.tools, options.stateFields);
|
|
59
|
+
const messages = [new HumanMessage(formatAgentMessage(agentInput))];
|
|
60
|
+
return await materializedAgent.invoke({ messages }, config);
|
|
61
|
+
}
|
|
62
|
+
// Legacy path — raw Runnable with .invoke()
|
|
63
|
+
assertAgentLike(options.entry);
|
|
64
|
+
const langchainTools = options.tools.map((tool) => convertToolToLangChain(tool));
|
|
65
|
+
if (langchainTools.length > 0) {
|
|
66
|
+
config.tools = langchainTools;
|
|
67
|
+
}
|
|
68
|
+
const messages = [new HumanMessage(formatAgentMessage(agentInput))];
|
|
69
|
+
return await options.entry.invoke({ messages }, config);
|
|
70
|
+
}
|
|
71
|
+
function formatAgentMessage(input) {
|
|
72
|
+
const entries = Object.entries(input);
|
|
73
|
+
if (entries.length === 0) {
|
|
74
|
+
return "";
|
|
75
|
+
}
|
|
76
|
+
if (entries.length === 1) {
|
|
77
|
+
return String(entries[0]?.[1]);
|
|
78
|
+
}
|
|
79
|
+
return entries.map(([key, value]) => `${key}: ${String(value)}`).join("\n");
|
|
80
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
export { executeAgent } from "./agent-adapter.js";
|
|
1
2
|
export { chainAdapter } from "./chain-adapter.js";
|
|
3
|
+
export { materializeStateSchema } from "./state-adapter.js";
|
|
2
4
|
export { convertToolToLangChain } from "./tool-converter.js";
|
|
3
5
|
export { executeWithToolLoop } from "./tool-loop.js";
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { executeAgent } from "./agent-adapter.js";
|
|
1
2
|
export { chainAdapter } from "./chain-adapter.js";
|
|
3
|
+
export { materializeStateSchema } from "./state-adapter.js";
|
|
2
4
|
export { convertToolToLangChain } from "./tool-converter.js";
|
|
3
5
|
export { executeWithToolLoop } from "./tool-loop.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface ResolvedStateField {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly reducer: "append" | "replace" | ((current: unknown, incoming: unknown) => unknown);
|
|
4
|
+
readonly default: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare function materializeStateSchema(fields: readonly ResolvedStateField[]): import("@langchain/langgraph").AnnotationRoot<any>;
|
|
7
|
+
//# sourceMappingURL=state-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-adapter.d.ts","sourceRoot":"","sources":["../src/state-adapter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,sDA6B3E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Annotation, MessagesAnnotation } from "@langchain/langgraph";
|
|
2
|
+
export function materializeStateSchema(fields) {
|
|
3
|
+
const spec = {
|
|
4
|
+
...MessagesAnnotation.spec,
|
|
5
|
+
};
|
|
6
|
+
for (const field of fields) {
|
|
7
|
+
if (typeof field.reducer === "function") {
|
|
8
|
+
spec[field.name] = Annotation({
|
|
9
|
+
reducer: field.reducer,
|
|
10
|
+
default: () => field.default,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
else if (field.reducer === "append") {
|
|
14
|
+
spec[field.name] = Annotation({
|
|
15
|
+
reducer: (prev, next) => [
|
|
16
|
+
...(prev ?? []),
|
|
17
|
+
...(Array.isArray(next) ? next : [next]),
|
|
18
|
+
],
|
|
19
|
+
default: () => (field.default ?? []),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
spec[field.name] = Annotation({
|
|
24
|
+
reducer: (_, next) => next,
|
|
25
|
+
default: () => field.default,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamically-built spec doesn't satisfy strict StateDefinition type
|
|
30
|
+
return Annotation.Root(spec);
|
|
31
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dawn-ai/langchain",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,22 +29,26 @@
|
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -b tsconfig.json",
|
|
34
|
+
"lint": "biome check --config-path ../config-biome/biome.json package.json src test tsconfig.json vitest.config.ts",
|
|
35
|
+
"test": "vitest --run --config vitest.config.ts",
|
|
36
|
+
"typecheck": "tsc --noEmit"
|
|
37
|
+
},
|
|
32
38
|
"dependencies": {
|
|
33
|
-
"@dawn-ai/sdk": "
|
|
39
|
+
"@dawn-ai/sdk": "workspace:*",
|
|
40
|
+
"@langchain/langgraph": "^0.2.71",
|
|
41
|
+
"@langchain/openai": "^0.3.17"
|
|
34
42
|
},
|
|
35
43
|
"peerDependencies": {
|
|
36
44
|
"@langchain/core": ">=0.3.0"
|
|
37
45
|
},
|
|
38
46
|
"devDependencies": {
|
|
47
|
+
"@dawn-ai/config-typescript": "workspace:*",
|
|
39
48
|
"@langchain/core": "0.3.62",
|
|
49
|
+
"@langchain/langgraph": "0.2.71",
|
|
50
|
+
"@langchain/openai": "0.3.17",
|
|
40
51
|
"@types/node": "25.6.0",
|
|
41
|
-
"zod": "3.24.4"
|
|
42
|
-
"@dawn-ai/config-typescript": "0.0.2"
|
|
43
|
-
},
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build": "tsc -b tsconfig.json",
|
|
46
|
-
"lint": "biome check --config-path ../config-biome/biome.json package.json src test tsconfig.json vitest.config.ts",
|
|
47
|
-
"test": "vitest --run --config vitest.config.ts",
|
|
48
|
-
"typecheck": "tsc --noEmit"
|
|
52
|
+
"zod": "3.24.4"
|
|
49
53
|
}
|
|
50
|
-
}
|
|
54
|
+
}
|