data fixes, partial custom indicator support
This commit is contained in:
@@ -90,31 +90,28 @@ function loadConfig() {
|
||||
|
||||
// LLM provider API keys and model configuration
|
||||
providerConfig: {
|
||||
anthropicApiKey: secretsData.llm_providers?.anthropic_api_key || process.env.ANTHROPIC_API_KEY,
|
||||
openaiApiKey: secretsData.llm_providers?.openai_api_key || process.env.OPENAI_API_KEY,
|
||||
googleApiKey: secretsData.llm_providers?.google_api_key || process.env.GOOGLE_API_KEY,
|
||||
openrouterApiKey: secretsData.llm_providers?.openrouter_api_key || process.env.OPENROUTER_API_KEY,
|
||||
deepinfraApiKey: secretsData.llm_providers?.deepinfra_api_key || process.env.DEEPINFRA_API_KEY,
|
||||
defaultModel: {
|
||||
provider: configData.defaults?.model_provider || 'anthropic',
|
||||
model: configData.defaults?.model || 'claude-sonnet-4-6',
|
||||
provider: configData.defaults?.model_provider || 'deepinfra',
|
||||
model: configData.defaults?.model || 'zai-org/GLM-5',
|
||||
},
|
||||
licenseModels: {
|
||||
free: {
|
||||
default: configData.license_models?.free?.default || 'claude-haiku-4-5-20251001',
|
||||
cost_optimized: configData.license_models?.free?.cost_optimized || 'claude-haiku-4-5-20251001',
|
||||
complex: configData.license_models?.free?.complex || 'claude-haiku-4-5-20251001',
|
||||
allowed_models: configData.license_models?.free?.allowed_models || ['claude-haiku-4-5-20251001'],
|
||||
default: configData.license_models?.free?.default || 'zai-org/GLM-5',
|
||||
cost_optimized: configData.license_models?.free?.cost_optimized || 'zai-org/GLM-5',
|
||||
complex: configData.license_models?.free?.complex || 'zai-org/GLM-5',
|
||||
allowed_models: configData.license_models?.free?.allowed_models || ['zai-org/GLM-5'],
|
||||
},
|
||||
pro: {
|
||||
default: configData.license_models?.pro?.default || 'claude-sonnet-4-6',
|
||||
cost_optimized: configData.license_models?.pro?.cost_optimized || 'claude-haiku-4-5-20251001',
|
||||
complex: configData.license_models?.pro?.complex || 'claude-sonnet-4-6',
|
||||
blocked_models: configData.license_models?.pro?.blocked_models || ['claude-opus-4-6'],
|
||||
default: configData.license_models?.pro?.default || 'zai-org/GLM-5',
|
||||
cost_optimized: configData.license_models?.pro?.cost_optimized || 'zai-org/GLM-5',
|
||||
complex: configData.license_models?.pro?.complex || 'zai-org/GLM-5',
|
||||
blocked_models: configData.license_models?.pro?.blocked_models || ['Qwen/Qwen3-235B-A22B-Instruct-2507'],
|
||||
},
|
||||
enterprise: {
|
||||
default: configData.license_models?.enterprise?.default || 'claude-sonnet-4-6',
|
||||
cost_optimized: configData.license_models?.enterprise?.cost_optimized || 'claude-haiku-4-5-20251001',
|
||||
complex: configData.license_models?.enterprise?.complex || 'claude-opus-4-6',
|
||||
default: configData.license_models?.enterprise?.default || 'zai-org/GLM-5',
|
||||
cost_optimized: configData.license_models?.enterprise?.cost_optimized || 'zai-org/GLM-5',
|
||||
complex: configData.license_models?.enterprise?.complex || 'Qwen/Qwen3-235B-A22B-Instruct-2507',
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -181,6 +178,9 @@ function loadConfig() {
|
||||
storageClass: configData.kubernetes?.storage_class || process.env.SANDBOX_STORAGE_CLASS || '',
|
||||
imagePullPolicy: configData.kubernetes?.image_pull_policy || process.env.IMAGE_PULL_POLICY || 'Always',
|
||||
},
|
||||
|
||||
// Search API keys
|
||||
tavilyApiKey: secretsData.search?.tavily_api_key || process.env.TAVILY_API_KEY,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -200,10 +200,9 @@ const app = Fastify({
|
||||
},
|
||||
});
|
||||
|
||||
// Validate at least one LLM provider is configured
|
||||
const hasAnyProvider = Object.values(config.providerConfig).some(key => !!key);
|
||||
if (!hasAnyProvider) {
|
||||
app.log.error('At least one LLM provider API key is required (ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY, or OPENROUTER_API_KEY)');
|
||||
// Validate LLM provider is configured
|
||||
if (!config.providerConfig.deepinfraApiKey) {
|
||||
app.log.error('DEEPINFRA_API_KEY is required');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
@@ -407,6 +406,8 @@ app.log.debug('Initializing auth routes...');
|
||||
const authRoutes = new AuthRoutes({
|
||||
authService,
|
||||
betterAuth,
|
||||
containerManager,
|
||||
userService,
|
||||
});
|
||||
|
||||
// Register routes
|
||||
@@ -581,6 +582,7 @@ try {
|
||||
ohlcService: () => ohlcService,
|
||||
symbolIndexService: () => symbolIndexService,
|
||||
workspaceManager: undefined, // Will be set per-session
|
||||
tavilyApiKey: config.tavilyApiKey,
|
||||
});
|
||||
|
||||
// Register agent tool configurations
|
||||
@@ -588,20 +590,27 @@ try {
|
||||
toolRegistry.registerAgentTools({
|
||||
agentName: 'main',
|
||||
platformTools: ['symbol_lookup', 'get_chart_data'],
|
||||
mcpTools: ['category_list'], // category_list lets the main agent see existing research scripts
|
||||
mcpTools: ['python_list', 'backtest_strategy', 'list_active_strategies'],
|
||||
});
|
||||
|
||||
// Research subagent: only MCP tools for script creation/execution
|
||||
toolRegistry.registerAgentTools({
|
||||
agentName: 'research',
|
||||
platformTools: [], // No platform tools (works at script level)
|
||||
mcpTools: ['category_*', 'execute_research'],
|
||||
mcpTools: ['python_*', 'execute_research'],
|
||||
});
|
||||
|
||||
// Code reviewer subagent: no tools by default
|
||||
// Indicator subagent: workspace patch + category tools + evaluate_indicator
|
||||
toolRegistry.registerAgentTools({
|
||||
agentName: 'code-reviewer',
|
||||
agentName: 'indicator',
|
||||
platformTools: [],
|
||||
mcpTools: ['workspace_read', 'workspace_patch', 'python_*', 'evaluate_indicator'],
|
||||
});
|
||||
|
||||
// Web explore subagent: platform search/fetch tools only (no MCP needed)
|
||||
toolRegistry.registerAgentTools({
|
||||
agentName: 'web-explore',
|
||||
platformTools: ['web_search', 'fetch_page', 'arxiv_search'],
|
||||
mcpTools: [],
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user