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.4.tar.gz (27.9 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.4-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 kB view details)

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

shell_llm-0.1.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.7 kB view details)

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

shell_llm-0.1.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 kB view details)

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

shell_llm-0.1.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.7 kB view details)

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

shell_llm-0.1.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 kB view details)

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

shell_llm-0.1.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.7 kB view details)

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

shell_llm-0.1.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.4 kB view details)

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

shell_llm-0.1.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.7 kB view details)

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

shell_llm-0.1.4-cp313-cp313-musllinux_1_2_x86_64.whl (39.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp313-cp313-musllinux_1_2_i686.whl (38.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view details)

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

shell_llm-0.1.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.8 kB view details)

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

shell_llm-0.1.4-cp312-cp312-musllinux_1_2_x86_64.whl (39.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp312-cp312-musllinux_1_2_i686.whl (38.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view details)

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

shell_llm-0.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.8 kB view details)

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

shell_llm-0.1.4-cp311-cp311-musllinux_1_2_x86_64.whl (39.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp311-cp311-musllinux_1_2_i686.whl (38.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.3 kB view details)

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

shell_llm-0.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.7 kB view details)

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

shell_llm-0.1.4-cp310-cp310-musllinux_1_2_x86_64.whl (39.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp310-cp310-musllinux_1_2_i686.whl (38.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.1 kB view details)

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

shell_llm-0.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.6 kB view details)

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

shell_llm-0.1.4-cp39-cp39-musllinux_1_2_x86_64.whl (39.0 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp39-cp39-musllinux_1_2_i686.whl (38.0 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.9 kB view details)

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

shell_llm-0.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.3 kB view details)

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

