@autobe/agent
Version:
AI backend server code generator
120 lines (114 loc) • 4.24 kB
text/typescript
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;