mirror of https://github.com/flightphp/core
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							140 lines
						
					
					
						
							4.3 KiB
						
					
					
				<?php
 | 
						|
namespace app\commands;
 | 
						|
 | 
						|
use Ahc\Cli\Input\Option;
 | 
						|
use Ahc\Cli\Output\Writer;
 | 
						|
use Ahc\Cli\IO\Interactor;
 | 
						|
use Ahc\Cli\Input\Command;
 | 
						|
 | 
						|
class AiInitCommand extends Command
 | 
						|
{
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        parent::__construct('ai:init', 'Initialize LLM API credentials and settings');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Executes the function
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function execute()
 | 
						|
    {
 | 
						|
		$io = $this->app()->io();
 | 
						|
 | 
						|
        $io->info('Welcome to AI Init!', true);
 | 
						|
 | 
						|
		// if runway creds already exist, prompt to overwrite
 | 
						|
		$baseDir = getcwd() . DIRECTORY_SEPARATOR;
 | 
						|
		$runwayCredsFile = $baseDir . '.runway-creds.json';
 | 
						|
 | 
						|
		// make sure the .runway-creds.json file is not already present
 | 
						|
		if (file_exists($runwayCredsFile)) {
 | 
						|
			$io->error('.runway-creds.json file already exists. Please remove it before running this command.', true);
 | 
						|
			// prompt to overwrite
 | 
						|
			$overwrite = $io->confirm('Do you want to overwrite the existing .runway-creds.json file?', 'n');
 | 
						|
			if ($overwrite === false) {
 | 
						|
				$io->info('Exiting without changes.', true);
 | 
						|
				return 0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// Prompt for API provider with validation
 | 
						|
		do {
 | 
						|
			$api = $io->prompt('Which LLM API do you want to use? (openai, grok, claude) [openai]', 'openai');
 | 
						|
			$api = strtolower(trim($api));
 | 
						|
			if (!in_array($api, ['openai', 'grok', 'claude'], true)) {
 | 
						|
			$io->error('Invalid API provider. Please enter one of: openai, grok, claude.', true);
 | 
						|
			$api = '';
 | 
						|
			}
 | 
						|
		} while (empty($api));
 | 
						|
 | 
						|
		// Prompt for base URL with validation
 | 
						|
		do {
 | 
						|
			switch($api) {
 | 
						|
				case 'openai':
 | 
						|
					$defaultBaseUrl = 'https://api.openai.com';
 | 
						|
					break;
 | 
						|
				case 'grok':
 | 
						|
					$defaultBaseUrl = 'https://api.x.ai';
 | 
						|
					break;
 | 
						|
				case 'claude':
 | 
						|
					$defaultBaseUrl = 'https://api.anthropic.com';
 | 
						|
					break;
 | 
						|
				default:
 | 
						|
					$defaultBaseUrl = '';
 | 
						|
			}
 | 
						|
			$baseUrl = $io->prompt('Enter the base URL for the LLM API', $defaultBaseUrl);
 | 
						|
			$baseUrl = trim($baseUrl);
 | 
						|
			if (empty($baseUrl) || !filter_var($baseUrl, FILTER_VALIDATE_URL)) {
 | 
						|
			$io->error('Base URL cannot be empty and must be a valid URL.', true);
 | 
						|
			$baseUrl = '';
 | 
						|
			}
 | 
						|
		} while (empty($baseUrl));
 | 
						|
 | 
						|
        // Validate API key input
 | 
						|
        do {
 | 
						|
            $apiKey = $io->prompt('Enter your API key for ' . $api);
 | 
						|
            if (empty(trim($apiKey))) {
 | 
						|
                $io->error('API key cannot be empty. Please enter a valid API key.', true);
 | 
						|
            }
 | 
						|
        } while (empty(trim($apiKey)));
 | 
						|
 | 
						|
        // Validate model input
 | 
						|
        do {
 | 
						|
			switch($api) {
 | 
						|
				case 'openai':
 | 
						|
					$defaultModel = 'gpt-4o';
 | 
						|
					break;
 | 
						|
				case 'grok':
 | 
						|
					$defaultModel = 'grok-3-beta';
 | 
						|
					break;
 | 
						|
				case 'claude':
 | 
						|
					$defaultModel = 'claude-3-opus';
 | 
						|
					break;
 | 
						|
				default:
 | 
						|
					$defaultModel = '';
 | 
						|
			}
 | 
						|
            $model = $io->prompt('Enter the model name you want to use (e.g. gpt-4, claude-3-opus, etc)', $defaultModel);
 | 
						|
            if (empty(trim($model))) {
 | 
						|
                $io->error('Model name cannot be empty. Please enter a valid model name.', true);
 | 
						|
            }
 | 
						|
        } while (empty(trim($model)));
 | 
						|
 | 
						|
        $creds = [
 | 
						|
            'provider' => $api,
 | 
						|
            'api_key' => $apiKey,
 | 
						|
            'model' => $model,
 | 
						|
			'base_url' => $baseUrl,
 | 
						|
        ];
 | 
						|
 | 
						|
        $json = json_encode($creds, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
 | 
						|
        $file = $runwayCredsFile;
 | 
						|
        if (file_put_contents($file, $json) === false) {
 | 
						|
            $io->error('Failed to write credentials to ' . $file, true);
 | 
						|
            return 1;
 | 
						|
        }
 | 
						|
        $io->ok('Credentials saved to ' . $file, true);
 | 
						|
 | 
						|
		// run a check to make sure that the creds file is in the .gitignore file
 | 
						|
		$gitignoreFile = $baseDir . '.gitignore';
 | 
						|
		if (!file_exists($gitignoreFile)) {
 | 
						|
			// create the .gitignore file if it doesn't exist
 | 
						|
			file_put_contents($gitignoreFile, ".runway-creds.json\n");
 | 
						|
			$io->info('.gitignore file created and .runway-creds.json added to it.', true);
 | 
						|
		} else {
 | 
						|
			// check if the .runway-creds.json file is already in the .gitignore file
 | 
						|
			$gitignoreContents = file_get_contents($gitignoreFile);
 | 
						|
			if (strpos($gitignoreContents, '.runway-creds.json') === false) {
 | 
						|
				// add the .runway-creds.json file to the .gitignore file
 | 
						|
				file_put_contents($gitignoreFile, "\n.runway-creds.json\n", FILE_APPEND);
 | 
						|
				$io->info('.runway-creds.json added to .gitignore file.', true);
 | 
						|
			} else {
 | 
						|
				$io->info('.runway-creds.json is already in the .gitignore file.', true);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
}
 |