feat: allow disabling task tracking via terminal

old-agentic-v1^2
Philipp Burckhardt 2023-07-09 21:53:01 -04:00
rodzic a62c41afe1
commit 15a0c83cb9
2 zmienionych plików z 74 dodań i 6 usunięć

Wyświetl plik

@ -5,7 +5,7 @@ import { OpenAIClient } from 'openai-fetch'
import { SetOptional } from 'type-fest' import { SetOptional } from 'type-fest'
import * as types from './types' import * as types from './types'
import { TerminalTaskTracker } from './events' import { DummyTaskTracker, TaskTracker, TerminalTaskTracker } from './events'
import { HumanFeedbackOptions, HumanFeedbackType } from './human-feedback' import { HumanFeedbackOptions, HumanFeedbackType } from './human-feedback'
import { HumanFeedbackMechanismCLI } from './human-feedback/cli' import { HumanFeedbackMechanismCLI } from './human-feedback/cli'
import { OpenAIChatCompletion } from './llms/openai' import { OpenAIChatCompletion } from './llms/openai'
@ -16,7 +16,7 @@ import { defaultIDGeneratorFn, isFunction, isString } from './utils'
export class Agentic extends EventEmitter { export class Agentic extends EventEmitter {
protected _ky: types.KyInstance protected _ky: types.KyInstance
protected _logger: types.Logger protected _logger: types.Logger
protected _taskTracker: TerminalTaskTracker protected _taskTracker: TaskTracker
protected _openai?: types.openai.OpenAIClient protected _openai?: types.openai.OpenAIClient
protected _anthropic?: types.anthropic.Anthropic protected _anthropic?: types.anthropic.Anthropic
@ -31,17 +31,48 @@ export class Agentic extends EventEmitter {
constructor( constructor(
opts: { opts: {
/**
* OpenAI client instance to use (by default, a new `openai-fetch` client will be created.)
*/
openai?: types.openai.OpenAIClient openai?: types.openai.OpenAIClient
/**
* Anthropic client instance to use (by default, a new `@anthropic-ai/sdk` client will be created.)
*/
anthropic?: types.anthropic.Anthropic anthropic?: types.anthropic.Anthropic
/**
* Default values for LLM calls.
*/
modelDefaults?: Pick< modelDefaults?: Pick<
types.BaseLLMOptions, types.BaseLLMOptions,
'provider' | 'model' | 'modelParams' | 'timeoutMs' | 'retryConfig' 'provider' | 'model' | 'modelParams' | 'timeoutMs' | 'retryConfig'
> >
/**
* Default option values for when requesting human feedback.
*/
humanFeedbackDefaults?: HumanFeedbackOptions<HumanFeedbackType, any> humanFeedbackDefaults?: HumanFeedbackOptions<HumanFeedbackType, any>
/**
* Function to generate a unique identifier for each task.
*/
idGeneratorFn?: types.IDGeneratorFunction idGeneratorFn?: types.IDGeneratorFunction
/**
* Logger instance to use for logging events of various severities.
*/
logger?: types.Logger logger?: types.Logger
/**
* Ky instance to use for HTTP requests.
*/
ky?: types.KyInstance 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() super()
@ -58,7 +89,13 @@ export class Agentic extends EventEmitter {
this._ky = opts.ky ?? defaultKy this._ky = opts.ky ?? defaultKy
this._logger = opts.logger ?? defaultLogger 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 || {}) this._openaiModelDefaults = openaiModelDefaults(opts.modelDefaults || {})
@ -98,7 +135,7 @@ export class Agentic extends EventEmitter {
return this._humanFeedbackDefaults return this._humanFeedbackDefaults
} }
public get taskTracker(): TerminalTaskTracker { public get taskTracker(): TaskTracker {
return this._taskTracker return this._taskTracker
} }

Wyświetl plik

@ -20,12 +20,42 @@ const RE_ANSI_ESCAPES = /^(\x1b\[[0-9;]*[ABCDHJK]|[\r\n])+$/ // cursor movement,
const originalStdoutWrite = process.stdout.write const originalStdoutWrite = process.stdout.write
const originalStderrWrite = process.stderr.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<TInput, TOutput>(event: TaskEvent<TInput, TOutput>): 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 { export interface TerminalTaskTrackerOptions {
spinnerInterval?: number spinnerInterval?: number
inactivityInterval?: number inactivityInterval?: number
} }
export class TerminalTaskTracker { export class TerminalTaskTracker extends TaskTracker {
protected _tree = new TreeModel() protected _tree = new TreeModel()
protected _root = this._tree.parse({ id: 'root' }) protected _root = this._tree.parse({ id: 'root' })
protected _interval: NodeJS.Timeout | null = null protected _interval: NodeJS.Timeout | null = null
@ -46,6 +76,7 @@ export class TerminalTaskTracker {
spinnerInterval = 150, spinnerInterval = 150,
inactivityInterval = 2_000 inactivityInterval = 2_000
}: TerminalTaskTrackerOptions = {}) { }: TerminalTaskTrackerOptions = {}) {
super()
this._spinnerInterval = spinnerInterval this._spinnerInterval = spinnerInterval
this._inactivityInterval = inactivityInterval this._inactivityInterval = inactivityInterval