@autobe/agent
Version:
AI backend server code generator
150 lines (141 loc) • 4.55 kB
text/typescript
import { IAgenticaController, MicroAgentica } from "@agentica/core";
import { AutoBePrisma } from "@autobe/interface";
import { AutoBePrismaSchemasEvent } from "@autobe/interface/src/events/AutoBePrismaSchemasEvent";
import { ILlmApplication, ILlmSchema } from "@samchon/openapi";
import { IPointer } from "tstl";
import typia from "typia";
import { AutoBeContext } from "../../context/AutoBeContext";
import { assertSchemaModel } from "../../context/assertSchemaModel";
import { enforceToolCall } from "../../utils/enforceToolCall";
import { transformPrismaSchemaHistories } from "./transformPrismaSchemaHistories";
export async function orchestratePrismaSchemas<Model extends ILlmSchema.Model>(
ctx: AutoBeContext<Model>,
components: { filename: string; tables: string[] }[],
): Promise<AutoBePrismaSchemasEvent[]> {
const start: Date = new Date();
const entireTables: string[] = Array.from(
new Set(components.flatMap((c) => c.tables)),
);
const total: number = components.reduce((acc, c) => acc + c.tables.length, 0);
let i: number = 0;
return await Promise.all(
components.map(async (c) => {
const result: IMakePrismaSchemaFileProps = await process(ctx, {
filename: c.filename,
tables: c.tables,
entireTables,
});
const event: AutoBePrismaSchemasEvent = {
type: "prismaSchemas",
created_at: start.toISOString(),
file: result.file,
completed: (i += c.tables.length),
total,
step: ctx.state().analyze?.step ?? 0,
};
ctx.dispatch(event);
return event;
}),
);
}
async function process<Model extends ILlmSchema.Model>(
ctx: AutoBeContext<Model>,
component: {
filename: string;
tables: string[];
entireTables: string[];
},
): Promise<IMakePrismaSchemaFileProps> {
const pointer: IPointer<IMakePrismaSchemaFileProps | null> = {
value: null,
};
const agentica: MicroAgentica<Model> = new MicroAgentica({
model: ctx.model,
vendor: ctx.vendor,
config: {
...(ctx.config ?? {}),
},
histories: transformPrismaSchemaHistories(ctx.state().analyze!, component),
tokenUsage: ctx.usage(),
controllers: [
createApplication({
model: ctx.model,
build: (next) => {
pointer.value ??= {
file: {
filename: component.filename,
namespace: next.file.namespace,
models: [],
},
};
pointer.value.file.models.push(...next.file.models);
},
}),
],
});
enforceToolCall(agentica);
await agentica.conversate("Make prisma schema file please");
if (pointer.value === null)
throw new Error("Unreachable code: Prisma Schema not generated");
return pointer.value;
}
function createApplication<Model extends ILlmSchema.Model>(props: {
model: Model;
build: (next: IMakePrismaSchemaFileProps) => void;
}): IAgenticaController.IClass<Model> {
assertSchemaModel(props.model);
const application: ILlmApplication<Model> = collection[
props.model
] as unknown as ILlmApplication<Model>;
return {
protocol: "class",
name: "Prisma Generator",
application,
execute: {
makePrismaSchemaFile: (next) => {
props.build(next);
},
} satisfies IApplication,
};
}
const claude = typia.llm.application<
IApplication,
"claude",
{ reference: true }
>();
const collection = {
chatgpt: typia.llm.application<
IApplication,
"chatgpt",
{ reference: true }
>(),
claude,
llama: claude,
deepseek: claude,
"3.1": claude,
"3.0": typia.llm.application<IApplication, "3.0">(),
};
interface IApplication {
/**
* Generates comprehensive Prisma schema files based on detailed requirements
* analysis.
*
* Creates multiple organized schema files following enterprise patterns
* including proper domain separation, relationship modeling, snapshot
* patterns, inheritance, materialized views, and comprehensive documentation.
* The generated schemas implement best practices for scalability,
* maintainability, and data integrity.
*
* @param props Properties containing the file
*/
makePrismaSchemaFile(props: IMakePrismaSchemaFileProps): void;
}
interface IMakePrismaSchemaFileProps {
/**
* Complete definition of a single Prisma schema file.
*
* Represents one business domain containing related models, organized for
* modular schema management and following domain-driven design principles.
*/
file: AutoBePrisma.IFile;
}