shell_llm-0.1.4-cp38-cp38-musllinux_1_2_x86_64.whl (39.0 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

shell_llm-0.1.4-cp38-cp38-musllinux_1_2_i686.whl (37.9 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ i686

shell_llm-0.1.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.4 kB view details)

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

shell_llm-0.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.8 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.4.tar.gz.

File metadata

  • Download URL: shell_llm-0.1.4.tar.gz
  • Upload date:
  • Size: 27.9 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.4.tar.gz
Algorithm Hash digest
SHA256 f0b04329f92f74a93312a71d7b066a84e26b561a2226f88f651ac68d72939173
MD5 42294ddd1a30eb2ee5f678ba51cab4c2
BLAKE2b-256 64b08b0561749a1624dbb675b23ba5d8fb1ab910dc89aac453b2ec0432866185

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c0aaa72c7778433fe395bd89188ae619e00aa9c6fa969137bef30890a02a50e1
MD5 4ecaed3ffc8d2ed1b3732b592afd0329
BLAKE2b-256 7e1a8dc09ee8ef2dd8735f74b02f21264028268d1cf2be7c57c63ca82897c158

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 111ea4c2b5fb725fae2011bf44aa3fcb4b9cd54945026dc3cfbd76dbb1e2837a
MD5 7513f2c9920e7e2ed4c99162d85ae30b
BLAKE2b-256 28d87697faf5cdb4fcb04c782f823024f8975742b7cc661e44b0992a3a429c78

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 32b68b9b9e2d4f9a609b53baaacbadcce1262e602bc3303d9a4f2fb95022df15
MD5 a2e677291e9ab3225dd3aab6406fddf6
BLAKE2b-256 e888d977c37517174e88dd7baf1a8f265783ddf8898c031fe4a77f163b882c51

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 09aaeb528be4ed2d0d3185fe644837c491666b7158ca58e36749155ec4062d4d
MD5 d4b1bdf6b11865d7441020e26af1deaa
BLAKE2b-256 1f2e048b1f0b5082e0d2da12aa24c8a22289f10169bb237bf89420da922b0cfc

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf60e8834a35600d8b6b2296127ff18c3e99bc7f71809a7cf6ebfd0d857c22cb
MD5 cbb789c351929c5748a1bdeff18f5b92
BLAKE2b-256 116606a34681b7310b4fffff44f3b3108dc9d55fc1b3962cf77325f51083e23d

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3944c12442cc1586bae5b4e4aa0514f875cf99e5a80a55572cb6ee043e2d7664
MD5 204c82aa0391360a83e6ff73b31bd589
BLAKE2b-256 e4e32d1090addf9500f7dbf3f24378a0d8bdd5185e3ab8ec14aceee65026ffe5

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e15b8fca24fb4668ba45df7b3c38c0e73dc2211b52ce0ea348e5a9f9f1f79e3b
MD5 9f8f487195bd02d805f0a9fe2c4502bb
BLAKE2b-256 976d7c9d25b72b2dc80b16c093ed0768bf9366ef63a8f68e8e722dc313a7b69d

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6dfb9d44f64cd7d6f6c1aabae5d81fb48e17686ede9a10e383a71cd754d30047
MD5 3a1b65a77859d28982c63361fc0ec2c1
BLAKE2b-256 71320b3b4b495ff2a544a56ee7c2867f507ff5a6645ee3e013c610b6703397cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0e012478ad1c8b1ad13eb18712a4a4615f080308694da7ea475c5b671ab7f263
MD5 0804f13a615396b0a9445a30c5ea97d4
BLAKE2b-256 323fe0ffd87b2e329d6ac68f27397ab8084e57176b04ff8c9c4bacfdf7fcfffb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 150469d228520f0cc8f05c5feb46ad469c35c6251a50eb3ecc1386ae40cfedb0
MD5 fcd64a2102821a6cdb4ff68bdad51761
BLAKE2b-256 c1a4a0449fd79027e0f0b8f335915443d8c2e9096603513fd23990b44bc6bbb5

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b54c4e6f8022ab73deb7691bd62a15c11d071ca9a444920c6b45e364b4d9ca6
MD5 2b483ba21a56b123e995f6c970b2640d
BLAKE2b-256 2749807a6e656ed0c5ca4a76428f6c0126a6a4745fb17c68b23f3bd8405d0b73

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2dc6c771e9b31ab6075f9d3530b8cfb5cf275144d080faab292aa819363cae29
MD5 e50930200743ab2acbe1d00845c276b4
BLAKE2b-256 d098f1e835be0f1f68407480b96388caad78beaaee6c33caf5e33db750d96077

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 66bbf954f671dc09ac46faa460d76cddbd9fff5967d8a0a31017a81c4ffb6ef4
MD5 c457a3cd84a5c4f809b9bf334e619387
BLAKE2b-256 b0df60f76f8c637f12e3fce2d59adf27e7e55a9e3f1914b970ffdcc71d9d0ffc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fd4cb417206275104924f04a256ecbac14efdedc68cfa20411956b41f32bc06f
MD5 9b081e7e4d1f37027aad8397be96bdd3
BLAKE2b-256 e470aa2718e01cb539c0bbbe830fbf2c6823a1bd5eea24384c74a7d6bb9b80e3

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 96075770d621c8ea687f3cc1824603f31d4dd998a714974408119950e66c24ac
MD5 1bfd8e33e861fc489e55580fb95e79a0
BLAKE2b-256 ab98ca5807284984c7794b8703c85269846bf63e95673db749670cdd1dab732f

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 318324a9bc5901ff3259e09d2a6d1e85e37af05c70e9fdbae469be240fa7e0e9
MD5 aae343e4a3c9ea5a0ac4a4f3f437a31e
BLAKE2b-256 760056ae3e0da5b220a07522c03a458dc14c2b6f14635ba287fc29b7e16155c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a28182850d052e5beb2d8ad91e1a65f2a519fff8b81f881651c876ae68316b1d
MD5 0153587250fcb902d51623f15ac46ca7
BLAKE2b-256 705dac7a941dbfdb511a9f0e753d62a0930130a6c41b049aca35c46300f025ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 bfed768e1af437493158b06231873180464a8d8325362d4c99f99baf30234fcb
MD5 e64733f65fe1fcd1afd9c8bdbe81f927
BLAKE2b-256 85f87869dfc2614665bda330fec49cc87050d9a390b897d9f17c8dec598b81bc

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ac65dc3d95cabb3f67028b250ec6df4c3527e2922a436bc7009e4dfb19af67a4
MD5 e8fec4bd5eecce754a32cfa341661e14
BLAKE2b-256 6ec0e89bacf4dd3b3338b0294d2fb81a09af7d616b1c5b68108cfa5c9b98522c

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 95f63f7db242f07051ddc2dc6decfc1bfaae650f0312ae2d2a640e73b0e29529
MD5 d3c7446304bb8bd072a929a20d17f406
BLAKE2b-256 b46450ef6725675f658b3631aed4eeebd9eaa4086941dfae05416549ea595853

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4c79d09e40a482847f26324b5d4b83d269ffa0859134f889b110d52e51a7524b
MD5 61e1fab7f369def907376ad610144f72
BLAKE2b-256 a14a1c767f9474236390076fba1722c5924f2a6bf870e30f43bb9899fc1aa52e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 766d3d1d53664c3c419502899dfae177dc04d0c5d9129c228ab2b6f524332c5f
MD5 94b0ff49022bc74c777a89300cc888de
BLAKE2b-256 cf82fc26055cdb20780eb89c5ff8a83841dcc5b4a4cf9a1acac5e1d50a7da5ad

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 22c3a64ef7eb8604ce8799799bee5f0a54e92f674ab92e87d5f13e699c375f78
MD5 900d8486d488fe6b99095dbcff6570f4
BLAKE2b-256 9094c690b89446e5ed3a91a7bb7825a4133a09c62bcd3df4340efe34d726668e

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c6b9acfe0fac112f67aeb04f0273a012690199db78c91b039272d04d6c859f59
MD5 f87450246e1d7e7b6f21d8b82d6c9a56
BLAKE2b-256 2d9c0a74056df7f84a2b7118dc386a6c249cdfe0d963927d19950e4cb5f9dc22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0c4d22bf1025cccbc28549bf2f8f35f36a026fdafb10053f1ba01365f7a9e971
MD5 9e801a0a8f25379e2fec160640847945
BLAKE2b-256 89398c47895dc0327fc9e9a64138edb6e5e648af2e57b718d783724e6993147a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 94a205f9fc5143c89a836086d00af1fa774a423d84afcaa9a174e0083ce6a14c
MD5 00d4ceee899b0c26350bdab697ebd985
BLAKE2b-256 56525dd5213ef111b1f8ec664121d030fcf481fe11596f6ee004c534e102ec6e

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d8d1100773638c78806559fd2250d2eac229445ba60c1ae3576272a14e5370d
MD5 7c7bc89fcd586a57947cce35d303d2ee
BLAKE2b-256 2e527c77530f64d0fd419079e121dc1633f361dad61897c75e32f641155ec49b

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 db1285242b9184714d6f1da6a4bbe65ddc3379300b0c9fcad51db483b30f0c68
MD5 61a5b71ae383f3e47685963e06b617fa
BLAKE2b-256 ea5cd576ba2cdc106ab515ab62bf6a9ba4f3e975ba2cc6c8b26f1ad082ad89f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 52c6c703d96589966417f9954c92cc8c87791fba623f3e37d229e0484eaea747
MD5 3ba9b4857f48043bf2b591aa096b599c
BLAKE2b-256 3df44177ebbc79f43fcf1b079d55fcbcff0345c2854932f9d151333fc8de279b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.4-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 b74855be6311d5dae516d4091bcb19e0fefb99a600e9949a4b564e772d6c4d1b
MD5 5d3ac520a6fb7fd3a45f0795afe4c738
BLAKE2b-256 bce1f283e437eb57bce9957251b21821bba41daa2dda17ced24aa86043aabcb2

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d15fa75cf0cca9067495ac05ffacd12cc810ef26af70dda2f58d2419fafc7b5
MD5 df84f16576e15b3a0b5f054fd1e92ade
BLAKE2b-256 cc6e980d1c9eb8867569f25cd35f1606e3b138f76d4f1bb8a99bd7f09d919b61

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.4-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.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 da43691aab024fe800c914241e7ab0de79b09bdbd1f65b3302a67d8e4b62558b
MD5 be702fadc316767a880e41b10753e30a
BLAKE2b-256 e8c75d011e0ac5409a1d56e24c1a464389ed89d8473c30147c1530210a0411bf

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