@picoflow/ezgraph 0.0.4

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.
Files changed (74) hide show
  1. package/LICENSE.md +17 -0
  2. package/README.md +171 -0
  3. package/dist/framework/base-graph.js +1 -0
  4. package/dist/framework/config-manager.js +1 -0
  5. package/dist/framework/conversation-node.js +1 -0
  6. package/dist/framework/conversation-runner.js +1 -0
  7. package/dist/framework/conversation-tool-result.js +1 -0
  8. package/dist/framework/graph-engine.js +1 -0
  9. package/dist/framework/graph-llm.config.js +1 -0
  10. package/dist/framework/graph-node.js +1 -0
  11. package/dist/framework/graph-registry.js +1 -0
  12. package/dist/framework/graph-state-support.js +1 -0
  13. package/dist/framework/graph-state.js +1 -0
  14. package/dist/framework/json-response.js +1 -0
  15. package/dist/framework/langchain-llm-gateway.js +1 -0
  16. package/dist/framework/langchain-provider.adapter.js +1 -0
  17. package/dist/framework/llm-file.js +1 -0
  18. package/dist/framework/llm-gateway.js +1 -0
  19. package/dist/framework/model-catalog.js +1 -0
  20. package/dist/framework/model-provider.js +1 -0
  21. package/dist/framework/model-stop-reason.js +1 -0
  22. package/dist/framework/node-outcome.js +1 -0
  23. package/dist/framework/node-state.js +1 -0
  24. package/dist/framework/persistence/cosmos-session-document.container.js +1 -0
  25. package/dist/framework/persistence/mongodb-session-document.container.js +1 -0
  26. package/dist/framework/persistence/session-manager.js +1 -0
  27. package/dist/framework/persistence/sqlite-session-document.container.js +13 -0
  28. package/dist/framework/session-log.js +1 -0
  29. package/dist/framework/stable-id.js +1 -0
  30. package/dist/framework/state-graph-ext.js +1 -0
  31. package/dist/framework/terminate-session.node.js +1 -0
  32. package/dist/framework/token-usage.js +1 -0
  33. package/dist/framework/turn-context.js +1 -0
  34. package/dist/index.js +1 -0
  35. package/dist/testing/scripted-gateway.js +1 -0
  36. package/dist/testing/turn-harness.js +1 -0
  37. package/dist/testing.js +1 -0
  38. package/dist/types/npmlib/src/index.d.ts +27 -0
  39. package/dist/types/npmlib/src/testing.d.ts +2 -0
  40. package/dist/types/src/framework/base-graph.d.ts +66 -0
  41. package/dist/types/src/framework/config-manager.d.ts +13 -0
  42. package/dist/types/src/framework/conversation-node.d.ts +18 -0
  43. package/dist/types/src/framework/conversation-runner.d.ts +49 -0
  44. package/dist/types/src/framework/conversation-tool-result.d.ts +19 -0
  45. package/dist/types/src/framework/graph-engine.d.ts +82 -0
  46. package/dist/types/src/framework/graph-llm.config.d.ts +21 -0
  47. package/dist/types/src/framework/graph-node.d.ts +106 -0
  48. package/dist/types/src/framework/graph-registry.d.ts +26 -0
  49. package/dist/types/src/framework/graph-state-support.d.ts +24 -0
  50. package/dist/types/src/framework/graph-state.d.ts +26 -0
  51. package/dist/types/src/framework/json-response.d.ts +1 -0
  52. package/dist/types/src/framework/langchain-llm-gateway.d.ts +23 -0
  53. package/dist/types/src/framework/langchain-provider.adapter.d.ts +4 -0
  54. package/dist/types/src/framework/llm-file.d.ts +13 -0
  55. package/dist/types/src/framework/llm-gateway.d.ts +27 -0
  56. package/dist/types/src/framework/model-catalog.d.ts +252 -0
  57. package/dist/types/src/framework/model-provider.d.ts +19 -0
  58. package/dist/types/src/framework/model-stop-reason.d.ts +11 -0
  59. package/dist/types/src/framework/node-outcome.d.ts +41 -0
  60. package/dist/types/src/framework/node-state.d.ts +6 -0
  61. package/dist/types/src/framework/persistence/cosmos-session-document.container.d.ts +34 -0
  62. package/dist/types/src/framework/persistence/mongodb-session-document.container.d.ts +18 -0
  63. package/dist/types/src/framework/persistence/session-manager.d.ts +116 -0
  64. package/dist/types/src/framework/persistence/sqlite-session-document.container.d.ts +19 -0
  65. package/dist/types/src/framework/session-log.d.ts +11 -0
  66. package/dist/types/src/framework/stable-id.d.ts +7 -0
  67. package/dist/types/src/framework/state-graph-ext.d.ts +58 -0
  68. package/dist/types/src/framework/terminate-session.node.d.ts +9 -0
  69. package/dist/types/src/framework/token-usage.d.ts +24 -0
  70. package/dist/types/src/framework/turn-context.d.ts +7 -0
  71. package/dist/types/src/testing/scripted-gateway.d.ts +45 -0
  72. package/dist/types/src/testing/turn-harness.d.ts +35 -0
  73. package/model-catalog.schema.json +57 -0
  74. package/package.json +64 -0
