From 720d7ff4f642f4cf69fe9c44a62c27d73eaf8e40 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:19:53 -0700 Subject: [PATCH 1/9] feat: add ai-samples skeleton with use-case feature folders --- ai/ai-samples/.gitignore | 4 ++++ ai/ai-samples/README.md | 9 +++++++ ai/ai-samples/index.html | 12 ++++++++++ ai/ai-samples/package.json | 24 +++++++++++++++++++ ai/ai-samples/src/App.tsx | 10 ++++++++ ai/ai-samples/src/config/firebase-config.ts | 7 ++++++ ai/ai-samples/src/features/chat/index.tsx | 9 +++++++ ai/ai-samples/src/features/chat/service.ts | 1 + .../src/features/function-calling/index.tsx | 9 +++++++ .../src/features/function-calling/service.ts | 1 + .../src/features/image-generation/index.tsx | 9 +++++++ .../src/features/image-generation/service.ts | 1 + .../src/features/multimodal/index.tsx | 9 +++++++ .../src/features/multimodal/service.ts | 1 + .../src/features/structured-output/index.tsx | 9 +++++++ .../src/features/structured-output/service.ts | 1 + .../src/features/text-generation/index.tsx | 9 +++++++ .../src/features/text-generation/service.ts | 1 + ai/ai-samples/src/index.tsx | 9 +++++++ .../src/services/firebaseAIService.ts | 1 + ai/ai-samples/tsconfig.json | 21 ++++++++++++++++ ai/ai-samples/tsconfig.node.json | 11 +++++++++ ai/ai-samples/vite.config.ts | 6 +++++ 23 files changed, 174 insertions(+) create mode 100644 ai/ai-samples/.gitignore create mode 100644 ai/ai-samples/README.md create mode 100644 ai/ai-samples/index.html create mode 100644 ai/ai-samples/package.json create mode 100644 ai/ai-samples/src/App.tsx create mode 100644 ai/ai-samples/src/config/firebase-config.ts create mode 100644 ai/ai-samples/src/features/chat/index.tsx create mode 100644 ai/ai-samples/src/features/chat/service.ts create mode 100644 ai/ai-samples/src/features/function-calling/index.tsx create mode 100644 ai/ai-samples/src/features/function-calling/service.ts create mode 100644 ai/ai-samples/src/features/image-generation/index.tsx create mode 100644 ai/ai-samples/src/features/image-generation/service.ts create mode 100644 ai/ai-samples/src/features/multimodal/index.tsx create mode 100644 ai/ai-samples/src/features/multimodal/service.ts create mode 100644 ai/ai-samples/src/features/structured-output/index.tsx create mode 100644 ai/ai-samples/src/features/structured-output/service.ts create mode 100644 ai/ai-samples/src/features/text-generation/index.tsx create mode 100644 ai/ai-samples/src/features/text-generation/service.ts create mode 100644 ai/ai-samples/src/index.tsx create mode 100644 ai/ai-samples/src/services/firebaseAIService.ts create mode 100644 ai/ai-samples/tsconfig.json create mode 100644 ai/ai-samples/tsconfig.node.json create mode 100644 ai/ai-samples/vite.config.ts diff --git a/ai/ai-samples/.gitignore b/ai/ai-samples/.gitignore new file mode 100644 index 000000000..b1640b509 --- /dev/null +++ b/ai/ai-samples/.gitignore @@ -0,0 +1,4 @@ +node_modules +dist +.env +.env.local diff --git a/ai/ai-samples/README.md b/ai/ai-samples/README.md new file mode 100644 index 000000000..45616631a --- /dev/null +++ b/ai/ai-samples/README.md @@ -0,0 +1,9 @@ +# Firebase AI Samples + +A modular migration of the Firebase AI logic, demonstrating different capabilities: +- Text Generation +- Chat +- Multimodal +- Structured Output +- Function Calling +- Image Generation diff --git a/ai/ai-samples/index.html b/ai/ai-samples/index.html new file mode 100644 index 000000000..5fb598fb6 --- /dev/null +++ b/ai/ai-samples/index.html @@ -0,0 +1,12 @@ + + + + + + Firebase AI Samples + + +
+ + + diff --git a/ai/ai-samples/package.json b/ai/ai-samples/package.json new file mode 100644 index 000000000..9cc5eaebd --- /dev/null +++ b/ai/ai-samples/package.json @@ -0,0 +1,24 @@ +{ + "name": "ai-samples", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "firebase": "^12.2.1", + "react": "^19.2.1", + "react-dom": "^19.2.1" + }, + "devDependencies": { + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "~5.7.2", + "vite": "^6.3.1" + } +} diff --git a/ai/ai-samples/src/App.tsx b/ai/ai-samples/src/App.tsx new file mode 100644 index 000000000..c9b04bf56 --- /dev/null +++ b/ai/ai-samples/src/App.tsx @@ -0,0 +1,10 @@ +import React from 'react' + +export default function App() { + return ( +
+

Firebase AI Samples

+

Modular Firebase AI capabilities.

+
+ ) +} diff --git a/ai/ai-samples/src/config/firebase-config.ts b/ai/ai-samples/src/config/firebase-config.ts new file mode 100644 index 000000000..9fe146085 --- /dev/null +++ b/ai/ai-samples/src/config/firebase-config.ts @@ -0,0 +1,7 @@ +// import { initializeApp } from "firebase/app"; + +// export const firebaseConfig = { +// // add your config here +// }; + +// export const app = initializeApp(firebaseConfig); diff --git a/ai/ai-samples/src/features/chat/index.tsx b/ai/ai-samples/src/features/chat/index.tsx new file mode 100644 index 000000000..f41a77cab --- /dev/null +++ b/ai/ai-samples/src/features/chat/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

