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.5.tar.gz (30.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.5-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.0 kB view details)

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

shell_llm-0.1.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.3 kB view details)

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

shell_llm-0.1.5-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.0 kB view details)

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

shell_llm-0.1.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.3 kB view details)

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

shell_llm-0.1.5-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.0 kB view details)

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

shell_llm-0.1.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.3 kB view details)

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

shell_llm-0.1.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (26.0 kB view details)

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

shell_llm-0.1.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (26.3 kB view details)

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

shell_llm-0.1.5-cp313-cp313-musllinux_1_2_x86_64.whl (39.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp313-cp313-musllinux_1_2_i686.whl (38.0 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.0 kB view details)

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

shell_llm-0.1.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.4 kB view details)

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

shell_llm-0.1.5-cp312-cp312-musllinux_1_2_x86_64.whl (39.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp312-cp312-musllinux_1_2_i686.whl (38.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.0 kB view details)

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

shell_llm-0.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.4 kB view details)

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

shell_llm-0.1.5-cp311-cp311-musllinux_1_2_x86_64.whl (39.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp311-cp311-musllinux_1_2_i686.whl (37.9 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.8 kB view details)

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

shell_llm-0.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.3 kB view details)

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

shell_llm-0.1.5-cp310-cp310-musllinux_1_2_x86_64.whl (38.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp310-cp310-musllinux_1_2_i686.whl (37.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.7 kB view details)

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

shell_llm-0.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.1 kB view details)

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