@@ -0,0 +1,27 @@
1
+ export { BaseGraph, type GraphDefinition, type GraphNodeConstructor, type GraphSchemaMigration, type HistorySpace, } from "../../src/framework/base-graph.js";
2
+ export { GRAPH_NODE_CLASS, GraphNode, GraphNodeRuntime, Tool, type EmptyModelResponseContext, type GraphNodeUpdate, type InvalidJsonResponseContext, type ToolDefinition, type ToolInput, type GraphNodeLocalState, type GraphNodeTarget, type NodeOutcomeBuilder, type OutcomeRouteTarget, } from "../../src/framework/graph-node.js";
3
+ export { ConversationNode, type ConversationNodeRunResult, } from "../../src/framework/conversation-node.js";
4
+ export { LLM_GATEWAY_FACTORY, assertLlmTimeoutMs, type LlmCallOptions, type LlmGateway, type LlmGatewayFactory, type LlmGatewayTool, type LlmGatewayToolCall, } from "../../src/framework/llm-gateway.js";
5
+ export { ConversationRunner, DEFAULT_CONVERSATION_POLICY, DEFAULT_EMPTY_HISTORY_SEED, DEFAULT_EMPTY_RESPONSE_RECOVERY, DEFAULT_MAX_AGENT_ROUNDS, EmptyModelResponseError, assertEmptyResponseRetries, assertMaxAgentRounds, type ConversationPolicy, type ConversationRunResult, type ConversationToolResult, type EmptyResponseRecovery, } from "../../src/framework/conversation-runner.js";
6
+ export { describeStopReason, isRetryableStopReason, modelStopReason, type ModelStopCategory, type ModelStopReason, } from "../../src/framework/model-stop-reason.js";
7
+ export { currentTurnContext, currentTurnSignal, withTurnContext, type TurnContext, } from "../../src/framework/turn-context.js";
8
+ export { type ConversationToolResultBuilder } from "../../src/framework/conversation-tool-result.js";
9
+ export { GraphStateSupport } from "../../src/framework/graph-state-support.js";
10
+ export { GRAPH_END_NODE, createGraphStateAnnotation, type GraphState, } from "../../src/framework/graph-state.js";
11
+ export { GraphRegistry, type RegisteredGraph, } from "../../src/framework/graph-registry.js";
12
+ export { GraphEngine, type GraphConstructor, type GraphEngineCreateOptions, type GraphEngineOptions, type RunResult, } from "../../src/framework/graph-engine.js";
13
+ export { ConfigManager, type ConfigManagerOptions, } from "../../src/framework/config-manager.js";
14
+ export { StateGraphExt, type CurrentNodeBranchOptions, type CurrentNodeSelector, type GraphEndpoint, type GraphNodeClass, type GraphNodeFactory, type RegisteredNode, } from "../../src/framework/state-graph-ext.js";
15
+ export { TerminateSessionNode } from "../../src/framework/terminate-session.node.js";
16
+ export { SessionLogError, SessionLogWarning, createSessionLogs, withSessionLogs, type SessionLogEntry, type SessionLogs, } from "../../src/framework/session-log.js";
17
+ export { ProviderFileManager, type LlmFile, } from "../../src/framework/llm-file.js";
18
+ export { SessionManager, SessionTurnError, SESSION_BUSY, SESSION_CONFLICT, SESSION_COMPLETED, SESSION_DOCUMENT_VERSION, MemorySessionDocumentContainer, sessionTurnLeaseMs, sessionRevision, isLiveSessionTurn, matchesSessionWritePredicate, type SessionGraphMetadata, type SessionGraphDocument, type SessionGraphStatus, type SessionDocument, type SessionDocumentContainer, type SessionTurnLease, type SessionTurnCode, type SessionWritePredicate, type SessionWriteResult, type SessionWriteOptions, type BeginTurnResult, } from "../../src/framework/persistence/session-manager.js";
19
+ export { MongoDbSessionDocumentContainer } from "../../src/framework/persistence/mongodb-session-document.container.js";
20
+ export { SqliteSessionDocumentContainer } from "../../src/framework/persistence/sqlite-session-document.container.js";
21
+ export { CosmosSessionDocumentContainer } from "../../src/framework/persistence/cosmos-session-document.container.js";
22
+ export { mergeNodeStates, type GraphNodeStates, type NodeStateValue, } from "../../src/framework/node-state.js";
23
+ export { LangChainLlmGateway, type LangChainLlmGatewayOptions, } from "../../src/framework/langchain-llm-gateway.js";
24
+ export { ModelProvider, type BuiltInModelProviderConfigs, type CustomModelProviderOptions, type ModelProviderRuntimeConfig, type RegisteredModelProviderAdapter, } from "../../src/framework/model-provider.js";
25
+ export { langChainModelInitialization, type LangChainModelInitialization, } from "../../src/framework/langchain-provider.adapter.js";
26
+ export { GRAPH_LLM_PROVIDERS, GRAPH_LLM_FAMILIES, GRAPH_LLM_CAPABILITIES, BUILT_IN_MODEL_CATALOG, GraphLlm, ModelCatalog, ModelProviderRegistry, type BuiltInGraphLlmConfig, type BuiltInModelId, type BuiltInModelParameters, type CommonModelParameters, type GraphLlmConfig, type GraphLlmConfigOverride, type GraphLlmCapability, type GraphLlmFamily, type GraphLlmModelMetadata, type GraphLlmParameters, type GraphLlmProvider, type GraphLlmRequiredCapabilities, type ModelCatalogDocument, type ModelParameterProfile, type ModelProviderAdapter, type ModelProviderInitialization, type RuntimeGraphLlmConfig, } from "../../src/framework/graph-llm.config.js";
27
+ export { addTokenUsage, emptyTokenUsage, modelExecution, normalizeTokenUsage, tokenUsageFromMessage, type ModelExecution, type ModelResult, type TokenUsage, } from "../../src/framework/token-usage.js";
@@ -0,0 +1,2 @@
1
+ export { ScriptedGateway, SCRIPTED_MODEL, SCRIPTED_TOKEN_USAGE, scriptedGateway, type ScriptedCall, } from "../../src/testing/scripted-gateway.js";
2
+ export { createTurnHarness, type HarnessTurn, type TurnHarness, } from "../../src/testing/turn-harness.js";
@@ -0,0 +1,66 @@
1
+ import { type GraphLlmConfig } from './graph-llm.config.js';
2
+ import { HumanMessage } from '@langchain/core/messages';
3
+ import type { LlmGateway } from './llm-gateway.js';
4
+ import { GraphNode, GraphNodeRuntime } from './graph-node.js';
5
+ import type { GraphState } from './graph-state.js';
6
+ import { StateGraphExt, type GraphNodeClass } from './state-graph-ext.js';
7
+ import type { StateDefinitionInit } from '@langchain/langgraph';
8
+ import type { SessionDocument } from './persistence/session-manager.js';
9
+ import { type ConversationPolicy } from './conversation-runner.js';
10
+ export type HistorySpace = readonly [GraphNodeClass, string];
11
+ export type GraphSchemaMigration<State extends GraphState = GraphState> = Readonly<{
12
+ from: number;
13
+ migrate(sessionDoc: SessionDocument<State>): SessionDocument<State> | Promise<SessionDocument<State>>;
14
+ }>;
15
+ export type GraphDefinition<NodeId extends string = string, State extends GraphState = GraphState> = Readonly<{
16
+ llmConfig: GraphLlmConfig;
17
+ endNode: NodeId;
18
+ schemaVersion?: number;
19
+ migrations?: readonly GraphSchemaMigration<State>[];
20
+ requiresUserMessage?: boolean;
21
+ responseMode?: 'chat' | 'json';
22
+ historySpaces?: readonly HistorySpace[];
23
+ initialHistorySpace?: string;
24
+ maxAgentRounds?: number;
25
+ llmTimeoutMs?: number;
26
+ emptyHistorySeed?: string | null;
27
+ emptyResponseRecovery?: Readonly<{
28
+ retries: number;
29
+ nudge: string;
30
+ }> | null;
31
+ }>;
32
+ export type GraphNodeConstructor<State extends GraphState> = GraphNodeClass & {
33
+ new (llmGateway: LlmGateway, runtime: GraphNodeRuntime<State>): GraphNode<State>;
34
+ };
35
+ export declare abstract class BaseGraph<State extends GraphState> {
36
+ protected readonly llmGateway: LlmGateway;
37
+ static id(): string;
38
+ static assertName(value: string): string;
39
+ static assertId(value: string): string;
40
+ readonly name: string;
41
+ readonly id: string;
42
+ readonly schemaVersion: number;
43
+ readonly llmConfig: GraphLlmConfig;
44
+ readonly requiresUserMessage: boolean;
45
+ readonly responseMode: 'chat' | 'json';
46
+ readonly maxAgentRounds: number;
47
+ readonly conversationPolicy: ConversationPolicy;
48
+ private compiledGraph?;
49
+ protected readonly runtime: GraphNodeRuntime<State>;
50
+ private readonly nodeMap;
51
+ private readonly endNode;
52
+ private readonly migrations;
53
+ protected constructor(llmGateway: LlmGateway, definition: GraphDefinition<State['currentNode'], State>);
54
+ get graph(): {
55
+ invoke(input: unknown): Promise<State>;
56
+ };
57
+ prepareInput(state: State | undefined, message: HumanMessage): Partial<State>;
58
+ restoreSessionDoc(sessionDoc: SessionDocument<State>): Promise<SessionDocument<State> | null>;
59
+ protected onRestoreSessionDoc(sessionDoc: SessionDocument<State>): Promise<SessionDocument<State> | null>;
60
+ protected idleMs(sessionDoc: Pick<SessionDocument, 'modifiedAt'>): number;
61
+ protected abstract buildGraph(): {
62
+ invoke(input: unknown): Promise<State>;
63
+ };
64
+ protected createStateGraph<StateDefinition extends StateDefinitionInit>(state: StateDefinition): StateGraphExt<StateDefinition>;
65
+ private createNode;
66
+ }
@@ -0,0 +1,13 @@
1
+ export type ConfigManagerOptions = Readonly<{
2
+ envFilePath?: string | string[];
3
+ ignoreEnvFile?: boolean;
4
+ environment?: Readonly<Record<string, string | undefined>>;
5
+ values?: Readonly<Record<string, string | undefined>>;
6
+ }>;
7
+ export declare class ConfigManager {
8
+ private readonly values;
9
+ constructor(options?: ConfigManagerOptions);
10
+ get(key: string): string | undefined;
11
+ get(key: string, defaultValue: string): string;
12
+ require(key: string): string;
13
+ }
@@ -0,0 +1,18 @@
1
+ import type { ConversationRunResult, ConversationToolResult } from './conversation-runner.js';
2
+ import { GraphNode, type GraphNodeUpdate, type NodeOutcomeBuilder } from './graph-node.js';
3
+ import type { GraphState } from './graph-state.js';
4
+ export type ConversationNodeRunResult = ConversationRunResult & {
5
+ quitRequested: boolean;
6
+ };
7
+ export declare abstract class ConversationNode<State extends GraphState, LocalState extends object = Record<string, never>, Context extends object = Record<string, never>> extends GraphNode<State, LocalState, Context> {
8
+ private readonly quitRequests;
9
+ readonly supportsAutomaticOutcomeRouting = true;
10
+ protected abstract createContext(state: State): Context;
11
+ protected abstract nextStep(state: State, context: Context, conversation: ConversationNodeRunResult): GraphNodeUpdate<State> | Promise<GraphNodeUpdate<State>>;
12
+ protected endChat(input: {
13
+ message?: string;
14
+ }, context: Context): Promise<ConversationToolResult>;
15
+ protected quit(conversation: ConversationRunResult): NodeOutcomeBuilder<State, LocalState>;
16
+ run(state: State): Promise<GraphNodeUpdate<State>>;
17
+ protected runConversation(state: State, context: Context): Promise<ConversationNodeRunResult>;
18
+ }
@@ -0,0 +1,49 @@
1
+ import { type BaseMessage } from '@langchain/core/messages';
2
+ import type { ToolCall } from '@langchain/core/messages/tool';
3
+ import type { GraphLlmConfig } from './graph-llm.config.js';
4
+ import type { LlmCallOptions, LlmGateway, LlmGatewayTool } from './llm-gateway.js';
5
+ import { type TokenUsage } from './token-usage.js';
6
+ import type { ConversationToolResult } from './conversation-tool-result.js';
7
+ import { type ModelStopReason } from './model-stop-reason.js';
8
+ export type { ConversationToolResult } from './conversation-tool-result.js';
9
+ export type ConversationRunResult = {
10
+ messages: BaseMessage[];
11
+ usage: TokenUsage;
12
+ response?: string;
13
+ stoppedAfterTool: boolean;
14
+ stopReason?: ModelStopReason;
15
+ };
16
+ export declare class EmptyModelResponseError extends Error {
17
+ readonly reason: ModelStopReason;
18
+ constructor(reason: ModelStopReason);
19
+ }
20
+ export declare const DEFAULT_MAX_AGENT_ROUNDS = 8;
21
+ export declare function assertMaxAgentRounds(value: number): number;
22
+ export declare const DEFAULT_EMPTY_HISTORY_SEED = "Start";
23
+ export type EmptyResponseRecovery = Readonly<{
24
+ retries: number;
25
+ nudge: string;
26
+ }>;
27
+ export declare const DEFAULT_EMPTY_RESPONSE_RECOVERY: EmptyResponseRecovery;
28
+ export declare function assertEmptyResponseRetries(value: number): number;
29
+ export type ConversationPolicy = Readonly<{
30
+ llmTimeoutMs?: number;
31
+ emptyHistorySeed: string | null;
32
+ emptyResponseRecovery: EmptyResponseRecovery | null;
33
+ }>;
34
+ export declare const DEFAULT_CONVERSATION_POLICY: ConversationPolicy;
35
+ export declare class ConversationRunner {
36
+ private readonly llmGateway;
37
+ constructor(llmGateway: LlmGateway);
38
+ run(options: {
39
+ systemPrompt: string;
40
+ history: readonly BaseMessage[];
41
+ tools: readonly LlmGatewayTool[];
42
+ llmConfig: GraphLlmConfig;
43
+ executeTool: (call: ToolCall) => Promise<ConversationToolResult>;
44
+ maxAgentRounds?: number;
45
+ emptyHistorySeed?: string | null;
46
+ emptyResponseRecovery?: EmptyResponseRecovery | null;
47
+ callOptions?: LlmCallOptions;
48
+ }): Promise<ConversationRunResult>;
49
+ }
@@ -0,0 +1,19 @@
1
+ import type { BaseMessage } from '@langchain/core/messages';
2
+ export type ConversationToolResult = {
3
+ output: unknown;
4
+ messages?: BaseMessage[];
5
+ cleanup?: () => Promise<void>;
6
+ stopAfterBatch?: boolean;
7
+ };
8
+ type ContextEffect<Context extends object> = Partial<Context> | ((context: Readonly<Context>) => Partial<Context>);
9
+ type StopPredicate<Context extends object> = boolean | ((context: Readonly<Context>) => boolean);
10
+ export type ConversationToolResultBuilder<Context extends object> = ConversationToolResult & {
11
+ withContext(effect: ContextEffect<Context>): ConversationToolResultBuilder<Context>;
12
+ withMessages(messages: BaseMessage | readonly BaseMessage[]): ConversationToolResultBuilder<Context>;
13
+ withCleanup(cleanup: () => Promise<void>): ConversationToolResultBuilder<Context>;
14
+ haltAfterBatch(): ConversationToolResultBuilder<Context>;
15
+ stopAfterBatchWhen(predicate: StopPredicate<Context>): ConversationToolResultBuilder<Context>;
16
+ };
17
+ export declare function createConversationToolResult<Context extends object>(output: unknown): ConversationToolResultBuilder<Context>;
18
+ export declare function resolveConversationToolResult<Context extends object>(result: ConversationToolResult, context: Context): ConversationToolResult;
19
+ export {};
@@ -0,0 +1,82 @@
1
+ import { ConfigManager } from "./config-manager.js";
2
+ import type { GraphDefinition } from "./base-graph.js";
3
+ import type { LlmGateway, LlmGatewayFactory } from "./llm-gateway.js";
4
+ import type { GraphState } from "./graph-state.js";
5
+ import type { RegisteredGraph } from "./graph-registry.js";
6
+ import type { RegisteredModelProviderAdapter } from "./model-provider.js";
7
+ import { SessionManager, type SessionDocument } from "./persistence/session-manager.js";
8
+ export type GraphConstructor = {
9
+ new (llmGateway: LlmGateway): RegisteredGraph;
10
+ getGraphDefinition(): GraphDefinition;
11
+ };
12
+ export type GraphEngineOptions = Readonly<{
13
+ sessionManager?: SessionManager;
14
+ llmGatewayFactory?: LlmGatewayFactory;
15
+ graphs?: readonly GraphConstructor[];
16
+ providers?: readonly RegisteredModelProviderAdapter[];
17
+ }>;
18
+ export type GraphEngineCreateOptions = Readonly<{
19
+ configManager?: ConfigManager;
20
+ llmGatewayFactory?: LlmGatewayFactory;
21
+ graphs?: readonly GraphConstructor[];
22
+ providers?: readonly RegisteredModelProviderAdapter[];
23
+ }>;
24
+ export type RunResult = {
25
+ status: number;
26
+ body: {
27
+ success: boolean;
28
+ completed: boolean;
29
+ message: string;
30
+ bot?: string;
31
+ session?: string;
32
+ code?: string;
33
+ } | Record<string, unknown>;
34
+ session?: string;
35
+ contentType?: "application/json";
36
+ };
37
+ export declare class GraphEngine {
38
+ private readonly registry;
39
+ private readonly sessions;
40
+ private readonly llmGatewayFactory;
41
+ private readonly inflightSessions;
42
+ constructor(options?: GraphEngineOptions);
43
+ static create(options?: GraphEngineCreateOptions): Promise<GraphEngine>;
44
+ registerGraph(graphClasses: readonly GraphConstructor[]): this;
45
+ getGraphs(): string[];
46
+ getSession<State extends GraphState = GraphState>(sessionId: string): Promise<SessionDocument<State> | undefined>;
47
+ run(input: {
48
+ graphName?: string;
49
+ userMessage?: string;
50
+ config?: Record<string, unknown>;
51
+ sessionId?: string;
52
+ signal?: AbortSignal;
53
+ }): Promise<RunResult>;
54
+ private withTurnScope;
55
+ deleteSession(sessionId?: string): Promise<{
56
+ status: number;
57
+ body: {
58
+ success: boolean;
59
+ message: string;
60
+ session?: never;
61
+ };
62
+ } | {
63
+ status: number;
64
+ body: {
65
+ success: boolean;
66
+ session: string;
67
+ message?: never;
68
+ };
69
+ } | {
70
+ status: number;
71
+ body: {
72
+ success: boolean;
73
+ session: string;
74
+ message: string;
75
+ };
76
+ }>;
77
+ close(): Promise<void>;
78
+ private conflictResult;
79
+ private completedSessionResult;
80
+ private jsonResult;
81
+ private chatResult;
82
+ }
@@ -0,0 +1,21 @@
1
+ import type { ModelProfile } from '@langchain/core/language_models/profile';
2
+ import { type GraphLlmConfig, type GraphLlmFamily, type GraphLlmParameters } from './model-catalog.js';
3
+ export { BUILT_IN_MODEL_CATALOG, GRAPH_LLM_CAPABILITIES, GRAPH_LLM_FAMILIES, GRAPH_LLM_PROVIDERS, ModelCatalog, ModelProviderRegistry, type AnthropicChatParameters, type AnthropicThinkingParameters, type BasicChatParameters, type BuiltInGraphLlmConfig, type BuiltInModelId, type BuiltInModelParameters, type CommonModelParameters, type GoogleChatParameters, type GraphLlmCapability, type GraphLlmConfig, type GraphLlmFamily, type GraphLlmParameters, type GraphLlmProvider, type GraphLlmRequiredCapabilities, type ModelCatalogDocument, type ModelParameterProfile, type ModelProviderAdapter, type ModelProviderInitialization, type OpenAIChatParameters, type OpenAIReasoningParameters, type ResolvedModelDescriptor, type RuntimeGraphLlmConfig, } from './model-catalog.js';
4
+ export type GraphLlmConfigOverride = GraphLlmConfig | Readonly<{
5
+ model?: never;
6
+ params?: Readonly<Record<string, unknown | null>>;
7
+ }>;
8
+ export type GraphLlmModelMetadata = Readonly<{
9
+ name: string;
10
+ family: GraphLlmFamily;
11
+ params: GraphLlmParameters;
12
+ }>;
13
+ export declare class GraphLlm {
14
+ private constructor();
15
+ static validateConfig(config: GraphLlmConfig): GraphLlmConfig;
16
+ static resolveConfig(defaults: GraphLlmConfig, override?: GraphLlmConfigOverride): GraphLlmConfig;
17
+ static modelIdentifier(config: GraphLlmConfig): string;
18
+ static parameters(config: GraphLlmConfig): GraphLlmParameters;
19
+ static modelMetadata(config: GraphLlmConfig): GraphLlmModelMetadata;
20
+ static validateProfile(config: GraphLlmConfig, profile: Readonly<ModelProfile>): void;
21
+ }
@@ -0,0 +1,106 @@
1
+ import type { GraphState } from './graph-state.js';
2
+ import type { LlmCallOptions, LlmGateway, LlmGatewayTool } from './llm-gateway.js';
3
+ import 'reflect-metadata';
4
+ import { type BaseMessage } from '@langchain/core/messages';
5
+ import type { ToolCall } from '@langchain/core/messages/tool';
6
+ import { type GraphLlmConfig, type GraphLlmConfigOverride } from './graph-llm.config.js';
7
+ import type { NodeStateValue } from './node-state.js';
8
+ import { GraphStateSupport } from './graph-state-support.js';
9
+ import { type ConversationPolicy, type ConversationRunResult, type ConversationToolResult } from './conversation-runner.js';
10
+ import type { ModelStopReason } from './model-stop-reason.js';
11
+ import { type ConversationToolResultBuilder } from './conversation-tool-result.js';
12
+ import { GRAPH_NODE_LOCAL_STATE, type GraphNodeTarget, type GraphNodeUpdate, type NodeOutcomeBuilder } from './node-outcome.js';
13
+ export { GRAPH_NODE_LOCAL_STATE, type GraphNodeLocalState, type GraphNodeTarget, type GraphNodeUpdate, type NodeOutcomeBuilder, type OutcomeRouteTarget, } from './node-outcome.js';
14
+ export type ToolDefinition<Input extends Record<string, unknown> = Record<string, unknown>> = Readonly<LlmGatewayTool<Input>>;
15
+ export type ToolInput<Tool extends ToolDefinition<any>> = Tool extends ToolDefinition<infer Input> ? Input : never;
16
+ export type InvalidJsonResponseContext<State extends GraphState> = Readonly<{
17
+ state: Readonly<State>;
18
+ update: Readonly<GraphNodeUpdate<State>>;
19
+ response: string;
20
+ error: Error;
21
+ }>;
22
+ export type EmptyModelResponseContext<State extends GraphState> = Readonly<{
23
+ state: Readonly<State>;
24
+ conversation: Readonly<ConversationRunResult>;
25
+ reason: ModelStopReason;
26
+ }>;
27
+ export declare const GRAPH_NODE_CLASS: unique symbol;
28
+ export declare function Tool(toolName: string): MethodDecorator;
29
+ export declare abstract class GraphNode<State extends GraphState, LocalState extends object = Record<string, never>, ToolContext extends object = Record<string, never>> {
30
+ protected readonly llmGateway: LlmGateway;
31
+ private readonly runtime;
32
+ static readonly [GRAPH_NODE_CLASS] = true;
33
+ static id(): string;
34
+ static readonly name: string;
35
+ readonly [GRAPH_NODE_LOCAL_STATE]: LocalState;
36
+ readonly supportsAutomaticOutcomeRouting: boolean;
37
+ readonly name: string;
38
+ readonly id: string;
39
+ constructor(llmGateway: LlmGateway, runtime: GraphNodeRuntime<State>);
40
+ abstract getPrompt(state: State): string;
41
+ defineTool(): readonly ToolDefinition[];
42
+ getLlmConfig(): GraphLlmConfigOverride;
43
+ route(_state: State): string;
44
+ protected handleTool(state: State, call: ToolCall, context: ToolContext): Promise<ConversationToolResult>;
45
+ private rejectToolCall;
46
+ abstract run(state: State): GraphNodeUpdate<State> | Promise<GraphNodeUpdate<State>>;
47
+ protected onInvalidJsonResponse(context: InvalidJsonResponseContext<State>): GraphNodeUpdate<State> | Promise<GraphNodeUpdate<State>>;
48
+ protected onEmptyModelResponse(context: EmptyModelResponseContext<State>): string | Promise<string>;
49
+ readonly invoke: (state: State) => Promise<GraphNodeUpdate<State>>;
50
+ obtainTools(): readonly ToolDefinition[];
51
+ validateTools(): void;
52
+ protected llmConfig(): GraphLlmConfig;
53
+ protected llmCallOptions(): LlmCallOptions;
54
+ protected runConversation(state: State, context: ToolContext): Promise<ConversationRunResult>;
55
+ private runAgentLoop;
56
+ protected toolResult(output: unknown): ConversationToolResultBuilder<ToolContext>;
57
+ protected historySpace(): string;
58
+ protected history(state: Pick<State, 'histories'>): BaseMessage[];
59
+ protected historyUpdate(messages: BaseMessage[]): Pick<State, 'histories'>;
60
+ protected respond(message: string): GraphNodeUpdate<State>;
61
+ protected complete(message: string): GraphNodeUpdate<State>;
62
+ protected stay(conversation: ConversationRunResult, response?: string | undefined): NodeOutcomeBuilder<State, LocalState>;
63
+ protected resumeAt<NodeClass extends GraphNodeTarget>(NodeClass: NodeClass, conversation: ConversationRunResult): NodeOutcomeBuilder<State, LocalState>;
64
+ protected advance<NodeClass extends GraphNodeTarget>(NodeClass: NodeClass, conversation: ConversationRunResult): NodeOutcomeBuilder<State, LocalState, true>;
65
+ protected transition<NodeClass extends GraphNodeTarget>(NodeClass: NodeClass, conversation: ConversationRunResult, canForwardInput: false): NodeOutcomeBuilder<State, LocalState>;
66
+ protected transition<NodeClass extends GraphNodeTarget>(NodeClass: NodeClass, conversation: ConversationRunResult, canForwardInput: true): NodeOutcomeBuilder<State, LocalState, true>;
67
+ protected finish(response: string, conversation: ConversationRunResult): NodeOutcomeBuilder<State, LocalState>;
68
+ protected state(state: Pick<State, 'nodes'>): NodeStateValue<LocalState>;
69
+ protected save(patch: Partial<LocalState>): GraphNodeUpdate<State>;
70
+ protected remove(...keys: (keyof LocalState & string)[]): GraphNodeUpdate<State>;
71
+ private outcomeBuilder;
72
+ private toolHandler;
73
+ private resolveJsonResponse;
74
+ private toolHandlers;
75
+ }
76
+ export declare class GraphNodeRuntime<State extends GraphState> extends GraphStateSupport<State['currentNode'], State['nodes']> {
77
+ private readonly defaultLlmConfig;
78
+ private readonly historySpaces;
79
+ private readonly initialHistorySpace;
80
+ private readonly responseMode;
81
+ readonly maxAgentRounds: number;
82
+ readonly conversationPolicy: ConversationPolicy;
83
+ private readonly tools;
84
+ constructor(endNode: State['currentNode'], defaultLlmConfig: GraphLlmConfig, historySpaces?: Readonly<Record<string, string>>, initialHistorySpace?: string, responseMode?: 'chat' | 'json', maxAgentRounds?: number, conversationPolicy?: ConversationPolicy);
85
+ llmCallOptions(): LlmCallOptions;
86
+ expectsJsonResponse(): boolean;
87
+ historySpace(currentNode?: string): string;
88
+ resolveLlmConfig(override?: GraphLlmConfigOverride): GraphLlmConfig;
89
+ registerTools(owner: string, definitions: readonly ToolDefinition[]): void;
90
+ requireTool(name: string): ToolDefinition;
91
+ input(state: Pick<State, 'histories' | 'currentNode'>): string;
92
+ respond(message: string): {
93
+ response: string;
94
+ inputConsumed: boolean;
95
+ };
96
+ complete(message: string): {
97
+ currentNode: State["currentNode"];
98
+ completed: boolean;
99
+ response: string;
100
+ inputConsumed: boolean;
101
+ };
102
+ saveNode(nodeName: string, values: NodeStateValue): {
103
+ nodes: State["nodes"];
104
+ };
105
+ removeNode(nodeName: string, ...keys: string[]): NonNullable<State["nodes"][keyof State["nodes"]]>;
106
+ }
@@ -0,0 +1,26 @@
1
+ import type { GraphState } from './graph-state.js';
2
+ import type { GraphLlmConfig } from './graph-llm.config.js';
3
+ import type { HumanMessage } from '@langchain/core/messages';
4
+ import type { SessionDocument } from './persistence/session-manager.js';
5
+ export interface RegisteredGraph<State extends GraphState = GraphState> {
6
+ readonly id?: string;
7
+ readonly name: string;
8
+ readonly schemaVersion?: number;
9
+ readonly llmConfig: GraphLlmConfig;
10
+ readonly requiresUserMessage?: boolean;
11
+ readonly responseMode?: 'chat' | 'json';
12
+ readonly graph: {
13
+ invoke(input: any): Promise<State>;
14
+ };
15
+ prepareInput(state: State | undefined, message: HumanMessage): Partial<State>;
16
+ restoreSessionDoc?(sessionDoc: SessionDocument<State>): Promise<SessionDocument<State> | null>;
17
+ }
18
+ export declare class GraphRegistry {
19
+ private readonly graphs;
20
+ constructor(graphs?: readonly RegisteredGraph[]);
21
+ register(graphs: readonly RegisteredGraph[]): void;
22
+ get(id?: string): RegisteredGraph | undefined;
23
+ names(): string[];
24
+ }
25
+ export declare function registeredGraphId(graph: RegisteredGraph): string;
26
+ export declare function registeredGraphSchemaVersion(graph: RegisteredGraph): number;
@@ -0,0 +1,24 @@
1
+ import { type BaseMessage } from '@langchain/core/messages';
2
+ type MessageState = {
3
+ messages: BaseMessage[];
4
+ };
5
+ export declare abstract class GraphStateSupport<CurrentNode extends string, Nodes extends object> {
6
+ private readonly endNode;
7
+ protected constructor(endNode: CurrentNode);
8
+ protected saveState<NodeName extends keyof Nodes>(nodeName: NodeName, values: NonNullable<Nodes[NodeName]>): {
9
+ nodes: Nodes;
10
+ };
11
+ protected removeState<NodeName extends keyof Nodes, StateKey extends keyof NonNullable<Nodes[NodeName]>>(_nodeName: NodeName, ...keys: StateKey[]): NonNullable<Nodes[NodeName]>;
12
+ protected latestInput(state: MessageState): string;
13
+ protected responseUpdate(message: string): {
14
+ response: string;
15
+ inputConsumed: boolean;
16
+ };
17
+ protected endUpdate(message: string): {
18
+ currentNode: CurrentNode;
19
+ completed: boolean;
20
+ response: string;
21
+ inputConsumed: boolean;
22
+ };
23
+ }
24
+ export {};
@@ -0,0 +1,26 @@
1
+ import type { BaseMessage } from '@langchain/core/messages';
2
+ import { type GraphNodeStates } from './node-state.js';
3
+ import { type TokenUsage } from './token-usage.js';
4
+ export declare const GRAPH_END_NODE: "end";
5
+ export type GraphState<CurrentNode extends string = string, Nodes extends object = GraphNodeStates> = {
6
+ histories: Record<string, BaseMessage[]>;
7
+ currentNode: CurrentNode;
8
+ config: Record<string, unknown>;
9
+ nodes: Nodes;
10
+ tokens: TokenUsage;
11
+ inputConsumed: boolean;
12
+ response: string;
13
+ completed: boolean;
14
+ outcomeRoute: string | undefined;
15
+ };
16
+ export declare function createGraphStateAnnotation<CurrentNode extends string = string, Nodes extends object = GraphNodeStates>(defaultCurrentNode: string, createInitialNodes?: () => Nodes): import("@langchain/langgraph").AnnotationRoot<{
17
+ histories: import("@langchain/langgraph").BaseChannel<Record<string, BaseMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>, import("@langchain/core/messages").MessageType>[]>, Record<string, BaseMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>, import("@langchain/core/messages").MessageType>[]> | import("@langchain/langgraph").OverwriteValue<Record<string, BaseMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>, import("@langchain/core/messages").MessageType>[]>>, unknown>;
18
+ currentNode: import("@langchain/langgraph").BaseChannel<CurrentNode, CurrentNode | import("@langchain/langgraph").OverwriteValue<CurrentNode>, unknown>;
19
+ config: import("@langchain/langgraph").BaseChannel<Record<string, unknown>, Record<string, unknown> | import("@langchain/langgraph").OverwriteValue<Record<string, unknown>>, unknown>;
20
+ nodes: import("@langchain/langgraph").BaseChannel<Nodes, Nodes | import("@langchain/langgraph").OverwriteValue<Nodes>, unknown>;
21
+ tokens: import("@langchain/langgraph").BaseChannel<TokenUsage, TokenUsage | import("@langchain/langgraph").OverwriteValue<TokenUsage>, unknown>;
22
+ inputConsumed: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
23
+ response: import("@langchain/langgraph").BaseChannel<string, string | import("@langchain/langgraph").OverwriteValue<string>, unknown>;
24
+ completed: import("@langchain/langgraph").BaseChannel<boolean, boolean | import("@langchain/langgraph").OverwriteValue<boolean>, unknown>;
25
+ outcomeRoute: import("@langchain/langgraph").BaseChannel<string | undefined, string | import("@langchain/langgraph").OverwriteValue<string | undefined> | undefined, unknown>;
26
+ }>;
@@ -0,0 +1 @@
1
+ export declare function parseJsonObjectResponse(response: string): Record<string, unknown>;
@@ -0,0 +1,23 @@
1
+ import { type BaseMessage, type AIMessage } from "@langchain/core/messages";
2
+ import type { z } from "zod";
3
+ import { type LlmCallOptions, type LlmGateway, type LlmGatewayTool, type LlmGatewayToolCall } from "./llm-gateway.js";
4
+ import { type GraphLlmConfig } from "./graph-llm.config.js";
5
+ import { type RegisteredModelProviderAdapter } from "./model-provider.js";
6
+ import { type ModelResult } from "./token-usage.js";
7
+ export type LangChainLlmGatewayOptions = Readonly<{
8
+ providers?: readonly RegisteredModelProviderAdapter[];
9
+ }>;
10
+ export declare class LangChainLlmGateway implements LlmGateway {
11
+ private readonly models;
12
+ private readonly llmConfig;
13
+ private readonly providers;
14
+ constructor(llmConfig: GraphLlmConfig, options?: LangChainLlmGatewayOptions);
15
+ generate(systemPrompt: string, userPrompt: string, llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<string>>;
16
+ structured<T extends Record<string, unknown>>(schema: z.ZodType<T>, systemPrompt: string, input: string, name: string, llmConfig?: GraphLlmConfig, history?: readonly BaseMessage[], callOptions?: LlmCallOptions): Promise<ModelResult<T>>;
17
+ respond(systemPrompt: string, history: readonly BaseMessage[], llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<string>>;
18
+ agent(systemPrompt: string, history: readonly BaseMessage[], tools: readonly LlmGatewayTool[], llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<AIMessage>>;
19
+ toolCall(systemPrompt: string, userPrompt: string, tools: readonly LlmGatewayTool[], llmConfig?: GraphLlmConfig, history?: readonly BaseMessage[], callOptions?: LlmCallOptions): Promise<ModelResult<LlmGatewayToolCall | undefined>>;
20
+ private messages;
21
+ private getModel;
22
+ private invoke;
23
+ }
@@ -0,0 +1,4 @@
1
+ import type { GraphLlmConfig, ModelProviderInitialization } from './graph-llm.config.js';
2
+ import { type RegisteredModelProviderAdapter } from './model-provider.js';
3
+ export type LangChainModelInitialization = ModelProviderInitialization;
4
+ export declare function langChainModelInitialization(config: GraphLlmConfig, providers?: readonly RegisteredModelProviderAdapter[]): LangChainModelInitialization;
@@ -0,0 +1,13 @@
1
+ export type LlmFile = {
2
+ contentPart: Record<string, unknown>;
3
+ fileId: string;
4
+ cleanup: () => Promise<void>;
5
+ };
6
+ export declare class ProviderFileManager {
7
+ private readonly provider;
8
+ constructor(provider: string);
9
+ uploadFile(filePath: string): Promise<LlmFile>;
10
+ private uploadToOpenAI;
11
+ private uploadToGoogle;
12
+ private uploadToAnthropic;
13
+ }
@@ -0,0 +1,27 @@
1
+ import type { ZodType } from 'zod';
2
+ import type { AIMessage, BaseMessage } from '@langchain/core/messages';
3
+ import type { GraphLlmConfig } from './graph-llm.config.js';
4
+ import type { ModelResult } from './token-usage.js';
5
+ export declare const LLM_GATEWAY_FACTORY: unique symbol;
6
+ export type LlmCallOptions = Readonly<{
7
+ signal?: AbortSignal;
8
+ timeoutMs?: number;
9
+ }>;
10
+ export declare function assertLlmTimeoutMs(value: number): number;
11
+ export interface LlmGateway {
12
+ structured<T extends Record<string, unknown>>(schema: ZodType<T>, systemPrompt: string, input: string, name: string, llmConfig?: GraphLlmConfig, history?: readonly BaseMessage[], callOptions?: LlmCallOptions): Promise<ModelResult<T>>;
13
+ generate(systemPrompt: string, userPrompt: string, llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<string>>;
14
+ respond(systemPrompt: string, history: readonly BaseMessage[], llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<string>>;
15
+ agent(systemPrompt: string, history: readonly BaseMessage[], tools: readonly LlmGatewayTool[], llmConfig?: GraphLlmConfig, callOptions?: LlmCallOptions): Promise<ModelResult<AIMessage>>;
16
+ toolCall(systemPrompt: string, userPrompt: string, tools: readonly LlmGatewayTool[], llmConfig?: GraphLlmConfig, history?: readonly BaseMessage[], callOptions?: LlmCallOptions): Promise<ModelResult<LlmGatewayToolCall | undefined>>;
17
+ }
18
+ export type LlmGatewayFactory = (config: GraphLlmConfig) => LlmGateway;
19
+ export type LlmGatewayTool<Input extends Record<string, unknown> = Record<string, unknown>> = {
20
+ name: string;
21
+ description: string;
22
+ schema: ZodType<Input>;
23
+ };
24
+ export type LlmGatewayToolCall = {
25
+ name: string;
26
+ args: Record<string, unknown>;
27
+ };