Skip to main content

Interactive shell with LLM-powered features

Project description

LLM Shell Assistant

An intelligent shell that combines traditional shell capabilities with natural language processing. Features include command generation from natural language, automatic error explanations, and command completion.

Prerequisites

  • Python 3.8 or higher
  • A Google API key for Gemini AI (specifically configured for gemini-2.0-flash model)
  • GCC compiler (for the C core)

Setup

Method 1: Install from PyPI (Recommended)

Install directly using pip:

pip install shell-llm

Set up your Google API key:

echo "GEMINI_API_KEY=your_api_key_here" > .env

Method 2: Install from Source

  1. Clone the repository:
git clone https://github.com/yourusername/shell-llm.git
cd shell-llm
  1. Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
  1. Install the package in development mode:
pip install -e .
  1. Set up your Google API key:
echo "GEMINI_API_KEY=your_api_key_here" > .env

Running the Shell

After installation, simply run:

shell-llm

If installed from source with a virtual environment, make sure your virtual environment is activated:

source venv/bin/activate  # On Windows: venv\Scripts\activate
shell-llm

Usage

  • Regular shell commands work as normal
  • Start with # for natural language queries:
    #how do I find large files
    
  • Add verbosity flags for more information:
    • -v: Show brief command explanation
    • -vv: Show detailed command explanation with options and examples
    #how do I copy files with scp -vv
    

Error Handling

The shell provides intelligent error handling with AI-powered explanations:

  1. Direct Error Capture

    • Errors are captured directly from command execution in the C core
    • No re-running of commands to capture errors
    • Handles both execution errors and usage messages
  2. Error Processing

    • Errors are immediately displayed with a red "Error:" prefix
    • The LLM analyzes the error using the Gemini model
    • Responses are cached to improve performance
  3. Structured Solutions The error handler provides a consistent format:

    Error: <original error message>
    
    Problem: <one-line explanation of what went wrong>
    
    Solution:
       <step-by-step instructions>
       <clear actionable items>
       <relevant suggestions>
    

Example outputs:

$ mkdir root/pass
Error: mkdir: cannot create directory 'root/pass': No such file or directory

Problem: The parent directory 'root' does not exist

Solution:
   First, create the parent directory 'root' using the command `mkdir root`
   Verify that the 'root' directory was created successfully using `ls -l`
   Then, create the 'pass' directory inside 'root' using `mkdir root/pass`
$ scp ssh
Error: usage: scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config]
           [-i identity_file] [-J destination] [-l limit] [-o ssh_option]
           [-P port] [-S program] [-X sftp_option] source ... target

Problem: The scp command was invoked with incorrect arguments

Solution:
   Review the scp command syntax: scp [options] source target
   Specify a source file/directory to copy from
   Specify a destination where you want to copy to
   Add any needed options like -r for directories

Technical Implementation

Architecture Overview

The project follows a hybrid architecture combining Python and C for optimal performance:

  1. Core Shell Implementation (core.c)

    • Written in C for performance-critical operations
    • Handles direct command execution
    • Manages working directory changes
    • Implements pipeline execution
    • Exposed to Python through Cython bindings
  2. Python Shell Wrapper (shell.py)

    • Main shell interface implementation
    • Handles user input/output with rich formatting
    • Manages LLM integration
    • Implements command history and completion
    • Error handling and explanation generation
  3. LLM Integration (llm.py)

    • Manages communication with Google's Gemini AI
    • Implements caching for faster responses
    • Handles structured command generation
    • Provides error explanation capabilities
  4. Command Completion (completions.py)

    • Custom command completion engine
    • Combines traditional shell completion with LLM suggestions

Key Components

Command Response Schema

{
    "command": str,        # The shell command to execute
    "explanation": str,    # Brief explanation of the command
    "detailed_explanation": str  # Detailed breakdown with examples
}

LLM Client Features

  • Lazy initialization of API client
  • Response caching with JSON persistence
  • Structured output parsing
  • Error handling and explanation generation
  • Command generation with context awareness

Shell Features

  • Asynchronous command execution
  • Pipeline support with error handling
  • Rich terminal output with custom formatting
  • History management with file persistence
  • Intelligent error handling with LLM-powered explanations

Project Structure

llm_shell/
├── shell.py           # Main shell implementation
├── core.c            # C core implementation
├── core.pyx          # Cython interface
├── llm.py            # LLM client implementation
├── completions.py    # Command completion engine
├── setup.py          # Build configuration
├── requirements.txt  # Python dependencies
└── .env             # Environment configuration

