@autobe/agent
Version:
AI backend server code generator
243 lines (230 loc) • 7.69 kB
text/typescript
import { IAgenticaController } from "@agentica/core";
import {
AutoBeAnalyzeActor,
AutoBeEventSource,
AutoBeProgressEventBase,
AutoBeRealizeAuthorization,
AutoBeRealizeAuthorizationWriteEvent,
IAutoBeCompiler,
IAutoBePrismaCompileResult,
} from "@autobe/interface";
import { ILlmApplication, ILlmSchema, IValidation } from "@samchon/openapi";
import { IPointer } from "tstl";
import typia from "typia";
import { v7 } from "uuid";
import { AutoBeContext } from "../../context/AutoBeContext";
import { assertSchemaModel } from "../../context/assertSchemaModel";
import { executeCachedBatch } from "../../utils/executeCachedBatch";
import { AutoBePreliminaryController } from "../common/AutoBePreliminaryController";
import { transformRealizeAuthorizationWriteHistory } from "./histories/transformRealizeAuthorizationWriteHistory";
import { orchestrateRealizeAuthorizationCorrect } from "./orchestrateRealizeAuthorizationCorrect";
import { IAutoBeRealizeAuthorizationWriteApplication } from "./structures/IAutoBeRealizeAuthorizationWriteApplication";
import { AuthorizationFileSystem } from "./utils/AuthorizationFileSystem";
import { InternalFileSystem } from "./utils/InternalFileSystem";
/**
* 1. Create decorator and its parameters. and design the Authorization Provider.
* 2. According to Authorization Provider design, create the Provider.
*
* @param ctx
*/
export async function orchestrateRealizeAuthorizationWrite<
Model extends ILlmSchema.Model,
>(ctx: AutoBeContext<Model>): Promise<AutoBeRealizeAuthorization[]> {
ctx.dispatch({
type: "realizeAuthorizationStart",
id: v7(),
step: ctx.state().test?.step ?? 0,
created_at: new Date().toISOString(),
});
const actors: AutoBeAnalyzeActor[] = ctx.state().analyze?.actors ?? [];
const progress: AutoBeProgressEventBase = {
total: actors.length,
completed: 0,
};
const templates: Record<string, string> = await (
await ctx.compiler()
).getTemplate({
phase: "realize",
dbms: "sqlite",
});
const authorizations: AutoBeRealizeAuthorization[] = await executeCachedBatch(
ctx,
actors.map(
(a) => (promptCacheKey) =>
process(ctx, {
actor: a,
templates: InternalFileSystem.DEFAULT.map((el) => ({
[el]: templates[el],
})).reduce((acc, cur) => Object.assign(acc, cur), {}),
progress,
promptCacheKey,
}),
),
);
ctx.dispatch({
type: "realizeAuthorizationComplete",
id: v7(),
created_at: new Date().toISOString(),
step: ctx.state().test?.step ?? 0,
});
return authorizations;
}
async function process<Model extends ILlmSchema.Model>(
ctx: AutoBeContext<Model>,
props: {
actor: AutoBeAnalyzeActor;
templates: Record<string, string>;
progress: AutoBeProgressEventBase;
promptCacheKey: string;
},
): Promise<AutoBeRealizeAuthorization> {
const preliminary: AutoBePreliminaryController<"prismaSchemas"> =
new AutoBePreliminaryController<"prismaSchemas">({
source: SOURCE,
application:
typia.json.application<IAutoBeRealizeAuthorizationWriteApplication>(),
kinds: ["prismaSchemas"],
state: ctx.state(),
});
return await preliminary.orchestrate(ctx, async (out) => {
const pointer: IPointer<IAutoBeRealizeAuthorizationWriteApplication.IComplete | null> =
{
value: null,
};
const result: AutoBeContext.IResult<Model> = await ctx.conversate({
source: "realizeAuthorizationWrite",
controller: createController({
model: ctx.model,
build: (next) => {
pointer.value = next;
},
preliminary,
}),
enforceFunctionCall: true,
promptCacheKey: props.promptCacheKey,
...transformRealizeAuthorizationWriteHistory({
actor: props.actor,
preliminary,
}),
});
if (pointer.value === null) return out(result)(null);
const compiler: IAutoBeCompiler = await ctx.compiler();
const authorization: AutoBeRealizeAuthorization = {
actor: props.actor,
decorator: {
location: AuthorizationFileSystem.decoratorPath(
pointer.value.decorator.name,
),
name: pointer.value.decorator.name,
content: pointer.value.decorator.content,
},
payload: {
location: AuthorizationFileSystem.payloadPath(
pointer.value.payload.name,
),
name: pointer.value.payload.name,
content: await compiler.typescript.beautify(
pointer.value.payload.content,
),
},
provider: {
location: AuthorizationFileSystem.providerPath(
pointer.value.provider.name,
),
name: pointer.value.provider.name,
content: pointer.value.provider.content,
},
};
ctx.dispatch({
type: "realizeAuthorizationWrite",
id: v7(),
created_at: new Date().toISOString(),
authorization: authorization,
metric: result.metric,
tokenUsage: result.tokenUsage,
completed: ++props.progress.completed,
total: props.progress.total,
step: ctx.state().test?.step ?? 0,
} satisfies AutoBeRealizeAuthorizationWriteEvent);
const prismaCompiled: IAutoBePrismaCompileResult | undefined =
ctx.state().prisma?.compiled;
const prismaClient: Record<string, string> =
prismaCompiled?.type === "success" ? prismaCompiled.nodeModules : {};
return out(result)(
await orchestrateRealizeAuthorizationCorrect(ctx, {
template: props.templates,
authorization,
prismaClient,
}),
);
});
}
function createController<Model extends ILlmSchema.Model>(props: {
model: Model;
build: (next: IAutoBeRealizeAuthorizationWriteApplication.IComplete) => void;
preliminary: AutoBePreliminaryController<"prismaSchemas">;
}): IAgenticaController.IClass<Model> {
assertSchemaModel(props.model);
const validate: Validator = (input) => {
const result: IValidation<IAutoBeRealizeAuthorizationWriteApplication.IProps> =
typia.validate<IAutoBeRealizeAuthorizationWriteApplication.IProps>(input);
if (result.success === false || result.data.request.type === "complete")
return result;
return props.preliminary.validate({
thinking: result.data.thinking,
request: result.data.request,
});
};
const application: ILlmApplication<Model> = collection[
props.model === "chatgpt"
? "chatgpt"
: props.model === "gemini"
? "gemini"
: "claude"
](
validate,
) satisfies ILlmApplication<any> as unknown as ILlmApplication<Model>;
return {
protocol: "class",
name: SOURCE,
application,
execute: {
process: (next) => {
if (next.request.type === "complete") props.build(next.request);
},
} satisfies IAutoBeRealizeAuthorizationWriteApplication,
};
}
const collection = {
chatgpt: (validate: Validator) =>
typia.llm.application<
IAutoBeRealizeAuthorizationWriteApplication,
"chatgpt"
>({
validate: {
process: validate,
},
}),
claude: (validate: Validator) =>
typia.llm.application<
IAutoBeRealizeAuthorizationWriteApplication,
"claude"
>({
validate: {
process: validate,
},
}),
gemini: (validate: Validator) =>
typia.llm.application<
IAutoBeRealizeAuthorizationWriteApplication,
"gemini"
>({
validate: {
process: validate,
},
}),
};
type Validator = (
input: unknown,
) => IValidation<IAutoBeRealizeAuthorizationWriteApplication.IProps>;
const SOURCE = "realizeAuthorizationWrite" satisfies AutoBeEventSource;