jupyter_copilot
PyPi 패키지
JupyterLab을 위한 GitHub Copilot 확장 프로그램입니다. 이 확장 프로그램은 copilot.vim에서 제공하는 언어 서버와 @jupyter/completer 모듈을 사용하여 노트북에 네이티브 GitHub Copilot 자동 완성을 제공합니다.
https://github.com/baolong281/jupyter-copilot/blob/656c425c9956eb1563a3f90990e0b270ebff725f/imgs/demo.gif
⚠️ 경고: 확장 프로그램 서버의 인증 기능이 현재 비활성화되어 있으므로 SSH를 통한 원격 노트북에서는 사용해서는 안 됩니다. 또한, 이 확장 프로그램은 JupyterLab과 Jupyter Notebook 7만 지원하며 Classic Notebook (v6)은 지원하지 않습니다.
이 확장 프로그램은 아직 매우 초기 단계이며 미흡한 부분이 있을 수 있습니다. 버그를 경험하거나 기능 요청 사항이 있다면 언제든지 이슈를 열거나 PR을 제출해 주세요 :)
기능(Features)
- GitHub Copilot 🤖을 이용한 인라인 자동 완성(Inline completions)
- 네이티브 GitHub 인증 🔐
- 사용자 지정 키 바인딩 🔥
- 다국어 지원(Multilanguage support)
요구 사항(Requirements)
- JupyterLab >= 4.1.0 또는 Jupyter Notebook >= 7.1.0
- Node.js >= 18.x
설정 방법(Setup)
확장 프로그램을 설치하려면 다음 명령을 실행하세요:
pip install jupyter_copilot
Copilot에 로그인하려면 명령어 팔레트를 Ctrl+Shift+C (macOS에서는 Cmd+Shift+C)로 열고 Sign In With Github 명령을 선택한 후 지침을 따르세요.
https://github.com/baolong281/jupyter-copilot/blob/656c425c9956eb1563a3f90990e0b270ebff725f/imgs/login.png
https://github.com/baolong281/jupyter-copilot/blob/656c425c9956eb1563a3f90990e0b270ebff725f/imgs/auth.png
로그인하면 아무 노트북이나 열어보세요. 확장 프로그램이 작동할 것입니다!
설정(Settings)
설정을 변경하려면 Settings > Settings Editor로 이동한 후 Copilot을 검색하세요.
설정 (Setting)
| 설정 항목 | 설명 |
|---|
| Enable/Disable | 확장 프로그램 활성화 또는 비활성화 |
| Accept Keybind | 자동 완성(completion)을 수락하는 데 사용할 키 바인딩. 기본값은 Ctrl + J입니다. 이 설정은 단순히 문자열이며 작동 여부를 검증하지 않습니다. 현재 Tab을 사용한 자동 완성이 작동하지 않으며, 변경 사항이 적용되려면 노트북을 새로고침해야 합니다. |
제거 (Uninstall)
확장 프로그램을 제거하려면 다음 명령어를 실행하세요:
pip uninstall jupyter_copilot
문제 해결 (Troubleshoot)
프런트엔드 확장 프로그램은 보이지만 작동하지 않는 경우, 서버 확장 프로그램이 활성화되었는지 확인하세요:
jupyter server extension list
서버 확장 프로그램이 설치 및 활성화되어 있지만 프런트엔드 확장 프로그램이 보이지 않는 경우, 프런트엔드 확장 프로그램이 설치되었는지 확인하세요:
jupyter labextension list
기여 (Contributing)
개발 환경 설정 (Development install)
참고: 확장 프로그램 패키지를 빌드하려면 NodeJS가 필요합니다.
jlpm 명령어는 JupyterLab에 설치되는 yarn의 고정 버전입니다. 아래에서는 jlpm 대신 yarn 또는 npm을 사용해도 됩니다.
소스 디렉토리를 감시하고 여러 터미널에서 JupyterLab을 동시에 실행하여 확장 프로그램 소스의 변경 사항을 확인하고 자동으로 확장 프로그램을 재빌드할 수 있습니다.
watch 명령이 실행되는 동안 저장된 모든 변경 사항은 즉시 로컬에서 빌드되어 실행 중인 JupyterLab에서 사용 가능합니다. 브라우저에 변경 사항을 로드하려면 JupyterLab을 새로고침해야 합니다(확장 프로그램 재빌드에 몇 초가 걸릴 수 있습니다).
기본적으로, jlpm build 명령어는 이 확장 프로그램을 디버깅하기 쉽게 만들기 위해 소스 맵(source maps)을 생성합니다. JupyterLab 핵심 확장 프로그램에도 소스 맵을 생성하려면 다음 명령어를 실행할 수 있습니다:
jupyter lab build --minimize=False
개발 환경 제거 (Development uninstall)
jupyter server extension disable jupyter_copilot
pip uninstall jupyter_copilot
개발 모드에서는 jupyter labextension develop 명령에 의해 생성된 심볼릭 링크(symlink)를 제거해야 합니다. 위치를 찾으려면 jupyter labextension list를 실행하여 labextensions 폴더가 어디에 있는지 파악할 수 있습니다. 그런 다음 해당 폴더 내에서 jupyter_copilot이라는 이름의 심볼릭 링크를 제거하면 됩니다.
레이아웃 및 구조 (Layout and structure)
https://github.com/baolong281/jupyter-copilot/blob/656c425c9956eb1563a3f90990e0b270ebff725f/imgs/diagram.png
이 확장 프로그램은 서버 확장 프로그램을 위한 jupyter_copilot이라는 Python 패키지와 프론트엔드 확장 프로그램을 위한 jupyter_copilot이라는 NPM 패키지로 구성되어 있습니다.
이 확장 프로그램은 인증 및 GitHub에서 실제 자동 완성(completions)을 가져오는 데 copilot.vim이 제공하는 언어 서버를 사용합니다. 이 언어 서버는 copilot-node-server라는 이름의 노드 모듈(node module)로 패키징됩니다.
프론트엔드는 웹소켓(websocket)을 통해 로컬 확장 프로그램 서버에 연결되어 노트북 업데이트를 받고 LSP 서버로부터 자동 완성(completion) 정보를 가져옵니다.
jupyter_copilot
이것은 로컬 서버의 코드입니다. handler.py는 프론트엔드로부터 오는 모든 웹소켓 메시지를 큐(queue)를 통해 처리하여 시스템 오류가 발생하지 않도록 합니다. 웹소켓 메시지 처리는 NotebookLSPHandler에서 수행됩니다. 또 다른 클래스인 NotebookHandler는 노트북의 코드를 메모리 내 표현으로 생성합니다. 이는 각 코드 블록에 대한 배열을 가지고, 업데이트가 있을 때 해당 배열을 인덱싱하여 내용을 변경하는 방식으로 작동합니다. 이 클래스는 또한 LSP 서버와 통신하기 위해 lsp_client를 사용합니다.
실제 node.js Copilot LSP 서버는 lsp.py에서 프로세스로 실행됩니다. 이 서버는 node_modules/copilot-node-server/dist/copilot/language-server.js에 위치하며, 다음과 같이 실행됩니다. lsp.py는 이 LSP 서버와 통신하는 인터페이스를 제공하며, 충돌할 경우 재시작 기능을 수행합니다.
이 폴더에서 변경 사항을 만들 때 npm run watch는 변화를 감지하지 못하므로, 변경 사항을 적용하려면 터미널에서 Jupyter 인스턴스를 다시 시작해야 합니다.
TODO
- 대괄호 내부의 자동 완성 기능
- 더 나은 키 바인딩 시스템 찾기
- Copilot 채팅 (?)
- 사용자 정의 제공자 (?)
- 노트북으로 포팅 (?)
이 프로젝트들에 진심으로 감사드립니다 ❤️
copilot.vim
LSP-copilot
copilot-node-server
copilot.lua
stackoverflow post
GitHub Copilot
확장 프로그램 패키징
RELEASE를 참조하세요.