shell_llm-0.1.5-cp39-cp39-musllinux_1_2_x86_64.whl (38.6 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp39-cp39-musllinux_1_2_i686.whl (37.5 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (39.4 kB view details)

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

shell_llm-0.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (37.9 kB view details)

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

shell_llm-0.1.5-cp38-cp38-musllinux_1_2_x86_64.whl (38.6 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

shell_llm-0.1.5-cp38-cp38-musllinux_1_2_i686.whl (37.5 kB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ i686

shell_llm-0.1.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (40.0 kB view details)

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

shell_llm-0.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (38.4 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.5.tar.gz.

File metadata

  • Download URL: shell_llm-0.1.5.tar.gz
  • Upload date:
  • Size: 30.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.5.tar.gz
Algorithm Hash digest
SHA256 c553f78f6a7b740319a589ff665c883f954200fe1b2be235dd12ef8214ffc343
MD5 616d0d927b45db4ab85775f2c4e671a9
BLAKE2b-256 b4651dc0e96dc6c634e91cdf7e9d4055d0e431e30c960156d87efc255dffdb08

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp311-pypy311_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad832b303388475106a4333cf2f2b306266516c860bc2537cf0c6e92101f380d
MD5 116a736f44351252de5f95c24073c0f1
BLAKE2b-256 a07353341fcafbf0ba46ff9f9391f575626902660b298c7146731da0e35eaa3a

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 19fe71d94d1bb824a802759c2f80af0f78178cc71690ed34cab651c500cd3d69
MD5 385daea604a03a85b3c7ccbc6fad09c5
BLAKE2b-256 92bf88df13cdafe76fb66f21133ec2800edb84ce3b48a21624c13405b0183966

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d0fad26f9c4715010a00c8bc25a424421231be848ed97e5ee2c517f957f9296a
MD5 28629b3d987be6b5365dea080ffdc446
BLAKE2b-256 cc6b71dc28f73aa8438e055ac315a47ab7e67fd5a23a693163df23edf81aa893

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 116d9f193f6e6da31ff22d2122a577d744303c079d083a19aa9163572c79371e
MD5 cff5b492fe39386c20f78fa899a063af
BLAKE2b-256 6ec41bee60b6fc3bdee19d9c22531fd641c5ab1c70f1a38e982cf3bf13d1d9dc

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a31db18547e353825fcc2636944ef844852ea7d3166b166ae9eea671727c1bf
MD5 2f8751347dc98e7312408e2890ef92a1
BLAKE2b-256 273b162208368ee3ce5c551db6b6dda83c683db8052643f7dc6e34a3c3e0128f

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 baf12e6428f00d018c0ac6945b8be3f17df6c1c1e6653447299b5b0d993a428d
MD5 39a09718de9e0c405c10c7f70bd67f22
BLAKE2b-256 1a904f608954c26811066cb9d59b9a0458555cea55845fce92a21e568b183d40

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0ab8071e3485f80a9106ccbc8eaa382264206e46765d817ec9026818c4879e29
MD5 ed84c518b9279221226ff6a52bf5b98c
BLAKE2b-256 a1e6f1af6e47303091c098a8d3a2782bf6c9feeb230eec38e6fd0e2e395c1c7e

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a728229c28c690fe7b9486b67ef42b3063c9a6aa228f3d88e7780c968d3053c2
MD5 4d2079554119bbdd1b01c1fd50b2102b
BLAKE2b-256 d66f6388502a5e871199f40db0010faafc557e07e4dcf6685b9b0c2289037f37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a26cabf0fa53b2213ff1a60e2f0b7909c2ddac2f6dd84c92a9130ec7ce639f25
MD5 ab3b1bc6ea070ed42461ee594ef3d2c5
BLAKE2b-256 ab99b9cce17b908d398303a63f1ff3b7734b9de83660d024542068a126ed0de0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 63a91e02f000e6d29f7d0fc3b760e62ce7b9cc086e67b7b4d55185053de5f2fa
MD5 c71b889808510720fa7e84351a154392
BLAKE2b-256 b8f3058027050675b21358d99969ee24422df4c046d6ea210e57d70af6284666

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6626064085453a0ac169300eb077533e26dac992155f4582a2c3837e8c896e6c
MD5 77717d7d5b1db9aa19367286f92391e8
BLAKE2b-256 bfe032d11a82f857c12ed5defb2abc47c0519e6390ef0674ee0aad687948f258

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 51c05ff0ff1b5dab0d807cdd559142286c190007cc65b1baceaccdc67700ad5c
MD5 75b992ce2d3e185221eae3789e0657f4
BLAKE2b-256 8103b9ac2a97cb60c37235988b1e200809b98c88cf62be94947a6b6e354f9c26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c56e7a1617ed24688e4537b4840ead0ce059145685ec44b1ec72bd16b7343ea6
MD5 5c15c28befec60c9a1d8f0c3d118590a
BLAKE2b-256 9a5b38956eaa7d504ef955a09513f8f2bcaef1757f08ed7e00f93f527f92a457

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 4864cb2568898d3f2d3c00680acbf52480beeb994f6dada97ef52a5b2936e691
MD5 b0f23a19f9bb08a4c4004d5961d1e78d
BLAKE2b-256 03f075fa725a235299c7f3cec2ea5e14cd198fd68a3d2ddf52caa231759926fe

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 848e64ec2b689856f1c56bdcdf31ca7607e7ec6fd1fad4a48646c15c45a0586c
MD5 77671e799634b20d2d4f0d759b4dc8b0
BLAKE2b-256 a32496a88bad6fcc482fbcae1fd84c2ab106d2cd7f586526bf3b96862163442d

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1bdbe37048ed5deba2b5979aa926a2ee01db77a7b317ddcb3fac28e4da5b094f
MD5 ba45a3468ed84969118df675c6f728b4
BLAKE2b-256 cd69f3c9a1d2e6448507e63c4b7a4d6c71024f94fb47233ab6e02289a882d5de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4487856ca6ab429471492a4062a40b89870f3739214456a796f8f1f6c1e6e6e1
MD5 8dc3cbe796cb914e68c6eb52660e2b30
BLAKE2b-256 628ef962a266b288a845d25917c2f077825e23b98aa89648e5a5a76e97ca23d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 3fd2e026df7519290172715f04567b4630a5341fea1472845d40408ccc582b7c
MD5 b32c06189311e97afa134320b870908e
BLAKE2b-256 2494498e313f9f64659341afccf91e839ec571fc372cde7519046eee516bc3df

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 421b76b08666eeb34b30dfcec9229fdb9108d35d5acde4ea823743a351754b95
MD5 00ba356ecb708285623605860cc9f8b0
BLAKE2b-256 9be8828cdc45aa1f8fe2bc3e08b5c0f05f77263db828ee3f91d707f7e19c048e

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 268b43b844307616f8b74bbbf2d2555a6d5783bbe25bc276b56e0de5e4868557
MD5 ddde786d90b39a239e85d09fe5759369
BLAKE2b-256 877cc0f336d3faed9b5c344cdf027a07471d6cd9216afc0616015358a949e18a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2bf43212a40d2cbc8eb7eadd4bab500f8f6cfeb53b817ad6bb34dc0f4c713632
MD5 e7953d0824a3ef991364055f24b29d7b
BLAKE2b-256 800b31c13adfe0b82734504b487a3c59eb44126a267083a394c4bda63bec07f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a5d522eaa6e576477f5ddc87d4d744de94a3fbd561db609f326b88494bb3a2ed
MD5 c55f0d96f37cae52f31f9873f0971033
BLAKE2b-256 13a1f95272673ca56d6f0f3027b5e97de9ed45b851ebf524c693809d5049caf3

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42b470ea9f8c013e3d78a035216292a1d7c633fa90ecea4745527b87df03545d
MD5 edd55be8e931f9e77837410198736b75
BLAKE2b-256 3aea26043103500417a8d71a4a5c7c7776cc57cc1e402e17838c74554439ba39

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e4a96c1b35428bcc5719144c56140667361f625789b0af37d2ef9e32f613e794
MD5 4b8597ce37b52879d33ae82e548e2d99
BLAKE2b-256 6de4a0c9e3de3aa625bf5ca6acbd65a86e5bc4fbf9cbdeb564780406630c7dc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a47cb3733da2bd881756ed834fa069195e9104632dc20d54ba79183cad255713
MD5 8d3a121fdc4d3ee6a789395cb296f221
BLAKE2b-256 020de257a97fce6f75a6cf1466d777409a788394e4d8334a475051f9088b4009

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 81b2d05620e7e5bd6f6cb9dcc2b8b5cc361187da620207b2db49ace11e1d58d4
MD5 1cbf266d605f7ce225781135664601c0
BLAKE2b-256 a19004165f4ba67f8f2f54f8fff2accb82fcf36a7e9ba6467d17ea555f3f0a14

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4feac5888013a03c168db7b7aaceba35bccda93c7c32fa7bd80ae3a32825e5b5
MD5 03455ddeae2598989c36ae6ad8ed1fa1
BLAKE2b-256 74323f9a890c611e5cb0f3b40dc467f3783f94f0c37f13ba089df3f8bdaf4f34

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 05fcdf04b451296d3610432ecaf2d0083b9a760a5c48061e0132385fc68cc9da
MD5 bb430142eadb1d7232a71f840a11944a
BLAKE2b-256 0d10dbb837b12e5e2a4af6b7f83f8992fbc6a1c6bb838de93b7398512558dd41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3e43b5935b5b437d7acf78962b7c7178bae4bbd122f498e92fc67a4b448c2668
MD5 40dc0d761488298bbc2b41e65a8448d8
BLAKE2b-256 23a6415db74847945b59cfde84e4acde4ed38facfd46da1754aed7da55f49607

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for shell_llm-0.1.5-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 44d8f790e54836ab3c849e0497498bab5f12a61a0b41a98f0e7c81a3160669b1
MD5 807d049ce2e385b8e5f72982d843a4f7
BLAKE2b-256 e6440cca6ae96e6bd1add3e8a1f4beeca1dae1df4957bccd4ddd151909381927

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 53fe2e18531937f4c3abb6271f6296f4551a99b73e0802ef805c3227f6502d06
MD5 0aaaa29557d56fd64ecb0d20a6c9344f
BLAKE2b-256 420a4c47c0b0813a5084db377383c3a6b00b10b9cadf1f9acd840f0b8dadf0ce

See more details on using hashes here.

File details

Details for the file shell_llm-0.1.5-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.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c615cbd4906b7fdcc0f40d1be78f2b1eadbc0c5b35c129b4e8cf9d6649c5cb21
MD5 2d84305b85417c655e0b85466a1b3f55
BLAKE2b-256 f1dfb9e732c328e218a6ba1c78a6b2f2db58d4957329570a540885004885bddb

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