Files

1 line
8.3 KiB
JSON

{"repo": "b08x/computertools", "files": {"lib/ComputerTools/actions/display_available_models_action.rb": {"5d88bbd05ee03f844a134f28e6caf9e9e1827692": {"t": 1785745748.35611, "n": 3924, "h": "40499836c30b5521", "c": "# frozen_string_literal: true\n\nrequire 'tty-table'\nrequire 'dotenv/load'\nrequire 'ruby_llm'\n\nmodule ComputerTools\n module Actions\n class DisplayAvailableModelsAction < Sublayer::Actions::Base\n def initialize(provider: nil)\n @provider = provider\n end\n\n def call\n fetch_and_display_models\n end\n\n private\n\n def fetch_and_display_models\n puts \"Fetching model list from AI providers...\"\n\n # Configure RubyLLM first\n configure_rubyllm\n\n # Refresh the model registry\n RubyLLM.models.refresh!\n\n # Get all available models\n all_models = RubyLLM.models.all\n\n # Filter models based on provider if specified, otherwise show gemini models\n filtered_models = if @provider\n all_models.select { |m| m.provider.to_s.downcase.include?(@provider.downcase) }\n else\n all_models.select { |m| m.provider.to_s.downcase.include?(\"gemini\") }\n end\n\n # Transform the model data into a format suitable for the table\n formatted_models = filtered_models.map do |model|\n {\n id: model.id,\n provider: model.provider,\n type: model.type || 'chat',\n name: model.name,\n context_window: model.context_window,\n max_tokens: model.max_tokens,\n supports_vision: model.supports_vision? ? 'Yes' : 'No',\n supports_functions: model.supports_functions? ? 'Yes' : 'No',\n input_price: model.input_price_per_million,\n output_price: model.output_price_per_million,\n family: model.family\n }\n end\n\n display_table(formatted_models)\n rescue StandardError => e\n puts \"An error occurred while fetching the models.\"\n puts \"Please ensure your API keys are set correctly in environment variables.\"\n puts \"Supported keys: GEMINI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY\"\n puts \"Error details: #{e.message}\"\n exit\n end\n\n def configure_rubyllm\n RubyLLM.configure do |config|\n config.gemini_api_key = ENV['GEMINI_API_KEY'] || ENV.fetch('GOOGLE_API_KEY', nil)\n config.openai_api_key = ENV.fetch('OPENROUTER_API_KEY', nil)\n config.openai_api_base = ENV.fetch('OPENROUTER_API_BASE', 'https://openrouter.ai/api/v1')\n # config.anthropic_api_key = ENV.fetch('ANTHROPIC_API_KEY', nil)\n # config.deepseek_api_key = ENV.fetch('DEEPSEEK_API_KEY', nil)\n\n # Set reasonable defaults\n config.request_timeout = 30\n config.max_retries = 3\n config.retry_interval = 1\n config.log_level = :info\n end\n end\n\n def display_table(formatted_models)\n provider_name = @provider&.capitalize || 'Gemini'\n puts \"\\n📋 Available #{provider_name} Models (via ruby_llm)\".colorize(:cyan)\n puts \"─\" * 80\n\n # Sort models by version (extracted from ID) then by context window\n sorted_models = formatted_models.sort_by do |model|\n version = extract_version(model[:id])\n context_window = model[:context_window] || 0\n [version, context_window]\n end\n\n # Display simple list with name and ID\n sorted_models.each do |model|\n puts \"• #{model[:name]} (#{model[:id]})\".colorize(:light_blue)\n end\n\n puts \"\\n#{sorted_models.count} models found\".colorize(:green)\n end\n\n private\n\n def extract_version(model_id)\n # Extract version number from model ID (e.g., \"gemini-1.5-pro\" -> [1, 5])\n version_match = model_id.match(/(\\d+)\\.(\\d+)/)\n if version_match\n [version_match[1].to_i, version_match[2].to_i]\n else\n # If no version found, put it at the end\n [999, 999]\n end\n end\n end\n end\nend"}, "553e6cd02e2c12374a19771e09dbecdd4df810a9": {"t": 1785756130.7569463, "n": 3924, "h": "40499836c30b5521", "c": "# frozen_string_literal: true\n\nrequire 'tty-table'\nrequire 'dotenv/load'\nrequire 'ruby_llm'\n\nmodule ComputerTools\n module Actions\n class DisplayAvailableModelsAction < Sublayer::Actions::Base\n def initialize(provider: nil)\n @provider = provider\n end\n\n def call\n fetch_and_display_models\n end\n\n private\n\n def fetch_and_display_models\n puts \"Fetching model list from AI providers...\"\n\n # Configure RubyLLM first\n configure_rubyllm\n\n # Refresh the model registry\n RubyLLM.models.refresh!\n\n # Get all available models\n all_models = RubyLLM.models.all\n\n # Filter models based on provider if specified, otherwise show gemini models\n filtered_models = if @provider\n all_models.select { |m| m.provider.to_s.downcase.include?(@provider.downcase) }\n else\n all_models.select { |m| m.provider.to_s.downcase.include?(\"gemini\") }\n end\n\n # Transform the model data into a format suitable for the table\n formatted_models = filtered_models.map do |model|\n {\n id: model.id,\n provider: model.provider,\n type: model.type || 'chat',\n name: model.name,\n context_window: model.context_window,\n max_tokens: model.max_tokens,\n supports_vision: model.supports_vision? ? 'Yes' : 'No',\n supports_functions: model.supports_functions? ? 'Yes' : 'No',\n input_price: model.input_price_per_million,\n output_price: model.output_price_per_million,\n family: model.family\n }\n end\n\n display_table(formatted_models)\n rescue StandardError => e\n puts \"An error occurred while fetching the models.\"\n puts \"Please ensure your API keys are set correctly in environment variables.\"\n puts \"Supported keys: GEMINI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY\"\n puts \"Error details: #{e.message}\"\n exit\n end\n\n def configure_rubyllm\n RubyLLM.configure do |config|\n config.gemini_api_key = ENV['GEMINI_API_KEY'] || ENV.fetch('GOOGLE_API_KEY', nil)\n config.openai_api_key = ENV.fetch('OPENROUTER_API_KEY', nil)\n config.openai_api_base = ENV.fetch('OPENROUTER_API_BASE', 'https://openrouter.ai/api/v1')\n # config.anthropic_api_key = ENV.fetch('ANTHROPIC_API_KEY', nil)\n # config.deepseek_api_key = ENV.fetch('DEEPSEEK_API_KEY', nil)\n\n # Set reasonable defaults\n config.request_timeout = 30\n config.max_retries = 3\n config.retry_interval = 1\n config.log_level = :info\n end\n end\n\n def display_table(formatted_models)\n provider_name = @provider&.capitalize || 'Gemini'\n puts \"\\n📋 Available #{provider_name} Models (via ruby_llm)\".colorize(:cyan)\n puts \"─\" * 80\n\n # Sort models by version (extracted from ID) then by context window\n sorted_models = formatted_models.sort_by do |model|\n version = extract_version(model[:id])\n context_window = model[:context_window] || 0\n [version, context_window]\n end\n\n # Display simple list with name and ID\n sorted_models.each do |model|\n puts \"• #{model[:name]} (#{model[:id]})\".colorize(:light_blue)\n end\n\n puts \"\\n#{sorted_models.count} models found\".colorize(:green)\n end\n\n private\n\n def extract_version(model_id)\n # Extract version number from model ID (e.g., \"gemini-1.5-pro\" -> [1, 5])\n version_match = model_id.match(/(\\d+)\\.(\\d+)/)\n if version_match\n [version_match[1].to_i, version_match[2].to_i]\n else\n # If no version found, put it at the end\n [999, 999]\n end\n end\n end\n end\nend"}}}}