diff --git a/legacy/packages/core/src/agentic.ts b/legacy/packages/core/src/agentic.ts index e61f113b..36fdc874 100644 --- a/legacy/packages/core/src/agentic.ts +++ b/legacy/packages/core/src/agentic.ts @@ -5,7 +5,7 @@ import { OpenAIClient } from 'openai-fetch' import { SetOptional } from 'type-fest' import * as types from './types' -import { TerminalTaskTracker } from './events' +import { DummyTaskTracker, TaskTracker, TerminalTaskTracker } from './events' import { HumanFeedbackOptions, HumanFeedbackType } from './human-feedback' import { HumanFeedbackMechanismCLI } from './human-feedback/cli' import { OpenAIChatCompletion } from './llms/openai' @@ -16,7 +16,7 @@ import { defaultIDGeneratorFn, isFunction, isString } from './utils' export class Agentic extends EventEmitter { protected _ky: types.KyInstance protected _logger: types.Logger - protected _taskTracker: TerminalTaskTracker + protected _taskTracker: TaskTracker protected _openai?: types.openai.OpenAIClient protected _anthropic?: types.anthropic.Anthropic @@ -31,17 +31,48 @@ export class Agentic extends EventEmitter { constructor( opts: { + /** + * OpenAI client instance to use (by default, a new `openai-fetch` client will be created.) + */ openai?: types.openai.OpenAIClient + + /** + * Anthropic client instance to use (by default, a new `@anthropic-ai/sdk` client will be created.) + */ anthropic?: types.anthropic.Anthropic + + /** + * Default values for LLM calls. + */ modelDefaults?: Pick< types.BaseLLMOptions, 'provider' | 'model' | 'modelParams' | 'timeoutMs' | 'retryConfig' > + + /** + * Default option values for when requesting human feedback. + */ humanFeedbackDefaults?: HumanFeedbackOptions + + /** + * Function to generate a unique identifier for each task. + */ idGeneratorFn?: types.IDGeneratorFunction + + /** + * Logger instance to use for logging events of various severities. + */ logger?: types.Logger + + /** + * Ky instance to use for HTTP requests. + */ ky?: types.KyInstance - taskTracker?: TerminalTaskTracker + + /** + * A task tracker or `false` to disable. By default, tasks will be tracked via the terminal. + */ + taskTracker?: TaskTracker | false } = {} ) { super() @@ -58,7 +89,13 @@ export class Agentic extends EventEmitter { this._ky = opts.ky ?? defaultKy this._logger = opts.logger ?? defaultLogger - this._taskTracker = opts.taskTracker ?? new TerminalTaskTracker() + if (opts.taskTracker) { + this._taskTracker = opts.taskTracker + } else if (opts.taskTracker === false) { + this._taskTracker = new DummyTaskTracker() + } else { + this._taskTracker = new TerminalTaskTracker() + } this._openaiModelDefaults = openaiModelDefaults(opts.modelDefaults || {}) @@ -98,7 +135,7 @@ export class Agentic extends EventEmitter { return this._humanFeedbackDefaults } - public get taskTracker(): TerminalTaskTracker { + public get taskTracker(): TaskTracker { return this._taskTracker } diff --git a/legacy/packages/core/src/events/tracker.ts b/legacy/packages/core/src/events/tracker.ts index 759e58ed..081cb839 100644 --- a/legacy/packages/core/src/events/tracker.ts +++ b/legacy/packages/core/src/events/tracker.ts @@ -20,12 +20,42 @@ const RE_ANSI_ESCAPES = /^(\x1b\[[0-9;]*[ABCDHJK]|[\r\n])+$/ // cursor movement, const originalStdoutWrite = process.stdout.write const originalStderrWrite = process.stderr.write +export abstract class TaskTracker { + abstract start(): void + abstract close(): void + abstract pause(message?: string): void + abstract resume(): void + abstract addEvent(event: TaskEvent): void + abstract render(): void +} + +export class DummyTaskTracker extends TaskTracker { + start(): void { + // Does nothing + } + close(): void { + // Does nothing + } + pause(): void { + // Does nothing + } + resume(): void { + // Does nothing + } + addEvent(): void { + // Does nothing + } + render(): void { + // Does nothing + } +} + export interface TerminalTaskTrackerOptions { spinnerInterval?: number inactivityInterval?: number } -export class TerminalTaskTracker { +export class TerminalTaskTracker extends TaskTracker { protected _tree = new TreeModel() protected _root = this._tree.parse({ id: 'root' }) protected _interval: NodeJS.Timeout | null = null @@ -46,6 +76,7 @@ export class TerminalTaskTracker { spinnerInterval = 150, inactivityInterval = 2_000 }: TerminalTaskTrackerOptions = {}) { + super() this._spinnerInterval = spinnerInterval this._inactivityInterval = inactivityInterval