hangyav / textLSP

Language server for text spell and grammar check with various tools.
GNU General Public License v3.0
40 stars 2 forks source link
artificial-intelligence grammar-checker language-server language-server-protocol latex org-mode pygls spellchecker

textLSP

Language server for text spell and grammar check with various AI tools.

This tool is in early development.

textLSP

Features

LSP features

Analyzers

Local tools

The following tools run on the local system:

Tools using remote services

DISCLAIMER: THE RELATED APIS REQUIRE REGISTRATION AND ARE NOT FREE TO USE! USE THESE ANALYZERS ON YOUR OWN RESPONSIBILITY! THE AUTHORS OF TEXTLSP DO NOT ASSUME ANY RESPONSIBILITY FOR THE COSTS INCURRED!

The following tools use remote text APIs. Due to potential costs turning off automatic analysis if suggested.

Supported File Types

Setup

Install

pip install textLSP

For the latest version:

pip install git+https://github.com/hangyav/textLSP

Additional dependencies

Some analyzers need additional dependencies!

Running

Simply run:

textlsp

Since some analyzers are computation intensive, consider running it on a server using the TCP interface:

textlsp --address 0.0.0.0 --port 1234

or simply over ssh (with ssh key) if the client doesn't support it:

ssh <server> textlsp

Configuration

Using textLSP within an editor depends on the editor of choice. For a few examples how to set up language servers in general in some of the popular editors see here or take a look at the related documentation of your editor.

By default, all analyzers are disabled in textLSP, they have to be turned on in the settings. Example configuration in lua for nvim (other editors should be set up accordingly):

textLSP = {
    analysers = {
        languagetool = {
            enabled = true,
            check_text = {
                on_open = true,
                on_save = true,
                on_change = false,
            }
        },
        ollama = {
          enabled = true,
          check_text = {
            on_open = false,
            on_save = true,
            on_change = false,
          },
          model = "phi3:3.8b-instruct",  -- smaller but faster model
          -- model = "phi3:14b-instruct",  -- more accurate
          max_token = 50,
        },
        gramformer = {
            -- gramformer dependency needs to be installed manually
            enabled = false,
            gpu = false,
            check_text = {
                on_open = false,
                on_save = true,
                on_change = false,
            }
        },
        hf_checker = {
            enabled = false,
            gpu = false,
            quantize=32,
            model='pszemraj/flan-t5-large-grammar-synthesis',
            min_length=40,
            check_text = {
                on_open = false,
                on_save = true,
                on_change = false,
            }
        },
        hf_instruction_checker = {
            enabled = false,
            gpu = false,
            quantize=32,
            model='grammarly/coedit-large',
            min_length=40,
            check_text = {
                on_open = false,
                on_save = true,
                on_change = false,
            }
        },
        hf_completion = {
            enabled = false,
            gpu = false,
            quantize=32,
            model='bert-base-multilingual-cased',
            topk=5,
        },
        openai = {
            enabled = false,
            api_key = '<MY_API_KEY>',
            -- url = '<CUSTOM_URL>'  -- optional to use an OpenAI-compatible server
            check_text = {
                on_open = false,
                on_save = false,
                on_change = false,
            },
            model = 'gpt-3.5-turbo',
            max_token = 16,
        },
        grammarbot = {
            enabled = false,
            api_key = '<MY_API_KEY>',
            -- longer texts are split, this parameter sets the maximum number of splits per analysis
            input_max_requests = 1,
            check_text = {
                on_open = false,
                on_save = false,
                on_change = false,
            }
        },
    },
    documents = {
        -- the language of the documents, could be set to `auto` of `auto:<fallback>`
        -- to detect automatically, default: auto:en
        language = "auto:en",
        -- do not autodetect documents with fewer characters
        min_length_language_detect = 20,
        org = {
            org_todo_keywords = {
                'TODO',
                'IN_PROGRESS',
                'DONE'
            },
        },
        txt = {
            parse = true,
        },
    },
}