Files
gh-jezweb-claude-skills-ski…/templates/context-caching.ts
2025-11-30 08:24:51 +08:00

155 lines
4.7 KiB
TypeScript

/**
* Google Gemini API - Context Caching Example
*
* Demonstrates how to create and use context caching to reduce costs by up to 90%
* when using the same large context (documents, videos, system instructions) repeatedly.
*
* Features:
* - Create cache with large document
* - Use cache for multiple queries
* - Update cache TTL
* - List and delete caches
*
* Requirements:
* - @google/genai@1.27.0+
* - GEMINI_API_KEY environment variable
*
* Note: You must use explicit model version suffixes like 'gemini-2.5-flash-001',
* not just 'gemini-2.5-flash' when creating caches.
*/
import { GoogleGenAI } from '@google/genai';
import fs from 'fs';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY! });
async function contextCachingExample() {
console.log('=== Context Caching Example ===\n');
// Example: Large document content
const largeDocument = `
This is a large legal document that will be analyzed multiple times.
Article 1: ...
Article 2: ...
... (imagine thousands of lines of legal text)
`.trim();
// 1. Create a cache with large content
console.log('1. Creating cache...');
const cache = await ai.caches.create({
model: 'gemini-2.5-flash-001', // Must use explicit version suffix!
config: {
displayName: 'legal-doc-cache',
systemInstruction: 'You are an expert legal analyst. Analyze documents and provide clear summaries.',
contents: largeDocument,
ttl: '3600s', // Cache for 1 hour
},
});
console.log(`✓ Cache created: ${cache.name}`);
console.log(` Display name: ${cache.displayName}`);
console.log(` Expires at: ${cache.expireTime}\n`);
// 2. Use cache for multiple queries (saves tokens!)
console.log('2. Using cache for first query...');
const response1 = await ai.models.generateContent({
model: cache.name, // Use cache name as model
contents: 'Summarize the key points of Article 1',
});
console.log(`Response: ${response1.text}\n`);
console.log('3. Using cache for second query...');
const response2 = await ai.models.generateContent({
model: cache.name,
contents: 'What are the legal implications of Article 2?',
});
console.log(`Response: ${response2.text}\n`);
// 3. Update cache TTL to extend lifetime
console.log('4. Extending cache TTL to 2 hours...');
await ai.caches.update({
name: cache.name,
config: {
ttl: '7200s', // Extend to 2 hours
},
});
console.log('✓ Cache TTL updated\n');
// 4. List all caches
console.log('5. Listing all caches...');
const caches = await ai.caches.list();
caches.forEach((c) => {
console.log(` - ${c.displayName}: ${c.name}`);
});
console.log();
// 5. Delete cache when done
console.log('6. Deleting cache...');
await ai.caches.delete({ name: cache.name });
console.log('✓ Cache deleted\n');
console.log('=== Context Caching Complete ===');
}
async function videoCachingExample() {
console.log('\n=== Video Caching Example ===\n');
// Upload a video file
console.log('1. Uploading video file...');
const videoFile = await ai.files.upload({
file: fs.createReadStream('./example-video.mp4'),
});
console.log('2. Waiting for video processing...');
let processedFile = videoFile;
while (processedFile.state.name === 'PROCESSING') {
await new Promise((resolve) => setTimeout(resolve, 2000));
processedFile = await ai.files.get({ name: videoFile.name });
}
console.log(`✓ Video processed: ${processedFile.uri}\n`);
// Create cache with video
console.log('3. Creating cache with video...');
const cache = await ai.caches.create({
model: 'gemini-2.5-flash-001',
config: {
displayName: 'video-analysis-cache',
systemInstruction: 'You are an expert video analyzer.',
contents: [processedFile],
ttl: '300s', // 5 minutes
},
});
console.log(`✓ Cache created: ${cache.name}\n`);
// Use cache for multiple video queries
console.log('4. Query 1: What happens in the first minute?');
const response1 = await ai.models.generateContent({
model: cache.name,
contents: 'What happens in the first minute?',
});
console.log(`Response: ${response1.text}\n`);
console.log('5. Query 2: Describe the main characters');
const response2 = await ai.models.generateContent({
model: cache.name,
contents: 'Describe the main characters',
});
console.log(`Response: ${response2.text}\n`);
// Clean up
await ai.caches.delete({ name: cache.name });
await ai.files.delete({ name: videoFile.name });
console.log('✓ Cache and video file deleted');
console.log('\n=== Video Caching Complete ===');
}
// Run examples
contextCachingExample()
.then(() => videoCachingExample())
.catch((error) => {
console.error('Error:', error.message);
process.exit(1);
});