knilink / tamperpilot

Copilot hack for running local copilot without auth and proxying
MIT License
1 stars 0 forks source link
codecompletion copilot llamacpp localllama ollama

Tamperpilot

A GitHub Copilot modding tool for enhancing user's local experience by overriding app context with custom script.

Quick start

  1. Clone this project

    git clone https://github.com/knilink/tamperpilot.git
  2. Clone the copilot script to be tamper with

    git clone https://github.com/github/copilot.vim.git
  3. Install dependencies

    cd tamperpilot
    npm install
  4. Patch script

    npm run patch openai ../copilot.vim/dist/language-server.js

    where "openai" is the build entry of the script to be injected, which is src/openai.ts If this step succeed, there should be a ../copilot.vim/dist/language-server-tampered.js generated.

  5. Test the script(optional). It should work with any openai compatible api, here use ollama at http://localhost:11434 as an example

    npm run test-completion -- \
    ../copilot.vim/dist/language-server-tampered.js --stdio --debug \
    --baseUrl=http://localhost:11434/v1 \
    --model=deepseek-coder-v2:16b-lite-base-q4_K_M \
    --stop='<|file_separator|>' --stop=$'\n'

    Args explanation:

    • --stdio: always required by language server.
    • --debug(optional): language server built-in debug args to enable debug log level.
    • --baseUrl: The base url of openai completions endpoint, e.g. http://localhost:11434/v1 for ollama
    • --model: model parameter to be injected to completion request payload, or alternatively use language server's built-in env AGENT_DEBUG_OVERRIDE_ENGINE
    • --stop: overriding language server's built-in stop sequences
    • --add-stop: append stop sequences to language server's built-in stop sequences
    • --unset-stop: unset stop sequences

When testing with ollama, make sure the model support FIM and the model file is the latest, AVOID codegemma as its tokenizer is required to be fixed with latest llamacpp/ollama. If this step succeed, log message completion {"completions":[..., "text":" age = current_year - birth_year", ...}]} can be seen at the last line.

If the completion is empty, check the log for [fetchCompletions] request.response: [http://localhost:11434/v1/completions] to make sure the request is sending to the specified --baseUrl, as well as server's non 200 responses.

How build a custom script

Below is an example to show necessary to build a custom injection script. First, create a file in src folder, src/myScript.ts for example, with following content.

// file://.src/myScript.ts
// import TamperContext
import { TamperContext } from './utils/tamperContext';
// optionally import presets to be applied
import { dummyAuth } from './utils/presets';

// create a tamper context instance
const tctx = new TamperContext();

// optionally apply preset
dummyAuth(tctx);

// setup hook, here use 'BuildInfo' as an example
tctx.tamper(
  // name of the context, more can be found in src/utils/contextKeys.d.ts
  'BuildInfo',
  (
    // instance of the context
    instance,
    // class or abstract class of the context, could be optionally used for extending
    BuildInfo
  ) => {
    // overriding method function, monkey patching is recommanded to minimize the chance of breaking
    instance.getDisplayVersion = () => '3.14.159-tampered';

    // must return the instance of `BuildInfo` or classes extends `BuildInfo`
    return instance;
  }
);

// export context instance as default, this step is IMPORTANT.
export default tctx;

Then run the patch

npm run patch myScript ../copilot.vim/dist/language-server.js

Finally, test the patch

npm run test-completion -- ../copilot.vim/dist/language-server-tampered.js --stdio --debug

If succeed, version 3.14.159-tampered can be seen in the initial debug log message [lsp] GitHub Copilot Language Server 3.14.159-tampered initialized.

More context info can be found in src/utils/contextKeys.d.ts, typing was done based on copilot.vim#v1.38.0 so could be inconsistent with other versions, below are contexts that are considered useful: