tachibot-mcp 2.0.5 → 2.0.7
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/.env.example +5 -2
- package/dist/src/config/model-constants.js +85 -72
- package/dist/src/config/model-preferences.js +5 -4
- package/dist/src/config.js +2 -1
- package/dist/src/mcp-client.js +3 -3
- package/dist/src/modes/scout.js +2 -1
- package/dist/src/optimization/model-router.js +19 -16
- package/dist/src/orchestrator-instructions.js +1 -1
- package/dist/src/orchestrator-lite.js +1 -1
- package/dist/src/orchestrator.js +1 -1
- package/dist/src/profiles/balanced.js +1 -2
- package/dist/src/profiles/code_focus.js +1 -2
- package/dist/src/profiles/full.js +1 -2
- package/dist/src/profiles/minimal.js +1 -2
- package/dist/src/profiles/research_power.js +1 -2
- package/dist/src/server.js +13 -12
- package/dist/src/tools/gemini-tools.js +15 -16
- package/dist/src/tools/grok-enhanced.js +21 -17
- package/dist/src/tools/grok-tools.js +26 -20
- package/dist/src/tools/openai-tools.js +28 -61
- package/dist/src/tools/tool-router.js +53 -52
- package/dist/src/tools/unified-ai-provider.js +1 -1
- package/dist/src/tools/workflow-runner.js +16 -0
- package/dist/src/tools/workflow-validator-tool.js +1 -1
- package/dist/src/utils/api-keys.js +20 -0
- package/dist/src/validators/interpolation-validator.js +4 -0
- package/dist/src/validators/tool-registry-validator.js +1 -1
- package/dist/src/validators/tool-types.js +0 -1
- package/dist/src/workflows/custom-workflows.js +4 -3
- package/dist/src/workflows/engine/VariableInterpolator.js +30 -3
- package/dist/src/workflows/engine/WorkflowExecutionEngine.js +2 -2
- package/dist/src/workflows/engine/WorkflowOutputFormatter.js +27 -4
- package/dist/src/workflows/fallback-strategies.js +2 -2
- package/dist/src/workflows/model-router.js +30 -5
- package/dist/src/workflows/tool-mapper.js +41 -14
- package/docs/API_KEYS.md +10 -6
- package/docs/TOOLS_REFERENCE.md +7 -43
- package/package.json +1 -1
- package/profiles/balanced.json +1 -2
- package/profiles/code_focus.json +1 -2
- package/profiles/debug_intensive.json +0 -1
- package/profiles/full.json +2 -3
- package/profiles/minimal.json +1 -2
- package/profiles/research_power.json +1 -2
- package/profiles/workflow_builder.json +1 -2
- package/smithery.yaml +2 -2
- package/tools.config.json +15 -3
- package/workflows/code-architecture-review.yaml +5 -3
- package/workflows/creative-brainstorm-yaml.yaml +1 -1
- package/workflows/pingpong.yaml +5 -3
- package/workflows/system/README.md +1 -1
- package/workflows/system/verifier.yaml +8 -5
- package/workflows/ultra-creative-brainstorm.yaml +3 -3
package/.env.example
CHANGED
|
@@ -22,8 +22,11 @@ TACHIBOT_PROFILE=balanced
|
|
|
22
22
|
# Perplexity API (for web search, research, reasoning)
|
|
23
23
|
PERPLEXITY_API_KEY=
|
|
24
24
|
|
|
25
|
-
# Grok API (for code analysis, debugging, architecture)
|
|
26
|
-
|
|
25
|
+
# Grok/xAI API (for code analysis, debugging, architecture)
|
|
26
|
+
# Get from: https://console.x.ai/
|
|
27
|
+
XAI_API_KEY=
|
|
28
|
+
# Legacy alias (both work):
|
|
29
|
+
# GROK_API_KEY=
|
|
27
30
|
|
|
28
31
|
# OpenAI API (for GPT-5, analysis, comparison)
|
|
29
32
|
OPENAI_API_KEY=
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
* Centralized Model Names and Constants
|
|
3
3
|
* Use these constants instead of hardcoded strings in workflows and tools
|
|
4
4
|
*/
|
|
5
|
-
// OpenAI GPT-5
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
// OpenAI GPT-5 Models (November 2025) - Optimized for Claude Code MCP
|
|
6
|
+
// Verified via Perplexity + OpenAI API docs
|
|
7
|
+
// Strategy: Use codex for code (80%), flagship for reasoning, pro for orchestration
|
|
8
|
+
// NOTE: Codex models use /v1/responses endpoint, non-codex use /v1/chat/completions
|
|
9
|
+
export const GPT5_MODELS = {
|
|
10
|
+
// General purpose (use /v1/chat/completions)
|
|
11
|
+
FULL: "gpt-5.1", // Flagship: reasoning/fallback ($10/$30, 2M context)
|
|
12
|
+
PRO: "gpt-5-pro", // Premium: complex orchestration ($20/$60, 4M context, 2x cost)
|
|
13
|
+
// Code specialized (use /v1/responses endpoint!)
|
|
14
|
+
CODEX_MINI: "gpt-5.1-codex-mini", // Workhorse: 70-80% of code tasks ($2/$6, 256K) ⚡ CHEAP!
|
|
15
|
+
CODEX: "gpt-5.1-codex", // Power: complex code tasks ($15/$45, 1M context)
|
|
16
|
+
CODEX_MAX: "gpt-5.1-codex-max", // Frontier: BEST for deep analysis & multi-file refactoring (pricing TBD)
|
|
17
|
+
// REMOVED: MINI (redundant - codex-mini better for code), NANO (too weak)
|
|
10
18
|
};
|
|
19
|
+
// Backward compatibility alias
|
|
20
|
+
export const GPT51_MODELS = GPT5_MODELS;
|
|
11
21
|
// GPT-5.1 Reasoning Effort Levels
|
|
12
22
|
export const GPT51_REASONING = {
|
|
13
23
|
NONE: "none", // No extra reasoning (fastest, cheapest)
|
|
@@ -17,12 +27,15 @@ export const GPT51_REASONING = {
|
|
|
17
27
|
};
|
|
18
28
|
// OpenAI GPT-4 Models (Legacy - mapped to GPT-5.1)
|
|
19
29
|
export const GPT4_MODELS = {
|
|
20
|
-
O_MINI: "gpt-5
|
|
21
|
-
O: "gpt-5.1", // Current best
|
|
30
|
+
O_MINI: "gpt-5-mini", // Cost-efficient (mapped to GPT-5 mini)
|
|
31
|
+
O: "gpt-5.1", // Current best (mapped to GPT-5.1 flagship)
|
|
22
32
|
_1_MINI: "gpt-4.1-mini", // Best value with 1M context
|
|
23
33
|
};
|
|
24
34
|
// Google Gemini Models (2025)
|
|
25
35
|
export const GEMINI_MODELS = {
|
|
36
|
+
// Gemini 3 (November 2025 - Latest)
|
|
37
|
+
GEMINI_3_PRO: "gemini-3-pro-preview", // Latest with enhanced structured outputs & multimodal, 1M context
|
|
38
|
+
// Gemini 2.5 (Previous generation)
|
|
26
39
|
FLASH: "gemini-2.5-flash", // Latest fast model
|
|
27
40
|
PRO: "gemini-2.5-pro", // Most advanced reasoning
|
|
28
41
|
FLASH_LITE: "gemini-2.5-flash-lite", // Cost-effective
|
|
@@ -32,11 +45,14 @@ export const PERPLEXITY_MODELS = {
|
|
|
32
45
|
SONAR_PRO: "sonar-pro", // Main search model
|
|
33
46
|
SONAR_REASONING: "sonar-reasoning-pro", // Reasoning model
|
|
34
47
|
};
|
|
35
|
-
// Grok Models (xAI) - Updated 2025-11-
|
|
48
|
+
// Grok Models (xAI) - Updated 2025-11-22 with correct API model names
|
|
36
49
|
export const GROK_MODELS = {
|
|
37
|
-
//
|
|
50
|
+
// Grok 4.1 models (Nov 2025) - LATEST & BEST
|
|
51
|
+
_4_1_FAST_REASONING: "grok-4-1-fast-reasoning", // Latest: 2M context, $0.20/$0.50, enhanced reasoning
|
|
52
|
+
_4_1_FAST_NON_REASONING: "grok-4-1-fast-non-reasoning", // Tool-calling optimized: 2M context, $0.20/$0.50
|
|
53
|
+
// Grok 4 fast models (2025) - Still good
|
|
38
54
|
CODE_FAST: "grok-code-fast-1", // Coding specialist: 256K→2M, $0.20/$1.50, 92 tok/sec
|
|
39
|
-
_4_FAST_REASONING: "grok-4-fast-reasoning", // Cheap reasoning: 2M→4M, $0.20/$0.50
|
|
55
|
+
_4_FAST_REASONING: "grok-4-fast-reasoning", // Cheap reasoning: 2M→4M, $0.20/$0.50
|
|
40
56
|
_4_FAST: "grok-4-fast-non-reasoning", // Fast general: 2M→4M, $0.20/$0.50
|
|
41
57
|
// Expensive/specialized (use sparingly)
|
|
42
58
|
_4_HEAVY: "grok-4-0709", // Multi-agent: 256K→2M, $3/$15 (expensive!)
|
|
@@ -62,154 +78,151 @@ export const DEFAULT_WORKFLOW_SETTINGS = {
|
|
|
62
78
|
retries: 3,
|
|
63
79
|
timeout: 30000, // 30 seconds
|
|
64
80
|
};
|
|
65
|
-
//
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// CURRENT_MODELS - SINGLE BUMP POINT FOR MODEL VERSIONS
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// When new models release, update ONLY this section!
|
|
85
|
+
// All tools automatically use the new models.
|
|
86
|
+
// ============================================================================
|
|
87
|
+
export const CURRENT_MODELS = {
|
|
88
|
+
openai: {
|
|
89
|
+
reason: GPT5_MODELS.PRO, // Deep reasoning
|
|
90
|
+
brainstorm: GPT5_MODELS.FULL, // Creative ideation
|
|
91
|
+
code: GPT5_MODELS.CODEX_MINI, // Code tasks (cheap & fast)
|
|
92
|
+
explain: GPT5_MODELS.CODEX_MINI, // Explanations
|
|
93
|
+
},
|
|
94
|
+
grok: {
|
|
95
|
+
reason: GROK_MODELS._4_1_FAST_REASONING,
|
|
96
|
+
code: GROK_MODELS._4_1_FAST_NON_REASONING,
|
|
97
|
+
debug: GROK_MODELS._4_1_FAST_NON_REASONING,
|
|
98
|
+
brainstorm: GROK_MODELS._4_1_FAST_REASONING,
|
|
99
|
+
search: GROK_MODELS._4_1_FAST_REASONING,
|
|
100
|
+
architect: GROK_MODELS._4_1_FAST_REASONING,
|
|
101
|
+
},
|
|
102
|
+
gemini: {
|
|
103
|
+
default: GEMINI_MODELS.GEMINI_3_PRO,
|
|
104
|
+
},
|
|
105
|
+
perplexity: {
|
|
106
|
+
search: PERPLEXITY_MODELS.SONAR_PRO,
|
|
107
|
+
reason: PERPLEXITY_MODELS.SONAR_REASONING,
|
|
108
|
+
},
|
|
109
|
+
openrouter: {
|
|
110
|
+
kimi: KIMI_MODELS.K2_THINKING,
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
// Tool-specific defaults - References CURRENT_MODELS for easy bumping
|
|
66
114
|
export const TOOL_DEFAULTS = {
|
|
67
|
-
// OpenAI
|
|
68
|
-
|
|
69
|
-
model:
|
|
115
|
+
// OpenAI tools
|
|
116
|
+
openai_reason: {
|
|
117
|
+
model: CURRENT_MODELS.openai.reason,
|
|
70
118
|
reasoning_effort: GPT51_REASONING.HIGH,
|
|
71
119
|
maxTokens: 4000,
|
|
72
120
|
temperature: 0.7,
|
|
73
121
|
},
|
|
74
122
|
openai_brainstorm: {
|
|
75
|
-
model:
|
|
123
|
+
model: CURRENT_MODELS.openai.brainstorm,
|
|
76
124
|
reasoning_effort: GPT51_REASONING.MEDIUM,
|
|
77
125
|
maxTokens: 2000,
|
|
78
126
|
temperature: 0.9,
|
|
79
127
|
},
|
|
80
|
-
openai_compare: {
|
|
81
|
-
model: GPT51_MODELS.CODEX_MINI,
|
|
82
|
-
reasoning_effort: GPT51_REASONING.LOW,
|
|
83
|
-
maxTokens: 2000,
|
|
84
|
-
temperature: 0.7,
|
|
85
|
-
},
|
|
86
128
|
openai_code_review: {
|
|
87
|
-
model:
|
|
129
|
+
model: CURRENT_MODELS.openai.code,
|
|
88
130
|
reasoning_effort: GPT51_REASONING.MEDIUM,
|
|
89
131
|
maxTokens: 2000,
|
|
90
132
|
temperature: 0.3,
|
|
91
133
|
},
|
|
92
134
|
openai_explain: {
|
|
93
|
-
model:
|
|
135
|
+
model: CURRENT_MODELS.openai.explain,
|
|
94
136
|
reasoning_effort: GPT51_REASONING.LOW,
|
|
95
137
|
maxTokens: 1500,
|
|
96
138
|
temperature: 0.7,
|
|
97
139
|
},
|
|
98
140
|
// Gemini tools
|
|
99
|
-
gemini_query: {
|
|
100
|
-
model: GEMINI_MODELS.PRO,
|
|
101
|
-
maxTokens: 2048,
|
|
102
|
-
temperature: 0.7,
|
|
103
|
-
},
|
|
104
141
|
gemini_brainstorm: {
|
|
105
|
-
model:
|
|
142
|
+
model: CURRENT_MODELS.gemini.default,
|
|
106
143
|
maxTokens: 2048,
|
|
107
144
|
temperature: 0.9,
|
|
108
145
|
},
|
|
109
146
|
gemini_analyze_code: {
|
|
110
|
-
model:
|
|
147
|
+
model: CURRENT_MODELS.gemini.default,
|
|
111
148
|
maxTokens: 2048,
|
|
112
149
|
temperature: 0.3,
|
|
113
150
|
},
|
|
114
151
|
gemini_analyze_text: {
|
|
115
|
-
model:
|
|
152
|
+
model: CURRENT_MODELS.gemini.default,
|
|
116
153
|
maxTokens: 2048,
|
|
117
154
|
temperature: 0.5,
|
|
118
155
|
},
|
|
119
156
|
// Perplexity tools
|
|
120
157
|
perplexity_ask: {
|
|
121
|
-
model:
|
|
158
|
+
model: CURRENT_MODELS.perplexity.search,
|
|
122
159
|
maxTokens: 2000,
|
|
123
160
|
temperature: 0.7,
|
|
124
161
|
},
|
|
125
162
|
perplexity_reason: {
|
|
126
|
-
model:
|
|
163
|
+
model: CURRENT_MODELS.perplexity.reason,
|
|
127
164
|
maxTokens: 4000,
|
|
128
165
|
temperature: 0.7,
|
|
129
166
|
},
|
|
130
167
|
perplexity_research: {
|
|
131
|
-
model:
|
|
168
|
+
model: CURRENT_MODELS.perplexity.search,
|
|
132
169
|
maxTokens: 3000,
|
|
133
170
|
temperature: 0.7,
|
|
134
171
|
},
|
|
135
|
-
// Grok tools
|
|
136
|
-
grok: {
|
|
137
|
-
model: GROK_MODELS._4_FAST_REASONING, // Changed: 3x cheaper output
|
|
138
|
-
maxTokens: 4000,
|
|
139
|
-
temperature: 0.7,
|
|
140
|
-
},
|
|
172
|
+
// Grok tools
|
|
141
173
|
grok_reason: {
|
|
142
|
-
model:
|
|
174
|
+
model: CURRENT_MODELS.grok.reason,
|
|
143
175
|
maxTokens: 8000,
|
|
144
176
|
temperature: 0.7,
|
|
145
177
|
},
|
|
146
178
|
grok_code: {
|
|
147
|
-
model:
|
|
179
|
+
model: CURRENT_MODELS.grok.code,
|
|
148
180
|
maxTokens: 4000,
|
|
149
181
|
temperature: 0.3,
|
|
150
182
|
},
|
|
151
183
|
grok_search: {
|
|
152
|
-
model:
|
|
184
|
+
model: CURRENT_MODELS.grok.search,
|
|
153
185
|
maxTokens: 3000,
|
|
154
186
|
temperature: 0.7,
|
|
155
187
|
},
|
|
156
188
|
grok_brainstorm: {
|
|
157
|
-
model:
|
|
189
|
+
model: CURRENT_MODELS.grok.brainstorm,
|
|
158
190
|
maxTokens: 4000,
|
|
159
191
|
temperature: 0.9,
|
|
160
192
|
},
|
|
161
193
|
grok_architect: {
|
|
162
|
-
model:
|
|
194
|
+
model: CURRENT_MODELS.grok.architect,
|
|
163
195
|
maxTokens: 4000,
|
|
164
196
|
temperature: 0.6,
|
|
165
197
|
},
|
|
166
198
|
grok_debug: {
|
|
167
|
-
model:
|
|
199
|
+
model: CURRENT_MODELS.grok.debug,
|
|
168
200
|
maxTokens: 3000,
|
|
169
201
|
temperature: 0.3,
|
|
170
202
|
},
|
|
171
|
-
//
|
|
203
|
+
// OpenRouter tools
|
|
172
204
|
qwen_coder: {
|
|
173
205
|
maxTokens: 4000,
|
|
174
206
|
temperature: 0.5,
|
|
175
207
|
},
|
|
176
|
-
// Kimi tools (via OpenRouter)
|
|
177
208
|
kimi_thinking: {
|
|
178
|
-
model:
|
|
179
|
-
maxTokens: 16000,
|
|
180
|
-
temperature: 0.7,
|
|
209
|
+
model: CURRENT_MODELS.openrouter.kimi,
|
|
210
|
+
maxTokens: 16000,
|
|
211
|
+
temperature: 0.7,
|
|
181
212
|
},
|
|
182
|
-
// Meta tools
|
|
213
|
+
// Meta tools
|
|
183
214
|
think: {
|
|
184
|
-
model:
|
|
215
|
+
model: CURRENT_MODELS.openai.reason,
|
|
185
216
|
reasoning_effort: GPT51_REASONING.HIGH,
|
|
186
217
|
maxTokens: 500,
|
|
187
218
|
temperature: 0.7,
|
|
188
219
|
},
|
|
189
220
|
focus: {
|
|
190
|
-
model:
|
|
221
|
+
model: CURRENT_MODELS.openai.code,
|
|
191
222
|
reasoning_effort: GPT51_REASONING.LOW,
|
|
192
223
|
maxTokens: 2000,
|
|
193
224
|
temperature: 0.8,
|
|
194
225
|
},
|
|
195
|
-
code_reviewer: {
|
|
196
|
-
model: GPT51_MODELS.CODEX_MINI,
|
|
197
|
-
reasoning_effort: GPT51_REASONING.MEDIUM,
|
|
198
|
-
maxTokens: 2000,
|
|
199
|
-
temperature: 0.5,
|
|
200
|
-
},
|
|
201
|
-
test_architect: {
|
|
202
|
-
model: GPT51_MODELS.CODEX_MINI,
|
|
203
|
-
reasoning_effort: GPT51_REASONING.MEDIUM,
|
|
204
|
-
maxTokens: 2000,
|
|
205
|
-
temperature: 0.6,
|
|
206
|
-
},
|
|
207
|
-
documentation_writer: {
|
|
208
|
-
model: GPT51_MODELS.CODEX_MINI,
|
|
209
|
-
reasoning_effort: GPT51_REASONING.LOW,
|
|
210
|
-
maxTokens: 2000,
|
|
211
|
-
temperature: 0.7,
|
|
212
|
-
},
|
|
213
226
|
};
|
|
214
227
|
// Default tool to use in workflows if not specified
|
|
215
228
|
export const DEFAULT_WORKFLOW_TOOL = "openai_brainstorm";
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Model Preferences Configuration
|
|
3
3
|
* Allows users to set their preferred models based on available API tokens
|
|
4
4
|
*/
|
|
5
|
+
import { hasGrokApiKey } from "../utils/api-keys.js";
|
|
5
6
|
/**
|
|
6
7
|
* Default model configurations with user preferences
|
|
7
8
|
*/
|
|
@@ -37,7 +38,7 @@ export class ModelPreferencesManager {
|
|
|
37
38
|
this.preferences.enableExpensiveModels = true;
|
|
38
39
|
}
|
|
39
40
|
if (preferO3) {
|
|
40
|
-
this.preferences.primaryReasoning = "
|
|
41
|
+
this.preferences.primaryReasoning = "openai_reason";
|
|
41
42
|
this.preferences.enableExpensiveModels = true;
|
|
42
43
|
}
|
|
43
44
|
// Load model-specific overrides from environment
|
|
@@ -63,7 +64,7 @@ export class ModelPreferencesManager {
|
|
|
63
64
|
};
|
|
64
65
|
}
|
|
65
66
|
// Grok configuration
|
|
66
|
-
if (
|
|
67
|
+
if (hasGrokApiKey()) {
|
|
67
68
|
this.preferences.modelOverrides["grok_reason"] = {
|
|
68
69
|
enabled: true,
|
|
69
70
|
priority: parseInt(process.env.GROK_PRIORITY || "2"),
|
|
@@ -122,7 +123,7 @@ export class ModelPreferencesManager {
|
|
|
122
123
|
*/
|
|
123
124
|
initializeModels() {
|
|
124
125
|
// Check which APIs are available
|
|
125
|
-
const hasGrok =
|
|
126
|
+
const hasGrok = hasGrokApiKey();
|
|
126
127
|
const hasOpenAI = !!process.env.OPENAI_API_KEY;
|
|
127
128
|
const hasGemini = !!process.env.GOOGLE_API_KEY;
|
|
128
129
|
const hasPerplexity = !!process.env.PERPLEXITY_API_KEY;
|
|
@@ -348,7 +349,7 @@ export class ModelPreferencesManager {
|
|
|
348
349
|
*/
|
|
349
350
|
getRecommendations() {
|
|
350
351
|
const recommendations = [];
|
|
351
|
-
const hasGrok =
|
|
352
|
+
const hasGrok = hasGrokApiKey();
|
|
352
353
|
const hasOpenAI = !!process.env.OPENAI_API_KEY;
|
|
353
354
|
if (hasGrok && !this.preferences.enableExpensiveModels) {
|
|
354
355
|
recommendations.push("You have Grok API access. Enable ENABLE_EXPENSIVE_MODELS=true to use Grok Heavy (256k context).");
|
package/dist/src/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { config } from 'dotenv';
|
|
2
2
|
import { TechnicalDomain } from './reasoning-chain.js';
|
|
3
|
+
import { getGrokApiKey } from './utils/api-keys.js';
|
|
3
4
|
import * as path from 'path';
|
|
4
5
|
import { fileURLToPath } from 'url';
|
|
5
6
|
// Get the directory of the current module
|
|
@@ -72,7 +73,7 @@ export function loadConfig() {
|
|
|
72
73
|
gemini: process.env.GOOGLE_API_KEY,
|
|
73
74
|
deepseek: process.env.DEEPSEEK_API_KEY,
|
|
74
75
|
perplexity: process.env.PERPLEXITY_API_KEY,
|
|
75
|
-
grok:
|
|
76
|
+
grok: getGrokApiKey(),
|
|
76
77
|
qwen: process.env.QWEN_API_KEY,
|
|
77
78
|
},
|
|
78
79
|
preferences: {
|
package/dist/src/mcp-client.js
CHANGED
|
@@ -10,7 +10,7 @@ export class MCPClient {
|
|
|
10
10
|
this.availableTools = new Set([
|
|
11
11
|
'mcp__gemini__gemini-brainstorm',
|
|
12
12
|
'mcp__perplexity-ask__perplexity_research',
|
|
13
|
-
'mcp__openai-
|
|
13
|
+
'mcp__openai-mcp__openai_reason',
|
|
14
14
|
'mcp__openai-mcp__openai_brainstorm',
|
|
15
15
|
'mcp__think-mcp-server__think',
|
|
16
16
|
'mcp__devlog-search__search_devlogs',
|
|
@@ -55,7 +55,7 @@ export class MCPClient {
|
|
|
55
55
|
content: params.prompt || params.query
|
|
56
56
|
}]
|
|
57
57
|
};
|
|
58
|
-
case 'mcp__openai-
|
|
58
|
+
case 'mcp__openai-mcp__openai_reason':
|
|
59
59
|
return {
|
|
60
60
|
query: params.prompt || params.query,
|
|
61
61
|
context: params.context
|
|
@@ -77,7 +77,7 @@ export class MCPClient {
|
|
|
77
77
|
const descriptions = {
|
|
78
78
|
'mcp__gemini__gemini-brainstorm': 'Creative brainstorming with Gemini',
|
|
79
79
|
'mcp__perplexity-ask__perplexity_research': 'Deep research with citations',
|
|
80
|
-
'mcp__openai-
|
|
80
|
+
'mcp__openai-mcp__openai_reason': 'Mathematical/logical reasoning (GPT-5-mini)',
|
|
81
81
|
'mcp__openai-mcp__openai_brainstorm': 'Alternative perspective generation',
|
|
82
82
|
'mcp__think-mcp-server__think': 'Reflective thinking scratchpad'
|
|
83
83
|
};
|
package/dist/src/modes/scout.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ModelRouter } from '../workflows/model-router.js';
|
|
2
2
|
import { getScoutModels, getDefaultModels } from '../config/model-defaults.js';
|
|
3
|
+
import { getGrokApiKey } from '../utils/api-keys.js';
|
|
3
4
|
import { createProgressStream } from '../utils/progress-stream.js';
|
|
4
5
|
import { providerRouter } from '../utils/provider-router.js';
|
|
5
6
|
import { getSmartTimeout } from '../config/timeout-config.js';
|
|
@@ -66,7 +67,7 @@ export class Scout {
|
|
|
66
67
|
};
|
|
67
68
|
// Load configuration from environment
|
|
68
69
|
this.defaultSearchProvider = process.env.DEFAULT_SEARCH_PROVIDER || 'perplexity';
|
|
69
|
-
this.grokApiKey =
|
|
70
|
+
this.grokApiKey = getGrokApiKey();
|
|
70
71
|
this.perplexityApiKey = process.env.PERPLEXITY_API_KEY;
|
|
71
72
|
this.modelRouter = new ModelRouter();
|
|
72
73
|
// Load model configurations
|
|
@@ -4,27 +4,30 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export var ModelTier;
|
|
6
6
|
(function (ModelTier) {
|
|
7
|
-
// Tier 0:
|
|
8
|
-
ModelTier["ULTRA_CHEAP"] = "gpt-5-
|
|
7
|
+
// Tier 0: Cheapest - GPT-5.1 Codex Mini
|
|
8
|
+
ModelTier["ULTRA_CHEAP"] = "gpt-5.1-codex-mini";
|
|
9
9
|
// Tier 1: Ultra Fast & Cheap (< $0.001 per request)
|
|
10
10
|
ModelTier["ULTRA_EFFICIENT"] = "gemini-2.5-flash";
|
|
11
|
-
ModelTier["EFFICIENT"] = "gpt-5-mini";
|
|
11
|
+
ModelTier["EFFICIENT"] = "gpt-5.1-codex-mini";
|
|
12
12
|
// Tier 2: Balanced ($0.001-$0.01 per request)
|
|
13
|
-
ModelTier["STANDARD"] = "gpt-5";
|
|
14
|
-
ModelTier["GPT5_MINI"] = "gpt-5-mini";
|
|
13
|
+
ModelTier["STANDARD"] = "gpt-5.1-codex";
|
|
14
|
+
ModelTier["GPT5_MINI"] = "gpt-5.1-codex-mini";
|
|
15
15
|
// Tier 3: Advanced ($0.01-$0.05 per request)
|
|
16
16
|
ModelTier["WEB_SEARCH"] = "perplexity-sonar-pro";
|
|
17
17
|
// Tier 4: Premium (Use with caution)
|
|
18
|
-
ModelTier["GPT5_FULL"] = "gpt-5";
|
|
18
|
+
ModelTier["GPT5_FULL"] = "gpt-5.1";
|
|
19
19
|
})(ModelTier || (ModelTier = {}));
|
|
20
20
|
const MODEL_COSTS = {
|
|
21
|
-
// GPT-5 Models (Nov 2025 pricing)
|
|
22
|
-
"gpt-5-
|
|
23
|
-
"gpt-5-
|
|
24
|
-
"gpt-5": { input: 0.
|
|
25
|
-
|
|
21
|
+
// GPT-5.1 Models (Nov 2025 pricing) - ACTUAL API MODEL NAMES
|
|
22
|
+
"gpt-5.1-codex-mini": { input: 0.002, output: 0.006, latency: 800 }, // CHEAPEST!
|
|
23
|
+
"gpt-5.1-codex": { input: 0.015, output: 0.045, latency: 1500 },
|
|
24
|
+
"gpt-5.1": { input: 0.010, output: 0.030, latency: 2000 },
|
|
25
|
+
"gpt-5-pro": { input: 0.020, output: 0.060, latency: 3000 },
|
|
26
|
+
// Gemini models
|
|
26
27
|
"gemini-2.5-flash": { input: 0.000075, output: 0.0003, latency: 500 },
|
|
27
28
|
"gemini-2.5-pro": { input: 0.00015, output: 0.0006, latency: 1000 },
|
|
29
|
+
"gemini-3-pro-preview": { input: 0.0002, output: 0.0008, latency: 800 },
|
|
30
|
+
// Other models
|
|
28
31
|
qwencoder: { input: 0.00015, output: 0.0006, latency: 1000 },
|
|
29
32
|
"perplexity-sonar-pro": { input: 0.006, output: 0.006, latency: 2000 },
|
|
30
33
|
};
|
|
@@ -94,18 +97,18 @@ export class SmartModelRouter {
|
|
|
94
97
|
* Select optimal model based on context
|
|
95
98
|
*/
|
|
96
99
|
selectModel(context) {
|
|
97
|
-
// Rule 1: Simple queries → GPT-5
|
|
100
|
+
// Rule 1: Simple queries → GPT-5.1 Codex Mini (CHEAPEST!)
|
|
98
101
|
if (context.complexity === "simple" && context.costSensitive !== false) {
|
|
99
102
|
// Check if GPT-5 is enabled
|
|
100
103
|
const gpt5Enabled = process.env.ENABLE_GPT5 !== "false";
|
|
101
104
|
if (gpt5Enabled) {
|
|
102
105
|
return {
|
|
103
|
-
primary: ModelTier.ULTRA_CHEAP, // gpt-5-
|
|
106
|
+
primary: ModelTier.ULTRA_CHEAP, // gpt-5.1-codex-mini
|
|
104
107
|
fallback: ModelTier.ULTRA_EFFICIENT, // gemini-2.5-flash
|
|
105
|
-
estimatedCost: 0.
|
|
106
|
-
estimatedLatency:
|
|
108
|
+
estimatedCost: 0.002,
|
|
109
|
+
estimatedLatency: 800,
|
|
107
110
|
requiresConfirmation: false,
|
|
108
|
-
reasoning: "Simple query - using GPT-5
|
|
111
|
+
reasoning: "Simple query - using GPT-5.1 Codex Mini (cheapest option)",
|
|
109
112
|
};
|
|
110
113
|
}
|
|
111
114
|
else {
|
|
@@ -67,7 +67,7 @@ export class InstructionOrchestrator {
|
|
|
67
67
|
const toolMap = {
|
|
68
68
|
'gemini_brainstorm': 'mcp__gemini__gemini-brainstorm',
|
|
69
69
|
'perplexity_research': 'mcp__perplexity-ask__perplexity_research',
|
|
70
|
-
'openai_reason': 'mcp__openai-
|
|
70
|
+
'openai_reason': 'mcp__openai-mcp__openai_reason',
|
|
71
71
|
'openai_brainstorm': 'mcp__openai-mcp__openai_brainstorm',
|
|
72
72
|
'think': 'mcp__think-mcp-server__think',
|
|
73
73
|
};
|
|
@@ -81,7 +81,7 @@ export class FocusOrchestratorLite {
|
|
|
81
81
|
const toolMap = {
|
|
82
82
|
'gemini_brainstorm': 'mcp__gemini__gemini-brainstorm',
|
|
83
83
|
'perplexity_research': 'mcp__perplexity-ask__perplexity_research',
|
|
84
|
-
'openai_reason': 'mcp__openai-
|
|
84
|
+
'openai_reason': 'mcp__openai-mcp__openai_reason',
|
|
85
85
|
'openai_brainstorm': 'mcp__openai-mcp__openai_brainstorm',
|
|
86
86
|
'think': 'mcp__think-mcp-server__think',
|
|
87
87
|
};
|
package/dist/src/orchestrator.js
CHANGED
|
@@ -88,7 +88,7 @@ export class FocusOrchestrator {
|
|
|
88
88
|
const toolMap = {
|
|
89
89
|
'gemini_brainstorm': 'mcp__gemini__gemini-brainstorm',
|
|
90
90
|
'perplexity_research': 'mcp__perplexity-ask__perplexity_research',
|
|
91
|
-
'openai_reason': 'mcp__openai-
|
|
91
|
+
'openai_reason': 'mcp__openai-mcp__openai_reason',
|
|
92
92
|
'openai_brainstorm': 'mcp__openai-mcp__openai_brainstorm',
|
|
93
93
|
'think': 'mcp__think-mcp-server__think',
|
|
94
94
|
};
|
|
@@ -13,8 +13,7 @@ export const balancedProfile = {
|
|
|
13
13
|
grok_architect: false,
|
|
14
14
|
grok_brainstorm: false,
|
|
15
15
|
grok_search: true,
|
|
16
|
-
|
|
17
|
-
openai_compare: false,
|
|
16
|
+
openai_reason: true,
|
|
18
17
|
openai_brainstorm: true,
|
|
19
18
|
openai_code_review: false,
|
|
20
19
|
openai_explain: false,
|
|
@@ -13,8 +13,7 @@ export const codeFocusProfile = {
|
|
|
13
13
|
grok_architect: false,
|
|
14
14
|
grok_brainstorm: false,
|
|
15
15
|
grok_search: false,
|
|
16
|
-
|
|
17
|
-
openai_compare: false,
|
|
16
|
+
openai_reason: false,
|
|
18
17
|
openai_brainstorm: false,
|
|
19
18
|
openai_code_review: true,
|
|
20
19
|
openai_explain: false,
|
|
@@ -13,8 +13,7 @@ export const fullProfile = {
|
|
|
13
13
|
grok_architect: true,
|
|
14
14
|
grok_brainstorm: true,
|
|
15
15
|
grok_search: true,
|
|
16
|
-
|
|
17
|
-
openai_compare: true,
|
|
16
|
+
openai_reason: true,
|
|
18
17
|
openai_brainstorm: true,
|
|
19
18
|
openai_code_review: true,
|
|
20
19
|
openai_explain: true,
|
|
@@ -13,8 +13,7 @@ export const minimalProfile = {
|
|
|
13
13
|
grok_architect: false,
|
|
14
14
|
grok_brainstorm: false,
|
|
15
15
|
grok_search: false,
|
|
16
|
-
|
|
17
|
-
openai_compare: false,
|
|
16
|
+
openai_reason: false,
|
|
18
17
|
openai_brainstorm: false,
|
|
19
18
|
openai_code_review: false,
|
|
20
19
|
openai_explain: false,
|
|
@@ -13,8 +13,7 @@ export const researchPowerProfile = {
|
|
|
13
13
|
grok_architect: false,
|
|
14
14
|
grok_brainstorm: false,
|
|
15
15
|
grok_search: true,
|
|
16
|
-
|
|
17
|
-
openai_compare: false,
|
|
16
|
+
openai_reason: false,
|
|
18
17
|
openai_brainstorm: true,
|
|
19
18
|
openai_code_review: false,
|
|
20
19
|
openai_explain: false,
|
package/dist/src/server.js
CHANGED
|
@@ -20,16 +20,17 @@ const envResult = dotenvConfig({
|
|
|
20
20
|
path: envPath,
|
|
21
21
|
override: true // Force override of existing env vars
|
|
22
22
|
});
|
|
23
|
+
// Import centralized API key utilities
|
|
24
|
+
import { hasGrokApiKey, hasOpenAIApiKey, hasPerplexityApiKey, hasGeminiApiKey, hasOpenRouterApiKey } from "./utils/api-keys.js";
|
|
23
25
|
// Debug: Log API key status (for troubleshooting)
|
|
24
26
|
if (process.env.DEBUG === 'true') {
|
|
25
27
|
console.error('[ENV] Loaded from:', envPath);
|
|
26
28
|
console.error('[ENV] API Keys present:', {
|
|
27
|
-
OPENROUTER:
|
|
28
|
-
PERPLEXITY:
|
|
29
|
-
OPENAI:
|
|
30
|
-
GEMINI:
|
|
31
|
-
GROK:
|
|
32
|
-
ANTHROPIC: !!process.env.ANTHROPIC_API_KEY
|
|
29
|
+
OPENROUTER: hasOpenRouterApiKey(),
|
|
30
|
+
PERPLEXITY: hasPerplexityApiKey(),
|
|
31
|
+
OPENAI: hasOpenAIApiKey(),
|
|
32
|
+
GEMINI: hasGeminiApiKey(),
|
|
33
|
+
GROK: hasGrokApiKey()
|
|
33
34
|
});
|
|
34
35
|
}
|
|
35
36
|
import { FastMCP, UserError } from "fastmcp";
|
|
@@ -364,7 +365,7 @@ if (isGrokAvailable()) {
|
|
|
364
365
|
});
|
|
365
366
|
console.error(`✅ Registered ${grokTools.length} Grok tools (custom API)`);
|
|
366
367
|
}
|
|
367
|
-
// Register all OpenAI tools (includes
|
|
368
|
+
// Register all OpenAI tools (includes openai_reason, openai_brainstorm, etc.)
|
|
368
369
|
if (isOpenAIAvailable()) {
|
|
369
370
|
const openaiTools = getAllOpenAITools();
|
|
370
371
|
openaiTools.forEach(tool => {
|
|
@@ -441,11 +442,11 @@ async function initializeServer() {
|
|
|
441
442
|
console.error(`Focus-Deep: ${canRunFocusDeep().quality} quality`);
|
|
442
443
|
// API Key Status (quick check)
|
|
443
444
|
const apiStatus = {
|
|
444
|
-
OpenRouter:
|
|
445
|
-
Perplexity:
|
|
446
|
-
OpenAI:
|
|
447
|
-
Gemini:
|
|
448
|
-
Grok:
|
|
445
|
+
OpenRouter: hasOpenRouterApiKey(),
|
|
446
|
+
Perplexity: hasPerplexityApiKey(),
|
|
447
|
+
OpenAI: hasOpenAIApiKey(),
|
|
448
|
+
Gemini: hasGeminiApiKey(),
|
|
449
|
+
Grok: hasGrokApiKey()
|
|
449
450
|
};
|
|
450
451
|
const configured = Object.entries(apiStatus).filter(([_, v]) => v).map(([k, _]) => k);
|
|
451
452
|
if (configured.length > 0) {
|