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()], +})