diff --git a/mycoder.config.js b/mycoder.config.js index 04155d9..e6877d4 100644 --- a/mycoder.config.js +++ b/mycoder.config.js @@ -9,12 +9,12 @@ export default { pageFilter: 'none', // 'simple', 'none', or 'readability' // Model settings - //provider: 'anthropic', - //model: 'claude-3-7-sonnet-20250219', + provider: 'anthropic', + model: 'claude-3-7-sonnet-20250219', //provider: 'openai', //model: 'gpt-4o', - provider: 'ollama', - model: 'medragondot/Sky-T1-32B-Preview:latest', + //provider: 'ollama', + //model: 'medragondot/Sky-T1-32B-Preview:latest', maxTokens: 4096, temperature: 0.7, diff --git a/packages/agent/src/core/toolAgent/config.test.ts b/packages/agent/src/core/toolAgent/config.test.ts index 3989606..1bb5951 100644 --- a/packages/agent/src/core/toolAgent/config.test.ts +++ b/packages/agent/src/core/toolAgent/config.test.ts @@ -6,13 +6,17 @@ import { getModel } from './config.js'; describe('createProvider', () => { it('should return the correct model for anthropic', () => { - const model = createProvider('anthropic', 'claude-3-7-sonnet-20250219'); + const model = createProvider('anthropic', 'claude-3-7-sonnet-20250219', { + apiKey: 'sk-proj-1234567890', + }); expect(model).toBeDefined(); expect(model.provider).toBe('anthropic.messages'); }); it('should return the correct model for openai', () => { - const model = createProvider('openai', 'gpt-4o-2024-05-13'); + const model = createProvider('openai', 'gpt-4o-2024-05-13', { + apiKey: 'sk-proj-1234567890', + }); expect(model).toBeDefined(); expect(model.provider).toBe('openai.chat'); }); diff --git a/packages/agent/src/core/toolAgent/config.ts b/packages/agent/src/core/toolAgent/config.ts index 89a121f..fea22e8 100644 --- a/packages/agent/src/core/toolAgent/config.ts +++ b/packages/agent/src/core/toolAgent/config.ts @@ -15,10 +15,6 @@ export type ModelProvider = 'anthropic' | 'openai' | 'ollama'; export type AgentConfig = { maxIterations: number; - provider: ModelProvider; - model: string; - maxTokens: number; - temperature: number; getSystemPrompt: (toolContext: ToolContext) => string; }; @@ -55,10 +51,6 @@ export function getModel( */ export const DEFAULT_CONFIG: AgentConfig = { maxIterations: 200, - provider: 'anthropic', - model: 'claude-3-7-sonnet-20250219', - maxTokens: 4096, - temperature: 0.7, getSystemPrompt: getDefaultSystemPrompt, }; diff --git a/packages/agent/src/core/toolAgent/toolAgentCore.ts b/packages/agent/src/core/toolAgent/toolAgentCore.ts index 6b7bed6..da00326 100644 --- a/packages/agent/src/core/toolAgent/toolAgentCore.ts +++ b/packages/agent/src/core/toolAgent/toolAgentCore.ts @@ -43,7 +43,7 @@ export const toolAgent = async ( const systemPrompt = config.getSystemPrompt(context); // Create the LLM provider - const provider = createProvider(config.provider, config.model); + const provider = createProvider(context.provider, context.model); for (let i = 0; i < config.maxIterations; i++) { logger.verbose( @@ -74,8 +74,8 @@ export const toolAgent = async ( const generateOptions = { messages: messagesWithSystem, functions: functionDefinitions, - temperature: config.temperature, - maxTokens: config.maxTokens, + temperature: context.temperature, + maxTokens: context.maxTokens, }; const { text, toolCalls, tokenUsage } = await generateText( diff --git a/packages/agent/src/core/types.ts b/packages/agent/src/core/types.ts index cc97339..59c70d0 100644 --- a/packages/agent/src/core/types.ts +++ b/packages/agent/src/core/types.ts @@ -24,6 +24,8 @@ export type ToolContext = { agentId?: string; // Unique identifier for the agent, used for background tool tracking provider: ModelProvider; model: string; + maxTokens: number; + temperature: number; }; export type Tool, TReturn = any> = { diff --git a/packages/agent/src/tools/getTools.test.ts b/packages/agent/src/tools/getTools.test.ts index 197e8d9..45965fe 100644 --- a/packages/agent/src/tools/getTools.test.ts +++ b/packages/agent/src/tools/getTools.test.ts @@ -17,6 +17,8 @@ export const getMockToolContext = (): ToolContext => ({ githubMode: true, provider: 'anthropic', model: 'claude-3-7-sonnet-20250219', + maxTokens: 4096, + temperature: 0.7, }); describe('getTools', () => { diff --git a/packages/agent/src/tools/interaction/agentStart.ts b/packages/agent/src/tools/interaction/agentStart.ts index 0a8244e..ec106f3 100644 --- a/packages/agent/src/tools/interaction/agentStart.ts +++ b/packages/agent/src/tools/interaction/agentStart.ts @@ -69,10 +69,6 @@ type ReturnType = z.infer; // Sub-agent specific configuration const subAgentConfig: AgentConfig = { maxIterations: 200, - maxTokens: 4096, - temperature: 0.7, - provider: 'anthropic', - model: 'claude-3-7-sonnet-20250219', getSystemPrompt: (context: ToolContext) => { return [ getDefaultSystemPrompt(context), diff --git a/packages/agent/src/tools/interaction/agentTools.test.ts b/packages/agent/src/tools/interaction/agentTools.test.ts index 214d818..9b0531e 100644 --- a/packages/agent/src/tools/interaction/agentTools.test.ts +++ b/packages/agent/src/tools/interaction/agentTools.test.ts @@ -26,6 +26,8 @@ const mockContext: ToolContext = { githubMode: true, provider: 'anthropic', model: 'claude-3-7-sonnet-20250219', + maxTokens: 4096, + temperature: 0.7, }; describe('Agent Tools', () => { diff --git a/packages/agent/src/tools/interaction/subAgent.test.ts b/packages/agent/src/tools/interaction/subAgent.test.ts index 3ef48e2..4b4df8e 100644 --- a/packages/agent/src/tools/interaction/subAgent.test.ts +++ b/packages/agent/src/tools/interaction/subAgent.test.ts @@ -30,6 +30,8 @@ const mockContext: ToolContext = { githubMode: true, provider: 'anthropic', model: 'claude-3-7-sonnet-20250219', + maxTokens: 4096, + temperature: 0.7, }; describe('subAgentTool', () => { diff --git a/packages/agent/src/tools/interaction/subAgent.ts b/packages/agent/src/tools/interaction/subAgent.ts index 6b19c64..3f66ae2 100644 --- a/packages/agent/src/tools/interaction/subAgent.ts +++ b/packages/agent/src/tools/interaction/subAgent.ts @@ -47,10 +47,6 @@ type ReturnType = z.infer; // Sub-agent specific configuration const subAgentConfig: AgentConfig = { maxIterations: 200, - provider: 'anthropic', - model: 'claude-3-7-sonnet-20250219', - maxTokens: 4096, - temperature: 0.7, getSystemPrompt: (context: ToolContext) => { return [ getDefaultSystemPrompt(context), @@ -106,11 +102,9 @@ export const subAgentTool: Tool = { const tools = getTools({ userPrompt: false }); - // Update config if timeout is specified + // Use the subAgentConfig const config: AgentConfig = { ...subAgentConfig, - provider: context.provider, - model: context.model, }; try { diff --git a/packages/cli/README.md b/packages/cli/README.md index fc5523e..1d87b66 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -97,17 +97,7 @@ Requirements for GitHub mode: MyCoder is configured using a `mycoder.config.js` file in your project root, similar to ESLint and other modern JavaScript tools. This file exports a configuration object with your preferred settings. -To create a default configuration file, run: - -```bash -# Create a default configuration file -mycoder init - -# Force overwrite an existing configuration file -mycoder init --force -``` - -This will create a `mycoder.config.js` file in your current directory with default settings that you can customize. +You can create a `mycoder.config.js` file in your project root with your preferred settings. Example configuration file: diff --git a/packages/cli/src/commands/$default.ts b/packages/cli/src/commands/$default.ts index 8287ad7..1d72962 100644 --- a/packages/cli/src/commands/$default.ts +++ b/packages/cli/src/commands/$default.ts @@ -146,13 +146,9 @@ export const command: CommandModule = { process.exit(0); }); - // Create a config with the selected model + // Create a config for the agent const agentConfig: AgentConfig = { ...DEFAULT_CONFIG, - provider: config.provider as ModelProvider, - model: config.model, - maxTokens: config.maxTokens, - temperature: config.temperature, }; const result = await toolAgent(prompt, tools, agentConfig, { @@ -168,6 +164,8 @@ export const command: CommandModule = { userPrompt: config.userPrompt, provider: config.provider as ModelProvider, model: config.model, + maxTokens: config.maxTokens, + temperature: config.temperature, }); const output = diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts deleted file mode 100644 index c4a0369..0000000 --- a/packages/cli/src/commands/init.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as path from 'path'; - -import chalk from 'chalk'; -import { Logger } from 'mycoder-agent'; - -import { SharedOptions } from '../options.js'; -import { createDefaultConfigFile } from '../settings/config.js'; -import { nameToLogIndex } from '../utils/nameToLogIndex.js'; - -import type { CommandModule, ArgumentsCamelCase } from 'yargs'; - -export interface InitOptions extends SharedOptions { - force: boolean; -} - -export const command: CommandModule = { - command: 'init', - describe: 'Initialize a new MyCoder configuration file', - builder: (yargs) => { - return yargs - .option('force', { - alias: 'f', - describe: 'Overwrite existing configuration file if it exists', - type: 'boolean', - default: false, - }) - .example('$0 init', 'Create a default mycoder.config.js file') - .example('$0 init --force', 'Overwrite existing configuration file'); - }, - handler: async (argv: ArgumentsCamelCase) => { - const logger = new Logger({ - name: 'Init', - logLevel: nameToLogIndex(argv.logLevel), - }); - - const configPath = path.join(process.cwd(), 'mycoder.config.js'); - - try { - // If force flag is set, delete existing file - if (argv.force) { - const fs = await import('fs'); - if (fs.existsSync(configPath)) { - fs.unlinkSync(configPath); - } - } - - // Create default configuration file - const created = createDefaultConfigFile(configPath); - - if (created) { - logger.info(chalk.green(`Created configuration file: ${configPath}`)); - logger.info('Edit this file to customize MyCoder settings.'); - } else { - logger.error( - chalk.red(`Configuration file already exists: ${configPath}`), - ); - logger.info('Use --force to overwrite the existing file.'); - } - } catch (error: unknown) { - const errorMessage = - error instanceof Error ? error.message : String(error); - logger.error( - chalk.red(`Failed to create configuration file: ${errorMessage}`), - ); - } - }, -}; diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 78c4957..ffbabf2 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -6,7 +6,6 @@ import yargs, { ArgumentsCamelCase, CommandModule } from 'yargs'; import { hideBin } from 'yargs/helpers'; import { command as defaultCommand } from './commands/$default.js'; -import { command as initCommand } from './commands/init.js'; import { command as testProfileCommand } from './commands/test-profile.js'; import { command as testSentryCommand } from './commands/test-sentry.js'; import { command as toolsCommand } from './commands/tools.js'; @@ -59,7 +58,6 @@ const main = async () => { testSentryCommand, testProfileCommand, toolsCommand, - initCommand, ] as CommandModule[]) .strict() .showHelpOnFail(true) diff --git a/packages/cli/src/settings/config.ts b/packages/cli/src/settings/config.ts index 9c4f4ca..74c4b88 100644 --- a/packages/cli/src/settings/config.ts +++ b/packages/cli/src/settings/config.ts @@ -1,6 +1,3 @@ -import * as fs from 'fs'; -import * as path from 'path'; - import { cosmiconfig } from 'cosmiconfig'; import { ArgumentsCamelCase } from 'yargs'; @@ -107,51 +104,3 @@ export async function loadConfig( }; return mergedConfig; } - -/** - * Create a default configuration file if it doesn't exist - * @param filePath Path to create the configuration file - * @returns true if file was created, false if it already exists - */ -export function createDefaultConfigFile(filePath?: string): boolean { - // Default to current directory if no path provided - const configPath = filePath || path.join(process.cwd(), 'mycoder.config.js'); - - // Check if file already exists - if (fs.existsSync(configPath)) { - return false; - } - - // Create default configuration file - const configContent = `// mycoder.config.js -export default { - // GitHub integration - githubMode: true, - - // Browser settings - headless: true, - userSession: false, - pageFilter: 'none', // 'simple', 'none', or 'readability' - - // Model settings - provider: 'anthropic', - model: 'claude-3-7-sonnet-20250219', - maxTokens: 4096, - temperature: 0.7, - - // Custom settings - customPrompt: '', - profile: false, - tokenCache: true, - - // Ollama configuration - ollamaBaseUrl: 'http://localhost:11434', - - // API keys (better to use environment variables for these) - // ANTHROPIC_API_KEY: 'your-api-key', -}; -`; - - fs.writeFileSync(configPath, configContent); - return true; -}