Performance Optimizations

  1. C Core Integration

    • Direct system calls for command execution
    • Efficient pipeline handling
    • Minimal Python-C context switching
  2. LLM Response Caching

    • JSON-based persistent cache
    • Cache invalidation on model updates
    • Lazy loading of expensive resources
  3. Asynchronous Operations

    • Non-blocking command execution
    • Asynchronous LLM API calls
    • Responsive UI during long operations

Security Considerations

  1. API Key Management

    • Environment-based configuration
    • No hardcoded credentials
    • Secure key storage recommendations
  2. Command Execution

    • Sanitized command inputs
    • Controlled execution environment
    • Error containment and reporting
  3. Cache Security

    • Local-only cache storage
    • No sensitive data in cache
    • Proper file permissions

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Implement your changes
  4. Add tests if applicable
  5. Submit a pull request

License

[Insert License Information]

Core Shell Implementation (core.c)

The C core provides high-performance shell operations through direct system calls. Here are the key components:

  1. Shell Context Management
typedef struct {
    char *cwd;           // Current working directory
    char **env;          // Environment variables
    int last_exit_code;  // Last command's exit code
    int interactive;     // Whether shell is interactive
} ShellContext;

ShellContext* shell_init(void) {
    ShellContext *ctx = malloc(sizeof(ShellContext));
    ctx->cwd = getcwd(NULL, 0);
    // ... initialize environment and other fields
    return ctx;
}

The Shell Context maintains the state of the shell environment. The ShellContext struct holds:

  • cwd: Dynamically allocated string storing the current working directory path
  • env: Array of environment variables as "NAME=VALUE" strings
  • last_exit_code: Exit status of the most recently executed command
  • interactive: Flag indicating if the shell is running in interactive mode

During initialization, the context:

  1. Allocates memory for the structure

  2. Gets the current working directory using getcwd()

  3. Copies the current environment variables

  4. Sets default values for exit code and interactive mode

  5. Command Execution Pipeline

int shell_execute_pipeline(ShellContext *ctx, const char **commands, int num_commands) {
    int pipes[num_commands-1][2];
    pid_t pids[num_commands];

    // Create pipes for command communication
    for (int i = 0; i < num_commands-1; i++) {
        pipe(pipes[i]);
    }

    // Fork processes for each command
    for (int i = 0; i < num_commands; i++) {
        pids[i] = fork();
        if (pids[i] == 0) {
            // Child: Setup pipes and execute command
            setup_pipes(i, pipes, num_commands);
            execute_command(commands[i]);
        }
    }
    // Parent: Wait for completion
    wait_for_children(pids, num_commands);
}

The pipeline execution system implements Unix-style command chaining:

  1. Creates an array of pipes (N-1 pipes for N commands)

  2. For each command in the pipeline:

    • Creates a new process using fork()
    • Child process:
      • Sets up input/output pipes
      • Redirects stdin/stdout to appropriate pipe ends
      • Executes the command
    • Parent process:
      • Keeps track of child PIDs
      • Manages pipe file descriptors
  3. Parent waits for all child processes to complete

  4. Handles errors and returns the last command's exit status

  5. Directory Management

int shell_cd(ShellContext *ctx, const char *path) {
    if (chdir(path) != 0) return -1;
    free(ctx->cwd);
    ctx->cwd = getcwd(NULL, 0);
    return 0;
}

The directory management system:

  1. Attempts to change directory using chdir()

  2. On success:

    • Frees the old working directory string
    • Gets and stores the new working directory
  3. Handles special cases like:

    • cd with no arguments (goes to HOME)
    • Relative paths
    • Symbolic links
  4. Returns -1 on error (e.g., directory not found)

  5. Environment Variable Handling

int shell_setenv(ShellContext *ctx, const char *name, const char *value) {
    char *new_var;
    asprintf(&new_var, "%s=%s", name, value);
    // Update or add environment variable
    update_environment(ctx, new_var);
}

Environment variable management:

  1. Creates a new environment string in "NAME=VALUE" format
  2. Searches existing environment for the variable
  3. If found: replaces the old value
  4. If not found: adds to the environment array
  5. Handles memory allocation and deallocation
  6. Maintains null termination of the environment array

Python Shell Wrapper (shell.py)

