-
Notifications
You must be signed in to change notification settings - Fork 2.1k
feat: add GitHub Copilot Provider that support agent mode #7010 #7072
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your contribution! I've reviewed the GitHub Copilot Provider implementation and found it to be well-structured overall. The OAuth device flow authentication is properly implemented, and the TypeScript typing is comprehensive. However, there are some issues that need attention before merging.
/** | ||
* Determine the X-Initiator header based on message roles | ||
*/ | ||
private determineInitiator(messages: Anthropic.Messages.MessageParam[]): string { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this X-Initiator logic correct? The method seems complex and the logic for determining 'agent' vs 'user' might not cover all edge cases. Could you add more comments explaining the rationale, or consider simplifying this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah. This method is mainly used to determine whether the last request was sent by the user. However, there is currently no such flag, which can only determine whether the text in the message has the specified tag.
|
||
private constructor() { | ||
// Store tokens in user's home directory | ||
this.tokenDir = join(homedir(), ".roo-code", "copilot") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security concern: Tokens are stored in plaintext at ~/.roo-code/copilot/tokens.json. Have you considered using VSCode's secret storage API instead for better security?
Example:
await context.secrets.store('copilot_access_token', accessToken)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this is no different from other apiKeys. And it is difficult to get the context in a singleton object
fcd4536
to
6e825b2
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you @NaccOll. This looks good. My main concern is the TOS that we might be breaking by pretending we are Copilot:


After the review comments are addressed, I will approve it and let the team decide if we should merge this.
@NaccOll Thank you for addressing the review, it seems that a unit test is failing, can you take a look? |
e1c32ff
to
f3d35b3
Compare
@daniel-lxs fixed unit test |
How do I resolve this latest conflict: Types of property 'apiProvider' are incompatible. @roo-code/cloud restricts adding providers. |
b9776a7
to
956716b
Compare
Hey @NaccOll, Thank you for the contribution. After discussing it with the team, we decided to close this PR. We prefer not to bypass restrictions by using the Copilot User Agent. Let me know if you have any questions! |
@daniel-lxs I think the issue should be closed as the VSCode LM API does not provide this functionality. It is unique to copilot and relies on a hack with a specific http header. |
I have just sent a message to a Senior Developer Advocate at GitHub. Maybe we can merge this... |
If there's any progress, please let me know so I can make changes. Copilot's documentation does allow third-party agents to access this. They might ban pretend copilots and instead require RooCode to register an Github app and grant permissions for the app. I've tried this myself, but when I tried to access the final API key, I got a message saying I didn't have the required permissions, so I gave up. |
Related GitHub Issue
Closes: #7010
Description
VS Code LM API cannot achieve multiple use of the tool consuming only one premium requeusts. Therefore, I implemented a Copilot Provider, mimicking the Copilot authentication process found at https://github.com/BerriAI/litellm and https://github.com/sst/opencode.
In my own test, I chose claude-4 and had him write a web version of Angry Birds. This involved reading and writing eight files, requiring approximately 20 tool calls and consuming only one premium requeust.
Test Procedure
Pre-Submission Checklist
Screenshots / Videos
Documentation Updates
Additional Notes
Get in Touch
Important
Add GitHub Copilot Provider with agent mode support, including authentication, model selection, and validation, along with tests and localization updates.
CopilotHandler
incopilot.ts
to handle GitHub Copilot API interactions, including authentication and model selection.webviewMessageHandler.ts
to handle Copilot authentication and model requests.validate.ts
.CopilotHandler
incopilot.spec.ts
.copilot.test.ts
.validate.test.ts
to include Copilot model validation.Copilot
component inCopilot.tsx
for UI interactions related to Copilot authentication and model selection.This description was created by
for 6e825b2. You can customize this summary. It will automatically update as commits are pushed.