eslint-plugin-firebase-ai-logic 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +515 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -1
- package/dist/index.js.map +1 -1
- package/dist/rules/check-media-resolution.d.ts +4 -0
- package/dist/rules/check-media-resolution.d.ts.map +1 -0
- package/dist/rules/check-media-resolution.js +47 -0
- package/dist/rules/check-media-resolution.js.map +1 -0
- package/dist/rules/check-temperature-defaults.d.ts +4 -0
- package/dist/rules/check-temperature-defaults.d.ts.map +1 -0
- package/dist/rules/check-temperature-defaults.js +56 -0
- package/dist/rules/check-temperature-defaults.js.map +1 -0
- package/dist/rules/no-code-execution-creative-tasks.d.ts +4 -0
- package/dist/rules/no-code-execution-creative-tasks.d.ts.map +1 -0
- package/dist/rules/no-code-execution-creative-tasks.js +75 -0
- package/dist/rules/no-code-execution-creative-tasks.js.map +1 -0
- package/dist/rules/no-file-uri-with-code-execution.d.ts +4 -0
- package/dist/rules/no-file-uri-with-code-execution.d.ts.map +1 -0
- package/dist/rules/no-file-uri-with-code-execution.js +44 -0
- package/dist/rules/no-file-uri-with-code-execution.js.map +1 -0
- package/dist/rules/no-thinking-simple-tasks.d.ts +1 -1
- package/dist/rules/no-thinking-simple-tasks.d.ts.map +1 -1
- package/dist/rules/no-thinking-simple-tasks.js +122 -102
- package/dist/rules/no-thinking-simple-tasks.js.map +1 -1
- package/dist/rules/require-code-execution-handling.d.ts +4 -0
- package/dist/rules/require-code-execution-handling.d.ts.map +1 -0
- package/dist/rules/require-code-execution-handling.js +66 -0
- package/dist/rules/require-code-execution-handling.js.map +1 -0
- package/dist/rules/require-google-ai-backend-for-grounding.d.ts +4 -0
- package/dist/rules/require-google-ai-backend-for-grounding.d.ts.map +1 -0
- package/dist/rules/require-google-ai-backend-for-grounding.js +63 -0
- package/dist/rules/require-google-ai-backend-for-grounding.js.map +1 -0
- package/dist/rules/require-grounding-compliance.d.ts +4 -0
- package/dist/rules/require-grounding-compliance.d.ts.map +1 -0
- package/dist/rules/require-grounding-compliance.js +51 -0
- package/dist/rules/require-grounding-compliance.js.map +1 -0
- package/dist/rules/validate-code-execution-config.d.ts +4 -0
- package/dist/rules/validate-code-execution-config.d.ts.map +1 -0
- package/dist/rules/validate-code-execution-config.js +38 -0
- package/dist/rules/validate-code-execution-config.js.map +1 -0
- package/dist/rules/validate-multimodal-config.d.ts +4 -0
- package/dist/rules/validate-multimodal-config.d.ts.map +1 -0
- package/dist/rules/validate-multimodal-config.js +54 -0
- package/dist/rules/validate-multimodal-config.js.map +1 -0
- package/dist/rules/validate-response-mime-type.d.ts +4 -0
- package/dist/rules/validate-response-mime-type.d.ts.map +1 -0
- package/dist/rules/validate-response-mime-type.js +67 -0
- package/dist/rules/validate-response-mime-type.js.map +1 -0
- package/dist/rules/validate-schema-structure.d.ts +4 -0
- package/dist/rules/validate-schema-structure.d.ts.map +1 -0
- package/dist/rules/validate-schema-structure.js +42 -0
- package/dist/rules/validate-schema-structure.js.map +1 -0
- package/dist/utils/ast-helpers.d.ts +7 -3
- package/dist/utils/ast-helpers.d.ts.map +1 -1
- package/dist/utils/ast-helpers.js +8 -1
- package/dist/utils/ast-helpers.js.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
# ESLint Plugin: Firebase AI Logic
|
|
2
|
+
|
|
3
|
+
Plugin ESLint oficial para **Firebase AI Logic** com 24 regras que detectam anti-padrões, imports obsoletos, configs inválidas e best practices.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install --save-dev eslint-plugin-firebase-ai-logic
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## 🚀 Início Rápido (5 min)
|
|
10
|
+
|
|
11
|
+
### 1️⃣ Instalar o Plugin
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install --save-dev eslint-plugin-firebase-ai-logic
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2️⃣ Configurar ESLint 9+ (Flat Config)
|
|
18
|
+
|
|
19
|
+
Edite `eslint.config.js`:
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
import firebaseAiLogicPlugin from 'eslint-plugin-firebase-ai-logic';
|
|
23
|
+
|
|
24
|
+
export default [
|
|
25
|
+
firebaseAiLogicPlugin.configs.recommended,
|
|
26
|
+
// suas outras configs...
|
|
27
|
+
];
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 3️⃣ Configurar ESLint 8.x (Legacy)
|
|
31
|
+
|
|
32
|
+
Edite `.eslintrc.js` ou `.eslintrc.json`:
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
module.exports = {
|
|
36
|
+
plugins: ['firebase-ai-logic'],
|
|
37
|
+
extends: ['plugin:firebase-ai-logic/recommended'],
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 4️⃣ Rodar ESLint
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx eslint src --fix
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Pronto! O plugin agora vai detectar problemas no seu código Firebase AI Logic.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 📋 Exemplos de Regras
|
|
52
|
+
|
|
53
|
+
### ❌ Imports Deprecated
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// ❌ ERRADO - Usando import antigo
|
|
57
|
+
import { getVertexAI } from 'firebase/vertexai-preview';
|
|
58
|
+
|
|
59
|
+
// ❌ ERRADO - Importando direto da Google Cloud
|
|
60
|
+
import { VertexAI } from '@google-cloud/vertexai';
|
|
61
|
+
|
|
62
|
+
// ✅ CERTO - Use firebase/ai
|
|
63
|
+
import { getAI, GoogleAIBackend } from 'firebase/ai';
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### ❌ Modelo Obsoleto
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ ERRADO - gemini-2.5-pro é deprecated
|
|
70
|
+
const model = getGenerativeModel(ai, {
|
|
71
|
+
model: 'gemini-2.5-pro'
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// ✅ CERTO - Use gemini-3-flash-preview
|
|
75
|
+
const model = getGenerativeModel(ai, {
|
|
76
|
+
model: 'gemini-3-flash-preview'
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### ❌ JSON Schema com Streaming
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// ❌ ERRADO - Não funciona junto
|
|
84
|
+
const result = await model.generateContentStream(prompt, {
|
|
85
|
+
responseMimeType: 'application/json',
|
|
86
|
+
responseSchema: mySchema,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// ✅ CERTO - Use generateContent (sem stream)
|
|
90
|
+
const result = await model.generateContent(prompt, {
|
|
91
|
+
responseMimeType: 'application/json',
|
|
92
|
+
responseSchema: mySchema,
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### ❌ Falta Backend
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// ❌ ERRADO - Backend é obrigatório
|
|
100
|
+
const ai = getAI(app);
|
|
101
|
+
|
|
102
|
+
// ✅ CERTO - Sempre especifique o backend
|
|
103
|
+
const ai = getAI(app, {
|
|
104
|
+
backend: new GoogleAIBackend()
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### ❌ Function Calling sem Response
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// ❌ ERRADO - Falta tratar resposta
|
|
112
|
+
const result = await model.generateContent(prompt);
|
|
113
|
+
const calls = result.response.functionCalls();
|
|
114
|
+
// ... executou a função mas não enviou de volta
|
|
115
|
+
|
|
116
|
+
// ✅ CERTO - Complete o loop
|
|
117
|
+
const result = await model.generateContent(prompt);
|
|
118
|
+
const calls = result.response.functionCalls();
|
|
119
|
+
for (const call of calls) {
|
|
120
|
+
const response = await executeFunction(call.name, call.args);
|
|
121
|
+
await chat.sendMessage({
|
|
122
|
+
role: 'user',
|
|
123
|
+
parts: [{ functionResponse: response }],
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 📚 Todas as 24 Regras
|
|
131
|
+
|
|
132
|
+
### Imports & Models (5 regras)
|
|
133
|
+
|
|
134
|
+
| Regra | Descrição |
|
|
135
|
+
|-------|-----------|
|
|
136
|
+
| `no-deprecated-firebase-vertexai` | Não use `firebase/vertexai-preview` → use `firebase/ai` |
|
|
137
|
+
| `no-vertexai-only-import` | Não use `firebase/vertexai` → use `firebase/ai` |
|
|
138
|
+
| `no-vertex-ai-direct-import` | Não use `@google-cloud/vertexai` → use `firebase/ai` |
|
|
139
|
+
| `no-google-genai-import` | Não use `@google/generative-ai` → use `firebase/ai` |
|
|
140
|
+
| `no-deprecated-models` | Detecta modelos obsoletos (gemini-2.5-pro, etc) |
|
|
141
|
+
|
|
142
|
+
### Schema & Validation (4 regras)
|
|
143
|
+
|
|
144
|
+
| Regra | Descrição |
|
|
145
|
+
|-------|-----------|
|
|
146
|
+
| `no-streaming-with-schema` | JSON schema NÃO funciona com streaming |
|
|
147
|
+
| `no-unsupported-schema-features` | union types, constraints não são suportados |
|
|
148
|
+
| `no-schema-in-prompt` | Remova instruções JSON do prompt se usar responseSchema |
|
|
149
|
+
| `require-json-validation` | Valide JSON parseado com Zod após receber |
|
|
150
|
+
|
|
151
|
+
### Functions (3 regras)
|
|
152
|
+
|
|
153
|
+
| Regra | Descrição |
|
|
154
|
+
|-------|-----------|
|
|
155
|
+
| `require-function-description` | Função precisa de descrição detalhada |
|
|
156
|
+
| `require-function-response-handling` | Function calling requer loop completo |
|
|
157
|
+
| `no-unsupported-function-params` | Alguns atributos não são suportados |
|
|
158
|
+
|
|
159
|
+
### Performance & Optimization (5 regras)
|
|
160
|
+
|
|
161
|
+
| Regra | Descrição |
|
|
162
|
+
|-------|-----------|
|
|
163
|
+
| `prefer-batch-requests` | Agrupe requisições em Promise.all() |
|
|
164
|
+
| `prefer-count-tokens` | Use countTokens() para prompts grandes |
|
|
165
|
+
| `prefer-streaming-long-responses` | Streaming para respostas > 1000 chars |
|
|
166
|
+
| `prefer-concise-property-names` | Nomes curtos economizam tokens |
|
|
167
|
+
| `prefer-cloud-storage-large-files` | Use Cloud Storage pra arquivos > 10MB |
|
|
168
|
+
|
|
169
|
+
### Configuration (4 regras)
|
|
170
|
+
|
|
171
|
+
| Regra | Descrição |
|
|
172
|
+
|-------|-----------|
|
|
173
|
+
| `require-backend` | Backend (GoogleAI ou VertexAI) é obrigatório |
|
|
174
|
+
| `require-ai-before-model` | Crie AI antes de usar getGenerativeModel |
|
|
175
|
+
| `require-app-check-production` | Use App Check em produção |
|
|
176
|
+
| `require-error-handling` | Envolva chamadas em try/catch |
|
|
177
|
+
|
|
178
|
+
### Best Practices (3 regras)
|
|
179
|
+
|
|
180
|
+
| Regra | Descrição |
|
|
181
|
+
|-------|-----------|
|
|
182
|
+
| `no-thinking-simple-tasks` | Thinking mode é overhead pra tarefas simples |
|
|
183
|
+
| `no-unlimited-chat-history` | Limpe histórico do chat regularmente |
|
|
184
|
+
| `no-verbose-prompts` | Prompts verbosos = mais tokens e custo |
|
|
185
|
+
| `require-thought-signature` | Gemini 3: preserve thoughtSignature |
|
|
186
|
+
| `no-sensitive-system-instruction` | Não coloque dados sensíveis no system prompt |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 🎯 Configuração Avançada
|
|
191
|
+
|
|
192
|
+
### Ativar Apenas Algumas Regras
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
// ESLint 9+ (flat config)
|
|
196
|
+
import firebaseAiLogicPlugin from 'eslint-plugin-firebase-ai-logic';
|
|
197
|
+
|
|
198
|
+
export default [
|
|
199
|
+
{
|
|
200
|
+
plugins: { 'firebase-ai-logic': firebaseAiLogicPlugin },
|
|
201
|
+
rules: {
|
|
202
|
+
'firebase-ai-logic/no-deprecated-models': 'error',
|
|
203
|
+
'firebase-ai-logic/require-backend': 'error',
|
|
204
|
+
'firebase-ai-logic/require-json-validation': 'warn',
|
|
205
|
+
// desabilitar regra
|
|
206
|
+
'firebase-ai-logic/no-verbose-prompts': 'off',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
];
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```javascript
|
|
213
|
+
// ESLint 8.x (legacy)
|
|
214
|
+
module.exports = {
|
|
215
|
+
plugins: ['firebase-ai-logic'],
|
|
216
|
+
rules: {
|
|
217
|
+
'firebase-ai-logic/no-deprecated-models': 'error',
|
|
218
|
+
'firebase-ai-logic/require-backend': 'error',
|
|
219
|
+
'firebase-ai-logic/require-json-validation': 'warn',
|
|
220
|
+
'firebase-ai-logic/no-verbose-prompts': 'off',
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Regras por Severity
|
|
226
|
+
|
|
227
|
+
**Error** (deve corrigir):
|
|
228
|
+
- Imports deprecated
|
|
229
|
+
- Modelos obsoletos
|
|
230
|
+
- Backend obrigatório
|
|
231
|
+
- Function calling incompleto
|
|
232
|
+
- Schema com streaming
|
|
233
|
+
|
|
234
|
+
**Warning** (considere corrigir):
|
|
235
|
+
- Falta de validation JSON
|
|
236
|
+
- Sem error handling
|
|
237
|
+
- Historico de chat ilimitado
|
|
238
|
+
- Prompts verbose
|
|
239
|
+
|
|
240
|
+
**Suggestion** (dicas opcionais):
|
|
241
|
+
- Nomes de propriedades longos
|
|
242
|
+
- Sem countTokens
|
|
243
|
+
- Sem streaming em respostas longas
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 💡 Exemplos Práticos
|
|
248
|
+
|
|
249
|
+
### Setup Completo
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
import { initializeApp } from 'firebase/app';
|
|
253
|
+
import { getAI, getGenerativeModel, GoogleAIBackend } from 'firebase/ai';
|
|
254
|
+
import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';
|
|
255
|
+
import { z } from 'zod';
|
|
256
|
+
|
|
257
|
+
// ✅ App Check habilitado
|
|
258
|
+
const app = initializeApp(firebaseConfig);
|
|
259
|
+
initializeAppCheck(app, {
|
|
260
|
+
provider: new ReCaptchaV3Provider('YOUR_SITE_KEY'),
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// ✅ AI com backend explícito
|
|
264
|
+
const ai = getAI(app, { backend: new GoogleAIBackend() });
|
|
265
|
+
|
|
266
|
+
// ✅ Model com config correto
|
|
267
|
+
const model = getGenerativeModel(ai, {
|
|
268
|
+
model: 'gemini-3-flash-preview', // ✅ Modelo atual
|
|
269
|
+
systemInstruction: 'Você é um assistente amigável',
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// ✅ Validação com Zod
|
|
273
|
+
const ResponseValidator = z.object({
|
|
274
|
+
sentiment: z.enum(['positive', 'negative', 'neutral']),
|
|
275
|
+
confidence: z.number().min(0).max(1),
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// ✅ Try/catch para error handling
|
|
279
|
+
async function analyzeReview(review: string) {
|
|
280
|
+
try {
|
|
281
|
+
// ✅ countTokens para prompt grande
|
|
282
|
+
const tokens = await model.countTokens(review);
|
|
283
|
+
if (tokens.totalTokens > 5000) {
|
|
284
|
+
console.warn('Prompt grande:', tokens.totalTokens);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ✅ generateContent (NÃO stream) para JSON
|
|
288
|
+
const result = await model.generateContent(review, {
|
|
289
|
+
responseMimeType: 'application/json',
|
|
290
|
+
responseSchema: ReviewSchema,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// ✅ Validar antes de usar
|
|
294
|
+
const data = JSON.parse(result.response.text());
|
|
295
|
+
return ResponseValidator.parse(data);
|
|
296
|
+
} catch (error) {
|
|
297
|
+
if (error instanceof Error && 'status' in error) {
|
|
298
|
+
if ((error as any).status === 429) {
|
|
299
|
+
// Rate limit - implementar exponential backoff
|
|
300
|
+
console.error('Rate limited, aguarde antes de tentar novamente');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Function Calling Correto
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
// ✅ Setup com tools
|
|
312
|
+
const model = getGenerativeModel(ai, {
|
|
313
|
+
model: 'gemini-3-flash-preview',
|
|
314
|
+
tools: [{
|
|
315
|
+
name: 'search_web',
|
|
316
|
+
description: 'Busca na web por informações recentes', // ✅ Descrição clara
|
|
317
|
+
parameters: {
|
|
318
|
+
type: 'object',
|
|
319
|
+
properties: {
|
|
320
|
+
query: { type: 'string' },
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
}],
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
async function chatWithFunctionCalling(userMessage: string) {
|
|
327
|
+
const chat = model.startChat();
|
|
328
|
+
|
|
329
|
+
try {
|
|
330
|
+
let response = await chat.sendMessage(userMessage);
|
|
331
|
+
|
|
332
|
+
// ✅ Loop completo de function calling
|
|
333
|
+
while (response.response.functionCalls().length > 0) {
|
|
334
|
+
const calls = response.response.functionCalls();
|
|
335
|
+
|
|
336
|
+
for (const call of calls) {
|
|
337
|
+
console.log(`Executando: ${call.name}(${JSON.stringify(call.args)})`);
|
|
338
|
+
|
|
339
|
+
// Executar a função
|
|
340
|
+
const result = await executeFunction(call.name, call.args);
|
|
341
|
+
|
|
342
|
+
// ✅ IMPORTANTE: Enviar resposta de volta
|
|
343
|
+
response = await chat.sendMessage({
|
|
344
|
+
role: 'user',
|
|
345
|
+
parts: [{
|
|
346
|
+
functionResponse: {
|
|
347
|
+
name: call.name,
|
|
348
|
+
response: result,
|
|
349
|
+
},
|
|
350
|
+
}],
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return response.response.text();
|
|
356
|
+
} catch (error) {
|
|
357
|
+
console.error('Erro em function calling:', error);
|
|
358
|
+
throw error;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Chat com Histórico Limitado
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
// ✅ Limitar histórico para economizar tokens
|
|
367
|
+
const MAX_HISTORY = 10;
|
|
368
|
+
|
|
369
|
+
async function maintainChatHistory(
|
|
370
|
+
messages: Array<{ role: string; text: string }>
|
|
371
|
+
) {
|
|
372
|
+
// ✅ Manter apenas últimas N mensagens
|
|
373
|
+
const recentMessages = messages.slice(-MAX_HISTORY);
|
|
374
|
+
|
|
375
|
+
const chat = model.startChat({
|
|
376
|
+
history: recentMessages.map((msg) => ({
|
|
377
|
+
role: msg.role as 'user' | 'model',
|
|
378
|
+
parts: [{ text: msg.text }],
|
|
379
|
+
})),
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
return chat;
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 🔧 Troubleshooting
|
|
389
|
+
|
|
390
|
+
### "Plugin não está sendo carregado"
|
|
391
|
+
|
|
392
|
+
**Erro:**
|
|
393
|
+
```
|
|
394
|
+
Cannot find module 'eslint-plugin-firebase-ai-logic'
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Solução:**
|
|
398
|
+
```bash
|
|
399
|
+
# Verifique se está instalado
|
|
400
|
+
npm list eslint-plugin-firebase-ai-logic
|
|
401
|
+
|
|
402
|
+
# Se não, instale
|
|
403
|
+
npm install --save-dev eslint-plugin-firebase-ai-logic
|
|
404
|
+
|
|
405
|
+
# ESLint 9 precisa de nome qualificado
|
|
406
|
+
import firebaseAiLogicPlugin from 'eslint-plugin-firebase-ai-logic';
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### "Regra não reconhecida"
|
|
410
|
+
|
|
411
|
+
**Erro:**
|
|
412
|
+
```
|
|
413
|
+
"firebase-ai-logic/no-deprecated-models" was not found
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Solução:**
|
|
417
|
+
- Verifique o nome exato da regra
|
|
418
|
+
- Use com prefixo: `firebase-ai-logic/`
|
|
419
|
+
- Certifique-se que a regra está ativa na config
|
|
420
|
+
|
|
421
|
+
### "Config recommended não existe"
|
|
422
|
+
|
|
423
|
+
**Solução para ESLint 9:**
|
|
424
|
+
```javascript
|
|
425
|
+
// ✅ CERTO
|
|
426
|
+
import firebaseAiLogicPlugin from 'eslint-plugin-firebase-ai-logic';
|
|
427
|
+
export default [
|
|
428
|
+
firebaseAiLogicPlugin.configs.recommended,
|
|
429
|
+
];
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
**Solução para ESLint 8:**
|
|
433
|
+
```javascript
|
|
434
|
+
// ✅ CERTO
|
|
435
|
+
module.exports = {
|
|
436
|
+
extends: ['plugin:firebase-ai-logic/recommended'],
|
|
437
|
+
};
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 📖 Documentação Completa
|
|
443
|
+
|
|
444
|
+
Cada regra tem documentação detalhada no GitHub:
|
|
445
|
+
|
|
446
|
+
https://github.com/Just-mpm/eslint-plugin-firebase-ai-logic
|
|
447
|
+
|
|
448
|
+
Veja o diretório `docs/rules/` para:
|
|
449
|
+
- Exemplos de código bom e ruim
|
|
450
|
+
- Razão por trás da regra
|
|
451
|
+
- Como corrigir automaticamente
|
|
452
|
+
- Exceções e edge cases
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## 🐛 Encontrou um Bug?
|
|
457
|
+
|
|
458
|
+
Abra uma issue no GitHub:
|
|
459
|
+
https://github.com/Just-mpm/eslint-plugin-firebase-ai-logic/issues
|
|
460
|
+
|
|
461
|
+
Inclua:
|
|
462
|
+
- Versão do plugin
|
|
463
|
+
- Versão do ESLint
|
|
464
|
+
- Configuração ESLint
|
|
465
|
+
- Código que causa o problema
|
|
466
|
+
- Output esperado vs atual
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 📝 License
|
|
471
|
+
|
|
472
|
+
MIT © [Matheus Pimenta](https://kodaai.app)
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## 🤝 Contribuindo
|
|
477
|
+
|
|
478
|
+
Contribuições são bem-vindas! O projeto está em:
|
|
479
|
+
https://github.com/Just-mpm/eslint-plugin-firebase-ai-logic
|
|
480
|
+
|
|
481
|
+
### Setup para Desenvolvimento
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
# Clone o repo
|
|
485
|
+
git clone https://github.com/Just-mpm/eslint-plugin-firebase-ai-logic.git
|
|
486
|
+
cd eslint-plugin-firebase-ai-logic
|
|
487
|
+
|
|
488
|
+
# Instale dependências
|
|
489
|
+
npm install
|
|
490
|
+
|
|
491
|
+
# Rode os testes
|
|
492
|
+
npm test
|
|
493
|
+
|
|
494
|
+
# Build TypeScript
|
|
495
|
+
npm run build
|
|
496
|
+
|
|
497
|
+
# Watch mode para desenvolvimento
|
|
498
|
+
npm run test:watch
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## 📚 Recursos Adicionais
|
|
504
|
+
|
|
505
|
+
- **Firebase AI Logic Docs**: https://firebase.google.com/docs/ai-logic
|
|
506
|
+
- **Gemini API Reference**: https://ai.google.dev/gemini-api/docs
|
|
507
|
+
- **ESLint Plugin Dev Guide**: https://eslint.org/docs/latest/extend/plugins
|
|
508
|
+
- **Skill firebase-ai-logic**: Guia prático no Claude Code
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
Feito com ❤️ para developers Firebase AI Logic
|
|
513
|
+
|
|
514
|
+
**Versão:** 1.0.0
|
|
515
|
+
**NPM:** https://www.npmjs.com/package/eslint-plugin-firebase-ai-logic
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAwR7C,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAOpB,CAAC;AAEF,SAAS,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,17 @@ const prefer_streaming_long_responses_js_1 = __importDefault(require("./rules/pr
|
|
|
31
31
|
const no_thinking_simple_tasks_js_1 = __importDefault(require("./rules/no-thinking-simple-tasks.js"));
|
|
32
32
|
const prefer_concise_property_names_js_1 = __importDefault(require("./rules/prefer-concise-property-names.js"));
|
|
33
33
|
const require_thought_signature_js_1 = __importDefault(require("./rules/require-thought-signature.js"));
|
|
34
|
+
const check_temperature_defaults_js_1 = __importDefault(require("./rules/check-temperature-defaults.js"));
|
|
35
|
+
const check_media_resolution_js_1 = __importDefault(require("./rules/check-media-resolution.js"));
|
|
36
|
+
const validate_response_mime_type_js_1 = __importDefault(require("./rules/validate-response-mime-type.js"));
|
|
37
|
+
const validate_code_execution_config_js_1 = __importDefault(require("./rules/validate-code-execution-config.js"));
|
|
38
|
+
const validate_schema_structure_js_1 = __importDefault(require("./rules/validate-schema-structure.js"));
|
|
39
|
+
const require_code_execution_handling_js_1 = __importDefault(require("./rules/require-code-execution-handling.js"));
|
|
40
|
+
const require_grounding_compliance_js_1 = __importDefault(require("./rules/require-grounding-compliance.js"));
|
|
41
|
+
const no_file_uri_with_code_execution_js_1 = __importDefault(require("./rules/no-file-uri-with-code-execution.js"));
|
|
42
|
+
const no_code_execution_creative_tasks_js_1 = __importDefault(require("./rules/no-code-execution-creative-tasks.js"));
|
|
43
|
+
const require_google_ai_backend_for_grounding_js_1 = __importDefault(require("./rules/require-google-ai-backend-for-grounding.js"));
|
|
44
|
+
const validate_multimodal_config_js_1 = __importDefault(require("./rules/validate-multimodal-config.js"));
|
|
34
45
|
const rules = {
|
|
35
46
|
// Import rules (4)
|
|
36
47
|
'no-google-genai-import': no_google_genai_import_js_1.default,
|
|
@@ -69,8 +80,22 @@ const rules = {
|
|
|
69
80
|
'prefer-streaming-long-responses': prefer_streaming_long_responses_js_1.default,
|
|
70
81
|
'no-thinking-simple-tasks': no_thinking_simple_tasks_js_1.default,
|
|
71
82
|
'prefer-concise-property-names': prefer_concise_property_names_js_1.default,
|
|
72
|
-
// Gemini 3 specific rules (
|
|
83
|
+
// Gemini 3 specific rules (3)
|
|
73
84
|
'require-thought-signature': require_thought_signature_js_1.default,
|
|
85
|
+
'check-temperature-defaults': check_temperature_defaults_js_1.default,
|
|
86
|
+
'check-media-resolution': check_media_resolution_js_1.default,
|
|
87
|
+
// Validation rules (3)
|
|
88
|
+
'validate-response-mime-type': validate_response_mime_type_js_1.default,
|
|
89
|
+
'validate-code-execution-config': validate_code_execution_config_js_1.default,
|
|
90
|
+
'validate-schema-structure': validate_schema_structure_js_1.default,
|
|
91
|
+
// Compliance (2)
|
|
92
|
+
'require-code-execution-handling': require_code_execution_handling_js_1.default,
|
|
93
|
+
'require-grounding-compliance': require_grounding_compliance_js_1.default,
|
|
94
|
+
// Additional rules (2)
|
|
95
|
+
'no-file-uri-with-code-execution': no_file_uri_with_code_execution_js_1.default,
|
|
96
|
+
'no-code-execution-creative-tasks': no_code_execution_creative_tasks_js_1.default,
|
|
97
|
+
'require-google-ai-backend-for-grounding': require_google_ai_backend_for_grounding_js_1.default,
|
|
98
|
+
'validate-multimodal-config': validate_multimodal_config_js_1.default,
|
|
74
99
|
};
|
|
75
100
|
// Rule configurations
|
|
76
101
|
const recommendedRules = {
|
|
@@ -89,10 +114,17 @@ const recommendedRules = {
|
|
|
89
114
|
'firebase-ai-logic/no-unsupported-schema-features': 'error',
|
|
90
115
|
'firebase-ai-logic/no-schema-in-prompt': 'warn',
|
|
91
116
|
'firebase-ai-logic/prefer-optional-properties': 'warn',
|
|
117
|
+
'firebase-ai-logic/validate-response-mime-type': 'error',
|
|
118
|
+
'firebase-ai-logic/validate-schema-structure': 'warn',
|
|
92
119
|
// Function calling - warnings
|
|
93
120
|
'firebase-ai-logic/require-function-description': 'warn',
|
|
94
121
|
'firebase-ai-logic/no-unsupported-function-params': 'error',
|
|
95
122
|
'firebase-ai-logic/require-function-response-handling': 'warn',
|
|
123
|
+
'firebase-ai-logic/validate-code-execution-config': 'error',
|
|
124
|
+
'firebase-ai-logic/require-code-execution-handling': 'warn',
|
|
125
|
+
'firebase-ai-logic/no-file-uri-with-code-execution': 'error',
|
|
126
|
+
'firebase-ai-logic/no-code-execution-creative-tasks': 'warn',
|
|
127
|
+
'firebase-ai-logic/require-grounding-compliance': 'error',
|
|
96
128
|
// Error handling - warnings
|
|
97
129
|
'firebase-ai-logic/require-error-handling': 'warn',
|
|
98
130
|
'firebase-ai-logic/require-json-validation': 'warn',
|
|
@@ -103,9 +135,12 @@ const recommendedRules = {
|
|
|
103
135
|
'firebase-ai-logic/require-app-check-production': 'warn',
|
|
104
136
|
// Multimodal - errors
|
|
105
137
|
'firebase-ai-logic/no-unsupported-mime-type': 'error',
|
|
138
|
+
'firebase-ai-logic/validate-multimodal-config': 'error',
|
|
106
139
|
'firebase-ai-logic/prefer-cloud-storage-large-files': 'warn',
|
|
107
140
|
// Gemini 3 specific - error (causes 400 errors if missing)
|
|
108
141
|
'firebase-ai-logic/require-thought-signature': 'error',
|
|
142
|
+
'firebase-ai-logic/check-temperature-defaults': 'warn',
|
|
143
|
+
'firebase-ai-logic/check-media-resolution': 'error',
|
|
109
144
|
};
|
|
110
145
|
const strictRules = {
|
|
111
146
|
...recommendedRules,
|
|
@@ -119,6 +154,12 @@ const strictRules = {
|
|
|
119
154
|
'firebase-ai-logic/no-unlimited-chat-history': 'error',
|
|
120
155
|
'firebase-ai-logic/require-app-check-production': 'error',
|
|
121
156
|
'firebase-ai-logic/prefer-cloud-storage-large-files': 'error',
|
|
157
|
+
'firebase-ai-logic/check-temperature-defaults': 'error',
|
|
158
|
+
'firebase-ai-logic/validate-schema-structure': 'error',
|
|
159
|
+
'firebase-ai-logic/require-code-execution-handling': 'error',
|
|
160
|
+
'firebase-ai-logic/no-file-uri-with-code-execution': 'error',
|
|
161
|
+
'firebase-ai-logic/no-code-execution-creative-tasks': 'error',
|
|
162
|
+
'firebase-ai-logic/require-grounding-compliance': 'error',
|
|
122
163
|
// Add optional rules
|
|
123
164
|
'firebase-ai-logic/prefer-count-tokens': 'warn',
|
|
124
165
|
'firebase-ai-logic/prefer-batch-requests': 'warn',
|
|
@@ -156,6 +197,17 @@ const allRules = {
|
|
|
156
197
|
'firebase-ai-logic/no-thinking-simple-tasks': 'error',
|
|
157
198
|
'firebase-ai-logic/prefer-concise-property-names': 'error',
|
|
158
199
|
'firebase-ai-logic/require-thought-signature': 'error',
|
|
200
|
+
'firebase-ai-logic/check-temperature-defaults': 'error',
|
|
201
|
+
'firebase-ai-logic/check-media-resolution': 'error',
|
|
202
|
+
'firebase-ai-logic/validate-response-mime-type': 'error',
|
|
203
|
+
'firebase-ai-logic/validate-code-execution-config': 'error',
|
|
204
|
+
'firebase-ai-logic/validate-schema-structure': 'error',
|
|
205
|
+
'firebase-ai-logic/require-code-execution-handling': 'error',
|
|
206
|
+
'firebase-ai-logic/no-file-uri-with-code-execution': 'error',
|
|
207
|
+
'firebase-ai-logic/no-code-execution-creative-tasks': 'error',
|
|
208
|
+
'firebase-ai-logic/require-grounding-compliance': 'error',
|
|
209
|
+
'firebase-ai-logic/require-google-ai-backend-for-grounding': 'error',
|
|
210
|
+
'firebase-ai-logic/validate-multimodal-config': 'error',
|
|
159
211
|
};
|
|
160
212
|
// Flat config format (ESLint 9+)
|
|
161
213
|
const configs = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAEA,eAAe;AACf,kGAAoE;AACpE,0GAA2E;AAC3E,oHAAsF;AACtF,oGAAsE;AAEtE,8FAAiE;AAEjE,oFAAwD;AACxD,oGAAsE;AAEtE,4FAA8D;AAC9D,sGAAwE;AACxE,kHAAoF;AACpF,0GAA6E;AAE7E,8GAAiF;AACjF,kHAAoF;AACpF,0HAA4F;AAE5F,kGAAqE;AACrE,oGAAuE;AAEvE,4FAA+D;AAC/D,wGAA0E;AAC1E,gGAAmE;AACnE,0FAA6D;AAE7D,oHAAsF;AACtF,8GAAgF;AAEhF,sGAAwE;AACxE,sHAAuF;AAEvF,oHAAsF;AACtF,sGAAwE;AACxE,gHAAkF;AAElF,wGAA2E;AAE3E,MAAM,KAAK,GAAG;IACZ,mBAAmB;IACnB,wBAAwB,EAAE,mCAAmB;IAC7C,4BAA4B,EAAE,uCAAsB;IACpD,iCAAiC,EAAE,4CAA4B;IAC/D,yBAAyB,EAAE,oCAAoB;IAE/C,kBAAkB;IAClB,sBAAsB,EAAE,iCAAkB;IAE1C,2BAA2B;IAC3B,iBAAiB,EAAE,4BAAc;IACjC,yBAAyB,EAAE,oCAAoB;IAE/C,mBAAmB;IACnB,qBAAqB,EAAE,gCAAgB;IACvC,0BAA0B,EAAE,qCAAqB;IACjD,gCAAgC,EAAE,2CAA2B;IAC7D,4BAA4B,EAAE,uCAAwB;IAEtD,6BAA6B;IAC7B,8BAA8B,EAAE,yCAA0B;IAC1D,gCAAgC,EAAE,2CAA2B;IAC7D,oCAAoC,EAAE,+CAA+B;IAErE,2BAA2B;IAC3B,wBAAwB,EAAE,mCAAoB;IAC9C,yBAAyB,EAAE,oCAAqB;IAEhD,+BAA+B;IAC/B,qBAAqB,EAAE,gCAAiB;IACxC,2BAA2B,EAAE,sCAAsB;IACnD,uBAAuB,EAAE,kCAAmB;IAC5C,oBAAoB,EAAE,+BAAgB;IAEtC,qBAAqB;IACrB,iCAAiC,EAAE,4CAA4B;IAC/D,8BAA8B,EAAE,yCAAyB;IAEzD,8BAA8B;IAC9B,0BAA0B,EAAE,qCAAqB;IACjD,kCAAkC,EAAE,6CAA4B;IAEhE,2BAA2B;IAC3B,iCAAiC,EAAE,4CAA4B;IAC/D,0BAA0B,EAAE,qCAAqB;IACjD,+BAA+B,EAAE,0CAA0B;IAE3D,8BAA8B;IAC9B,2BAA2B,EAAE,sCAAuB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-media-resolution.d.ts","sourceRoot":"","sources":["../../src/rules/check-media-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAQnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA6ChB,CAAC;AAEF,eAAe,IAAI,CAAC"}
|