xiaohongshu
xiaohongshu
firebase-ai-logic
Guide for integrating Gemini AI models with Firebase using Firebase AI Logic SDK. This skill should be used when implementing Gemini features (chat, content generation, structured JSON output), configuring security (App Check), or troubleshooting issues (rate limits, schema errors).
Full skill instructions
Firebase AI Logic enables secure, client-side integration with Google's Gemini AI models through Firebase SDKs. This skill provides production-ready patterns for implementing AI features including chat, structured output (JSON), streaming responses, cost optimization, and security best practices. Renamed from "Vertex AI in Firebase" in May 2025.
This skill should be used when working with:
import { initializeApp } from 'firebase/app';
import { getAI, getGenerativeModel } from 'firebase/ai';
const app = initializeApp({
apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
// ... other config
});
const ai = getAI(app);
const model = getGenerativeModel(ai, {
model: 'gemini-2.5-flash-lite',
});
Enable App Check to prevent API abuse:
import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
const appCheck = initializeAppCheck(app, {
provider: new ReCaptchaV3Provider('YOUR_RECAPTCHA_SITE_KEY'),
isTokenAutoRefreshEnabled: true,
});
Why App Check is critical:
Platform-Specific Configuration:
Web:
import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
const appCheck = initializeAppCheck(app, {
provider: new ReCaptchaV3Provider('YOUR_RECAPTCHA_SITE_KEY'),
isTokenAutoRefreshEnabled: true,
});
Flutter (requires explicit App Check passing):
// Flutter requires passing App Check during AI initialization
final appCheck = FirebaseAppCheck.instance;
await appCheck.activate();
Development Mode:
if (process.env.NODE_ENV === 'development') {
(window as any).FIREBASE_APPCHECK_DEBUG_TOKEN = true;
}
// Add debug token from console to Firebase Console → App Check → Debug tokens
API Key Security Rules:
Generate consistent JSON for Firestore/database storage:
import { Schema } from 'firebase/ai';
const reviewAnalysisSchema = Schema.object({
properties: {
sentiment: Schema.string(),
rating: Schema.number(),
categories: Schema.array({ items: Schema.string() }),
summary: Schema.string(),
},
optionalProperties: ["summary"],
});
const model = getGenerativeModel(ai, {
model: 'gemini-2.5-flash-lite',
generationConfig: {
responseMimeType: 'application/json',
responseSchema: reviewAnalysisSchema,
},
});
const result = await model.generateContent('Great product! Fast shipping.');
const analysis = JSON.parse(result.response.text());
await setDoc(doc(db, 'reviews', id), analysis);
Schema Constraints (CRITICAL):
AVOID these (cause InvalidArgument errors):
["string", "null"]if, then, allOf, oneOf, notminLength, pattern, maxLength$ref referencesUSE only:
string, number, boolean, array, objectoptionalProperties array for optional fieldsFor complex validation, combine simple schema with Zod:
import { z } from 'zod';
// Simple schema for Gemini
const simpleSchema = Schema.object({
properties: {
categories: Schema.array({ items: Schema.string() }),
summary: Schema.string(),
}
});
// Detailed validation with Zod
const Validator = z.object({
categories: z.array(z.enum(['tech', 'business', 'sports', 'other'])),
summary: z.string().min(20).max(200),
});
const result = await model.generateContent(prompt);
const raw = JSON.parse(result.response.text());
const validated = Validator.parse(raw); // Throws if invalid
const chat = model.startChat({
history: [
{ role: 'user', parts: [{ text: 'Hi!' }] },
{ role: 'model', parts: [{ text: 'Hello! How can I help?' }] },
],
});
const result = await chat.sendMessage('How are you?');
console.log(result.response.text());
Cost optimization - limit history:
// ✅ GOOD: Keep recent context only
const chat = model.startChat({
history: recentMessages.slice(-20) // Last 20 messages
});
const result = await chat.sendMessageStream('Write a long response...');
for await (const chunk of result.stream) {
console.log(chunk.text()); // Display in real-time UI
}
const finalResponse = await result.response;
When to use streaming:
Define model behavior before any user prompts:
const model = getGenerativeModel(ai, {
model: 'gemini-2.5-flash-lite',
systemInstruction: `You are a customer support assistant.
Be helpful, patient, and professional.
Escalate complex issues to human agents.`,
});
Best practices:
Handle 429 (Rate Limit Exceeded) with exponential backoff:
async function retryWithBackoff<T>(
fn: () => Promise<T>,
maxRetries = 3
): Promise<T> {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error: any) {
if (error.code === 429 && i < maxRetries - 1) {
const delay = Math.pow(2, i) * 1000 + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
throw new Error('Max retries exceeded');
}
const result = await retryWithBackoff(() => model.generateContent(prompt));
// countTokens is a METHOD on the model, not a standalone function
const response = await model.countTokens(prompt);
const totalTokens = response.totalTokens;
console.log(`Estimated: ${totalTokens} tokens`);
if (totalTokens > 10000) {
console.warn('High token usage - consider shortening prompt');
}
// Alternative: count tokens for structured request
const response2 = await model.countTokens({
contents: [{ role: 'user', parts: [{ text: prompt }] }],
});
// ❌ BAD: Verbose
const badPrompt = `I would like you to carefully analyze...
Please provide detailed analysis... "${text}"`;
// ✅ GOOD: Concise
const goodPrompt = `Analyze sentiment:\n"${text}"`;
// ✅ GOOD: Process multiple items in one request
const prompt = `Classify these articles:
1. "${article1}"
2. "${article2}"
3. "${article3}"
Return JSON array.`;
Gemini 2.5 Flash Lite is a reasoning model with configurable thinking budget:
const model = getGenerativeModel(ai, {
model: 'gemini-2.5-flash-lite',
generationConfig: {
thinkingBudget: 'low', // 'low', 'medium', 'high', or off (default)
},
});
Thinking Budget Guidelines:
Natural voice conversations with real-time interruption support:
Features:
Supported Platforms:
Official Firebase AI Logic SDK for Unity:
Use Cases:
Status: Preview (2025)
Security:
Performance:
gemini-2.5-flash-liteCost:
Quality:
Location Configuration:
gemini-2.5-flash-lite is the recommended model for this project:
Specifications:
Pricing (2025):
FREE Tier Limits (2025):
Ideal for:
Retired Models (NEVER USE): All Gemini 1.0 and 1.5 models return 404 errors:
MUST migrate to:
Image analysis capabilities including OCR, object detection, captions, and categorization. Supports PNG, JPEG, WebP formats.
Load when needed:
Read features/vision-multimodal.md for image analysis implementation
Comprehensive guide for enforcing deterministic JSON/enums with responseSchema. Highlights schema patterns, optional vs. required fields, and limitations such as the incompatibility with generateContentStream when responseMimeType is application/json.
Load when needed:
Read features/structured-output.md for schema design, validation tips, and fallback strategies
Enable Gemini to call external APIs, Cloud Functions, and tools. Implement dynamic integrations with real-time data sources.
Load when needed:
Read features/function-calling.md for tool use and API integration
Connect Gemini to real-time Google Search for up-to-date information, fact-checking, and source attribution.
Load when needed:
Read features/grounding.md for Google Search grounding implementation
Let Gemini generate and execute Python code iteratively for mathematical calculations, data analysis, and visualizations.
Load when needed:
Read features/code-execution.md for Python code execution
Generate and edit images using Imagen models. Text-to-image, inpainting, outpainting, and style customization.
Load when needed:
Read features/imagen.md for image generation and editing
Process video, audio, and PDF content. Video analysis, audio transcription, and document understanding.
Load when needed:
Read features/video-audio.md for multimodal content processing
Automatic fallback between on-device Gemini Nano and cloud models for privacy, offline capability, and cost savings.
Load when needed:
Read features/hybrid-inference.md for on-device inference
Real-time voice conversations with bidirectional streaming, natural speech, and interruption support.
Load when needed:
Read features/gemini-live.md for voice conversation implementation
Handle large files (videos, PDFs, audio) via Cloud Storage URLs for Vertex AI Gemini API.
Load when needed:
Read features/file-upload.md for large file handling
Complete production-ready code examples:
Load when needed:
Read references/examples.md for complete implementation examples
Solutions for common issues:
Load when needed:
Read references/troubleshooting.md for error solutions
Common mistakes to avoid:
location: 'global')Load when needed:
Read references/anti-patterns.md for common mistakes and solutions
Key Imports:
import { getAI, getGenerativeModel, Schema } from 'firebase/ai';
import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
// Note: countTokens is a METHOD on the model instance, not an exported function
// Usage: await model.countTokens(prompt)
Official Documentation:
xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience