UNPKG

@autobe/agent

Version:

AI backend server code generator

182 lines (172 loc) 5.14 kB
import { AgenticaAssistantMessageHistory, IAgenticaController, MicroAgentica, MicroAgenticaHistory, } from "@agentica/core"; import { AutoBeAssistantMessageHistory, AutoBePrisma } from "@autobe/interface"; import { AutoBePrismaComponentsEvent } from "@autobe/interface/src/events/AutoBePrismaComponentsEvent"; import { ILlmApplication, ILlmSchema } from "@samchon/openapi"; import { IPointer } from "tstl"; import typia from "typia"; import { v4 } from "uuid"; import { AutoBeContext } from "../../context/AutoBeContext"; import { assertSchemaModel } from "../../context/assertSchemaModel"; import { transformPrismaComponentsHistories } from "./transformPrismaComponentsHistories"; export async function orchestratePrismaComponents< Model extends ILlmSchema.Model, >( ctx: AutoBeContext<Model>, content: string = "Please extract files and tables from the given documents.", ): Promise<AutoBeAssistantMessageHistory | AutoBePrismaComponentsEvent> { const start: Date = new Date(); const pointer: IPointer<IExtractComponentsProps | null> = { value: null, }; const prefix: string | null = ctx.state().analyze?.prefix ?? null; const agentica: MicroAgentica<Model> = new MicroAgentica({ model: ctx.model, vendor: ctx.vendor, config: { ...(ctx.config ?? {}), executor: { describe: null, }, }, histories: transformPrismaComponentsHistories(ctx.state(), prefix), controllers: [ createApplication({ model: ctx.model, build: (next) => { pointer.value ??= { components: [], }; pointer.value.components.push(...next.components); }, }), ], }); const histories: MicroAgenticaHistory<Model>[] = await agentica .conversate(content) .finally(() => { const tokenUsage = agentica.getTokenUsage(); ctx.usage().record(tokenUsage, ["prisma"]); }); if (histories.at(-1)?.type === "assistantMessage") return { ...(histories.at(-1)! as AgenticaAssistantMessageHistory), created_at: start.toISOString(), completed_at: new Date().toISOString(), id: v4(), } satisfies AutoBeAssistantMessageHistory; else if (pointer.value === null) { throw new Error("Failed to extract files and tables."); // unreachable } return { type: "prismaComponents", created_at: start.toISOString(), components: pointer.value.components, step: ctx.state().analyze?.step ?? 0, }; } function createApplication<Model extends ILlmSchema.Model>(props: { model: Model; build: (next: IExtractComponentsProps) => void; }): IAgenticaController.IClass<Model> { assertSchemaModel(props.model); const application: ILlmApplication<Model> = collection[ props.model ] as unknown as ILlmApplication<Model>; return { protocol: "class", name: "Prisma Extract Files and Tables", application, execute: { extractComponents: (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, }; interface IApplication { /** * Extracts and organizes database schema files with their corresponding table * definitions. * * Processes Prisma schema files and maps each file to its contained database * tables, enabling structured organization of schemas across multiple files * for large projects. * * @example * ```typescript * application.extractFilesAndTables({ * components: [ * { * filename: "schema-01-users.prisma", * tables: ["user", "user_profile"] * }, * { * filename: "schema-02-articles.prisma", * tables: ["article", "attachment_file"] * } * ] * }); * ```; * * @param props - Configuration object containing the file-to-table mapping * structure */ extractComponents(props: IExtractComponentsProps): void; } interface IExtractComponentsProps { /** * Maps Prisma schema filenames to their contained database tables. * * **Structure:** * * - Key: Prisma schema filename with .prisma extension * - Value: Array of table names defined in that file * * **Example:** * * ```typescript * { * { * filename: "schema-01-users.prisma", * tables: ["user", "admin", "moderator", "user_profile", "user_settings"] * }, * { * filename: "schema-02-articles.prisma", * tables: ["article", "article_snapshot"] * }, * { * filename: "schema-03-comments.prisma", * tables: ["comment", "comment_like"] * } * } * ``` * * **Notes:** * * - Table names must match exact Prisma model names (case-sensitive) * - Keep mapping synchronized with actual schema files * - Use consistent naming convention for files */ components: AutoBePrisma.IComponent[]; }