diff --git a/legacy/examples/hf0-demo.ts b/legacy/examples/hf0-demo.ts new file mode 100644 index 00000000..7395d3af --- /dev/null +++ b/legacy/examples/hf0-demo.ts @@ -0,0 +1,83 @@ +import { OpenAIClient } from '@agentic/openai-fetch' +import 'dotenv/config' +import { z } from 'zod' + +import { + Agentic, + HumanFeedbackMechanismTwilio, + SearchAndCrawlTool, + WeatherTool, + withHumanFeedback +} from '@/index' + +async function main() { + const openai = new OpenAIClient({ apiKey: process.env.OPENAI_API_KEY! }) + const agentic = new Agentic({ openai }) + + const topic = process.argv[2] || 'OpenAI' + + const res0 = await withHumanFeedback( + agentic + .gpt4({ + messages: [ + { + role: 'system', + content: `You are a MckInsey analyst who is an expert at writing executive summaries.` + }, + { + role: 'user', + content: `What are the 3 most important questions we would need to answer in order to have a thorough understanding of this topic: {{topic}}? Be concise but creative in your questions, and make sure to capture the true essence of the topic.` + } + ], + model: 'gpt-4', + temperature: 1.0 + }) + .input( + z.object({ + topic: z.string() + }) + ) + .output(z.array(z.string()).describe('question')), + { + type: 'selectN', + mechanism: HumanFeedbackMechanismTwilio + } + ).callWithMetadata({ topic }) + + console.log() + console.log() + console.log(`Questions: ${res0.result}`) + console.log() + console.log() + + const questions: string[] = (res0.metadata.feedback as any)!.selected + + const res = await agentic + .gpt4({ + messages: [ + { + role: 'system', + content: `You are a MckInsey analyst who is an expert at writing executive summaries.` + }, + { + role: 'user', + content: `Write a thorough executive summary on this topic: {{topic}}. + In order to do this, you will need to answer the following questions: \n{{#questions}}- {{.}}\n{{/questions}}` + } + ], + model: 'gpt-4-32k' + }) + .tools([new SearchAndCrawlTool(), new WeatherTool()]) + .input( + z.object({ + topic: z.string(), + questions: z.array(z.string()) + }) + ) + .call({ topic, questions }) + + console.log('\n\n\n') + console.log(res) +} + +main() diff --git a/legacy/src/errors.ts b/legacy/src/errors.ts index 5d17802d..6912c1b8 100644 --- a/legacy/src/errors.ts +++ b/legacy/src/errors.ts @@ -1,7 +1,11 @@ +import { TimeoutError as KyTimeoutError } from 'ky' +import { TimeoutError } from 'p-timeout' import type { Jsonifiable } from 'type-fest' import type { ZodError } from 'zod' import { ValidationError, fromZodError } from 'zod-validation-error' +export { TimeoutError, KyTimeoutError } + export type ErrorOptions = { /** HTTP status code for the error. */ status?: number diff --git a/legacy/src/human-feedback/feedback.ts b/legacy/src/human-feedback/feedback.ts index d7fded39..aa161bbb 100644 --- a/legacy/src/human-feedback/feedback.ts +++ b/legacy/src/human-feedback/feedback.ts @@ -216,6 +216,11 @@ export abstract class HumanFeedbackMechanism< choices.push(HumanFeedbackUserActions.Abort) } + this._agentic.logger.info( + choices, + `>>> Human feedback ${this.constructor.name} ${msg}` + ) + const choice = choices.length === 1 ? HumanFeedbackUserActions.Select @@ -291,6 +296,10 @@ export abstract class HumanFeedbackMechanism< }) } + this._agentic.logger.info( + feedback, + `<<< Human feedback ${this.constructor.name} ${msg}` + ) return feedback as FeedbackTypeToMetadata } } diff --git a/legacy/src/task.ts b/legacy/src/task.ts index 6602f7c4..99d01b24 100644 --- a/legacy/src/task.ts +++ b/legacy/src/task.ts @@ -192,6 +192,12 @@ export abstract class BaseTask< } else if (err instanceof errors.HumanFeedbackDeclineError) { ctx.retryMessage = err.message return + } else if ( + err instanceof errors.KyTimeoutError || + err instanceof errors.TimeoutError || + (err as any).name === 'TimeoutError' + ) { + // TODO } else if ((err.cause as any)?.code === 'UND_ERR_HEADERS_TIMEOUT') { // TODO: This is a pretty common OpenAI error, and I think it either has // to do with OpenAI's servers being flaky or the combination of Node.js