UNPKG

@autobe/agent

Version:

AI backend server code generator

120 lines (114 loc) 4.24 kB
import { AgenticaAssistantMessageHistory, IAgenticaController, } from "@agentica/core"; import { AutoBeAnalyzeScenarioEvent, AutoBeAssistantMessageHistory, AutoBeEventSource, } from "@autobe/interface"; import { IPointer } from "tstl"; import typia, { ILlmApplication, IValidation } from "typia"; import { v7 } from "uuid"; import { AutoBeContext } from "../../context/AutoBeContext"; import { AutoBePreliminaryController } from "../common/AutoBePreliminaryController"; import { transformAnalyzeScenarioHistory } from "./histories/transformAnalyzeScenarioHistory"; import { buildFixedAnalyzeScenarioFiles } from "./structures/FixedAnalyzeTemplate"; import { IAutoBeAnalyzeScenarioApplication } from "./structures/IAutoBeAnalyzeScenarioApplication"; export const orchestrateAnalyzeScenario = async ( ctx: AutoBeContext, props?: { feedback?: string }, ): Promise<AutoBeAnalyzeScenarioEvent | AutoBeAssistantMessageHistory> => { const start: Date = new Date(); const preliminary: AutoBePreliminaryController< "previousAnalysisSections" | "complete" > = new AutoBePreliminaryController({ application: typia.json.application<IAutoBeAnalyzeScenarioApplication>(), source: SOURCE, kinds: ["previousAnalysisSections", "complete"], state: ctx.state(), dispatch: (e) => ctx.dispatch(e), }); return await preliminary.orchestrate(ctx, async (out) => { const pointer: IPointer<IAutoBeAnalyzeScenarioApplication.IWrite | null> = { value: null, }; const result: AutoBeContext.IResult = await ctx.conversate({ source: SOURCE, controller: createController({ pointer, preliminary, }), enforceFunctionCall: false, ...transformAnalyzeScenarioHistory(ctx, preliminary, props?.feedback), }); if (result.histories.at(-1)?.type === "assistantMessage") return out(result)({ ...(result.histories.at(-1)! as AgenticaAssistantMessageHistory), created_at: start.toISOString(), completed_at: new Date().toISOString(), id: v7(), } satisfies AutoBeAssistantMessageHistory); else if (pointer.value === null) return out(result)(null); const features = pointer.value.features ?? []; const event: AutoBeAnalyzeScenarioEvent = { type: SOURCE, id: v7(), prefix: pointer.value.prefix, language: pointer.value.language, actors: pointer.value.actors, entities: pointer.value.entities, features: features.map((f) => ({ id: f.id, ...(f.providers ? { providers: f.providers } : {}), })), files: buildFixedAnalyzeScenarioFiles( pointer.value.prefix, features, ) as AutoBeAnalyzeScenarioEvent["files"], acquisition: preliminary.getAcquisition(), metric: result.metric, tokenUsage: result.tokenUsage, step: (ctx.state().analyze?.step ?? -1) + 1, created_at: start.toISOString(), }; return out(result)(event); }); }; function createController(props: { pointer: IPointer<IAutoBeAnalyzeScenarioApplication.IWrite | null>; preliminary: AutoBePreliminaryController< "previousAnalysisSections" | "complete" >; }): IAgenticaController.IClass { const validate = ( input: unknown, ): IValidation<IAutoBeAnalyzeScenarioApplication.IProps> => { const result: IValidation<IAutoBeAnalyzeScenarioApplication.IProps> = typia.validate<IAutoBeAnalyzeScenarioApplication.IProps>(input); if (result.success === false) return result; else if (result.data.request.type === "write") return result; return props.preliminary.validate({ thinking: result.data.thinking ?? "", request: result.data.request, }); }; const application: ILlmApplication = props.preliminary.fixApplication( typia.llm.application<IAutoBeAnalyzeScenarioApplication>({ validate: { process: validate, }, }), ); return { protocol: "class", name: SOURCE, application, execute: { process: (input) => { if (input.request.type === "write") props.pointer.value = input.request; }, } satisfies IAutoBeAnalyzeScenarioApplication, }; } const SOURCE = "analyzeScenario" satisfies AutoBeEventSource;