@neetru/cli 2.2.0 → 2.3.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/dist/commands/ai.js +82 -10
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/auth.d.ts +19 -0
- package/dist/commands/auth.js +203 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/index.js +134 -105
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/auth-discovery.d.ts +26 -0
- package/dist/lib/ai/auth-discovery.js +256 -0
- package/dist/lib/ai/auth-discovery.js.map +1 -0
- package/dist/lib/ai/orchestrator.d.ts +25 -0
- package/dist/lib/ai/orchestrator.js +167 -28
- package/dist/lib/ai/orchestrator.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,34 +2,80 @@ import Anthropic from '@anthropic-ai/sdk';
|
|
|
2
2
|
import OpenAI from 'openai';
|
|
3
3
|
import { config } from '../config.js';
|
|
4
4
|
import { NEETRU_SYSTEM_CONTEXT, loadProjectContext } from './context.js';
|
|
5
|
+
import { discoveredKeys } from './auth-discovery.js';
|
|
5
6
|
import { log } from '../../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a apiKey efetiva pra um provider. Prioridade:
|
|
9
|
+
* 1. Config local do Neetru (set via `neetru config set`).
|
|
10
|
+
* 2. Cred descoberta de Claude Code / Codex / Gemini CLIs concorrentes
|
|
11
|
+
* (auth-discovery).
|
|
12
|
+
*
|
|
13
|
+
* Não faz lookup repetido — caller pode chamar várias vezes sem custo
|
|
14
|
+
* (discovery é cacheada via module-level evaluation no detect call mas
|
|
15
|
+
* aqui rechamamos pra refletir mudanças em runtime).
|
|
16
|
+
*/
|
|
17
|
+
function resolveKey(provider) {
|
|
18
|
+
const configKey = provider === 'anthropic'
|
|
19
|
+
? 'anthropicApiKey'
|
|
20
|
+
: provider === 'openai'
|
|
21
|
+
? 'openaiApiKey'
|
|
22
|
+
: 'geminiApiKey';
|
|
23
|
+
const localKey = config.get(configKey);
|
|
24
|
+
if (localKey)
|
|
25
|
+
return localKey;
|
|
26
|
+
return discoveredKeys()[provider];
|
|
27
|
+
}
|
|
6
28
|
/**
|
|
7
29
|
* Escolhe o modelo mais adequado para um dado tipo de tarefa.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
30
|
+
*
|
|
31
|
+
* Heurísticas (em ordem):
|
|
32
|
+
* 1. Se user forçou um modelo (!= auto), respeita — desde que tenha cred.
|
|
33
|
+
* 2. Code generation pesado → OpenAI (gpt-4o codex-trained) se tiver.
|
|
34
|
+
* 3. Análise/arquitetura/raciocínio longo → Claude (sonnet 4.6).
|
|
35
|
+
* 4. Sumarização rápida / Q&A factual → Gemini (mais barato) se tiver.
|
|
36
|
+
* 5. Fallback: o primeiro provider com cred (claude > openai > gemini).
|
|
10
37
|
*/
|
|
11
|
-
function routeModel(input, preferred) {
|
|
12
|
-
|
|
13
|
-
|
|
38
|
+
export function routeModel(input, preferred) {
|
|
39
|
+
// Provedores efetivamente disponíveis (config OU discovery).
|
|
40
|
+
const available = {
|
|
41
|
+
claude: !!resolveKey('anthropic'),
|
|
42
|
+
openai: !!resolveKey('openai'),
|
|
43
|
+
gemini: !!resolveKey('gemini'),
|
|
44
|
+
};
|
|
45
|
+
if (preferred !== 'auto') {
|
|
46
|
+
if (preferred === 'claude' && available.claude)
|
|
47
|
+
return 'claude';
|
|
48
|
+
if (preferred === 'openai' && available.openai)
|
|
49
|
+
return 'openai';
|
|
50
|
+
if (preferred === 'gemini' && available.gemini)
|
|
51
|
+
return 'gemini';
|
|
52
|
+
// Pediu mas não tem cred — cai pra auto.
|
|
53
|
+
}
|
|
14
54
|
const lower = input.toLowerCase();
|
|
15
|
-
//
|
|
16
|
-
const isCodeGen =
|
|
17
|
-
|
|
18
|
-
lower.includes('escreva a função') ||
|
|
19
|
-
lower.includes('implemente');
|
|
20
|
-
const hasOpenAI = !!config.get('openaiApiKey');
|
|
21
|
-
if (isCodeGen && hasOpenAI)
|
|
55
|
+
// Code generation pesado → OpenAI
|
|
56
|
+
const isCodeGen = /\b(crie|gere|escreva|implemente|escreve|gera|cria)\s+(um|uma|o|a|essa|esse|esta|este)?\s*(componente|função|funcao|classe|módulo|modulo|arquivo|test|teste|endpoint|rota|hook|serviço|servico|api)\b/i.test(lower) || /^```|^class\s|^function\s|^const\s+\w+\s*=\s*\(/m.test(input);
|
|
57
|
+
if (isCodeGen && available.openai)
|
|
22
58
|
return 'openai';
|
|
23
|
-
|
|
59
|
+
// Sumarização rápida / Q&A factual → Gemini
|
|
60
|
+
const isQuickQa = /\b(o que é|o que e|defina|defina o|defina a|resuma|resume|sumariza|sumarize|que faz|para que serve)\b/i.test(lower) && input.length < 240;
|
|
61
|
+
if (isQuickQa && available.gemini)
|
|
62
|
+
return 'gemini';
|
|
63
|
+
// Default: Claude (arquitetura, análise, raciocínio).
|
|
64
|
+
if (available.claude)
|
|
65
|
+
return 'claude';
|
|
66
|
+
if (available.openai)
|
|
67
|
+
return 'openai';
|
|
68
|
+
if (available.gemini)
|
|
69
|
+
return 'gemini';
|
|
70
|
+
// Sem creds em lugar nenhum — joga erro descritivo. Caller pode oferecer
|
|
71
|
+
// `neetru auth setup` antes de tentar.
|
|
72
|
+
throw new Error('Nenhum provedor de IA configurado. Rode: neetru auth setup');
|
|
24
73
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Stream de resposta via Claude (claude-sonnet-4-5 ou superior).
|
|
27
|
-
* Retorna o texto completo ao final.
|
|
28
|
-
*/
|
|
29
74
|
async function streamClaude(messages, systemExtra, onChunk) {
|
|
30
|
-
const apiKey =
|
|
31
|
-
if (!apiKey)
|
|
32
|
-
throw new Error('
|
|
75
|
+
const apiKey = resolveKey('anthropic');
|
|
76
|
+
if (!apiKey) {
|
|
77
|
+
throw new Error('Cred Claude/Anthropic ausente. Rode `neetru auth setup` ou `neetru config set anthropicApiKey <sk-ant-...>`');
|
|
78
|
+
}
|
|
33
79
|
const client = new Anthropic({ apiKey });
|
|
34
80
|
const system = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
|
|
35
81
|
let full = '';
|
|
@@ -48,13 +94,11 @@ async function streamClaude(messages, systemExtra, onChunk) {
|
|
|
48
94
|
}
|
|
49
95
|
return full;
|
|
50
96
|
}
|
|
51
|
-
/**
|
|
52
|
-
* Stream de resposta via OpenAI (gpt-4o).
|
|
53
|
-
*/
|
|
54
97
|
async function streamOpenAI(messages, systemExtra, onChunk) {
|
|
55
|
-
const apiKey =
|
|
56
|
-
if (!apiKey)
|
|
57
|
-
throw new Error('
|
|
98
|
+
const apiKey = resolveKey('openai');
|
|
99
|
+
if (!apiKey) {
|
|
100
|
+
throw new Error('Cred OpenAI ausente. Rode `neetru auth setup` ou `neetru config set openaiApiKey <sk-...>`');
|
|
101
|
+
}
|
|
58
102
|
const client = new OpenAI({ apiKey });
|
|
59
103
|
const systemContent = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
|
|
60
104
|
let full = '';
|
|
@@ -75,6 +119,65 @@ async function streamOpenAI(messages, systemExtra, onChunk) {
|
|
|
75
119
|
}
|
|
76
120
|
return full;
|
|
77
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Stream via Gemini. Usa a REST API REST `streamGenerateContent` direto
|
|
124
|
+
* (sem dependência extra). Modelo: gemini-1.5-flash (rápido + barato).
|
|
125
|
+
*/
|
|
126
|
+
async function streamGemini(messages, systemExtra, onChunk) {
|
|
127
|
+
const apiKey = resolveKey('gemini');
|
|
128
|
+
if (!apiKey) {
|
|
129
|
+
throw new Error('Cred Gemini ausente. Rode `neetru auth setup` ou `neetru config set geminiApiKey <key>`');
|
|
130
|
+
}
|
|
131
|
+
const systemContent = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
|
|
132
|
+
// Gemini API expects user/model roles (não assistant). Converte.
|
|
133
|
+
const contents = messages.map((m) => ({
|
|
134
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
135
|
+
parts: [{ text: m.content }],
|
|
136
|
+
}));
|
|
137
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:streamGenerateContent?alt=sse&key=${encodeURIComponent(apiKey)}`;
|
|
138
|
+
const resp = await fetch(url, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: { 'content-type': 'application/json' },
|
|
141
|
+
body: JSON.stringify({
|
|
142
|
+
systemInstruction: { parts: [{ text: systemContent }] },
|
|
143
|
+
contents,
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
146
|
+
if (!resp.ok || !resp.body) {
|
|
147
|
+
const txt = await resp.text().catch(() => '');
|
|
148
|
+
throw new Error(`Gemini API erro ${resp.status}: ${txt.slice(0, 200)}`);
|
|
149
|
+
}
|
|
150
|
+
let full = '';
|
|
151
|
+
const reader = resp.body.getReader();
|
|
152
|
+
const dec = new TextDecoder();
|
|
153
|
+
let buf = '';
|
|
154
|
+
while (true) {
|
|
155
|
+
const { value, done } = await reader.read();
|
|
156
|
+
if (done)
|
|
157
|
+
break;
|
|
158
|
+
buf += dec.decode(value, { stream: true });
|
|
159
|
+
// SSE: linhas começando com "data: "
|
|
160
|
+
const lines = buf.split('\n');
|
|
161
|
+
buf = lines.pop() ?? '';
|
|
162
|
+
for (const line of lines) {
|
|
163
|
+
const m = line.match(/^data:\s*(.*)$/);
|
|
164
|
+
if (!m)
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const obj = JSON.parse(m[1]);
|
|
168
|
+
const txt = obj?.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
169
|
+
if (typeof txt === 'string' && txt) {
|
|
170
|
+
onChunk(txt);
|
|
171
|
+
full += txt;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// ignora linha de keep-alive
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return full;
|
|
180
|
+
}
|
|
78
181
|
/**
|
|
79
182
|
* Orquestrador principal: decide o modelo, injeta contexto Neetru,
|
|
80
183
|
* faz stream da resposta e retorna o texto completo.
|
|
@@ -84,9 +187,45 @@ export async function chat(messages, onChunk, preferred) {
|
|
|
84
187
|
const model = routeModel(lastUserMsg, preferred ?? config.get('defaultModel') ?? 'auto');
|
|
85
188
|
const projectCtx = await loadProjectContext();
|
|
86
189
|
log.dim(`modelo: ${model}`);
|
|
87
|
-
if (model === 'openai')
|
|
190
|
+
if (model === 'openai')
|
|
88
191
|
return streamOpenAI(messages, projectCtx, onChunk);
|
|
89
|
-
|
|
192
|
+
if (model === 'gemini')
|
|
193
|
+
return streamGemini(messages, projectCtx, onChunk);
|
|
90
194
|
return streamClaude(messages, projectCtx, onChunk);
|
|
91
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Spawn N agents concorrentes pra mesma pergunta. Útil pra "team mode":
|
|
198
|
+
* pega N opiniões e o caller decide o que fazer. Retorna array com
|
|
199
|
+
* {model, response} pra cada um.
|
|
200
|
+
*
|
|
201
|
+
* Limite: spawn só até a quantidade de providers com cred. Se pedir 5 mas
|
|
202
|
+
* só tem 2 providers configurados, roda 2.
|
|
203
|
+
*/
|
|
204
|
+
export async function chatParallel(prompt, systemExtra) {
|
|
205
|
+
const targets = [];
|
|
206
|
+
if (resolveKey('anthropic'))
|
|
207
|
+
targets.push('claude');
|
|
208
|
+
if (resolveKey('openai'))
|
|
209
|
+
targets.push('openai');
|
|
210
|
+
if (resolveKey('gemini'))
|
|
211
|
+
targets.push('gemini');
|
|
212
|
+
if (targets.length === 0) {
|
|
213
|
+
throw new Error('Nenhum provedor configurado. Rode: neetru auth setup');
|
|
214
|
+
}
|
|
215
|
+
const messages = [{ role: 'user', content: prompt }];
|
|
216
|
+
const noop = () => { };
|
|
217
|
+
const results = await Promise.allSettled(targets.map(async (m) => {
|
|
218
|
+
let response = '';
|
|
219
|
+
if (m === 'claude')
|
|
220
|
+
response = await streamClaude(messages, systemExtra, noop);
|
|
221
|
+
else if (m === 'openai')
|
|
222
|
+
response = await streamOpenAI(messages, systemExtra, noop);
|
|
223
|
+
else
|
|
224
|
+
response = await streamGemini(messages, systemExtra, noop);
|
|
225
|
+
return { model: m, response };
|
|
226
|
+
}));
|
|
227
|
+
return results.map((r, i) => r.status === 'fulfilled'
|
|
228
|
+
? { model: targets[i], response: r.value.response, ok: true }
|
|
229
|
+
: { model: targets[i], response: '', ok: false, error: String(r.reason?.message ?? r.reason) });
|
|
230
|
+
}
|
|
92
231
|
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/ai/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAS5C
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/ai/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED