From 3d02e5fc254d7b7407803efe463a3cf19db215ca Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 6 Jul 2026 08:03:31 +0530 Subject: [PATCH] feat: Port `ILLMProvider` interface and langchain gemini adapter --- packages/llm/src/index.ts | 2 +- packages/llm/src/llm.ts | 22 ++++++++++++++++++ packages/llm/src/providers/google-genai.ts | 26 ++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/llm/src/llm.ts create mode 100644 packages/llm/src/providers/google-genai.ts diff --git a/packages/llm/src/index.ts b/packages/llm/src/index.ts index cb0ff5c..9d92d6d 100644 --- a/packages/llm/src/index.ts +++ b/packages/llm/src/index.ts @@ -1 +1 @@ -export {}; +export * from "./llm.js"; diff --git a/packages/llm/src/llm.ts b/packages/llm/src/llm.ts new file mode 100644 index 0000000..93053ec --- /dev/null +++ b/packages/llm/src/llm.ts @@ -0,0 +1,22 @@ +import { z } from "zod"; + +export interface LLMRequest { + systemPrompt: string; + userContext: string; + schema: T; // The Zod schema + temperature?: number; +} + +export interface LLMResponse { + success: boolean; + data?: T; + error?: string; +} + +export interface ILLMProvider { + providerName: string; + // We use Zod to ensure the generic T matches the schema + generateStructuredResponse( + request: LLMRequest, + ): Promise>>; +} diff --git a/packages/llm/src/providers/google-genai.ts b/packages/llm/src/providers/google-genai.ts new file mode 100644 index 0000000..8a82a2f --- /dev/null +++ b/packages/llm/src/providers/google-genai.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; +import { ChatGoogleGenerativeAI } from "@langchain/google-genai"; +import { ILLMProvider, LLMRequest, LLMResponse } from "../llm.js"; + +export class GeminiProvider implements ILLMProvider { + providerName = "Gemini"; + private model: ChatGoogleGenerativeAI; + + constructor(apiKey: string) { + this.model = new ChatGoogleGenerativeAI({ + apiKey, + model: "gemini-3-flash", + }); + } + + async generateStructuredResponse( + request: LLMRequest, + ): Promise>> { + const structuredModel = this.model.withStructuredOutput(request.schema); + const result = await structuredModel.invoke([ + { role: "system", content: request.systemPrompt }, + { role: "user", content: request.userContext }, + ]); + return { success: true, data: result as z.infer }; + } +}