data fixes, partial custom indicator support

This commit is contained in:
2026-04-08 21:28:31 -04:00
parent b701554996
commit a70dcd954f
81 changed files with 5438 additions and 1852 deletions

View File

@@ -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: [],
});