The Python wrapper provides high-level functionality and LLM integration:

  1. Asynchronous Command Handling
async def handle_command(self, query: str):
    if query.startswith('#'):
        # Natural language query
        response = await self.llm_client.generate_command(query[1:])
        self.console.print(f"[bold bright_red]{response['command']}[/bold bright_red]")
        
        if '-vv' in query:
            self.console.print(f"[green_yellow]{response['detailed_explanation']}[/green_yellow]")
        elif '-v' in query:
            self.console.print(f"[green_yellow]{response['explanation']}[/green_yellow]")
    else:
        # Direct shell command
        await self.execute_shell_command(query)

The command handler processes two types of inputs:

  1. Natural Language Queries (starting with #):

    • Strips the # prefix
    • Sends query to LLM for command generation
    • Handles verbosity flags:
      • No flag: Shows only the command
      • -v: Adds brief explanation
      • -vv: Adds detailed explanation with examples
  2. Direct Shell Commands:

    • Passes directly to the C core for execution
    • Captures and handles errors
    • Maintains asynchronous operation
  3. Rich Terminal Output

def get_prompt(self):
    cwd = self.core_shell.get_cwd()
    return HTML(
        f'<ansigreen>{self.username}@{self.hostname}</ansigreen>:'
        f'<ansiblue>{cwd}</ansiblue>$ '
    )

The prompt system provides:

  1. Color-coded components using HTML-style formatting

  2. Dynamic current directory display

  3. Username and hostname information

  4. ANSI color support with fallback

  5. Customizable prompt structure

  6. Error Handling with LLM Explanations

async def execute_shell_command(self, command: str):
    try:
        result = self.core_shell.execute(command)
        if result != 0:
            error_msg = os.popen(f"{command} 2>&1").read().strip()
            explanation = await self.llm_client.explain_error(error_msg)
            self.console.print(f"[bright_yellow]{explanation}[/bright_yellow]")
    except Exception as e:
        await self.handle_error(e)

The error handling system:

  1. Executes commands through the C core
  2. Captures both stdout and stderr
  3. On non-zero exit codes:
    • Captures the error message
    • Sends to LLM for explanation
    • Formats and displays user-friendly explanation
  4. Handles Python exceptions separately
  5. Maintains async operation throughout

LLM Integration (llm.py)

The LLM integration layer manages all interactions with Google's Gemini AI:

  1. Structured Command Generation
COMMAND_SCHEMA = {
    "type": "object",
    "properties": {
        "command": {
            "type": "string",
            "description": "The shell command to execute"
        },
        "explanation": {
            "type": "string", 
            "description": "Brief explanation of what the command does"
        },
        "detailed_explanation": {
            "type": "string",
            "description": "Detailed explanation including options and examples"
        }
    },
    "required": ["command", "explanation", "detailed_explanation"]
}

The command schema ensures:

  1. Consistent response structure
  2. Required fields are always present
  3. Clear field descriptions for the LLM
  4. Validation of response format
  5. Easy parsing and handling of responses

Advanced Caching System

The caching system uses a multi-level approach to optimize performance:

  1. Cache Structure
class LLMClient:
    def __init__(self, api_key: str):
        self.cache_file = Path.home() / '.llm_shell_cache.json'
        self._cache = {}
        self._load_cache()
        
    def _load_cache(self):
        """Load the persistent cache from disk."""
        try:
            if self.cache_file.exists():
                with open(self.cache_file, 'r') as f:
                    self.persistent_cache = json.load(f)
            else:
                self.persistent_cache = {}
        except Exception:
            self.persistent_cache = {}

The caching system implements:

  1. Two-tier caching:

    • In-memory LRU cache for fastest access
    • Persistent JSON file for long-term storage
  2. Version-aware caching:

    • Cache keys include version information
    • Automatic invalidation on prompt changes
  3. Type-specific caching:

    • Different handling for commands vs. explanations
    • Structured vs. plain text responses
  4. Cache Key Generation

def _cache_key(self, query_type: str, text: str) -> str:
    version = "v2"  # Increment when changing prompts
    return hashlib.sha256(f"{version}|{query_type}|{text}".encode()).hexdigest()

Key generation ensures:

  1. Unique keys for each query type and text

  2. Version-based cache invalidation

  3. Consistent hashing across sessions

  4. Collision-free storage

  5. Secure key generation

  6. Memory Cache Management

@lru_cache(maxsize=1000)
def _get_from_memory_cache(self, cache_key: str) -> Optional[str]:
    return self.persistent_cache.get(cache_key)

def _add_to_cache(self, cache_key: str, response):
    self.persistent_cache[cache_key] = response
    self._get_from_memory_cache.cache_clear()
    self._save_cache()

The memory cache:

  1. Uses Python's LRU cache decorator

  2. Limits memory usage (1000 entries)

  3. Automatically evicts least recently used entries

  4. Synchronizes with persistent storage

  5. Handles cache invalidation

  6. Cache Persistence

def _save_cache(self):
    """Save the persistent cache to disk."""
    try:
        with open(self.cache_file, 'w') as f:
            json.dump(self.persistent_cache, f)
    except Exception:
        pass  # Fail silently if we can't save cache

Persistence features:

  1. Atomic file writing

  2. Error handling for disk operations

  3. JSON format for human readability

  4. Automatic recovery from corruption

  5. Silent failure to prevent disruption

  6. Cache Security

def clear_cache(self):
    """Clear both memory and persistent cache."""
    self._get_from_memory_cache.cache_clear()
    self.persistent_cache = {}
    if self.cache_file.exists():
        self.cache_file.unlink()

Security considerations:

  1. Cache file permissions
  2. No sensitive data storage
  3. Secure deletion option
  4. Error recovery
  5. Version-based invalidation

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Implement your changes
  4. Add tests if applicable
  5. Submit a pull request

License

[Insert License Information]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

shell_llm-0.1.6.tar.gz (33.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.2 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (27.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.2 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (27.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.2 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (27.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (27.2 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (27.5 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp313-cp313-musllinux_1_2_x86_64.whl (41.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp313-cp313-musllinux_1_2_i686.whl (40.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp312-cp312-musllinux_1_2_x86_64.whl (41.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp312-cp312-musllinux_1_2_i686.whl (40.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp311-cp311-musllinux_1_2_x86_64.whl (41.3 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp311-cp311-musllinux_1_2_i686.whl (40.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp310-cp310-musllinux_1_2_x86_64.whl (41.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp310-cp310-musllinux_1_2_i686.whl (40.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (42.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp39-cp39-musllinux_1_2_x86_64.whl (40.9 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp39-cp39-musllinux_1_2_i686.whl (40.0 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (42.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

shell_llm-0.1.6-cp38-cp38-musllinux_1_2_x86_64.whl (40.8 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

shell_llm-0.1.6-cp38-cp38-musllinux_1_2_i686.whl (39.8 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ i686

shell_llm-0.1.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (42.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

shell_llm-0.1.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (41.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

File details

Details for the file shell_llm-0.1.6.tar.gz.

File metadata

  • Download URL: shell_llm-0.1.6.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for shell_llm-0.1.6.tar.gz
Algorithm Hash digest
SHA256 80145d750fb566d5725b2510bc06b6d3e73a4822e58648ed570f29c2ec05ef9f
MD5 28d80ea3331409bcbdb5a5664ecfec50
BLAKE2b-256 e22e484e262b026b90a7e5e935fa7ce8d0f4e16d27b89938c4041549ee964fb5

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a4484b3b6c487c209281df7325223ad7fb763be7eca795e697eb5665f53004f2
MD5 4aa35c2e538836f26be1859a6302b0f1
BLAKE2b-256 44a3e4c7754e3f77afd68aad19e8ff38f29d3496c0488c816728c7492d0462ca

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0a89f864fb4f8d6c7a71a1aa565bb9bd565e8fd9dd8c13c48349e9ab1eaedc11
MD5 c076bf7e5c3764c7629f183002f836f1
BLAKE2b-256 965251073d4cc8cfbd2f178cc4c20236be0b4102761312e0e9fcfe2d35fb559f

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1158eeff390ce1ad47e60b2eecafecb63d49cd3ecaef03e2c50da80dc8cffdb6
MD5 4355697b5e7c630aaef17cc1c900afe8
BLAKE2b-256 858616d620c7627ca59a5466e449e2810e8f6912631109d8692d1b55efd61c46

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2a18f8d25a705c0337a2e702cf67226a72df8a16e497c9538db329efc206db2e
MD5 f7e28118ad427fbc4aa3f4e4c7b3135d
BLAKE2b-256 4c25310a10f83100e9563737a98c60740db100bcd67fb0065db86719bcfe92f6

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64fa485ca2741ebde00e64fb95a78e9ad051b3665f419725254cc0d95373ff04
MD5 919b6d7d6d10b74769d0be362f1afe86
BLAKE2b-256 5e18a800fd0b30538b25f4d7ba5519cda25a829604120bddf9b7566167fa4784

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0ebaa598cec9a41fc6231aa40a2cfd676f3b8ad71f5dc9a4fc84f15f4e3a9cd5
MD5 4554ecc9410a7907d85a68104bc30c91
BLAKE2b-256 d3da804375cd8e5c3d4bafaa78249b7d22ee4e69b92b7fcf99456dd8e2645cc8

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 75e87f303581696d4859d54b90e15ff092312d4539b082d2b7ad4d3589cfe187
MD5 798feeff7ddc9687a7267aa91bfba85c
BLAKE2b-256 b31e59b00acf9a6b9124cb60194e10f1c81cc6a0489564139613f34ebd16e8fe

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4cabb3fc38c86902be423a593571aaaf17c6a10def1db1af847e46ba427495f4
MD5 554475b455bfcb8e027966800fdf2a25
BLAKE2b-256 8cb1cbb2ed0fc859eeaa0893ccf98b6ec496c280497f2a3b149a03b95875fd26

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2e865d03e31ee9dd3894a324c8af52dc846b45777b0bfb966baecf408fb5f204
MD5 cdbd6c2a4c5a65815a281f31553235c2
BLAKE2b-256 6905cd2f2fbb67ea5b756cc432616a3b9be300bdf4c9a1fc2bfd83745ccc4945

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 29600d6267970bbf9a735ee60fdaa3da2dc2c33c189f270621ef310ae55290ca
MD5 c65bbc61f07eccca1fb8b177e6f8456c
BLAKE2b-256 9f9afe029fcd7fc56c88b65171bcff1054ed36fc641736d3b07df65360ed7de8

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6d2d4885261519f2484e67634cce9f7edc8d4abbbc449c14b355ad8725e224a0
MD5 ecdde4c3e627e725f578b749832fb32d
BLAKE2b-256 6b56c432f94a9d156a79a75ab6697c28890c9c5a396c6661e7a3e52ac8cb8c81

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3320084f5d8b98fbb4b590ea8ed2ed0b198c716e0afb6d41de909b0ec1499b03
MD5 e56de3982d0245e0cee8e984513943dc
BLAKE2b-256 5921125fd43f713a7fc57ce9439bc8f6d6deebf19ca9da1be52d79f88130ab8d

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0403bda7c9d0be547a73b9417bf1b553ab279108d431ec17c2bf1f6c5568b22b
MD5 6070484cf9279f94112901f63264fbb2
BLAKE2b-256 df33a3e8a86c726a86f29cba53c67e0ab4ed7c2227a957a1e64ff0ab5d3c2a8c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c1dc31562093b2fc7fe7d20a77b85325b6f42ec0af80d396c84a9381a5a41850
MD5 8941d936d6a3376b6ecbebbf93861fb2
BLAKE2b-256 6e50a8c6f905566721546e53f74d1e9494f13c54e0777aacd6f1cc31eba75f55

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b4202b46ba4435a8014d520d987a88944c73fe5b8ca6e9cf1dafb9fffad247b
MD5 474a5bf9ab919ea1c4a2fc6521e67d8d
BLAKE2b-256 ad3a350c31bd927c2fec08fe37166a2165f7740b730a147eff39862307a82ba0

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f076feff7613f7f00244e3bd57a78e4eb5012bc00973a2937c21ddf09ecfe51c
MD5 6d8643de9a7ad7940711b9a4e55f89ef
BLAKE2b-256 4047ed15048f453f48bd89cebdd4bcee04a7c2497660a912ef85eba5a1b00550

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9f4b61f3127e1085e4b41747796280e1ef68f8acbc33e92ecef7a339d25e16e3
MD5 b533bf1f0e456a5c308f3f819af2cd98
BLAKE2b-256 a2c96e29ea0f76f1197bdb8c1df0dd76a69c5eac2a2f95415a1a5d46dabb8a6c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 df643c676d262912589f1d5561ea13208bee4e22d65eef8c885c83dcd2f48d8c
MD5 832ce132e7cab91e99d0e4ffca8b6b82
BLAKE2b-256 54facd3514ab06b399d5b0986b1da95044463b1fe8bfaf48bf13b9a28e860420

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8400a2653e0ed7495f145c4e817cd01338b93e7c5aa99cb56ffe721d58507123
MD5 8be5ccd107249cc06b6e2dd864eb6926
BLAKE2b-256 db4c234e52f2faf0558aaf1ab6125d1851fdd2568659f62046236c65f2762b94

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 aaa354bf18d9b34d73ae260f17a3ab0b5af6bf299d5c8b071d8e30e0fff0a029
MD5 0163c8875205da86f59ac3d9442275ed
BLAKE2b-256 61817cfdea3a3ebd5ea38ee6fc888b0de85ceff8b31c6f2aff022fad78218f1a

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 88e3782ce22a8a19facdead334ebdd1f5e0b8741314919f4f2b6b46d10cf911d
MD5 262fe9141e6299c3ca6e1a9ebd52982c
BLAKE2b-256 4149995f8a0562a88f61d3966f136835f316bd478c0bf9eed8e1cc3272856385

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 ded7ba38aa6b4f923cf62c1cbd3512a88267034c7badab6bce3efd5b03d14ca2
MD5 54191c2fc57dc04ab0f36e43124cde1d
BLAKE2b-256 53da1140fd815a8d3bac0e506154b6c8c1a2821be169862dfb353f3940f3670c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4930978daeb803c02996867e8acbe394cdd9a3a760fb15de3c5dbcd756df0570
MD5 2cabb36df3e896080856e8ad319a360c
BLAKE2b-256 5841a3e6c7993fd3163cd82b3855d128f2b9f7f28acc365d27db8ebdc55d645c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9db55c6af4ed879bffbb44f17736781f2d5d987ac9dba661a846b7c364098257
MD5 5ced73f442e5eb35f50d9f62dbae26bf
BLAKE2b-256 ccd51ffc26fee11b41f62fa5138d05a0e9c289a1e503fbf13d121568f717d4e2

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a2e87a852fe4eddf2c4334d6cdb864e1a0009fb7f79fc91901f433545643ab54
MD5 50cfda408347d80d0ddde1a83dfc0ed3
BLAKE2b-256 bbaaa01b4b66c298eead667422b6bbba291ace7aa2feba64d1d1bbc262ae5255

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 96b9089dd9be1b77e27de533ac7c07f27f68b985ff8ce163d71db7855164bf1c
MD5 8d4daef2964fe8fe0e258ce323027245
BLAKE2b-256 109564bd2ffc4c451ca105d2fbc8bbd6d25aa825b352dde5459500bbee34cf3e

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9c3d980fd82f74560d24a74a108e771668375dd07e989f9f3ab412fa06f4ffca
MD5 9af5f6b5d73ba5a3c3011fa39dd5f961
BLAKE2b-256 bbd9ae7cf85ae8bf51e9abb3e819d4985ff05dcfc0cd456d671b9b107ddccd58

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e3e0fa0ff2b6129612c358d4b235600bb7c899bdd94f5b5d198b8e7ded75ac44
MD5 94daa6dc8ae8251dc5a79b4d427c53b8
BLAKE2b-256 9178f6b5e8dccc27d0c5fa24df3e51bd861372b43af40b572c85db9e54b5cb34

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5de7ec5c0610f3b5d8b6454f92a873bc80b66d90e867ef0f69e2a6d7a240d35c
MD5 4c8ce6956142027a26973df68507727b
BLAKE2b-256 5d8eec970e443894e5eab8de3d1515e3f3d06b19e1ff8c1c02bc9577d2a1208c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp38-cp38-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 5ec2ad5cc1b66a93262f44902856c0aec43f575c682c61c7308a7985607184da
MD5 abcff99581f0a5239d6cf70600731cf2
BLAKE2b-256 b327b620c7f19f70c5dae6dc6a055b93042a8c60e882ce66f757135b5ba5f33d

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 099806ffb39ad0767a83193a9a7d7a9034fdab07dfcead65b74785c13a0aaf7f
MD5 8d887de68f74d4926975ebb46a947e43
BLAKE2b-256 1d5f2479850e32019a51654f4fbff57e5db2affe865f751628449eeef264c896

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for shell_llm-0.1.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 719c0d7258dca3b6895547a5bbec60cff439079818a9ef2f4dec9c68920d4e5c
MD5 96085cf1b45328a4320fc23273038b7c
BLAKE2b-256 c008530bc421e4f116dbce783899fbd251958d15a345003522d50e977a9a2edd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page