chat

+
+ ); +} diff --git a/ai/ai-samples/src/features/chat/service.ts b/ai/ai-samples/src/features/chat/service.ts new file mode 100644 index 000000000..c942f90c9 --- /dev/null +++ b/ai/ai-samples/src/features/chat/service.ts @@ -0,0 +1 @@ +// Service for chat diff --git a/ai/ai-samples/src/features/function-calling/index.tsx b/ai/ai-samples/src/features/function-calling/index.tsx new file mode 100644 index 000000000..10f0ac7ec --- /dev/null +++ b/ai/ai-samples/src/features/function-calling/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

function-calling

+
+ ); +} diff --git a/ai/ai-samples/src/features/function-calling/service.ts b/ai/ai-samples/src/features/function-calling/service.ts new file mode 100644 index 000000000..1d926001b --- /dev/null +++ b/ai/ai-samples/src/features/function-calling/service.ts @@ -0,0 +1 @@ +// Service for function-calling diff --git a/ai/ai-samples/src/features/image-generation/index.tsx b/ai/ai-samples/src/features/image-generation/index.tsx new file mode 100644 index 000000000..026aea372 --- /dev/null +++ b/ai/ai-samples/src/features/image-generation/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

image-generation

+
+ ); +} diff --git a/ai/ai-samples/src/features/image-generation/service.ts b/ai/ai-samples/src/features/image-generation/service.ts new file mode 100644 index 000000000..4bddbe4a5 --- /dev/null +++ b/ai/ai-samples/src/features/image-generation/service.ts @@ -0,0 +1 @@ +// Service for image-generation diff --git a/ai/ai-samples/src/features/multimodal/index.tsx b/ai/ai-samples/src/features/multimodal/index.tsx new file mode 100644 index 000000000..a18674ff4 --- /dev/null +++ b/ai/ai-samples/src/features/multimodal/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

multimodal

+
+ ); +} diff --git a/ai/ai-samples/src/features/multimodal/service.ts b/ai/ai-samples/src/features/multimodal/service.ts new file mode 100644 index 000000000..53742af07 --- /dev/null +++ b/ai/ai-samples/src/features/multimodal/service.ts @@ -0,0 +1 @@ +// Service for multimodal diff --git a/ai/ai-samples/src/features/structured-output/index.tsx b/ai/ai-samples/src/features/structured-output/index.tsx new file mode 100644 index 000000000..7542981dc --- /dev/null +++ b/ai/ai-samples/src/features/structured-output/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

structured-output

+
+ ); +} diff --git a/ai/ai-samples/src/features/structured-output/service.ts b/ai/ai-samples/src/features/structured-output/service.ts new file mode 100644 index 000000000..36d040709 --- /dev/null +++ b/ai/ai-samples/src/features/structured-output/service.ts @@ -0,0 +1 @@ +// Service for structured-output diff --git a/ai/ai-samples/src/features/text-generation/index.tsx b/ai/ai-samples/src/features/text-generation/index.tsx new file mode 100644 index 000000000..34ab0187c --- /dev/null +++ b/ai/ai-samples/src/features/text-generation/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; + +export default function Feature() { + return ( +
+

text-generation

+
+ ); +} diff --git a/ai/ai-samples/src/features/text-generation/service.ts b/ai/ai-samples/src/features/text-generation/service.ts new file mode 100644 index 000000000..2f10c4fbc --- /dev/null +++ b/ai/ai-samples/src/features/text-generation/service.ts @@ -0,0 +1 @@ +// Service for text-generation diff --git a/ai/ai-samples/src/index.tsx b/ai/ai-samples/src/index.tsx new file mode 100644 index 000000000..39ef887d8 --- /dev/null +++ b/ai/ai-samples/src/index.tsx @@ -0,0 +1,9 @@ +import React, { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/ai/ai-samples/src/services/firebaseAIService.ts b/ai/ai-samples/src/services/firebaseAIService.ts new file mode 100644 index 000000000..03e01e3f9 --- /dev/null +++ b/ai/ai-samples/src/services/firebaseAIService.ts @@ -0,0 +1 @@ +// Core Firebase AI service setup diff --git a/ai/ai-samples/tsconfig.json b/ai/ai-samples/tsconfig.json new file mode 100644 index 000000000..3934b8f6d --- /dev/null +++ b/ai/ai-samples/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/ai/ai-samples/tsconfig.node.json b/ai/ai-samples/tsconfig.node.json new file mode 100644 index 000000000..97ede7ee6 --- /dev/null +++ b/ai/ai-samples/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/ai/ai-samples/vite.config.ts b/ai/ai-samples/vite.config.ts new file mode 100644 index 000000000..9ffcc6757 --- /dev/null +++ b/ai/ai-samples/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], +}) From 12828e6694c33a15539451dd3a55f8c07d48a204 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:23:44 -0700 Subject: [PATCH 2/9] Update ai/ai-samples/src/features/text-generation/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/text-generation/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/text-generation/index.tsx b/ai/ai-samples/src/features/text-generation/index.tsx index 34ab0187c..d39fed68b 100644 --- a/ai/ai-samples/src/features/text-generation/index.tsx +++ b/ai/ai-samples/src/features/text-generation/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function TextGenerationFeature() { return (

text-generation

From 2f73f0f621a7cb03d12a140fd79f101e23730bb6 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:23:53 -0700 Subject: [PATCH 3/9] Update ai/ai-samples/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/package.json b/ai/ai-samples/package.json index 9cc5eaebd..3916adef0 100644 --- a/ai/ai-samples/package.json +++ b/ai/ai-samples/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "firebase": "^12.2.1", + "firebase": "12.2.1", "react": "^19.2.1", "react-dom": "^19.2.1" }, From a41e2bec21d04c97de13c1d357064062271bc2f8 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:03 -0700 Subject: [PATCH 4/9] Update ai/ai-samples/src/config/firebase-config.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/config/firebase-config.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ai/ai-samples/src/config/firebase-config.ts b/ai/ai-samples/src/config/firebase-config.ts index 9fe146085..c53528053 100644 --- a/ai/ai-samples/src/config/firebase-config.ts +++ b/ai/ai-samples/src/config/firebase-config.ts @@ -1,7 +1,12 @@ -// import { initializeApp } from "firebase/app"; +import { initializeApp } from "firebase/app"; -// export const firebaseConfig = { -// // add your config here -// }; +export const firebaseConfig = { + apiKey: "YOUR_API_KEY", + authDomain: "YOUR_AUTH_DOMAIN", + projectId: "YOUR_PROJECT_ID", + storageBucket: "YOUR_STORAGE_BUCKET", + messagingSenderId: "YOUR_MESSAGING_SENDER_ID", + appId: "YOUR_APP_ID", +}; -// export const app = initializeApp(firebaseConfig); +export const app = initializeApp(firebaseConfig); From d6b70f7fc8d895ff02c3e2147d165931b806f24d Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:15 -0700 Subject: [PATCH 5/9] Update ai/ai-samples/src/features/chat/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/chat/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/chat/index.tsx b/ai/ai-samples/src/features/chat/index.tsx index f41a77cab..5110ba1aa 100644 --- a/ai/ai-samples/src/features/chat/index.tsx +++ b/ai/ai-samples/src/features/chat/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function ChatFeature() { return (

chat

From 3345115f769c2d0c07eb61e9cc4f8f546b5cd586 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:22 -0700 Subject: [PATCH 6/9] Update ai/ai-samples/src/features/function-calling/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/function-calling/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/function-calling/index.tsx b/ai/ai-samples/src/features/function-calling/index.tsx index 10f0ac7ec..06eafd36a 100644 --- a/ai/ai-samples/src/features/function-calling/index.tsx +++ b/ai/ai-samples/src/features/function-calling/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function FunctionCallingFeature() { return (

function-calling

From ce9cc5e42c717498e8da5d41131d7f51a20fa054 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:28 -0700 Subject: [PATCH 7/9] Update ai/ai-samples/src/features/image-generation/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/image-generation/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/image-generation/index.tsx b/ai/ai-samples/src/features/image-generation/index.tsx index 026aea372..cecd9009e 100644 --- a/ai/ai-samples/src/features/image-generation/index.tsx +++ b/ai/ai-samples/src/features/image-generation/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function ImageGenerationFeature() { return (

image-generation

From 318f547aac951ab388d80119c665bbee550c8902 Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:35 -0700 Subject: [PATCH 8/9] Update ai/ai-samples/src/features/multimodal/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/multimodal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/multimodal/index.tsx b/ai/ai-samples/src/features/multimodal/index.tsx index a18674ff4..b155221a6 100644 --- a/ai/ai-samples/src/features/multimodal/index.tsx +++ b/ai/ai-samples/src/features/multimodal/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function MultimodalFeature() { return (

multimodal

From 23b781399fea52bec7b625a5052ae6959e59814f Mon Sep 17 00:00:00 2001 From: sedanah-m Date: Mon, 15 Jun 2026 15:24:41 -0700 Subject: [PATCH 9/9] Update ai/ai-samples/src/features/structured-output/index.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- ai/ai-samples/src/features/structured-output/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/ai-samples/src/features/structured-output/index.tsx b/ai/ai-samples/src/features/structured-output/index.tsx index 7542981dc..580c508c0 100644 --- a/ai/ai-samples/src/features/structured-output/index.tsx +++ b/ai/ai-samples/src/features/structured-output/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export default function Feature() { +export default function StructuredOutputFeature() { return (

structured-output