UNPKG

@autobe/agent

Version:

AI backend server code generator

122 lines (114 loc) 4.05 kB
import { AutoBeEventSource, AutoBeOpenApi, AutoBeProgressEventBase, AutoBeTestGenerateFunction, AutoBeTestPrepareFunction, } from "@autobe/interface"; import typia, { ILlmApplication, ILlmController, IValidation } from "typia"; import { AutoBeContext } from "../../context/AutoBeContext"; import { orchestrateTestCorrectCasting } from "./internal/orchestrateTestCorrectCasting"; import { orchestrateTestCorrectOverall } from "./internal/orchestrateTestCorrectOverall"; // import { orchestrateTestCorrectRequest } from "./internal/orchestrateTestCorrectRequest"; import { orchestrateTestGenerateWrite } from "./orchestrateTestGenerateWrite"; import { AutoBeTestGenerateProgrammer } from "./programmers/AutoBeTestGenerateProgrammer"; import { IAutoBeTestCorrectOverallApplication } from "./structures/IAutoBeTestCorrectOverallApplication"; import { IAutoBeTestGenerateProcedure } from "./structures/IAutoBeTestGenerateProcedure"; export async function orchestrateTestGenerate( ctx: AutoBeContext, props: { instruction: string; document: AutoBeOpenApi.IDocument; prepares: AutoBeTestPrepareFunction[]; writeProgress: AutoBeProgressEventBase; validateProgress: AutoBeProgressEventBase; }, ): Promise<AutoBeTestGenerateFunction[]> { const compile = async (procedure: IAutoBeTestGenerateProcedure) => AutoBeTestGenerateProgrammer.compile({ compiler: await ctx.compiler(), step: ctx.state().analyze?.step ?? 0, progress: props.validateProgress, procedure, }); const replaceImportStatements = async ( procedure: IAutoBeTestGenerateProcedure, ) => AutoBeTestGenerateProgrammer.replaceImportStatements({ compiler: await ctx.compiler(), artifacts: procedure.artifacts, prepare: procedure.prepare, location: procedure.function.location, content: procedure.function.content, }); let procedures: IAutoBeTestGenerateProcedure[] = await orchestrateTestGenerateWrite(ctx, { instruction: props.instruction, document: props.document, prepares: props.prepares, progress: props.writeProgress, }); props.validateProgress.total += procedures.length; procedures = await orchestrateTestCorrectCasting(ctx, { programmer: { compile, replaceImportStatements, asynchronous: true, }, procedures, progress: props.validateProgress, }); procedures = await orchestrateTestCorrectOverall(ctx, { programmer: { compile, replaceImportStatements, controller: (next) => createCorrectOverallController(next), }, instruction: props.instruction, progress: props.validateProgress, procedures, discard: false, }); return procedures.map((p) => p.function); } function createCorrectOverallController(props: { procedure: IAutoBeTestGenerateProcedure; build: (next: IAutoBeTestCorrectOverallApplication.IProps) => void; }): ILlmController<IAutoBeTestCorrectOverallApplication> { const validate: Validator = (input) => { const result: IValidation<IAutoBeTestCorrectOverallApplication.IProps> = typia.validate<IAutoBeTestCorrectOverallApplication.IProps>(input); if (result.success === false) return result; const errors: IValidation.IError[] = AutoBeTestGenerateProgrammer.validate({ procedure: props.procedure, draft: result.data.draft, revise: result.data.revise, }); return errors.length ? { success: false, errors, data: result.data, } : result; }; const application: ILlmApplication = typia.llm.application<IAutoBeTestCorrectOverallApplication>({ validate: { rewrite: validate, }, }); return { protocol: "class", name: "testCorrect" satisfies AutoBeEventSource, application, execute: { rewrite: (v) => { props.build(v); }, } satisfies IAutoBeTestCorrectOverallApplication, }; } type Validator = ( input: unknown, ) => IValidation<IAutoBeTestCorrectOverallApplication.IProps>;