@autobe/agent
Version:
AI backend server code generator
208 lines (193 loc) • 7.12 kB
text/typescript
import { IAgenticaController } from "@agentica/core";
import {
AutoBeEventSource,
AutoBeRealizeAuthorization,
AutoBeRealizeAuthorizationCorrect,
AutoBeRealizeAuthorizationCorrectEvent,
IAutoBeCompiler,
IAutoBeTypeScriptCompileResult,
} from "@autobe/interface";
import { IPointer } from "tstl";
import typia, { ILlmApplication, IValidation } from "typia";
import { v7 } from "uuid";
import { AutoBeConfigConstant } from "../../constants/AutoBeConfigConstant";
import { AutoBeContext } from "../../context/AutoBeContext";
import { AutoBePreliminaryController } from "../common/AutoBePreliminaryController";
import { transformRealizeAuthorizationCorrectHistory } from "./histories/transformRealizeAuthorizationCorrectHistory";
import { IAutoBeRealizeAuthorizationCorrectApplication } from "./structures/IAutoBeRealizeAuthorizationCorrectApplication";
import { AuthorizationFileSystem } from "./utils/AuthorizationFileSystem";
import { AutoBeRealizeAuthorizationReplaceImport } from "./utils/AutoBeRealizeAuthorizationReplaceImport";
export async function orchestrateRealizeAuthorizationCorrect(
ctx: AutoBeContext,
props: {
authorization: AutoBeRealizeAuthorization;
template: Record<string, string>;
prismaClient: Record<string, string>;
},
life: number = AutoBeConfigConstant.COMPILER_RETRY,
): Promise<AutoBeRealizeAuthorization> {
try {
const compiler: IAutoBeCompiler = await ctx.compiler();
const providerContent: string = await compiler.typescript.beautify(
AutoBeRealizeAuthorizationReplaceImport.replaceProviderImport(
props.authorization.actor.name,
props.authorization.provider.content,
),
);
const decoratorContent: string = await compiler.typescript.beautify(
AutoBeRealizeAuthorizationReplaceImport.replaceDecoratorImport(
props.authorization.actor.name,
props.authorization.decorator.content,
),
);
// Check Compile
const files: Record<string, string> = {
...props.template,
...props.prismaClient,
[AuthorizationFileSystem.decoratorPath(
props.authorization.decorator.name,
)]: decoratorContent,
[AuthorizationFileSystem.providerPath(props.authorization.provider.name)]:
providerContent,
[AuthorizationFileSystem.payloadPath(props.authorization.payload.name)]:
props.authorization.payload.content,
};
const compiled: IAutoBeTypeScriptCompileResult =
await compiler.typescript.compile({
files,
});
ctx.dispatch({
type: "realizeAuthorizationValidate",
id: v7(),
created_at: new Date().toISOString(),
authorization: props.authorization,
result: compiled,
step: ctx.state().test?.step ?? 0,
});
if (compiled.type === "success") {
return props.authorization;
} else if (compiled.type === "exception" || life < 0) {
return props.authorization;
}
const preliminary: AutoBePreliminaryController<"databaseSchemas"> =
new AutoBePreliminaryController({
source: SOURCE,
dispatch: (e) => ctx.dispatch(e),
application:
typia.json.application<IAutoBeRealizeAuthorizationCorrectApplication>(),
kinds: ["databaseSchemas"],
state: ctx.state(),
});
const event: AutoBeRealizeAuthorizationCorrectEvent =
await preliminary.orchestrate(ctx, async (out) => {
const pointer: IPointer<IAutoBeRealizeAuthorizationCorrectApplication.IWrite | null> =
{
value: null,
};
const result: AutoBeContext.IResult = await ctx.conversate({
source: "realizeAuthorizationCorrect",
controller: createController({
build: (next) => {
pointer.value = next;
},
preliminary,
}),
enforceFunctionCall: true,
...transformRealizeAuthorizationCorrectHistory({
authorization: props.authorization,
template: props.template,
diagnostics: compiled.diagnostics,
preliminary,
}),
});
if (pointer.value === null) return out(result)(null);
const correct: AutoBeRealizeAuthorizationCorrect = {
...pointer.value,
decorator: {
...pointer.value.decorator,
location: AuthorizationFileSystem.decoratorPath(
pointer.value.decorator.name,
),
},
provider: {
...pointer.value.provider,
location: AuthorizationFileSystem.providerPath(
pointer.value.provider.name,
),
},
payload: {
name: pointer.value.payload.name,
location: AuthorizationFileSystem.payloadPath(
pointer.value.payload.name,
),
content: await compiler.typescript.beautify(
pointer.value.payload.content,
),
},
actor: props.authorization.actor,
};
return out(result)({
...pointer.value,
type: "realizeAuthorizationCorrect",
id: v7(),
created_at: new Date().toISOString(),
authorization: correct,
result: compiled,
acquisition: preliminary.getAcquisition(),
metric: result.metric,
tokenUsage: result.tokenUsage,
step: ctx.state().test?.step ?? 0,
});
});
ctx.dispatch(event);
return await orchestrateRealizeAuthorizationCorrect(
ctx,
{
authorization: event.authorization,
prismaClient: props.prismaClient,
template: props.template,
},
life - 1,
);
} catch {
return await orchestrateRealizeAuthorizationCorrect(ctx, props, life - 1);
}
}
function createController(props: {
build: (next: IAutoBeRealizeAuthorizationCorrectApplication.IWrite) => void;
preliminary: AutoBePreliminaryController<"databaseSchemas">;
}): IAgenticaController.IClass {
const validate: Validator = (input) => {
const result: IValidation<IAutoBeRealizeAuthorizationCorrectApplication.IProps> =
typia.validate<IAutoBeRealizeAuthorizationCorrectApplication.IProps>(
input,
);
if (result.success === false || 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<IAutoBeRealizeAuthorizationCorrectApplication>({
validate: {
process: validate,
},
}),
);
return {
protocol: "class",
name: SOURCE,
application,
execute: {
process: (next) => {
if (next.request.type === "write") props.build(next.request);
},
} satisfies IAutoBeRealizeAuthorizationCorrectApplication,
};
}
type Validator = (
input: unknown,
) => IValidation<IAutoBeRealizeAuthorizationCorrectApplication.IProps>;
const SOURCE = "realizeAuthorizationCorrect" satisfies AutoBeEventSource;