kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
chore: delete holdover feedback file
rodzic
e1abd8a24f
commit
e6548f037b
|
@ -1,232 +0,0 @@
|
|||
import checkbox from '@inquirer/checkbox'
|
||||
import editor from '@inquirer/editor'
|
||||
import select from '@inquirer/select'
|
||||
import { ZodTypeAny, z } from 'zod'
|
||||
|
||||
import * as types from '@/types'
|
||||
import { BaseTask } from '@/task'
|
||||
|
||||
/**
|
||||
* Actions the user can take in the feedback selection prompt.
|
||||
*/
|
||||
export const UserActions = {
|
||||
Accept: 'accept',
|
||||
Edit: 'edit',
|
||||
Decline: 'decline',
|
||||
Select: 'select',
|
||||
Exit: 'exit'
|
||||
} as const
|
||||
|
||||
export type UserActions = (typeof UserActions)[keyof typeof UserActions]
|
||||
|
||||
/**
|
||||
* Messages to display to the user for each action.
|
||||
*/
|
||||
const UserActionMessages: Record<UserActions, string> = {
|
||||
[UserActions.Accept]: 'Accept inputs',
|
||||
[UserActions.Edit]: 'Edit (open in editor)',
|
||||
[UserActions.Decline]: 'Decline',
|
||||
[UserActions.Select]: 'Select inputs to keep',
|
||||
[UserActions.Exit]: 'Exit'
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompt the user to select one of a list of options.
|
||||
*/
|
||||
async function askUser(
|
||||
message: string,
|
||||
choices: UserActions[]
|
||||
): Promise<UserActions> {
|
||||
return select({
|
||||
message,
|
||||
choices: choices.map((choice) => ({
|
||||
name: UserActionMessages[choice],
|
||||
value: choice
|
||||
}))
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema when prompting the user to accept, edit, or decline a single input.
|
||||
*/
|
||||
export const FeedbackSingleOutputSchema = <T extends ZodTypeAny>(result: T) =>
|
||||
z.object({
|
||||
result: result,
|
||||
accepted: z.boolean()
|
||||
})
|
||||
|
||||
/**
|
||||
* Prompt the user to accept, edit, or decline a single input.
|
||||
*/
|
||||
export class HumanFeedbackSingle<T extends ZodTypeAny> extends BaseTask<
|
||||
ZodTypeAny,
|
||||
ZodTypeAny
|
||||
> {
|
||||
protected choiceSchema: T
|
||||
|
||||
constructor(choiceSchema: T) {
|
||||
super()
|
||||
this.choiceSchema = choiceSchema
|
||||
}
|
||||
|
||||
public get inputSchema() {
|
||||
return this.choiceSchema
|
||||
}
|
||||
|
||||
public get outputSchema() {
|
||||
return FeedbackSingleOutputSchema(this.choiceSchema)
|
||||
}
|
||||
|
||||
protected actionHandlers = {
|
||||
[UserActions.Accept]: (
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
) => ({ result: input, accepted: true }),
|
||||
[UserActions.Edit]: async (
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
) => {
|
||||
const editedInput = await editor({
|
||||
message: 'Edit the input:',
|
||||
default: JSON.stringify(input)
|
||||
})
|
||||
return this.outputSchema.parse({
|
||||
result: JSON.parse(editedInput),
|
||||
accepted: true
|
||||
})
|
||||
},
|
||||
[UserActions.Decline]: () => ({ result: null, accepted: false }),
|
||||
[UserActions.Exit]: () => {
|
||||
throw new Error('Exiting...')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompts the user to give feedback for the given input and handles their response.
|
||||
*/
|
||||
public async call(
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
): Promise<types.ParsedData<typeof this.outputSchema>> {
|
||||
try {
|
||||
input = this.inputSchema.parse(input)
|
||||
const msg = [
|
||||
'The following input was generated:',
|
||||
JSON.stringify(input, null, 2),
|
||||
'What would you like to do?'
|
||||
].join('\n')
|
||||
const feedback = await askUser(msg, [
|
||||
UserActions.Accept,
|
||||
UserActions.Edit,
|
||||
UserActions.Decline,
|
||||
UserActions.Exit
|
||||
])
|
||||
const handler = this.actionHandlers[feedback]
|
||||
if (!handler) {
|
||||
throw new Error(`Unexpected feedback: ${feedback}`)
|
||||
}
|
||||
return handler(input)
|
||||
} catch (err) {
|
||||
console.error('Error parsing input:', err)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Output schema when prompting the user to accept, select from, edit, or decline a list of inputs.
|
||||
*/
|
||||
export const FeedbackSelectOutputSchema = <T extends ZodTypeAny>(result: T) =>
|
||||
z.object({
|
||||
results: z.array(result),
|
||||
accepted: z.boolean()
|
||||
})
|
||||
|
||||
/**
|
||||
* Prompt the user to accept, select from, edit, or decline a list of inputs.
|
||||
*/
|
||||
export class HumanFeedbackSelect<T extends ZodTypeAny> extends BaseTask<
|
||||
ZodTypeAny,
|
||||
ZodTypeAny
|
||||
> {
|
||||
protected choiceSchema: T
|
||||
|
||||
constructor(choiceSchema: T) {
|
||||
super()
|
||||
this.choiceSchema = choiceSchema
|
||||
}
|
||||
|
||||
public get inputSchema() {
|
||||
return z.array(this.choiceSchema)
|
||||
}
|
||||
|
||||
public get outputSchema() {
|
||||
return FeedbackSelectOutputSchema(this.choiceSchema)
|
||||
}
|
||||
|
||||
protected actionHandlers = {
|
||||
[UserActions.Accept]: (
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
) => ({ results: input, accepted: true }),
|
||||
[UserActions.Edit]: async (
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
) => {
|
||||
const editedInput = await editor({
|
||||
message: 'Edit the input:',
|
||||
default: JSON.stringify(input, null, 2)
|
||||
})
|
||||
return this.outputSchema.parse({
|
||||
results: JSON.parse(editedInput),
|
||||
accepted: true
|
||||
})
|
||||
},
|
||||
[UserActions.Select]: async (
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
) => {
|
||||
const choices = input.map((completion) => ({
|
||||
name: completion,
|
||||
value: completion
|
||||
}))
|
||||
const chosen = await checkbox({
|
||||
message: 'Pick items to keep:',
|
||||
choices,
|
||||
pageSize: choices.length
|
||||
})
|
||||
return { results: chosen.length === 0 ? [] : chosen, accepted: true }
|
||||
},
|
||||
[UserActions.Decline]: () => ({ results: [], accepted: false }),
|
||||
[UserActions.Exit]: () => {
|
||||
throw new Error('Exiting...')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompts the user to give feedback for the given list of inputs and handles their response.
|
||||
*/
|
||||
public async call(
|
||||
input: types.ParsedData<typeof this.inputSchema>
|
||||
): Promise<types.ParsedData<typeof this.outputSchema>> {
|
||||
try {
|
||||
input = this.inputSchema.parse(input)
|
||||
const message = [
|
||||
'The following inputs were generated:',
|
||||
...input.map(
|
||||
(choice, index) => `${index + 1}. ${JSON.stringify(choice, null, 2)}`
|
||||
),
|
||||
'What would you like to do?'
|
||||
].join('\n')
|
||||
const feedback = await askUser(message, [
|
||||
UserActions.Accept,
|
||||
UserActions.Select,
|
||||
UserActions.Edit,
|
||||
UserActions.Decline,
|
||||
UserActions.Exit
|
||||
])
|
||||
const handler = this.actionHandlers[feedback]
|
||||
if (!handler) {
|
||||
throw new Error(`Unexpected feedback: ${feedback}`)
|
||||
}
|
||||
return handler(input)
|
||||
} catch (err) {
|
||||
console.error('Error parsing input:', err)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
Ładowanie…
Reference in New Issue