substrai-lambdallm 1.1.0 → 1.2.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.
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Multi-agent router, tool sandboxing, and async tool dispatch.
3
+ */
4
+ import { Agent, AgentResult } from './agent';
5
+ import { LambdaLLMContext } from '../core/context';
6
+ export interface RouteConfig {
7
+ agent: Agent;
8
+ description: string;
9
+ keywords: string[];
10
+ priority?: number;
11
+ }
12
+ export declare class AgentRouter {
13
+ private routes;
14
+ private fallback?;
15
+ private strategy;
16
+ constructor(options: {
17
+ routes: RouteConfig[];
18
+ fallback?: Agent;
19
+ strategy?: 'keyword' | 'llm';
20
+ });
21
+ route(query: string, context: LambdaLLMContext): Promise<AgentResult>;
22
+ private routeByKeyword;
23
+ private routeByLLM;
24
+ }
25
+ export interface SandboxPolicy {
26
+ allowedActions: string[];
27
+ deniedActions: string[];
28
+ maxExecutionTimeMs: number;
29
+ }
30
+ export declare class ToolSandbox {
31
+ private policy;
32
+ constructor(policy?: Partial<SandboxPolicy>);
33
+ execute<T>(fn: () => T | Promise<T>): Promise<T>;
34
+ validateAction(action: string): boolean;
35
+ }
36
+ export interface AsyncToolRequest {
37
+ requestId: string;
38
+ toolName: string;
39
+ toolInput: Record<string, any>;
40
+ }
41
+ export declare class AsyncToolDispatcher {
42
+ private queueUrl?;
43
+ private client;
44
+ constructor(options?: {
45
+ queueUrl?: string;
46
+ });
47
+ dispatch(toolName: string, toolInput: Record<string, any>): Promise<AsyncToolRequest>;
48
+ private sendToSQS;
49
+ private generateId;
50
+ }
51
+ export declare class StreamingResponse {
52
+ private chunks;
53
+ private generator;
54
+ constructor(generator: AsyncGenerator<string>);
55
+ [Symbol.asyncIterator](): AsyncGenerator<string>;
56
+ getFullText(): Promise<string>;
57
+ toLambdaStream(): AsyncGenerator<Buffer>;
58
+ }
59
+ //# sourceMappingURL=extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../src/agents/extras.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAoB;gBAExB,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,KAAK,CAAA;KAAE;IAMxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAe3E,OAAO,CAAC,cAAc;YAUR,UAAU;CAUzB;AAID,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAQrC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAWtD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAUxC;AAID,MAAM,WAAW,gBAAgB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAAE;AAE1G,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAa;gBAEf,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;IAIzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAY7E,SAAS;IAavB,OAAO,CAAC,UAAU;CAMnB;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAyB;gBAE9B,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC;IAItC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC;IAOjD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC,cAAc,IAAI,cAAc,CAAC,MAAM,CAAC;CAWzC"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-agent router, tool sandboxing, and async tool dispatch.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StreamingResponse = exports.AsyncToolDispatcher = exports.ToolSandbox = exports.AgentRouter = void 0;
7
+ class AgentRouter {
8
+ constructor(options) {
9
+ this.routes = options.routes.sort((a, b) => (b.priority || 0) - (a.priority || 0));
10
+ this.fallback = options.fallback;
11
+ this.strategy = options.strategy || 'keyword';
12
+ }
13
+ async route(query, context) {
14
+ let agent;
15
+ if (this.strategy === 'keyword') {
16
+ agent = this.routeByKeyword(query);
17
+ }
18
+ else {
19
+ agent = await this.routeByLLM(query, context);
20
+ }
21
+ if (!agent)
22
+ agent = this.fallback;
23
+ if (!agent)
24
+ throw new Error('No agent matched and no fallback configured');
25
+ return agent.run(query, context);
26
+ }
27
+ routeByKeyword(query) {
28
+ const lower = query.toLowerCase();
29
+ for (const route of this.routes) {
30
+ for (const keyword of route.keywords) {
31
+ if (lower.includes(keyword.toLowerCase()))
32
+ return route.agent;
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ async routeByLLM(query, context) {
38
+ const descriptions = this.routes.map(r => `- ${r.agent.name}: ${r.description}`).join('\n');
39
+ const prompt = `Classify this query into one of these categories:\n${descriptions}\n\nQuery: ${query}\n\nRespond with ONLY the agent name.`;
40
+ try {
41
+ const response = await context.invoke(prompt);
42
+ const name = response.trim().toLowerCase();
43
+ const match = this.routes.find(r => r.agent.name.toLowerCase() === name);
44
+ return match?.agent;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ }
51
+ exports.AgentRouter = AgentRouter;
52
+ class ToolSandbox {
53
+ constructor(policy) {
54
+ this.policy = {
55
+ allowedActions: policy?.allowedActions || [],
56
+ deniedActions: policy?.deniedActions || [],
57
+ maxExecutionTimeMs: policy?.maxExecutionTimeMs || 30000,
58
+ };
59
+ }
60
+ async execute(fn) {
61
+ const start = Date.now();
62
+ const result = await Promise.race([
63
+ Promise.resolve(fn()),
64
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Tool execution exceeded timeout (${this.policy.maxExecutionTimeMs}ms)`)), this.policy.maxExecutionTimeMs)),
65
+ ]);
66
+ return result;
67
+ }
68
+ validateAction(action) {
69
+ if (this.policy.deniedActions.includes(action))
70
+ return false;
71
+ if (this.policy.allowedActions.length === 0)
72
+ return true;
73
+ for (const allowed of this.policy.allowedActions) {
74
+ if (allowed === '*')
75
+ return true;
76
+ if (allowed.endsWith('*') && action.startsWith(allowed.slice(0, -1)))
77
+ return true;
78
+ if (action === allowed)
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ }
84
+ exports.ToolSandbox = ToolSandbox;
85
+ class AsyncToolDispatcher {
86
+ constructor(options = {}) {
87
+ this.client = null;
88
+ this.queueUrl = options.queueUrl;
89
+ }
90
+ async dispatch(toolName, toolInput) {
91
+ const requestId = this.generateId();
92
+ const request = { requestId, toolName, toolInput };
93
+ if (this.queueUrl) {
94
+ await this.sendToSQS(request);
95
+ }
96
+ console.log(JSON.stringify({ event: 'async_tool.dispatched', ...request }));
97
+ return request;
98
+ }
99
+ async sendToSQS(request) {
100
+ try {
101
+ const { SQSClient, SendMessageCommand } = require('@aws-sdk/client-sqs');
102
+ if (!this.client)
103
+ this.client = new SQSClient({});
104
+ await this.client.send(new SendMessageCommand({
105
+ QueueUrl: this.queueUrl,
106
+ MessageBody: JSON.stringify(request),
107
+ }));
108
+ }
109
+ catch (e) {
110
+ throw new Error(`Failed to dispatch async tool: ${e.message}`);
111
+ }
112
+ }
113
+ generateId() {
114
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
115
+ const r = Math.random() * 16 | 0;
116
+ return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
117
+ });
118
+ }
119
+ }
120
+ exports.AsyncToolDispatcher = AsyncToolDispatcher;
121
+ // ===== STREAMING =====
122
+ class StreamingResponse {
123
+ constructor(generator) {
124
+ this.chunks = [];
125
+ this.generator = generator;
126
+ }
127
+ async *[Symbol.asyncIterator]() {
128
+ for await (const chunk of this.generator) {
129
+ this.chunks.push(chunk);
130
+ yield chunk;
131
+ }
132
+ }
133
+ async getFullText() {
134
+ for await (const chunk of this.generator) {
135
+ this.chunks.push(chunk);
136
+ }
137
+ return this.chunks.join('');
138
+ }
139
+ toLambdaStream() {
140
+ const self = this;
141
+ return (async function* () {
142
+ yield Buffer.from(JSON.stringify({ type: 'metadata' }) + '\n');
143
+ for await (const chunk of self.generator) {
144
+ self.chunks.push(chunk);
145
+ yield Buffer.from(JSON.stringify({ type: 'content', text: chunk }) + '\n');
146
+ }
147
+ yield Buffer.from(JSON.stringify({ type: 'complete' }) + '\n');
148
+ })();
149
+ }
150
+ }
151
+ exports.StreamingResponse = StreamingResponse;
152
+ //# sourceMappingURL=extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../src/agents/extras.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * LambdaLLM - Serverless-native LLM orchestration framework for AWS Lambda.
3
- * TypeScript implementation.
3
+ * TypeScript implementation - full feature parity with Python version.
4
4
  *
5
5
  * @packageDocumentation
6
6
  * @author Gaurav Kumar Sinha <gaurav@substrai.dev>
@@ -8,12 +8,18 @@
8
8
  */
9
9
  export { handler, HandlerOptions } from './core/handler';
10
10
  export { Prompt, PromptOptions } from './core/prompt';
11
- export { Model, ModelConfig, ModelResponse } from './core/models';
11
+ export { Model, ModelConfig, ModelResponse, calculateCost, MODEL_COSTS } from './core/models';
12
12
  export { LambdaLLMContext } from './core/context';
13
- export { Chain, Step, ChainResult } from './chains/chain';
14
- export { Session, MemoryStrategy } from './state/session';
13
+ export { LambdaLLMError, ModelInvocationError, TimeoutError, BudgetExceededError, ConfigurationError } from './core/exceptions';
14
+ export { Chain, Step, ChainResult, StepOptions, ChainOptions } from './chains/chain';
15
+ export { Session, MemoryStrategy, Message } from './state/session';
16
+ export { DynamoDBStateStore, InMemoryStateStore, StateStore } from './state/store';
17
+ export { ContextWindowManager } from './state/contextWindow';
15
18
  export { Middleware } from './middleware/base';
16
- export { Tool, Agent, AgentResult } from './agents/agent';
17
- export { LambdaLLMError, ModelInvocationError, TimeoutError, BudgetExceededError, } from './core/exceptions';
18
- export declare const VERSION = "1.1.0";
19
+ export { LoggingMiddleware, CostTrackingMiddleware } from './middleware/logging';
20
+ export { Tool, Agent, AgentResult, ToolDefinition, AgentOptions } from './agents/agent';
21
+ export { AgentRouter, RouteConfig, ToolSandbox, SandboxPolicy, AsyncToolDispatcher, StreamingResponse } from './agents/extras';
22
+ export { Tracer, Span, MetricsEmitter, CostTracker, CostEntry, CostReport, Experiment, Variant, PromptAnalytics, PromptMetrics, CostAwareRouter, RoutingRule } from './observability/index';
23
+ export { MockLambdaContext, MockProvider, GoldenDatasetRunner, GoldenCase, GoldenResult } from './testing/index';
24
+ export declare const VERSION = "1.2.0";
19
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGhI,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGrF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/H,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5L,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjH,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,37 +1,71 @@
1
1
  "use strict";
2
2
  /**
3
3
  * LambdaLLM - Serverless-native LLM orchestration framework for AWS Lambda.
4
- * TypeScript implementation.
4
+ * TypeScript implementation - full feature parity with Python version.
5
5
  *
6
6
  * @packageDocumentation
7
7
  * @author Gaurav Kumar Sinha <gaurav@substrai.dev>
8
8
  * @see https://github.com/substrai/lambdallm
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.VERSION = exports.BudgetExceededError = exports.TimeoutError = exports.ModelInvocationError = exports.LambdaLLMError = exports.Agent = exports.Tool = exports.Middleware = exports.MemoryStrategy = exports.Session = exports.Step = exports.Chain = exports.LambdaLLMContext = exports.Model = exports.Prompt = exports.handler = void 0;
11
+ exports.VERSION = exports.GoldenDatasetRunner = exports.MockProvider = exports.MockLambdaContext = exports.CostAwareRouter = exports.PromptAnalytics = exports.Experiment = exports.CostTracker = exports.MetricsEmitter = exports.Tracer = exports.StreamingResponse = exports.AsyncToolDispatcher = exports.ToolSandbox = exports.AgentRouter = exports.Agent = exports.Tool = exports.CostTrackingMiddleware = exports.LoggingMiddleware = exports.Middleware = exports.ContextWindowManager = exports.InMemoryStateStore = exports.DynamoDBStateStore = exports.MemoryStrategy = exports.Session = exports.Step = exports.Chain = exports.ConfigurationError = exports.BudgetExceededError = exports.TimeoutError = exports.ModelInvocationError = exports.LambdaLLMError = exports.LambdaLLMContext = exports.MODEL_COSTS = exports.calculateCost = exports.Model = exports.Prompt = exports.handler = void 0;
12
+ // Core
12
13
  var handler_1 = require("./core/handler");
13
14
  Object.defineProperty(exports, "handler", { enumerable: true, get: function () { return handler_1.handler; } });
14
15
  var prompt_1 = require("./core/prompt");
15
16
  Object.defineProperty(exports, "Prompt", { enumerable: true, get: function () { return prompt_1.Prompt; } });
16
17
  var models_1 = require("./core/models");
17
18
  Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return models_1.Model; } });
19
+ Object.defineProperty(exports, "calculateCost", { enumerable: true, get: function () { return models_1.calculateCost; } });
20
+ Object.defineProperty(exports, "MODEL_COSTS", { enumerable: true, get: function () { return models_1.MODEL_COSTS; } });
18
21
  var context_1 = require("./core/context");
19
22
  Object.defineProperty(exports, "LambdaLLMContext", { enumerable: true, get: function () { return context_1.LambdaLLMContext; } });
23
+ var exceptions_1 = require("./core/exceptions");
24
+ Object.defineProperty(exports, "LambdaLLMError", { enumerable: true, get: function () { return exceptions_1.LambdaLLMError; } });
25
+ Object.defineProperty(exports, "ModelInvocationError", { enumerable: true, get: function () { return exceptions_1.ModelInvocationError; } });
26
+ Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return exceptions_1.TimeoutError; } });
27
+ Object.defineProperty(exports, "BudgetExceededError", { enumerable: true, get: function () { return exceptions_1.BudgetExceededError; } });
28
+ Object.defineProperty(exports, "ConfigurationError", { enumerable: true, get: function () { return exceptions_1.ConfigurationError; } });
29
+ // Chains
20
30
  var chain_1 = require("./chains/chain");
21
31
  Object.defineProperty(exports, "Chain", { enumerable: true, get: function () { return chain_1.Chain; } });
22
32
  Object.defineProperty(exports, "Step", { enumerable: true, get: function () { return chain_1.Step; } });
33
+ // State
23
34
  var session_1 = require("./state/session");
24
35
  Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
25
36
  Object.defineProperty(exports, "MemoryStrategy", { enumerable: true, get: function () { return session_1.MemoryStrategy; } });
37
+ var store_1 = require("./state/store");
38
+ Object.defineProperty(exports, "DynamoDBStateStore", { enumerable: true, get: function () { return store_1.DynamoDBStateStore; } });
39
+ Object.defineProperty(exports, "InMemoryStateStore", { enumerable: true, get: function () { return store_1.InMemoryStateStore; } });
40
+ var contextWindow_1 = require("./state/contextWindow");
41
+ Object.defineProperty(exports, "ContextWindowManager", { enumerable: true, get: function () { return contextWindow_1.ContextWindowManager; } });
42
+ // Middleware
26
43
  var base_1 = require("./middleware/base");
27
44
  Object.defineProperty(exports, "Middleware", { enumerable: true, get: function () { return base_1.Middleware; } });
45
+ var logging_1 = require("./middleware/logging");
46
+ Object.defineProperty(exports, "LoggingMiddleware", { enumerable: true, get: function () { return logging_1.LoggingMiddleware; } });
47
+ Object.defineProperty(exports, "CostTrackingMiddleware", { enumerable: true, get: function () { return logging_1.CostTrackingMiddleware; } });
48
+ // Agents
28
49
  var agent_1 = require("./agents/agent");
29
50
  Object.defineProperty(exports, "Tool", { enumerable: true, get: function () { return agent_1.Tool; } });
30
51
  Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_1.Agent; } });
31
- var exceptions_1 = require("./core/exceptions");
32
- Object.defineProperty(exports, "LambdaLLMError", { enumerable: true, get: function () { return exceptions_1.LambdaLLMError; } });
33
- Object.defineProperty(exports, "ModelInvocationError", { enumerable: true, get: function () { return exceptions_1.ModelInvocationError; } });
34
- Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return exceptions_1.TimeoutError; } });
35
- Object.defineProperty(exports, "BudgetExceededError", { enumerable: true, get: function () { return exceptions_1.BudgetExceededError; } });
36
- exports.VERSION = '1.1.0';
52
+ var extras_1 = require("./agents/extras");
53
+ Object.defineProperty(exports, "AgentRouter", { enumerable: true, get: function () { return extras_1.AgentRouter; } });
54
+ Object.defineProperty(exports, "ToolSandbox", { enumerable: true, get: function () { return extras_1.ToolSandbox; } });
55
+ Object.defineProperty(exports, "AsyncToolDispatcher", { enumerable: true, get: function () { return extras_1.AsyncToolDispatcher; } });
56
+ Object.defineProperty(exports, "StreamingResponse", { enumerable: true, get: function () { return extras_1.StreamingResponse; } });
57
+ // Observability
58
+ var index_1 = require("./observability/index");
59
+ Object.defineProperty(exports, "Tracer", { enumerable: true, get: function () { return index_1.Tracer; } });
60
+ Object.defineProperty(exports, "MetricsEmitter", { enumerable: true, get: function () { return index_1.MetricsEmitter; } });
61
+ Object.defineProperty(exports, "CostTracker", { enumerable: true, get: function () { return index_1.CostTracker; } });
62
+ Object.defineProperty(exports, "Experiment", { enumerable: true, get: function () { return index_1.Experiment; } });
63
+ Object.defineProperty(exports, "PromptAnalytics", { enumerable: true, get: function () { return index_1.PromptAnalytics; } });
64
+ Object.defineProperty(exports, "CostAwareRouter", { enumerable: true, get: function () { return index_1.CostAwareRouter; } });
65
+ // Testing
66
+ var index_2 = require("./testing/index");
67
+ Object.defineProperty(exports, "MockLambdaContext", { enumerable: true, get: function () { return index_2.MockLambdaContext; } });
68
+ Object.defineProperty(exports, "MockProvider", { enumerable: true, get: function () { return index_2.MockProvider; } });
69
+ Object.defineProperty(exports, "GoldenDatasetRunner", { enumerable: true, get: function () { return index_2.GoldenDatasetRunner; } });
70
+ exports.VERSION = '1.2.0';
37
71
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,0CAAyD;AAAhD,kGAAA,OAAO,OAAA;AAChB,wCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,wCAAkE;AAAzD,+FAAA,KAAK,OAAA;AACd,0CAAkD;AAAzC,2GAAA,gBAAgB,OAAA;AACzB,wCAA0D;AAAjD,8FAAA,KAAK,OAAA;AAAE,6FAAA,IAAI,OAAA;AACpB,2CAA0D;AAAjD,kGAAA,OAAO,OAAA;AAAE,yGAAA,cAAc,OAAA;AAChC,0CAA+C;AAAtC,kGAAA,UAAU,OAAA;AACnB,wCAA0D;AAAjD,6FAAA,IAAI,OAAA;AAAE,8FAAA,KAAK,OAAA;AACpB,gDAK2B;AAJzB,4GAAA,cAAc,OAAA;AACd,kHAAA,oBAAoB,OAAA;AACpB,0GAAA,YAAY,OAAA;AACZ,iHAAA,mBAAmB,OAAA;AAGR,QAAA,OAAO,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,OAAO;AACP,0CAAyD;AAAhD,kGAAA,OAAO,OAAA;AAChB,wCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,wCAA8F;AAArF,+FAAA,KAAK,OAAA;AAA8B,uGAAA,aAAa,OAAA;AAAE,qGAAA,WAAW,OAAA;AACtE,0CAAkD;AAAzC,2GAAA,gBAAgB,OAAA;AACzB,gDAAgI;AAAvH,4GAAA,cAAc,OAAA;AAAE,kHAAA,oBAAoB,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,iHAAA,mBAAmB,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAEpG,SAAS;AACT,wCAAqF;AAA5E,8FAAA,KAAK,OAAA;AAAE,6FAAA,IAAI,OAAA;AAEpB,QAAQ;AACR,2CAAmE;AAA1D,kGAAA,OAAO,OAAA;AAAE,yGAAA,cAAc,OAAA;AAChC,uCAAmF;AAA1E,2GAAA,kBAAkB,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAC/C,uDAA6D;AAApD,qHAAA,oBAAoB,OAAA;AAE7B,aAAa;AACb,0CAA+C;AAAtC,kGAAA,UAAU,OAAA;AACnB,gDAAiF;AAAxE,4GAAA,iBAAiB,OAAA;AAAE,iHAAA,sBAAsB,OAAA;AAElD,SAAS;AACT,wCAAwF;AAA/E,6FAAA,IAAI,OAAA;AAAE,8FAAA,KAAK,OAAA;AACpB,0CAA+H;AAAtH,qGAAA,WAAW,OAAA;AAAe,qGAAA,WAAW,OAAA;AAAiB,6GAAA,mBAAmB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAErG,gBAAgB;AAChB,+CAA4L;AAAnL,+FAAA,MAAM,OAAA;AAAQ,uGAAA,cAAc,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAyB,mGAAA,UAAU,OAAA;AAAW,wGAAA,eAAe,OAAA;AAAiB,wGAAA,eAAe,OAAA;AAE/I,UAAU;AACV,yCAAiH;AAAxG,0GAAA,iBAAiB,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAEhD,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Logging and Cost middleware for LambdaLLM.
3
+ */
4
+ import { Middleware } from './base';
5
+ import { LambdaLLMContext } from '../core/context';
6
+ export declare class LoggingMiddleware extends Middleware {
7
+ private startTime;
8
+ private logPrompts;
9
+ constructor(options?: {
10
+ logPrompts?: boolean;
11
+ });
12
+ beforeInvoke(event: Record<string, any>, context: LambdaLLMContext): Record<string, any>;
13
+ afterInvoke(event: Record<string, any>, result: any, context: LambdaLLMContext): any;
14
+ }
15
+ export declare class CostTrackingMiddleware extends Middleware {
16
+ private dailyBudget;
17
+ private onExceeded;
18
+ constructor(options?: {
19
+ dailyBudget?: number;
20
+ onExceeded?: 'block' | 'downgrade' | 'alert';
21
+ });
22
+ beforeInvoke(event: Record<string, any>, context: LambdaLLMContext): Record<string, any>;
23
+ afterInvoke(event: Record<string, any>, result: any, context: LambdaLLMContext): any;
24
+ }
25
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/middleware/logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAU;gBAEhB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO;IAKlD,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAcxF,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,GAAG,GAAG;CAWrF;AAED,qBAAa,sBAAuB,SAAQ,UAAU;IACpD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkC;gBAExC,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,CAAA;KAAO;IAMhG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAKxF,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,GAAG,GAAG;CAUrF"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * Logging and Cost middleware for LambdaLLM.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CostTrackingMiddleware = exports.LoggingMiddleware = void 0;
7
+ const base_1 = require("./base");
8
+ class LoggingMiddleware extends base_1.Middleware {
9
+ constructor(options = {}) {
10
+ super();
11
+ this.startTime = 0;
12
+ this.logPrompts = options.logPrompts || false;
13
+ }
14
+ beforeInvoke(event, context) {
15
+ this.startTime = Date.now();
16
+ const logData = {
17
+ event: 'request.start',
18
+ path: event.path || event.rawPath || '/',
19
+ method: event.httpMethod || 'INVOKE',
20
+ };
21
+ if (this.logPrompts && event.body) {
22
+ logData.body_preview = typeof event.body === 'string' ? event.body.slice(0, 200) : event.body;
23
+ }
24
+ console.log(JSON.stringify(logData));
25
+ return event;
26
+ }
27
+ afterInvoke(event, result, context) {
28
+ const latencyMs = Date.now() - this.startTime;
29
+ console.log(JSON.stringify({
30
+ event: 'request.complete',
31
+ latency_ms: latencyMs,
32
+ status_code: result?.statusCode || 200,
33
+ total_cost_usd: context.totalCost,
34
+ invocations: context.invocationCount,
35
+ }));
36
+ return result;
37
+ }
38
+ }
39
+ exports.LoggingMiddleware = LoggingMiddleware;
40
+ class CostTrackingMiddleware extends base_1.Middleware {
41
+ constructor(options = {}) {
42
+ super();
43
+ this.dailyBudget = options.dailyBudget || 50.0;
44
+ this.onExceeded = options.onExceeded || 'block';
45
+ }
46
+ beforeInvoke(event, context) {
47
+ // Budget check would query DynamoDB in production
48
+ return event;
49
+ }
50
+ afterInvoke(event, result, context) {
51
+ if (context.totalCost > 0) {
52
+ console.log(JSON.stringify({
53
+ event: 'cost.recorded',
54
+ cost_usd: context.totalCost,
55
+ budget_daily: this.dailyBudget,
56
+ }));
57
+ }
58
+ return result;
59
+ }
60
+ }
61
+ exports.CostTrackingMiddleware = CostTrackingMiddleware;
62
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/middleware/logging.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iCAAoC;AAGpC,MAAa,iBAAkB,SAAQ,iBAAU;IAI/C,YAAY,UAAoC,EAAE;QAChD,KAAK,EAAE,CAAC;QAJF,cAAS,GAAG,CAAC,CAAC;QAKpB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IAChD,CAAC;IAED,YAAY,CAAC,KAA0B,EAAE,OAAyB;QAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAQ;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG;YACxC,MAAM,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ;SACrC,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,KAA0B,EAAE,MAAW,EAAE,OAAyB;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,KAAK,EAAE,kBAAkB;YACzB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,MAAM,EAAE,UAAU,IAAI,GAAG;YACtC,cAAc,EAAE,OAAO,CAAC,SAAS;YACjC,WAAW,EAAE,OAAO,CAAC,eAAe;SACrC,CAAC,CAAC,CAAC;QACJ,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAlCD,8CAkCC;AAED,MAAa,sBAAuB,SAAQ,iBAAU;IAIpD,YAAY,UAAkF,EAAE;QAC9F,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IAClD,CAAC;IAED,YAAY,CAAC,KAA0B,EAAE,OAAyB;QAChE,kDAAkD;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,KAA0B,EAAE,MAAW,EAAE,OAAyB;QAC5E,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,OAAO,CAAC,SAAS;gBAC3B,YAAY,EAAE,IAAI,CAAC,WAAW;aAC/B,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAzBD,wDAyBC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Observability system for LambdaLLM - Tracing, Metrics, Cost, A/B, Analytics.
3
+ */
4
+ export interface Span {
5
+ name: string;
6
+ startTime: number;
7
+ endTime?: number;
8
+ status: 'ok' | 'error';
9
+ attributes: Record<string, any>;
10
+ durationMs: number;
11
+ }
12
+ export declare class Tracer {
13
+ private spans;
14
+ private enabled;
15
+ constructor(options?: {
16
+ enabled?: boolean;
17
+ });
18
+ span<T>(name: string, fn: (span: {
19
+ setAttribute: (k: string, v: any) => void;
20
+ }) => Promise<T>): Promise<T>;
21
+ getTraceSummary(): {
22
+ spanCount: number;
23
+ totalDurationMs: number;
24
+ errors: number;
25
+ spans: Span[];
26
+ };
27
+ }
28
+ export declare class MetricsEmitter {
29
+ private buffer;
30
+ private namespace;
31
+ private enabled;
32
+ constructor(options?: {
33
+ namespace?: string;
34
+ enabled?: boolean;
35
+ });
36
+ record(name: string, value: number, unit?: string, dimensions?: Record<string, string>): void;
37
+ recordModelInvocation(modelId: string, tokensIn: number, tokensOut: number, latencyMs: number, costUsd: number): void;
38
+ flush(): Promise<void>;
39
+ get pendingCount(): number;
40
+ }
41
+ export interface CostEntry {
42
+ timestamp: number;
43
+ modelId: string;
44
+ tokensIn: number;
45
+ tokensOut: number;
46
+ costUsd: number;
47
+ handlerName?: string;
48
+ }
49
+ export interface CostReport {
50
+ period: string;
51
+ totalCostUsd: number;
52
+ totalRequests: number;
53
+ byModel: Record<string, number>;
54
+ budgetUsd: number;
55
+ utilizationPercent: number;
56
+ }
57
+ export declare class CostTracker {
58
+ private dailyBudget;
59
+ private monthlyBudget;
60
+ private onExceeded;
61
+ private entries;
62
+ constructor(options?: {
63
+ dailyBudget?: number;
64
+ monthlyBudget?: number;
65
+ onExceeded?: 'block' | 'downgrade' | 'alert';
66
+ });
67
+ record(entry: CostEntry): void;
68
+ getDailySpend(): number;
69
+ checkBudget(): {
70
+ exceeded: boolean;
71
+ dailySpend: number;
72
+ utilization: number;
73
+ };
74
+ getReport(): CostReport;
75
+ forecastMonthly(): {
76
+ projected: number;
77
+ onTrack: boolean;
78
+ };
79
+ }
80
+ export interface Variant {
81
+ name: string;
82
+ weight: number;
83
+ promptTemplate?: string;
84
+ modelId?: string;
85
+ }
86
+ export declare class Experiment {
87
+ name: string;
88
+ variants: Variant[];
89
+ status: 'active' | 'paused' | 'completed';
90
+ constructor(options: {
91
+ name: string;
92
+ variants: Variant[];
93
+ });
94
+ selectVariant(userId?: string): Variant;
95
+ recordResult(variantName: string, metrics: {
96
+ latencyMs?: number;
97
+ costUsd?: number;
98
+ error?: boolean;
99
+ }): void;
100
+ private hashCode;
101
+ }
102
+ export interface PromptMetrics {
103
+ promptName: string;
104
+ invocations: number;
105
+ totalCost: number;
106
+ totalLatency: number;
107
+ errors: number;
108
+ avgCost: number;
109
+ avgLatency: number;
110
+ successRate: number;
111
+ }
112
+ export declare class PromptAnalytics {
113
+ private metrics;
114
+ record(promptName: string, data: {
115
+ costUsd: number;
116
+ latencyMs: number;
117
+ error?: boolean;
118
+ }): void;
119
+ getReport(promptName: string): PromptMetrics | null;
120
+ getSuggestions(promptName: string): string[];
121
+ }
122
+ export interface RoutingRule {
123
+ condition: string;
124
+ model: string;
125
+ priority?: number;
126
+ }
127
+ export declare class CostAwareRouter {
128
+ private strategy;
129
+ private rules;
130
+ constructor(options?: {
131
+ strategy?: 'cost-optimized' | 'quality-first' | 'balanced';
132
+ rules?: RoutingRule[];
133
+ });
134
+ select(prompt: string, budgetUtilization: number): string;
135
+ private evaluateCondition;
136
+ private resolveAlias;
137
+ }
138
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"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"}