Создание приложений для продакшена на Gemini 3 Flash: Полное руководство разработчика (2025)
Декабрь 2025
Google только что запустила Gemini 3 Flash, и это уже меняет подход разработчиков к созданию приложений на базе ИИ. Благодаря производительности уровня Pro при скорости в 3 раза выше и стоимости на 80% ниже, эта модель становится новым стандартом для рабочих нагрузок в продакшене.
Но «быстро и дешево» не означает автоматически «готово к продакшену». Есть большая разница между запуском модели в ноутбуке и созданием масштабируемого надежного приложения, обслуживающего миллионы пользователей.
В этом руководстве рассматривается все, что вам нужно знать для создания приложений на Gemini 3 Flash: паттерны архитектуры, оптимизация затрат, настройка производительности, обработка ошибок и стратегии миграции.
Почему Gemini 3 Flash меняет правила игры
Прежде чем мы перейдем к реализации, давайте разберемся, чем Gemini 3 Flash отличается от предыдущих «быстрых» моделей.
Эволюция быстрых моделей
| Модель | Релиз | Скорость | Качество | Стоимость/1 млн токенов | Готов к продакшену? |
|---|---|---|---|---|---|
| GPT-4 Turbo | 2024 | Хорошая | Отличное | $10-$30 | ✅ Да |
| GPT-5.2 | 2025 | Хорошая | Отличное | $2.50-$7.50 | ✅ Да |
| Claude 4.5 Haiku | 2025 | Быстрая | Хорошее | $0.25-$0.80 | ✅ Да |
| Gemini 2.5 Flash | 2025 Q1 | Быстрая | Хорошее | $0.075-$0.30 | ✅ Да |
| Gemini 3 Flash | 2025 Q4 | В 3 раза быстрее | Уровень Pro | $0.05-$0.15 | ✅ Да |
Прорыв: Gemini 3 Flash — это первая «быстрая» модель, которая не приносит в жертву качество. Предыдущие быстрые модели требовали компромиссов. Gemini 3 Flash дает вам логические способности уровня Pro при скорости и стоимости уровня Flash.
Реальное влияние
До Gemini 3 Flash:
- Быстрые модели (Claude 4.5 Haiku, Gemini 2.5 Flash) → хорошо, но не уровень Pro.
- Модели Pro (GPT-5.2, Gemini 3 Pro) → медленно, дорого, ограниченное масштабирование.
После Gemini 3 Flash:
- Одна модель справляется как с критичными к скорости, так и с критичными к качеству нагрузками.
- Снижение затрат на 80% по сравнению с GPT-5.2 → в 5 раз больше запросов при том же бюджете.
- В 3 раза быстрее, чем Gemini 2.5 Flash → приложения реального времени теперь осуществимы.
Связанное: Ознакомьтесь с нашим анализом Orionmist и Lithiumflow, чтобы узнать о технической эволюции Gemini 3.
Паттерны архитектуры для продакшена
Паттерн 1: Стриминг для UX в реальном времени
Кейс: Интерфейсы чатов, живые ассистенты по письму, клиентская поддержка.
Почему стриминг важен:
- Пользователи видят ответы мгновенно (воспринимаемая задержка ↓ на 80%).
- Обработка длинных ответов без ошибок по таймауту.
- Лучший UX при медленных соединениях.
Реализация:
// Next.js API Route with Streaming
import { GoogleGenerativeAI } from '@google/generative-ai';
export const config = {
runtime: 'edge', // Deploy to Edge for low latency
};
export default async function handler(req) {
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
const model = genAI.getGenerativeModel({
model: "gemini-3-flash",
generationConfig: {
temperature: 0.7,
maxOutputTokens: 2048,
}
});
const { prompt } = await req.json();
// Create streaming response
const result = await model.generateContentStream(prompt);
const encoder = new TextEncoder();
const stream = new ReadableStream({
async start(controller) {
for await (const chunk of result.stream) {
const text = chunk.text();
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ text })}\n\n`));
}
controller.close();
},
});
return new Response(stream, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
},
});
}
Фронтенд (React):
'use client';
import { useState } from 'react';
export default function StreamingChat() {
const [response, setResponse] = useState('');
const [loading, setLoading] = useState(false);
const handleSubmit = async (prompt) => {
setLoading(true);
setResponse('');
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt }),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
setResponse(prev => prev + data.text);
}
}
}
setLoading(false);
};
return (
<div className="chat-interface">
{/* Your chat UI */}
<div className="response">{response}</div>
</div>
);
}
Производительность:
- Задержка первого токена: ~200-300 мс.
- Скорость стриминга: ~50-80 токенов/секунду.
- Общая стоимость: $0.05 за 1 млн входных токенов.
Рекомендация: Используйте наш Генератор архитектуры приложений для проектирования вашей инфраструктуры стриминга.
Паттерн 2: Пакетная обработка для оптимизации затрат
Кейс: Генерация контента, анализ данных, фоновые задачи.
Почему пакетная обработка (batching) работает:
- Амортизация накладных расходов API по нескольким запросам.
- Максимизация пропускной способности в непиковые часы.
- Снижение стоимости на ~40% при пакетных запросах.
Реализация:
// Batch processor with queue and retry logic
import { GoogleGenerativeAI } from '@google/generative-ai';
import pQueue from 'p-queue';
class GeminiBatchProcessor {
constructor() {
this.genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
this.model = this.genAI.getGenerativeModel({ model: "gemini-3-flash" });
// Concurrency control: max 10 parallel requests
this.queue = new pQueue({ concurrency: 10 });
// Retry config
this.maxRetries = 3;
this.retryDelay = 1000; // 1 second
}
async processItem(item, retries = 0) {
try {
const result = await this.model.generateContent(item.prompt);
return {
id: item.id,
response: result.response.text(),
status: 'success',
};
} catch (error) {
if (retries < this.maxRetries) {
await new Promise(r => setTimeout(r, this.retryDelay * (retries + 1)));
return this.processItem(item, retries + 1);
}
return {
id: item.id,
error: error.message,
status: 'failed',
};
}
}
async processBatch(items) {
const tasks = items.map(item =>
this.queue.add(() => this.processItem(item))
);
const results = await Promise.all(tasks);
const stats = {
total: results.length,
succeeded: results.filter(r => r.status === 'success').length,
failed: results.filter(r => r.status === 'failed').length,
};
return { results, stats };
}
}
// Usage
const processor = new GeminiBatchProcessor();
const items = [
{ id: 1, prompt: "Summarize: [article 1]" },
{ id: 2, prompt: "Summarize: [article 2]" },
// ... 1000 more items
];
const { results, stats } = await processor.processBatch(items);
console.log(`Processed ${stats.succeeded}/${stats.total} successfully`);
Экономия затрат:
- Пакетная обработка 1000 запросов: ~$0.50 (против $0.85 при последовательной).
- Пропускная способность: 500-800 запросов/минуту.
- Расходы на повторные попытки: <5%.
Рекомендация: Используйте наш Оценщик сроков разработки для планирования графика пакетной обработки.
Паттерн 3: Гибридная маршрутизация (Fast + Pro)
Кейс: Приложения, которым важны и скорость, и качество.
Стратегия: Направляйте простые запросы на Gemini 3 Flash, а сложные — на Gemini 3 Pro.
Реализация:
// Intelligent routing based on complexity
class HybridGeminiRouter {
constructor() {
this.genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
this.flash = this.genAI.getGenerativeModel({ model: "gemini-3-flash" });
this.pro = this.genAI.getGenerativeModel({ model: "gemini-3-pro" });
}
analyzeComplexity(prompt) {
const signals = {
length: prompt.length > 1000,
reasoning: /analyze|compare|evaluate|explain why/i.test(prompt),
multiStep: /first.*then.*finally/i.test(prompt),
code: /```|function|class|def /i.test(prompt),
math: /calculate|solve|prove|∫|∑/i.test(prompt),
};
const score = Object.values(signals).filter(Boolean).length;
return score >= 3 ? 'pro' : 'flash';
}
async generate(prompt, forceModel = null) {
const model = forceModel || this.analyzeComplexity(prompt);
const selectedModel = model === 'pro' ? this.pro : this.flash;
console.log(`Routing to: ${model.toUpperCase()}`);
const startTime = Date.now();
const result = await selectedModel.generateContent(prompt);
const latency = Date.now() - startTime;
return {
text: result.response.text(),
model,
latency,
cost: this.estimateCost(prompt, result.response.text(), model),
};
}
estimateCost(input, output, model) {
const inputTokens = input.length / 4; // rough estimate
const outputTokens = output.length / 4;
const rates = {
flash: { input: 0.05, output: 0.15 },
pro: { input: 1.25, output: 5.00 },
};
const rate = rates[model];
return ((inputTokens * rate.input) + (outputTokens * rate.output)) / 1_000_000;
}
}
// Usage
const router = new HybridGeminiRouter();
// Simple query → routed to Flash
await router.generate("What's the weather today?");
// → Routing to: FLASH (latency: 280ms, cost: $0.000015)
// Complex query → routed to Pro
await router.generate("Analyze the macroeconomic impacts of AI on labor markets");
// → Routing to: PRO (latency: 1200ms, cost: $0.000340)
Оптимизация затрат:
- 80% запросов → Flash ($0.05/1 млн)
- 20% запросов → Pro ($1.25/1 млн)
- Средняя стоимость: $0.29/1 млн (против $1.25, если использовать только Pro)
Связанное: Посмотрите наш Калькулятор стоимости SaaS, чтобы смоделировать ваши затраты на API.
Настройка производительности
1. Оптимизация задержки (Latency)
Развертывание на Edge:
// Vercel Edge Function
export const config = { runtime: 'edge' };
// Cloudflare Workers
export default {
async fetch(request, env) {
// Your Gemini API call
}
}
Сравнение задержек:
- Традиционный сервер (us-east-1): ~500-800 мс.
- Edge-функция (глобально): ~200-400 мс.
- Улучшение: на 50-60% быстрее.
2. Стратегия кэширования
// Redis caching layer
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
async function cachedGenerate(prompt, ttl = 3600) {
const cacheKey = `gemini:${hashPrompt(prompt)}`;
// Check cache
const cached = await redis.get(cacheKey);
if (cached) {
return JSON.parse(cached);
}
// Generate
const result = await model.generateContent(prompt);
const response = result.response.text();
// Cache result
await redis.setex(cacheKey, ttl, JSON.stringify({ response }));
return { response, cached: false };
}
function hashPrompt(prompt) {
// Use a fast hash (e.g., xxhash)
return require('xxhash').hash64(Buffer.from(prompt), 0).toString(16);
}
Влияние Cache Hit Rate:
- 30% попаданий в кэш → снижение затрат на 30%.
- 50% попаданий в кэш → снижение затрат на 50%.
- Задержка: ~10 мс (Redis) против ~300 мс (API).
3. Оптимизация промптов
Плохой промпт (многословный):
Please analyze the following customer support conversation and provide
a detailed summary of the main issues discussed, the sentiment of the
customer, any action items that were mentioned, and your recommendation
for next steps. Here is the conversation: [2000 words]
Хороший промпт (краткий):
Analyze this support chat. Extract:
1. Main issues
2. Customer sentiment
3. Action items
4. Recommended next steps
[2000 words]
Экономия:
- Сокращение токенов: ~40%.
- Сокращение задержки: ~25%.
- Качество: такое же или лучше.
Рекомендация: Используйте наш Генератор промптов для Vibe Coding для оптимизации ваших запросов.
Обработка ошибок и надежность
Стратегия повторных попыток с экспоненциальной задержкой
async function geminiWithRetry(prompt, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const result = await model.generateContent(prompt);
return result.response.text();
} catch (error) {
// Check if error is retryable
if (!isRetryable(error) || i === maxRetries - 1) {
throw error;
}
// Exponential backoff: 1s, 2s, 4s
const delay = Math.pow(2, i) * 1000;
console.log(`Retry ${i + 1}/${maxRetries} after ${delay}ms`);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
function isRetryable(error) {
const retryableErrors = [
'RATE_LIMIT_EXCEEDED',
'SERVICE_UNAVAILABLE',
'DEADLINE_EXCEEDED',
];
return retryableErrors.some(code =>
error.message?.includes(code) || error.code === code
);
}
Паттерн «Прерыватель» (Circuit Breaker)
class CircuitBreaker {
constructor(threshold = 5, timeout = 60000) {
this.failureCount = 0;
this.threshold = threshold;
this.timeout = timeout;
this.state = 'CLOSED'; // CLOSED, OPEN, HALF_OPEN
this.nextAttempt = Date.now();
}
async execute(fn) {
if (this.state === 'OPEN') {
if (Date.now() < this.nextAttempt) {
throw new Error('Circuit breaker is OPEN');
}
this.state = 'HALF_OPEN';
}
try {
const result = await fn();
this.onSuccess();
return result;
} catch (error) {
this.onFailure();
throw error;
}
}
onSuccess() {
this.failureCount = 0;
this.state = 'CLOSED';
}
onFailure() {
this.failureCount++;
if (this.failureCount >= this.threshold) {
this.state = 'OPEN';
this.nextAttempt = Date.now() + this.timeout;
}
}
}
// Usage
const breaker = new CircuitBreaker();
try {
const response = await breaker.execute(() =>
model.generateContent(prompt)
);
} catch (error) {
// Fallback to cached response or default message
}
Стратегии миграции
С GPT-4 на Gemini 3 Flash
Шаг 1: Определите кандидатов для миграции
- Высоконагруженные эндпоинты (>1 млн запросов/месяц).
- Функции, чувствительные к скорости (чат, автодополнение).
- Задачи, чувствительные к стоимости (пакетная обработка).
Шаг 2: A/B-тестирование
async function abTestGeneration(prompt, userId) {
// 10% traffic to Gemini 3 Flash
const useGemini = hashUserId(userId) % 100 < 10;
if (useGemini) {
const result = await geminiFlash.generateContent(prompt);
logMetric('gemini_flash', result);
return result.response.text();
} else {
const result = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: prompt }],
});
logMetric('gpt4', result);
return result.choices[0].message.content;
}
}
Шаг 3: Сравните метрики
- Качество: оценка удовлетворенности пользователей, лайки/дизлайки.
- Скорость: задержка p50, p95, p99.
- Стоимость: $ за 1000 запросов.
- Надежность: частота ошибок, частота повторных попыток.
Шаг 4: Постепенное развертывание
- Неделя 1: 10% → Gemini 3 Flash.
- Неделя 2: 25% → Gemini 3 Flash.
- Неделя 3: 50% → Gemini 3 Flash.
- Неделя 4: 100% → Gemini 3 Flash (если метрики в норме).
Рекомендация: Используйте нашу Битву технологических стеков для сравнения поставщиков API.
С Claude на Gemini 3 Flash
Адаптация промптов:
Промпты Claude часто используют XML-теги для структуры:
<instructions>
Analyze this code for bugs.
</instructions>
<code>
function foo() { ... }
</code>
Gemini 3 Flash лучше работает с Markdown:
## Instructions
Analyze this code for bugs.
## Code
```javascript
function foo() { ... }
**Различия в вызове функций (Function Calling):**
```javascript
// Claude (Anthropic format)
const claudeTools = [{
name: "get_weather",
description: "Get weather for a location",
input_schema: {
type: "object",
properties: {
location: { type: "string" }
}
}
}];
// Gemini (Google format)
const geminiTools = [{
functionDeclarations: [{
name: "get_weather",
description: "Get weather for a location",
parameters: {
type: "object",
properties: {
location: { type: "string" }
}
}
}]
}];
Реальные кейсы
1. Чат-бот службы поддержки
Характеристики:
- 10 тыс. одновременных пользователей.
- В среднем 8 сообщений на диалог.
- Требуемая задержка: <500 мс.
Архитектура:
Пользователь → Cloudflare Worker (Edge) → Gemini 3 Flash (Стриминг)
↓
Redis Cache (30% попаданий)
Результаты:
- Задержка: p95 = 320 мс ✅
- Стоимость: $0.008 за диалог.
- Аптайм: 99.97%.
Прогноз месячных затрат:
- 1 млн диалогов/месяц.
- Итого: $8,000 (против $40,000 с GPT-4).
Рекомендация: Используйте наш Калькулятор стоимости приложения для оценки расходов на инфраструктуру.
2. Конвейер генерации контента
Характеристики:
- Генерация 50 тыс. описаний товаров в день.
- Качество: должно проходить проверку человеком в 95%+ случаев.
- Бюджет: <$500/месяц.
Архитектура:
Очередь задач → Пакетный обработчик (10 параллельно) → Gemini 3 Flash
↓
Ревью человеком (5%)
Результаты:
- Пропускная способность: 2100 описаний/час.
- Процент прохождения: 96.8% ✅
- Стоимость: $375/месяц ✅
3. API перевода в реальном времени
Характеристики:
- Поддержка 20 языков.
- Задержка: <200 мс.
- 500 тыс. запросов/день.
Архитектура:
API Gateway → Edge-функция → Gemini 3 Flash (с кэшированием)
↓
CloudFlare KV (слой кэша)
Результаты:
- Задержка: p95 = 180 мс ✅
- Попадание в кэш: 45%.
- Стоимость: $150/месяц (против $800 при использовании специализированных API перевода).
Рекомендация: Используйте наше Сравнение цен на API для сравнения сервисов перевода.
Чек-лист по оптимизации затрат
- Промпт-инжиниринг: удалите лишние слова, используйте краткие инструкции.
- Кэширование: кэшируйте идентичные/похожие промпты (снижение затрат на 30-50%).
- Стриминг: используйте стриминг только для пользовательских функций (пакетная обработка может быть без него).
- Гибридная маршрутизация: используйте Flash для простых задач, Pro — для сложных (снижение затрат на 40-60%).
- Ограничение частоты (Rate limiting): предотвращайте злоупотребления, устанавливайте квоты для пользователей.
- Мониторинг: отслеживайте стоимость каждой функции, выявляйте дорогие промпты.
- Пакетная обработка: объединяйте несколько запросов, обрабатывайте их в непиковые часы.
Рекомендация: Используйте нашу Финансовую модель SaaS для прогнозирования затрат на API при масштабировании.
Мониторинг и наблюдаемость
Ключевые метрики для отслеживания
// Example: Log structured metrics to Datadog/New Relic
function logGeminiMetrics(request, response, error = null) {
const metrics = {
model: 'gemini-3-flash',
endpoint: request.endpoint,
promptTokens: estimateTokens(request.prompt),
responseTokens: response ? estimateTokens(response.text) : 0,
latency: response?.latency || 0,
cost: response?.cost || 0,
cached: response?.cached || false,
error: error?.message || null,
timestamp: Date.now(),
};
// Send to monitoring service
datadog.increment('gemini.requests', 1, { endpoint: request.endpoint });
datadog.histogram('gemini.latency', metrics.latency);
datadog.gauge('gemini.cost', metrics.cost);
if (error) {
datadog.increment('gemini.errors', 1, { error: error.code });
}
}
Настройка алертов
- Высокая частота ошибок: >5% ошибок за 5 минут.
- Высокая задержка: p95 >1000 мс в течение 5 минут.
- Высокая стоимость: ежедневные расходы >$X бюджета.
- Превышение лимитов: приближение к квоте API.
Лучшие практики безопасности
1. Управление API-ключами
// ❌ Плохо: API-ключ в коде
const genAI = new GoogleGenerativeAI('AIzaSy...');
// ✅ Хорошо: API-ключ из окружения
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
// ✅ Еще лучше: Ротация ключей, использование менеджера секретов
const genAI = new GoogleGenerativeAI(await getSecret('gemini-api-key'));
2. Санитизация (очистка) входных данных
function sanitizeInput(userInput) {
// Remove PII
let sanitized = userInput.replace(/\b\d{3}-\d{2}-\d{4}\b/g, '[SSN]');
sanitized = sanitized.replace(/\b\d{16}\b/g, '[CC]');
// Limit length (prevent token abuse)
if (sanitized.length > 10000) {
sanitized = sanitized.slice(0, 10000);
}
return sanitized;
}
3. Фильтрация выходных данных
async function generateWithSafety(prompt) {
const result = await model.generateContent(prompt);
// Check safety ratings
const safetyRatings = result.response.candidates[0].safetyRatings;
const unsafe = safetyRatings.some(r =>
r.probability === 'HIGH' || r.probability === 'MEDIUM'
);
if (unsafe) {
return {
text: "I'm sorry, I can't generate that content.",
blocked: true
};
}
return {
text: result.response.text(),
blocked: false
};
}
Распространенные ошибки и решения
Ошибка 1: Игнорирование лимитов (Rate Limits)
Проблема: Приложение падает при достижении лимитов API.
Решение: Реализуйте очередь с ограничением частоты запросов.
import Bottleneck from 'bottleneck';
const limiter = new Bottleneck({
maxConcurrent: 10,
minTime: 100, // 10 requests/second
});
const rateLimitedGenerate = limiter.wrap(
(prompt) => model.generateContent(prompt)
);
Ошибка 2: Игнорирование лимитов токенов
Проблема: Длинные промпты обрезаются, теряется контекст.
Решение: Разбивайте длинные входные данные на части (chunking).
function chunkText(text, maxTokens = 30000) {
const estimatedTokens = text.length / 4;
if (estimatedTokens <= maxTokens) {
return [text];
}
const chunkSize = Math.floor(text.length / Math.ceil(estimatedTokens / maxTokens));
const chunks = [];
for (let i = 0; i < text.length; i += chunkSize) {
chunks.push(text.slice(i, i + chunkSize));
}
return chunks;
}
Ошибка 3: Отсутствие резервной стратегии (Fallback)
Проблема: Сервис недоступен = приложение не работает.
Решение: Реализуйте постепенную деградацию функционала.
async function generateWithFallback(prompt) {
try {
return await geminiFlash.generateContent(prompt);
} catch (error) {
console.error('Gemini Flash failed, trying GPT-3.5');
try {
return await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [{ role: 'user', content: prompt }],
});
} catch (fallbackError) {
console.error('All providers failed');
return { text: "Service temporarily unavailable. Please try again." };
}
}
}
Заключение: от прототипа к продакшену
Gemini 3 Flash меняет экономику ИИ-приложений. То, что раньше было дорогим и медленным, теперь стало доступным и быстрым.
Но дешево и быстро не означает легко. Приложения для продакшена требуют:
- ✅ Правильной обработки ошибок и повторных попыток.
- ✅ Кэширования и оптимизации затрат.
- ✅ Мониторинга и алертинга.
- ✅ Безопасности и ограничения частоты запросов.
- ✅ Резервных стратегий и постепенной деградации.
Помните:
- Начинайте со стриминга для пользовательских функций.
- Внедряйте кэширование как можно раньше (экономия 30-50%).
- Используйте гибридную маршрутизацию (Flash + Pro) для сложных приложений.
- Отслеживайте метрики: задержку, стоимость, частоту ошибок.
- Планируйте сбои: используйте повторные попытки, прерыватели и резервные варианты.
Готовы строить на Gemini 3 Flash? Используйте наши бесплатные инструменты для планирования реализации:
Связанные инструменты и ресурсы
- 🔧 Генератор архитектуры приложений — спроектируйте архитектуру вашей системы.
- 🔧 Калькулятор стоимости приложения — оцените затраты на разработку и API.
- 🔧 Сравнение цен на API — сравните поставщиков LLM API.
- 🔧 Битва технологических стеков — сравните фреймворки и сервисы.
- 🔧 Финансовая модель SaaS — смоделируйте затраты на API при масштабировании.
- 🔧 Оценщик сроков разработки — спланируйте график разработки.
- 📖 Релиз Gemini 3 Flash: все, что вам нужно знать
- 📖 Orionmist и Lithiumflow: внутри Gemini 3