@n8n/agents 0.27.4 → 0.28.1
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/build.tsbuildinfo +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/runtime/guardrails/budget-guardrail.d.ts +27 -0
- package/dist/runtime/guardrails/budget-guardrail.js +71 -0
- package/dist/runtime/guardrails/budget-guardrail.js.map +1 -0
- package/dist/runtime/guardrails/guardrail-runner.d.ts +18 -0
- package/dist/runtime/guardrails/guardrail-runner.js +51 -0
- package/dist/runtime/guardrails/guardrail-runner.js.map +1 -0
- package/dist/runtime/loop/agent-runtime.d.ts +3 -1
- package/dist/runtime/loop/agent-runtime.js +158 -26
- package/dist/runtime/loop/agent-runtime.js.map +1 -1
- package/dist/runtime/loop/generate-sink.js +2 -1
- package/dist/runtime/loop/generate-sink.js.map +1 -1
- package/dist/runtime/loop/hydrate-file-parts.js +14 -6
- package/dist/runtime/loop/hydrate-file-parts.js.map +1 -1
- package/dist/runtime/loop/side-call-cost.d.ts +2 -0
- package/dist/runtime/loop/side-call-cost.js +14 -0
- package/dist/runtime/loop/side-call-cost.js.map +1 -0
- package/dist/runtime/loop/stream-sink.d.ts +3 -1
- package/dist/runtime/loop/stream-sink.js +19 -1
- package/dist/runtime/loop/stream-sink.js.map +1 -1
- package/dist/runtime/mcp/mcp-connection.js +14 -6
- package/dist/runtime/mcp/mcp-connection.js.map +1 -1
- package/dist/runtime/mcp/mcp-tool-resolver.js +1 -0
- package/dist/runtime/mcp/mcp-tool-resolver.js.map +1 -1
- package/dist/runtime/memory/episodic-memory-capture.d.ts +8 -1
- package/dist/runtime/memory/episodic-memory-capture.js +53 -11
- package/dist/runtime/memory/episodic-memory-capture.js.map +1 -1
- package/dist/runtime/memory/episodic-memory-defaults.js +7 -1
- package/dist/runtime/memory/episodic-memory-defaults.js.map +1 -1
- package/dist/runtime/memory/forward-usage.d.ts +2 -0
- package/dist/runtime/memory/forward-usage.js +14 -0
- package/dist/runtime/memory/forward-usage.js.map +1 -0
- package/dist/runtime/memory/memory-orchestrator.d.ts +2 -1
- package/dist/runtime/memory/memory-orchestrator.js +54 -23
- package/dist/runtime/memory/memory-orchestrator.js.map +1 -1
- package/dist/runtime/memory/observation-log-defaults.d.ts +2 -0
- package/dist/runtime/memory/observation-log-defaults.js +36 -32
- package/dist/runtime/memory/observation-log-defaults.js.map +1 -1
- package/dist/runtime/memory/observation-log-observer.d.ts +4 -1
- package/dist/runtime/memory/observation-log-observer.js +48 -14
- package/dist/runtime/memory/observation-log-observer.js.map +1 -1
- package/dist/runtime/memory/observation-log-reflector.d.ts +4 -1
- package/dist/runtime/memory/observation-log-reflector.js +8 -1
- package/dist/runtime/memory/observation-log-reflector.js.map +1 -1
- package/dist/runtime/memory/title-generation.d.ts +5 -2
- package/dist/runtime/memory/title-generation.js +31 -5
- package/dist/runtime/memory/title-generation.js.map +1 -1
- package/dist/runtime/memory/tool-result-memory.js.map +1 -1
- package/dist/runtime/model/message-list.d.ts +1 -1
- package/dist/runtime/model/message-list.js +8 -3
- package/dist/runtime/model/message-list.js.map +1 -1
- package/dist/runtime/streaming/stream-writer-guard.d.ts +2 -0
- package/dist/runtime/streaming/stream-writer-guard.js +8 -4
- package/dist/runtime/streaming/stream-writer-guard.js.map +1 -1
- package/dist/runtime/tools/tool-adapter.js +1 -0
- package/dist/runtime/tools/tool-adapter.js.map +1 -1
- package/dist/runtime/tools/tool-call-executor.js +7 -0
- package/dist/runtime/tools/tool-call-executor.js.map +1 -1
- package/dist/runtime/tools/tool-call-runner.js +21 -3
- package/dist/runtime/tools/tool-call-runner.js.map +1 -1
- package/dist/runtime/tools/tool-result-guard.js.map +1 -1
- package/dist/runtime/tools/untrusted-tool-output.js.map +1 -1
- package/dist/sdk/agent.d.ts +1 -0
- package/dist/sdk/agent.js +12 -1
- package/dist/sdk/agent.js.map +1 -1
- package/dist/sdk/tool.d.ts +6 -0
- package/dist/sdk/tool.js +21 -3
- package/dist/sdk/tool.js.map +1 -1
- package/dist/types/index.d.ts +5 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/runtime/agent-loop.d.ts +6 -1
- package/dist/types/runtime/tool-execution.d.ts +6 -1
- package/dist/types/sdk/agent.d.ts +33 -2
- package/dist/types/sdk/agent.js +2 -0
- package/dist/types/sdk/agent.js.map +1 -1
- package/dist/types/sdk/guardrail.d.ts +37 -0
- package/dist/types/sdk/mcp.d.ts +14 -5
- package/dist/types/sdk/memory.d.ts +7 -2
- package/dist/types/sdk/observation-log.d.ts +12 -2
- package/dist/types/sdk/tool.d.ts +11 -0
- package/package.json +9 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { BuiltTool, BuiltProviderTool, BuiltAgent, BuiltMemory, BuiltEpisodicMemoryCaptureStore, BuiltEpisodicMemoryStore, BuiltGuardrail, PiiDetectionType, BuiltEval, RunOptions, AgentResult, GenerateResult, StreamResult, EvalInput, EvalScore, EvalRunResult, EvalResults, ToolContext, ToolCancellationContext, ToolExecutionContext, InterruptibleToolContext, ToolSuspendOptions, CheckpointStore, StreamChunk, Provider, ThinkingConfig, ThinkingConfigFor, AnthropicThinkingEffort, AnthropicThinkingConfig, OpenAIReasoningEffort, OpenAIThinkingConfig, GoogleThinkingConfig, XaiThinkingConfig, ReasoningLevel, SerializableAgentState, AgentRunState, MemoryConfig, ObservationLogMemoryConfig, MemoryDescriptor, ObservationCapableMemory, TitleGenerationConfig, Thread, EpisodicMemoryConfig, EpisodicMemoryCaptureCandidate, EpisodicMemoryCaptureKind, EpisodicMemoryCaptureMethods, EpisodicMemoryCaptureStatus, EpisodicMemoryEmbeddingProviderOptions, EpisodicMemoryEntry, EpisodicMemoryEntrySource, EpisodicMemoryMethods, EpisodicMemoryPrompts, EpisodicMemoryReflectFn, EpisodicMemoryReflection, EpisodicMemoryReflectionApply, EpisodicMemoryReflectionApplyMerge, EpisodicMemoryReflectionMerge, EpisodicMemoryReflectionResult, EpisodicMemoryReflectorInput, EpisodicMemoryScope, EpisodicMemorySearchOptions, EpisodicMemoryStatus, EpisodicMemoryTaskLockHandle, EpisodicMemoryTaskLockMethods, NewEpisodicMemoryCaptureCandidate, NewEpisodicMemoryEntry, NewEpisodicMemoryEntrySource, NewEpisodicMemoryEntrySourceForEntry, RetrievedEpisodicMemoryEntry, ResumeOptions, McpServerConfig, McpToolCallSettledEvent, McpConnectionFailedEvent, McpVerifyResult, ModelConfig, ExecutionOptions, SmoothStreamOptions, TokenUsage, AgentExecutionCounter, PersistedExecutionOptions, AnthropicPromptCachingConfig, OpenAIPromptCachingConfig, PromptCachingConfig, BuiltTelemetry, AttributeValue, ObservationCursor, ObservationalMemoryConfig, BuiltObservationLogStore, BuiltObservationLogTaskLockStore, MemoryTaskUsageReport, NewObservationLogEntry, ObservationLogEntry, ObservationLogMarker, ObservationLogMerge, ObservationLogReadOptions, ObservationLogReflection, ObservationLogReflectionResult, ObservationLogScope, ObservationLogStatus, ObservationLogTaskKind, ObservationLogTaskLockHandle, FinishReason, } from './types';
|
|
1
|
+
export type { BuiltTool, BuiltProviderTool, BuiltAgent, BuiltMemory, BuiltEpisodicMemoryCaptureStore, BuiltEpisodicMemoryStore, BuiltGuardrail, GuardrailDecision, GuardrailModelCallContext, GuardrailModelCallSource, GuardrailStop, GuardrailToolCallContext, GuardrailsOptions, ModelGuardrail, PiiDetectionType, BuiltEval, RunOptions, AgentResult, GenerateResult, StreamResult, EvalInput, EvalScore, EvalRunResult, EvalResults, ToolContext, ToolCancellationContext, ToolExecutionContext, ToolApprovalContext, InterruptibleToolContext, ToolSuspendOptions, CheckpointStore, StreamChunk, Provider, ThinkingConfig, ThinkingConfigFor, AnthropicThinkingEffort, AnthropicThinkingConfig, OpenAIReasoningEffort, OpenAIThinkingConfig, GoogleThinkingConfig, XaiThinkingConfig, ReasoningLevel, SerializableAgentState, AgentRunState, MemoryConfig, ObservationLogMemoryConfig, MemoryDescriptor, ObservationCapableMemory, TitleGenerationConfig, Thread, EpisodicMemoryConfig, EpisodicMemoryCaptureCandidate, EpisodicMemoryCaptureKind, EpisodicMemoryCaptureMethods, EpisodicMemoryCaptureStatus, EpisodicMemoryEmbeddingProviderOptions, EpisodicMemoryEntry, EpisodicMemoryEntrySource, EpisodicMemoryMethods, EpisodicMemoryPrompts, EpisodicMemoryReflectFn, EpisodicMemoryReflectResult, EpisodicMemoryReflection, EpisodicMemoryReflectionApply, EpisodicMemoryReflectionApplyMerge, EpisodicMemoryReflectionMerge, EpisodicMemoryReflectionResult, EpisodicMemoryReflectorInput, EpisodicMemoryScope, EpisodicMemorySearchOptions, EpisodicMemoryStatus, EpisodicMemoryTaskLockHandle, EpisodicMemoryTaskLockMethods, NewEpisodicMemoryCaptureCandidate, NewEpisodicMemoryEntry, NewEpisodicMemoryEntrySource, NewEpisodicMemoryEntrySourceForEntry, RetrievedEpisodicMemoryEntry, ResumeOptions, McpServerConfig, McpToolCallSettledEvent, McpConnectionFailedEvent, McpVerifyResult, ModelConfig, ExecutionOptions, AgentInputBoundary, SmoothStreamOptions, TokenUsage, AgentExecutionCounter, SideCallTask, SideCallUsageReport, PersistedExecutionOptions, AnthropicPromptCachingConfig, OpenAIPromptCachingConfig, PromptCachingConfig, BuiltTelemetry, AttributeValue, ObservationCursor, ObservationalMemoryConfig, BuiltObservationLogStore, BuiltObservationLogTaskLockStore, MemoryTaskUsageReport, NewObservationLogEntry, ObservationLogEntry, ObservationLogMarker, ObservationLogMerge, ObservationLogObserveResult, ObservationLogReadOptions, ObservationLogReflection, ObservationLogReflectResult, ObservationLogReflectionResult, ObservationLogScope, ObservationLogStatus, ObservationLogTaskKind, ObservationLogTaskLockHandle, FinishReason, } from './types';
|
|
2
2
|
export { FINISH_REASONS, isFinishReason } from './types';
|
|
3
3
|
export type { ProviderOptions } from '@ai-sdk/provider-utils';
|
|
4
4
|
export { AgentEvent } from './types';
|
|
@@ -17,6 +17,8 @@ export { VectorStore } from './sdk/vector-store';
|
|
|
17
17
|
export { FILTER_OPERATORS, normalizeFilterInput, assertValidFilter, buildFilterInputSchema, } from './sdk/vector-store-filter';
|
|
18
18
|
export type { VectorFilterInput } from './sdk/vector-store-filter';
|
|
19
19
|
export { Guardrail } from './sdk/guardrail';
|
|
20
|
+
export { budgetMonthKey, createBudgetGuardrail } from './runtime/guardrails/budget-guardrail';
|
|
21
|
+
export type { BudgetGuardrailOptions, SpendEntry, SpendLedger, SpendTotal, } from './runtime/guardrails/budget-guardrail';
|
|
20
22
|
export { redactText, redactDeep, redactionOptionsFromGuardrail, DEFAULT_PLACEHOLDER, StreamingRedactor, resolvePatterns, passesLuhn, SUPPORTED_PII_CATEGORIES, } from './sdk/guardrails';
|
|
21
23
|
export type { RedactionOptions, RedactionResult, DeepRedactionResult, RedactionCategory, RedactionPattern, } from './sdk/guardrails';
|
|
22
24
|
export { Eval } from './sdk/eval';
|
|
@@ -66,7 +68,7 @@ export { generateTitleFromMessage } from './runtime/memory/title-generation';
|
|
|
66
68
|
export { activeLifecycleState, droppedLifecycleState, markLifecycleActive, markLifecycleDropped, markLifecycleSuperseded, normalizeFlatReflectionActions, supersededLifecycleState, uniqueStrings, } from './runtime/memory/memory-lifecycle';
|
|
67
69
|
export { RECALL_MEMORY_TOOL_NAME, createRecallMemoryTool, getEpisodicMemoryScope, hashEpisodicMemoryContent, hashEpisodicMemoryEvidence, hasEpisodicMemoryCaptureStore, hasEpisodicMemoryStore, isEpisodicMemoryEnabled, rankEpisodicMemoryEntries, withEpisodicMemoryDefaults, } from './runtime/memory/episodic-memory';
|
|
68
70
|
export { FLAG_MEMORY_TOOL_NAME, createFlagMemoryTool, runEpisodicMemoryCandidateProcessor, } from './runtime/memory/episodic-memory-capture';
|
|
69
|
-
export type { RunEpisodicMemoryCandidateProcessorOpts, RunEpisodicMemoryCandidateProcessorResult, } from './runtime/memory/episodic-memory-capture';
|
|
71
|
+
export type { RunEpisodicMemoryCandidateProcessorOpts, RunEpisodicMemoryCandidateProcessorResult, EpisodicMemoryUsageReport, } from './runtime/memory/episodic-memory-capture';
|
|
70
72
|
export { DEFAULT_EPISODIC_MEMORY_CAPTURE_TOOL_INSTRUCTION, DEFAULT_EPISODIC_MEMORY_EMBEDDING_MODEL, DEFAULT_EPISODIC_MEMORY_MAX_ENTRIES_PER_RUN, DEFAULT_EPISODIC_MEMORY_RECALL_TOOL_INSTRUCTION, DEFAULT_EPISODIC_MEMORY_REFLECTION_PROMPT, DEFAULT_EPISODIC_MEMORY_TOP_K, buildEpisodicMemoryReflectorPrompt, createEpisodicMemoryReflectFn, } from './runtime/memory/episodic-memory-defaults';
|
|
71
73
|
export type { CreateEpisodicMemoryReflectFnOptions } from './runtime/memory/episodic-memory-defaults';
|
|
72
74
|
export type { MemoryLifecycleState, MemoryLifecycleStatus, } from './runtime/memory/memory-lifecycle';
|
package/dist/index.js
CHANGED
|
@@ -33,10 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
39
|
-
exports.zodToJsonSchema = exports.isZodSchema = exports.modelConfigToId = exports.ProcessHandle = exports.SandboxProcessManager = exports.reconcileToolResultRuns = exports.createWorkspaceTools = exports.createScopedWorkspace = exports.CORE_WORKSPACE_TOOL_NAMES = exports.BaseSandbox = exports.BaseFilesystem = exports.Workspace = exports.DEFAULT_OBSERVATION_LOG_TAIL_LIMIT = exports.DEFAULT_OBSERVATION_LOG_RENDER_TOKEN_BUDGET = void 0;
|
|
36
|
+
exports.createRuntimeSkillRegistry = exports.appendSkillCatalogToInstructions = exports.Agent = exports.LangSmithTelemetry = exports.deriveSubAgentTelemetry = exports.Telemetry = exports.evals = exports.evaluate = exports.Eval = exports.SUPPORTED_PII_CATEGORIES = exports.passesLuhn = exports.resolvePatterns = exports.StreamingRedactor = exports.DEFAULT_PLACEHOLDER = exports.redactionOptionsFromGuardrail = exports.redactDeep = exports.redactText = exports.createBudgetGuardrail = exports.budgetMonthKey = exports.Guardrail = exports.buildFilterInputSchema = exports.assertValidFilter = exports.normalizeFilterInput = exports.FILTER_OPERATORS = exports.VectorStore = exports.Memory = exports.wrapUntrustedData = exports.UNTRUSTED_OUTPUT_DOCTRINE = exports.stripInvisibleUnicode = exports.sanitizeToolName = exports.wrapToolForApproval = exports.Tool = exports.APPROVAL_SUSPEND_SCHEMA = exports.APPROVAL_RESUME_SCHEMA = exports.ModelStreamStallError = exports.DEFAULT_MODEL_STREAM_IDLE_TIMEOUT_MS = exports.DEFAULT_MODEL_STREAM_FIRST_OUTPUT_TIMEOUT_MS = exports.throwIfAborted = exports.raceWithAbort = exports.isAbortError = exports.createAbortError = exports.CANCELLATION_TYPE = exports.isCancellation = exports.createCancellation = exports.estimateObservationTokens = exports.OBSERVATION_LOG_STATUSES = exports.OBSERVATION_LOG_MARKERS = exports.AgentEvent = exports.isFinishReason = exports.FINISH_REASONS = void 0;
|
|
37
|
+
exports.WRITE_TODOS_TOOL_NAME = exports.renderDelegateSubAgentPrompt = exports.parseDelegateSubAgentContinuation = exports.isDelegateSubAgentTool = exports.getInlineDelegateSubAgentToolOptions = exports.generateResultToDelegateSubAgentOutput = exports.failedDelegatedChildSuspendOutput = exports.createDelegateSubAgentTool = exports.SUB_AGENT_TASK_DIFFICULTIES = exports.INLINE_SUB_AGENT_ID = exports.DELEGATED_CHILD_SUSPEND_UNSUPPORTED_MESSAGE = exports.DELEGATE_SUB_AGENT_TOOL_NAME = exports.sanitizeSubAgentTaskName = exports.isSubAgentTaskPath = exports.createChildSubAgentTaskPath = exports.assertSubAgentTaskPath = exports.ROOT_SUB_AGENT_TASK_PATH = exports.DEFAULT_SUB_AGENT_MAX_CHILDREN = exports.createModel = exports.BaseVectorStore = exports.BaseMemory = exports.fetchProviderCatalog = exports.isLlmMessage = exports.getCreatedAt = exports.filterLlmMessages = exports.stripHydratedFileData = exports.verify = exports.providerTools = exports.mcpContentToModelParts = exports.mcpContentToMessageParts = exports.hasMcpMediaContent = exports.McpClient = exports.validateRuntimeSkill = exports.SKILL_LOAD_TOOL_NAME = exports.RUNTIME_SKILL_REGISTRY_SCHEMA_VERSION = exports.RUNTIME_SKILL_NAME_PATTERN = exports.RUNTIME_SKILL_LINKED_FILE_GROUPS = exports.RUNTIME_SKILL_MAX_OUTPUT_BYTES = exports.RUNTIME_SKILL_FILE_NAME = exports.RUNTIME_SKILL_TOOL_NAMES = exports.renderSkillCatalogPrompt = exports.parseRuntimeSkillMarkdown = exports.loadRuntimeSkillSourceFromDirectory = exports.loadRuntimeSkillsFromDirectory = exports.InvalidRuntimeSkillError = exports.formatSkillValidationErrors = exports.filterRuntimeSkillSource = exports.createSkillLoadTool = exports.createRuntimeSkillTools = exports.createRuntimeSkillSource = void 0;
|
|
38
|
+
exports.DEFAULT_OBSERVATION_LOG_OBSERVER_THRESHOLD_TOKENS = exports.DEFAULT_OBSERVATION_LOG_OBSERVER_PROMPT = exports.DEFAULT_OBSERVATION_LOG_LOCK_TTL_MS = exports.createObservationLogObserveFn = exports.createObservationLogReflectFn = exports.buildObservationLogObserverPrompt = exports.buildObservationLogReflectorPrompt = exports.ScopedMemoryTaskRunner = exports.runObservationLogReflector = exports.renderObservationLogForReflection = exports.parseObservationLogReflectionJson = exports.normalizeObservationLogReflection = exports.wrapUntrustedObserverData = exports.runObservationLogObserver = exports.renderObserverTranscript = exports.parseObservationLogMarkdown = exports.createEpisodicMemoryReflectFn = exports.buildEpisodicMemoryReflectorPrompt = exports.DEFAULT_EPISODIC_MEMORY_TOP_K = exports.DEFAULT_EPISODIC_MEMORY_REFLECTION_PROMPT = exports.DEFAULT_EPISODIC_MEMORY_RECALL_TOOL_INSTRUCTION = exports.DEFAULT_EPISODIC_MEMORY_MAX_ENTRIES_PER_RUN = exports.DEFAULT_EPISODIC_MEMORY_EMBEDDING_MODEL = exports.DEFAULT_EPISODIC_MEMORY_CAPTURE_TOOL_INSTRUCTION = exports.runEpisodicMemoryCandidateProcessor = exports.createFlagMemoryTool = exports.FLAG_MEMORY_TOOL_NAME = exports.withEpisodicMemoryDefaults = exports.rankEpisodicMemoryEntries = exports.isEpisodicMemoryEnabled = exports.hasEpisodicMemoryStore = exports.hasEpisodicMemoryCaptureStore = exports.hashEpisodicMemoryEvidence = exports.hashEpisodicMemoryContent = exports.getEpisodicMemoryScope = exports.createRecallMemoryTool = exports.RECALL_MEMORY_TOOL_NAME = exports.uniqueStrings = exports.supersededLifecycleState = exports.normalizeFlatReflectionActions = exports.markLifecycleSuperseded = exports.markLifecycleDropped = exports.markLifecycleActive = exports.droppedLifecycleState = exports.activeLifecycleState = exports.generateTitleFromMessage = exports.createEmbeddingModel = exports.isAttachmentValidationError = exports.createPlannerTodosTool = exports.createWriteTodosTool = void 0;
|
|
39
|
+
exports.zodToJsonSchema = exports.isZodSchema = exports.modelConfigToId = exports.ProcessHandle = exports.SandboxProcessManager = exports.reconcileToolResultRuns = exports.createWorkspaceTools = exports.createScopedWorkspace = exports.CORE_WORKSPACE_TOOL_NAMES = exports.BaseSandbox = exports.BaseFilesystem = exports.Workspace = exports.DEFAULT_OBSERVATION_LOG_TAIL_LIMIT = exports.DEFAULT_OBSERVATION_LOG_RENDER_TOKEN_BUDGET = exports.DEFAULT_OBSERVATION_LOG_REFLECTOR_THRESHOLD_TOKENS = exports.DEFAULT_OBSERVATION_LOG_REFLECTOR_PROMPT = void 0;
|
|
40
40
|
var types_1 = require("./types");
|
|
41
41
|
Object.defineProperty(exports, "FINISH_REASONS", { enumerable: true, get: function () { return types_1.FINISH_REASONS; } });
|
|
42
42
|
Object.defineProperty(exports, "isFinishReason", { enumerable: true, get: function () { return types_1.isFinishReason; } });
|
|
@@ -81,6 +81,9 @@ Object.defineProperty(exports, "assertValidFilter", { enumerable: true, get: fun
|
|
|
81
81
|
Object.defineProperty(exports, "buildFilterInputSchema", { enumerable: true, get: function () { return vector_store_filter_1.buildFilterInputSchema; } });
|
|
82
82
|
var guardrail_1 = require("./sdk/guardrail");
|
|
83
83
|
Object.defineProperty(exports, "Guardrail", { enumerable: true, get: function () { return guardrail_1.Guardrail; } });
|
|
84
|
+
var budget_guardrail_1 = require("./runtime/guardrails/budget-guardrail");
|
|
85
|
+
Object.defineProperty(exports, "budgetMonthKey", { enumerable: true, get: function () { return budget_guardrail_1.budgetMonthKey; } });
|
|
86
|
+
Object.defineProperty(exports, "createBudgetGuardrail", { enumerable: true, get: function () { return budget_guardrail_1.createBudgetGuardrail; } });
|
|
84
87
|
var guardrails_1 = require("./sdk/guardrails");
|
|
85
88
|
Object.defineProperty(exports, "redactText", { enumerable: true, get: function () { return guardrails_1.redactText; } });
|
|
86
89
|
Object.defineProperty(exports, "redactDeep", { enumerable: true, get: function () { return guardrails_1.redactDeep; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ModelGuardrail } from '../../types';
|
|
2
|
+
export interface SpendEntry {
|
|
3
|
+
key: string;
|
|
4
|
+
usd: number;
|
|
5
|
+
}
|
|
6
|
+
export interface SpendTotal {
|
|
7
|
+
key: string;
|
|
8
|
+
totalUsd: number;
|
|
9
|
+
previousUsd: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SpendLedger {
|
|
12
|
+
add(callId: string, entries: SpendEntry[]): Promise<SpendTotal[]>;
|
|
13
|
+
read(key: string): Promise<number>;
|
|
14
|
+
}
|
|
15
|
+
export interface BudgetGuardrailOptions {
|
|
16
|
+
ledger: SpendLedger;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
agentId?: string;
|
|
19
|
+
sessionCostCapUsd?: number;
|
|
20
|
+
monthlyBudgetUsd?: number;
|
|
21
|
+
alertThresholdPercent?: number;
|
|
22
|
+
onNotice?: (notice: {
|
|
23
|
+
code: 'budget.alert';
|
|
24
|
+
}) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function budgetMonthKey(agentId: string, now?: Date): string;
|
|
27
|
+
export declare function createBudgetGuardrail(options: BudgetGuardrailOptions): ModelGuardrail;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.budgetMonthKey = budgetMonthKey;
|
|
4
|
+
exports.createBudgetGuardrail = createBudgetGuardrail;
|
|
5
|
+
const SESSION_STOP = { action: 'stop', code: 'budget.session' };
|
|
6
|
+
const MONTHLY_STOP = { action: 'stop', code: 'budget.monthly' };
|
|
7
|
+
const MISCONFIGURED = { action: 'stop', code: 'budget.misconfigured' };
|
|
8
|
+
const ALLOW = { action: 'allow' };
|
|
9
|
+
function budgetMonthKey(agentId, now = new Date()) {
|
|
10
|
+
return `${agentId}:${now.toISOString().slice(0, 7)}`;
|
|
11
|
+
}
|
|
12
|
+
function hasId(value) {
|
|
13
|
+
return value !== undefined && value.length > 0;
|
|
14
|
+
}
|
|
15
|
+
function positiveUsd(value) {
|
|
16
|
+
if (value === undefined || !Number.isFinite(value) || value <= 0)
|
|
17
|
+
return undefined;
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function createBudgetGuardrail(options) {
|
|
21
|
+
const { ledger, sessionId, agentId, alertThresholdPercent, onNotice } = options;
|
|
22
|
+
const sessionCostCapUsd = positiveUsd(options.sessionCostCapUsd);
|
|
23
|
+
const monthlyBudgetUsd = positiveUsd(options.monthlyBudgetUsd);
|
|
24
|
+
const alertLine = monthlyBudgetUsd !== undefined && alertThresholdPercent !== undefined
|
|
25
|
+
? (monthlyBudgetUsd * alertThresholdPercent) / 100
|
|
26
|
+
: undefined;
|
|
27
|
+
return {
|
|
28
|
+
async before() {
|
|
29
|
+
if (sessionCostCapUsd !== undefined && !hasId(sessionId))
|
|
30
|
+
return MISCONFIGURED;
|
|
31
|
+
if (monthlyBudgetUsd !== undefined && !hasId(agentId))
|
|
32
|
+
return MISCONFIGURED;
|
|
33
|
+
if (sessionCostCapUsd !== undefined && hasId(sessionId)) {
|
|
34
|
+
const spent = await ledger.read(sessionId);
|
|
35
|
+
if (spent >= sessionCostCapUsd)
|
|
36
|
+
return SESSION_STOP;
|
|
37
|
+
}
|
|
38
|
+
if (monthlyBudgetUsd !== undefined && hasId(agentId)) {
|
|
39
|
+
const spent = await ledger.read(budgetMonthKey(agentId));
|
|
40
|
+
if (spent >= monthlyBudgetUsd)
|
|
41
|
+
return MONTHLY_STOP;
|
|
42
|
+
}
|
|
43
|
+
return ALLOW;
|
|
44
|
+
},
|
|
45
|
+
async after(ctx, usage) {
|
|
46
|
+
const cost = usage?.cost;
|
|
47
|
+
if (cost === undefined)
|
|
48
|
+
return;
|
|
49
|
+
const entries = [];
|
|
50
|
+
if (sessionCostCapUsd !== undefined && hasId(sessionId)) {
|
|
51
|
+
entries.push({ key: sessionId, usd: cost });
|
|
52
|
+
}
|
|
53
|
+
const month = hasId(agentId) ? budgetMonthKey(agentId) : undefined;
|
|
54
|
+
if (monthlyBudgetUsd !== undefined && month !== undefined) {
|
|
55
|
+
entries.push({ key: month, usd: cost });
|
|
56
|
+
}
|
|
57
|
+
if (entries.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const totals = await ledger.add(ctx.callId, entries);
|
|
60
|
+
if (alertLine === undefined || month === undefined)
|
|
61
|
+
return;
|
|
62
|
+
const monthTotal = totals.find((total) => total.key === month);
|
|
63
|
+
if (!monthTotal)
|
|
64
|
+
return;
|
|
65
|
+
if (monthTotal.previousUsd < alertLine && monthTotal.totalUsd >= alertLine) {
|
|
66
|
+
onNotice?.({ code: 'budget.alert' });
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=budget-guardrail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-guardrail.js","sourceRoot":"","sources":["../../../src/runtime/guardrails/budget-guardrail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GuardrailModelCallContext, GuardrailModelCallSource, GuardrailStop, GuardrailToolCallContext, GuardrailsOptions, TokenUsage } from '../../types';
|
|
2
|
+
export declare class GuardrailRunner {
|
|
3
|
+
private readonly hooks;
|
|
4
|
+
private readonly ids;
|
|
5
|
+
private constructor();
|
|
6
|
+
static from(options: GuardrailsOptions | undefined): GuardrailRunner | undefined;
|
|
7
|
+
modelCallContext(source: GuardrailModelCallSource, model: string): GuardrailModelCallContext;
|
|
8
|
+
toolCallContext(call: {
|
|
9
|
+
toolCallId: string;
|
|
10
|
+
toolName: string;
|
|
11
|
+
input: unknown;
|
|
12
|
+
runId: string;
|
|
13
|
+
}): GuardrailToolCallContext;
|
|
14
|
+
before(ctx: GuardrailModelCallContext): Promise<GuardrailStop | undefined>;
|
|
15
|
+
after(ctx: GuardrailModelCallContext, usage: TokenUsage | undefined): Promise<void>;
|
|
16
|
+
beforeTool(ctx: GuardrailToolCallContext): Promise<GuardrailStop | undefined>;
|
|
17
|
+
afterTool(ctx: GuardrailToolCallContext, result: unknown): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GuardrailRunner = void 0;
|
|
4
|
+
class GuardrailRunner {
|
|
5
|
+
constructor(hooks, ids) {
|
|
6
|
+
this.hooks = hooks;
|
|
7
|
+
this.ids = ids;
|
|
8
|
+
}
|
|
9
|
+
static from(options) {
|
|
10
|
+
if (!options || options.hooks.length === 0)
|
|
11
|
+
return undefined;
|
|
12
|
+
return new GuardrailRunner(options.hooks, {
|
|
13
|
+
agentId: options.agentId,
|
|
14
|
+
threadId: options.threadId,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
modelCallContext(source, model) {
|
|
18
|
+
return { callId: crypto.randomUUID(), ...this.ids, model, source };
|
|
19
|
+
}
|
|
20
|
+
toolCallContext(call) {
|
|
21
|
+
return { ...call, ...this.ids };
|
|
22
|
+
}
|
|
23
|
+
async before(ctx) {
|
|
24
|
+
for (const hook of this.hooks) {
|
|
25
|
+
const decision = await hook.before?.(ctx);
|
|
26
|
+
if (decision?.action === 'stop')
|
|
27
|
+
return { code: decision.code };
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
async after(ctx, usage) {
|
|
32
|
+
for (const hook of this.hooks) {
|
|
33
|
+
await hook.after?.(ctx, usage);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async beforeTool(ctx) {
|
|
37
|
+
for (const hook of this.hooks) {
|
|
38
|
+
const decision = await hook.beforeTool?.(ctx);
|
|
39
|
+
if (decision?.action === 'stop')
|
|
40
|
+
return { code: decision.code };
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
async afterTool(ctx, result) {
|
|
45
|
+
for (const hook of this.hooks) {
|
|
46
|
+
await hook.afterTool?.(ctx, result);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.GuardrailRunner = GuardrailRunner;
|
|
51
|
+
//# sourceMappingURL=guardrail-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-runner.js","sourceRoot":"","sources":["../../../src/runtime/guardrails/guardrail-runner.ts"],"names":[],"mappings":";;;AAiBA;IACC,YACkB,KAAuB,EACvB,GAAiB;qBADjB,KAAK;mBACL,GAAG;IAClB,CAAC;IAGJ,MAAM,CAAC,IAAI,CAAC,OAAsC;QACjD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7D,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE;YACzC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,MAAgC,EAAE,KAAa;QAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,eAAe,CAAC,IAKf;QACA,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAA8B;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAA8B,EAAE,KAA6B;QACxE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAA6B;QAC7C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAA6B,EAAE,MAAe;QAC7D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;CACD"}
|
|
@@ -26,6 +26,7 @@ export declare class AgentRuntime {
|
|
|
26
26
|
stream(input: AgentMessage[] | string, options?: RunOptions & ExecutionOptions): Promise<StreamResult>;
|
|
27
27
|
resume(method: 'generate', data: unknown, options: ResumeOptions & ExecutionOptions): Promise<GenerateResult>;
|
|
28
28
|
resume(method: 'stream', data: unknown, options: ResumeOptions & ExecutionOptions): Promise<StreamResult>;
|
|
29
|
+
resumePaused(options: Omit<ResumeOptions, 'toolCallId'> & ExecutionOptions): Promise<StreamResult>;
|
|
29
30
|
crashResume(options: {
|
|
30
31
|
runId: string;
|
|
31
32
|
contextNotes?: string[];
|
|
@@ -45,8 +46,9 @@ export declare class AgentRuntime {
|
|
|
45
46
|
private createRunServices;
|
|
46
47
|
private maybeGenerateTitle;
|
|
47
48
|
private runAgentLoop;
|
|
49
|
+
private consumeAdditionalInput;
|
|
48
50
|
private prepareLoop;
|
|
49
|
-
private
|
|
51
|
+
private getRejectableInputIds;
|
|
50
52
|
private buildToolBatchContext;
|
|
51
53
|
private resumePendingTools;
|
|
52
54
|
private runLoopIteration;
|
|
@@ -11,8 +11,10 @@ const stream_sink_1 = require("./stream-sink");
|
|
|
11
11
|
const catalog_1 = require("../../sdk/catalog");
|
|
12
12
|
const model_1 = require("../../utils/model");
|
|
13
13
|
const workspace_1 = require("../../workspace");
|
|
14
|
+
const guardrail_runner_1 = require("../guardrails/guardrail-runner");
|
|
14
15
|
const logger_1 = require("../logger");
|
|
15
16
|
const memory_orchestrator_1 = require("../memory/memory-orchestrator");
|
|
17
|
+
const tool_result_memory_1 = require("../memory/tool-result-memory");
|
|
16
18
|
const title_generation_1 = require("../memory/title-generation");
|
|
17
19
|
const message_list_1 = require("../model/message-list");
|
|
18
20
|
const model_token_counter_1 = require("../model/model-token-counter");
|
|
@@ -138,6 +140,7 @@ class AgentRuntime {
|
|
|
138
140
|
const { state, list, resumeData } = await this.prepareToolResume(data, options);
|
|
139
141
|
let abortScope;
|
|
140
142
|
let resumeClaimed = false;
|
|
143
|
+
let resumeAdmitted = false;
|
|
141
144
|
try {
|
|
142
145
|
const { runId: _rid, toolCallId: _tcid, onResumeClaimed: _onResumeClaimed, hostMetadata, ...callerExecOptions } = options;
|
|
143
146
|
const mergedExecOptions = (0, checkpoint_data_1.mergeResumeExecutionOptions)(state, callerExecOptions);
|
|
@@ -152,6 +155,7 @@ class AgentRuntime {
|
|
|
152
155
|
};
|
|
153
156
|
this.updateState({ persistence: resumeOptions.persistence });
|
|
154
157
|
await options.onResumeClaimed?.();
|
|
158
|
+
resumeAdmitted = true;
|
|
155
159
|
abortScope = this.eventBus.createAbortScope(resumeOptions.abortSignal);
|
|
156
160
|
const activeAbortScope = abortScope;
|
|
157
161
|
const pendingResume = {
|
|
@@ -171,9 +175,52 @@ class AgentRuntime {
|
|
|
171
175
|
return this.createResumedStream(ctx);
|
|
172
176
|
}
|
|
173
177
|
catch (error) {
|
|
178
|
+
if (resumeClaimed && !resumeAdmitted) {
|
|
179
|
+
const suspendedState = { ...state, persistence: this.currentState.persistence };
|
|
180
|
+
await this.runState.suspend(this.runId, suspendedState);
|
|
181
|
+
this.updateState(suspendedState);
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
174
184
|
return await this.handleResumeFailure(method, error, abortScope, resumeClaimed);
|
|
175
185
|
}
|
|
176
186
|
}
|
|
187
|
+
async resumePaused(options) {
|
|
188
|
+
this.runId = options.runId;
|
|
189
|
+
const state = await this.runState.resume(this.runId);
|
|
190
|
+
if (!state || state.finishReason !== 'paused' || Object.keys(state.pendingToolCalls).length) {
|
|
191
|
+
throw new run_state_1.StaleResumeError('This run is not paused');
|
|
192
|
+
}
|
|
193
|
+
if (options.hostMetadata !== undefined && !state.persistence) {
|
|
194
|
+
throw new Error('Cannot update host metadata without persistence');
|
|
195
|
+
}
|
|
196
|
+
const { runId: _runId, hostMetadata, onResumeClaimed, ...executionOptions } = options;
|
|
197
|
+
const resumeOptions = {
|
|
198
|
+
...(0, checkpoint_data_1.mergeResumeExecutionOptions)(state, executionOptions),
|
|
199
|
+
persistence: (0, checkpoint_data_1.mergeResumePersistence)(state.persistence, hostMetadata),
|
|
200
|
+
};
|
|
201
|
+
const list = await this.restoreCheckpointMessages(state);
|
|
202
|
+
if (!(await this.runState.claimResume(this.runId, state))) {
|
|
203
|
+
throw new run_state_1.StaleResumeError('This run has already resumed');
|
|
204
|
+
}
|
|
205
|
+
this.updateState({
|
|
206
|
+
status: 'running',
|
|
207
|
+
finishReason: undefined,
|
|
208
|
+
persistence: resumeOptions.persistence,
|
|
209
|
+
});
|
|
210
|
+
const abortScope = this.eventBus.createAbortScope(resumeOptions.abortSignal);
|
|
211
|
+
try {
|
|
212
|
+
await onResumeClaimed?.();
|
|
213
|
+
await this.prepareResumeMemory(list, state.persistence);
|
|
214
|
+
return this.createResumedStream({ list, options: resumeOptions, abortScope });
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
abortScope.dispose();
|
|
218
|
+
const suspendedState = { ...state, persistence: resumeOptions.persistence };
|
|
219
|
+
await this.runState.suspend(this.runId, suspendedState);
|
|
220
|
+
this.updateState(suspendedState);
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
177
224
|
async crashResume(options) {
|
|
178
225
|
this.runId = options.runId;
|
|
179
226
|
const state = await this.loadStepCheckpoint();
|
|
@@ -318,7 +365,7 @@ class AgentRuntime {
|
|
|
318
365
|
result.runId = this.runId;
|
|
319
366
|
result.usage = this.applyCost(result.usage);
|
|
320
367
|
result.model = this.modelIdString;
|
|
321
|
-
if (!result.pendingSuspend?.length) {
|
|
368
|
+
if (!result.pendingSuspend?.length && result.finishReason !== 'paused') {
|
|
322
369
|
this.updateState({ status: 'success', messageList: list.serialize() });
|
|
323
370
|
this.eventBus.emit({ type: "agent_end", messages: result.messages });
|
|
324
371
|
}
|
|
@@ -329,7 +376,8 @@ class AgentRuntime {
|
|
|
329
376
|
...this.telemetry.buildTelemetryOptions(options),
|
|
330
377
|
...(options?.onStepStart ? { onStepStart: options.onStepStart } : {}),
|
|
331
378
|
...(options?.onStepEnd || options?.onStepFinish
|
|
332
|
-
?
|
|
379
|
+
?
|
|
380
|
+
{ onStepEnd: options.onStepEnd ?? options.onStepFinish }
|
|
333
381
|
: {}),
|
|
334
382
|
repairToolCall: async (options) => {
|
|
335
383
|
return await (0, fix_tool_call_1.fixToolCall)({
|
|
@@ -372,6 +420,8 @@ class AgentRuntime {
|
|
|
372
420
|
modelFetch: this.config.modelFetch,
|
|
373
421
|
turnDelta: list.turnDelta(),
|
|
374
422
|
executionCounter: options.executionCounter,
|
|
423
|
+
onSideCallUsage: options.onSideCallUsage,
|
|
424
|
+
promptCaching: this.config.promptCaching,
|
|
375
425
|
});
|
|
376
426
|
this.backgroundTasks.track(titlePromise);
|
|
377
427
|
if (this.config.titleGeneration.sync) {
|
|
@@ -386,12 +436,33 @@ class AgentRuntime {
|
|
|
386
436
|
return settlement.result;
|
|
387
437
|
}
|
|
388
438
|
for (; state.iterationCount < state.maxIterations; state.iterationCount++) {
|
|
439
|
+
const hasInput = await this.consumeAdditionalInput(prepared, sink, state);
|
|
440
|
+
if (state.guardrailStop)
|
|
441
|
+
break;
|
|
442
|
+
if (state.reachedStopCondition && !hasInput)
|
|
443
|
+
break;
|
|
444
|
+
this.assertNotAborted(prepared.abortScope);
|
|
445
|
+
if (await prepared.options?.shouldPause?.()) {
|
|
446
|
+
await this.persistSuspension({}, prepared.options, prepared.list, state.totalUsage, state.maxIterations, state.iterationCount, 'paused');
|
|
447
|
+
this.assertNotAborted(prepared.abortScope);
|
|
448
|
+
return await sink.finishSuspended({
|
|
449
|
+
suspendRunId: this.runId,
|
|
450
|
+
list: prepared.list,
|
|
451
|
+
usage: state.totalUsage,
|
|
452
|
+
suspensions: [],
|
|
453
|
+
finishReason: 'paused',
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
state.reachedStopCondition = false;
|
|
389
457
|
const settlement = await this.runLoopIteration(prepared, sink, state);
|
|
390
458
|
if (settlement.suspended)
|
|
391
459
|
return settlement.result;
|
|
392
|
-
if (state.reachedStopCondition)
|
|
460
|
+
if (state.reachedStopCondition && !prepared.options?.onInputBoundary)
|
|
393
461
|
break;
|
|
394
462
|
}
|
|
463
|
+
if (state.iterationCount >= state.maxIterations) {
|
|
464
|
+
await this.consumeAdditionalInput(prepared, sink, state);
|
|
465
|
+
}
|
|
395
466
|
if (!state.reachedStopCondition && state.iterationCount >= state.maxIterations) {
|
|
396
467
|
state.lastFinishReason = 'max-iterations';
|
|
397
468
|
}
|
|
@@ -401,8 +472,34 @@ class AgentRuntime {
|
|
|
401
472
|
finishReason: state.lastFinishReason,
|
|
402
473
|
usage: state.totalUsage,
|
|
403
474
|
structuredOutput: state.structuredOutput,
|
|
475
|
+
guardrail: state.guardrailStop,
|
|
404
476
|
});
|
|
405
477
|
}
|
|
478
|
+
async consumeAdditionalInput(ctx, sink, state) {
|
|
479
|
+
const receive = ctx.options?.onInputBoundary;
|
|
480
|
+
if (!receive || state.lastFinishReason === 'error')
|
|
481
|
+
return false;
|
|
482
|
+
this.assertNotAborted(ctx.abortScope);
|
|
483
|
+
await sink.inputBoundary?.(ctx.abortScope.signal);
|
|
484
|
+
this.assertNotAborted(ctx.abortScope);
|
|
485
|
+
const messages = await receive({
|
|
486
|
+
messages: (0, tool_result_memory_1.sanitizeOffloadedToolResultsForMemory)(ctx.list.turnDelta()),
|
|
487
|
+
lastCreatedAt: ctx.list.messages().at(-1)?.createdAt.getTime() ?? 0,
|
|
488
|
+
completing: state.reachedStopCondition,
|
|
489
|
+
canContinue: state.iterationCount < state.maxIterations && !state.guardrailStop,
|
|
490
|
+
});
|
|
491
|
+
ctx.list.addInput(messages);
|
|
492
|
+
for (const message of messages)
|
|
493
|
+
await sink.emitInput?.(message);
|
|
494
|
+
this.assertNotAborted(ctx.abortScope);
|
|
495
|
+
if (messages.length > 0) {
|
|
496
|
+
state.structuredOutput = undefined;
|
|
497
|
+
await (0, hydrate_file_parts_1.hydrateFileParts)(ctx.list.messages(), this.config.fileStore, {
|
|
498
|
+
threadId: ctx.options?.persistence?.threadId,
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
return messages.length > 0;
|
|
502
|
+
}
|
|
406
503
|
async prepareLoop(ctx) {
|
|
407
504
|
const { list, options } = ctx;
|
|
408
505
|
await this.activeSkills?.restore(list, options?.persistence);
|
|
@@ -428,22 +525,23 @@ class AgentRuntime {
|
|
|
428
525
|
runTelemetry,
|
|
429
526
|
staticContext,
|
|
430
527
|
instructionProviderOptions,
|
|
431
|
-
|
|
528
|
+
acceptedInputIds: new Set(ctx.isFreshRun ? [] : list.inputDelta().map((message) => message.id)),
|
|
432
529
|
},
|
|
433
530
|
state,
|
|
434
531
|
};
|
|
435
532
|
}
|
|
436
|
-
|
|
437
|
-
const inputMessages = new Set(ctx.list.inputDelta());
|
|
533
|
+
getRejectableInputIds(ctx) {
|
|
534
|
+
const inputMessages = new Set(ctx.list.inputDelta().filter((message) => !ctx.acceptedInputIds.has(message.id)));
|
|
438
535
|
const inputIds = new Set([...inputMessages].map((message) => message.id));
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
536
|
+
const hasFiles = [...inputMessages].some((message) => 'role' in message &&
|
|
537
|
+
message.role === 'user' &&
|
|
538
|
+
Array.isArray(message.content) &&
|
|
539
|
+
message.content.some((part) => part.type === 'file' && part.data !== undefined));
|
|
540
|
+
if (!hasFiles)
|
|
541
|
+
return [];
|
|
542
|
+
if (ctx.list.messages().some((message) => !inputMessages.has(message) && inputIds.has(message.id)))
|
|
543
|
+
return [];
|
|
544
|
+
return [...inputIds];
|
|
447
545
|
}
|
|
448
546
|
buildToolBatchContext(ctx, toolMap) {
|
|
449
547
|
return {
|
|
@@ -453,6 +551,8 @@ class AgentRuntime {
|
|
|
453
551
|
persistence: ctx.options?.persistence,
|
|
454
552
|
telemetry: ctx.runTelemetry,
|
|
455
553
|
executionCounter: ctx.options?.executionCounter,
|
|
554
|
+
guardrails: ctx.options?.guardrails,
|
|
555
|
+
approvalContext: ctx.options?.approvalContext,
|
|
456
556
|
abortSignal: ctx.abortScope.signal,
|
|
457
557
|
isAborted: () => ctx.abortScope.isAborted,
|
|
458
558
|
};
|
|
@@ -472,9 +572,16 @@ class AgentRuntime {
|
|
|
472
572
|
async runLoopIteration(ctx, sink, state) {
|
|
473
573
|
this.assertNotAborted(ctx.abortScope);
|
|
474
574
|
this.eventBus.emit({ type: "turn_start" });
|
|
475
|
-
const { toolMap, modelCallContext } = await this.prepareModelCall(ctx
|
|
575
|
+
const { toolMap, modelCallContext } = await this.prepareModelCall(ctx);
|
|
476
576
|
const turn = await this.callModelWithRetries(ctx, sink, state, modelCallContext);
|
|
577
|
+
if (!turn) {
|
|
578
|
+
state.lastFinishReason = 'guardrail';
|
|
579
|
+
state.reachedStopCondition = true;
|
|
580
|
+
return { suspended: false };
|
|
581
|
+
}
|
|
477
582
|
this.assertNotAborted(ctx.abortScope);
|
|
583
|
+
for (const message of ctx.list.inputDelta())
|
|
584
|
+
ctx.acceptedInputIds.add(message.id);
|
|
478
585
|
state.lastFinishReason = turn.finishReason;
|
|
479
586
|
if (!(0, runtime_helpers_1.isReasoningOnlyStop)(turn))
|
|
480
587
|
ctx.list.addResponse(turn.newMessages);
|
|
@@ -497,7 +604,7 @@ class AgentRuntime {
|
|
|
497
604
|
await this.completeToolTurn(ctx, state, turn);
|
|
498
605
|
return settlement;
|
|
499
606
|
}
|
|
500
|
-
async prepareModelCall(ctx
|
|
607
|
+
async prepareModelCall(ctx) {
|
|
501
608
|
const { list, options, abortScope, staticContext } = ctx;
|
|
502
609
|
const tools = this.context.buildToolLoopContext(staticContext.aiProviderTools, options?.persistence, options?.executionCounter, list);
|
|
503
610
|
const hostVolatileInstructions = await this.resolveVolatileInstructions(options?.persistence);
|
|
@@ -513,34 +620,53 @@ class AgentRuntime {
|
|
|
513
620
|
system: prompt.system,
|
|
514
621
|
messages: prompt.messages,
|
|
515
622
|
abortSignal: abortScope.signal,
|
|
516
|
-
hasTools: tools.hasTools,
|
|
623
|
+
hasTools: options?.toolsEnabled !== false && tools.hasTools,
|
|
517
624
|
aiTools: prompt.aiTools,
|
|
518
625
|
reasoning: staticContext.reasoning,
|
|
519
626
|
providerOptions: staticContext.providerOptions,
|
|
520
627
|
outputSpec: staticContext.outputSpec,
|
|
521
628
|
maxOutputTokens: staticContext.maxOutputTokens,
|
|
522
629
|
aiSdkOptions: this.buildAiSdkOptions(tools.toolMap, options),
|
|
523
|
-
onInputRejected: this.createInputRejectionHandler(ctx
|
|
630
|
+
onInputRejected: this.createInputRejectionHandler(ctx),
|
|
524
631
|
};
|
|
525
632
|
return { toolMap: tools.toolMap, modelCallContext };
|
|
526
633
|
}
|
|
527
|
-
createInputRejectionHandler(ctx
|
|
528
|
-
|
|
634
|
+
createInputRejectionHandler(ctx) {
|
|
635
|
+
const messageIds = this.getRejectableInputIds(ctx);
|
|
636
|
+
if (messageIds.length === 0)
|
|
529
637
|
return undefined;
|
|
530
638
|
return async () => {
|
|
531
639
|
if (ctx.abortScope.isAborted)
|
|
532
640
|
return;
|
|
533
|
-
await this.memory.discardRejectedInput(ctx.list, ctx.options);
|
|
641
|
+
await this.memory.discardRejectedInput(ctx.list, messageIds, ctx.options);
|
|
534
642
|
this.updateState({ messageList: ctx.list.serialize() });
|
|
535
643
|
};
|
|
536
644
|
}
|
|
537
645
|
async callModelWithRetries(ctx, sink, state, modelCallContext) {
|
|
538
|
-
|
|
539
|
-
|
|
646
|
+
const guardrails = guardrail_runner_1.GuardrailRunner.from(ctx.options?.guardrails);
|
|
647
|
+
const callModel = async () => {
|
|
648
|
+
const guardCtx = guardrails?.modelCallContext('turn', this.modelIdString);
|
|
649
|
+
if (guardrails && guardCtx) {
|
|
650
|
+
const stop = await guardrails.before(guardCtx);
|
|
651
|
+
if (stop) {
|
|
652
|
+
state.guardrailStop = stop;
|
|
653
|
+
return undefined;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
const turn = await sink.callModel(modelCallContext);
|
|
657
|
+
turn.usage = this.applyCost(turn.usage);
|
|
658
|
+
if (guardrails && guardCtx)
|
|
659
|
+
await guardrails.after(guardCtx, turn.usage);
|
|
660
|
+
return turn;
|
|
661
|
+
};
|
|
662
|
+
let turn = await callModel();
|
|
663
|
+
for (let retry = 0; turn && retry < MAX_EMPTY_TURN_RETRIES && (0, runtime_helpers_1.isEmptyModelTurn)(turn); retry++) {
|
|
540
664
|
this.recordTurnUsage(ctx, sink, state, turn);
|
|
541
665
|
this.assertNotAborted(ctx.abortScope);
|
|
542
|
-
turn = await
|
|
666
|
+
turn = await callModel();
|
|
543
667
|
}
|
|
668
|
+
if (!turn)
|
|
669
|
+
return undefined;
|
|
544
670
|
this.recordTurnUsage(ctx, sink, state, turn);
|
|
545
671
|
return turn;
|
|
546
672
|
}
|
|
@@ -650,7 +776,7 @@ class AgentRuntime {
|
|
|
650
776
|
});
|
|
651
777
|
}
|
|
652
778
|
}
|
|
653
|
-
async persistSuspension(pendingToolCalls, options, list, totalUsage, maxIterations, iterationCount) {
|
|
779
|
+
async persistSuspension(pendingToolCalls, options, list, totalUsage, maxIterations, iterationCount, finishReason) {
|
|
654
780
|
const checkpointOptions = (0, checkpoint_data_1.buildCheckpointOptions)(options, maxIterations, iterationCount);
|
|
655
781
|
(0, checkpoint_data_1.markSuspendedToolCalls)(list, pendingToolCalls);
|
|
656
782
|
const state = {
|
|
@@ -659,10 +785,16 @@ class AgentRuntime {
|
|
|
659
785
|
messageList: list.serialize(),
|
|
660
786
|
pendingToolCalls,
|
|
661
787
|
usage: totalUsage,
|
|
788
|
+
finishReason,
|
|
662
789
|
...checkpointOptions,
|
|
663
790
|
};
|
|
664
791
|
await this.runState.suspend(this.runId, state);
|
|
665
|
-
this.updateState({
|
|
792
|
+
this.updateState({
|
|
793
|
+
status: 'suspended',
|
|
794
|
+
pendingToolCalls,
|
|
795
|
+
messageList: list.serialize(),
|
|
796
|
+
finishReason,
|
|
797
|
+
});
|
|
666
798
|
await this.memory.persistTurnDelta(list, options);
|
|
667
799
|
}
|
|
668
800
|
async persistStepCheckpoint(list, totalUsage, options, maxIterations, iterationCount) {
|