Skip to content

Copilot hack for running local copilot without auth and proxying

License

Notifications You must be signed in to change notification settings

knilink/tamperpilot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
  1. Clone the copilot script to be tamper with
git clone https://github.com/github/copilot.vim.git
  1. Install dependencies
cd tamperpilot
npm install
  1. 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.

  1. 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:

  • Fetcher: the context responsible sending all http requests.
  • NetworkConfiguration: defines a bunch of URLs
  • ConfigProvider: provides config
  • AuthManager, CopilotTokenManager: handling auth

About

Copilot hack for running local copilot without auth and proxying

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published