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..3916adef0
--- /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..c53528053
--- /dev/null
+++ b/ai/ai-samples/src/config/firebase-config.ts
@@ -0,0 +1,12 @@
+import { initializeApp } from "firebase/app";
+
+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);
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..5110ba1aa
--- /dev/null
+++ b/ai/ai-samples/src/features/chat/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function ChatFeature() {
+ 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..06eafd36a
--- /dev/null
+++ b/ai/ai-samples/src/features/function-calling/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function FunctionCallingFeature() {
+ 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..cecd9009e
--- /dev/null
+++ b/ai/ai-samples/src/features/image-generation/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function ImageGenerationFeature() {
+ 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..b155221a6
--- /dev/null
+++ b/ai/ai-samples/src/features/multimodal/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function MultimodalFeature() {
+ 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..580c508c0
--- /dev/null
+++ b/ai/ai-samples/src/features/structured-output/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function StructuredOutputFeature() {
+ 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..d39fed68b
--- /dev/null
+++ b/ai/ai-samples/src/features/text-generation/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+export default function TextGenerationFeature() {
+ 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()],
+})