Skip to content

Commit 9359cf3

Browse files
committed
refactor: update header mode terminology from 'compatible' to 'per-user-prompt' for clarity
1 parent c1ab584 commit 9359cf3

4 files changed

Lines changed: 20 additions & 16 deletions

File tree

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ The following command line options are available for the `start` command:
162162
| --github-token | Provide GitHub token directly (must be generated using the `auth` subcommand) | none | -g |
163163
| --claude-code | Generate a command to launch Claude Code with Copilot API config | false | -c |
164164
| --show-token | Show GitHub and Copilot tokens on fetch and refresh | false | none |
165-
| --header-mode | Header mode: savings (cost-optimized) or compatible (VS Code extension behavior) | savings | none |
165+
| --header-mode | Header mode: savings (cost-optimized) or per-user-prompt (mimics VS Code extension) | savings | none |
166166

167167
### Auth Command Options
168168

@@ -340,7 +340,7 @@ bun run start
340340
341341
## Request Header Modes
342342
343-
Copilot API supports two header modes to balance cost optimization with compatibility:
343+
Copilot API supports two header modes to balance cost optimization with different request patterns:
344344
345345
### `savings` Mode (Default)
346346
@@ -356,14 +356,14 @@ copilot-api start
356356
copilot-api start --header-mode savings
357357
```
358358
359-
### `compatible` Mode
359+
### `per-user-prompt` Mode
360360
361-
VS Code Copilot extension compatibility:
361+
VS Code Copilot extension behavior:
362362
363363
- **Headers**: `X-Initiator`
364364
- **Logic**: If last message is user then it is user, otherwise agent
365-
- **Use case**: Use this when you want to mimic the behavior of the VS Code extension to avoid potential abuse detection. (I am not sure if they do that, but it's better to be cautious.)
365+
- **Use case**: Use this when you want to follow the VS Code extension's request pattern to avoid potential abuse detection. (I am not sure if they do that, but it's better to be cautious.)
366366
367367
```bash
368-
copilot-api start --header-mode compatible
368+
copilot-api start --header-mode per-user-prompt
369369
```

src/lib/headers.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { ChatCompletionsPayload } from "~/services/copilot/create-chat-completions"
22

3-
export type HeaderMode = "savings" | "compatible"
3+
export type HeaderMode = "savings" | "per-user-prompt"
44

55
export interface RequestHeaders {
66
"X-Initiator": "user" | "agent"
@@ -18,7 +18,7 @@ export function generateSessionHeaders(
1818
(payload: ChatCompletionsPayload) => "user" | "agent"
1919
> = {
2020
savings: getSavingsInitiator,
21-
compatible: getCompatibleInitiator,
21+
"per-user-prompt": getPerUserPromptInitiator,
2222
}
2323
return {
2424
"X-Initiator": initiatorMap[mode](payload),
@@ -38,13 +38,15 @@ function isAgentRole(role: string): boolean {
3838
function getSavingsInitiator(
3939
payload: ChatCompletionsPayload,
4040
): "user" | "agent" {
41-
return payload.messages.some((msg) => isAgentRole(msg.role)) ? "agent" : "user"
41+
return payload.messages.some((msg) => isAgentRole(msg.role)) ?
42+
"agent"
43+
: "user"
4244
}
4345

4446
/**
45-
* Compatible mode: if last message is user then it is user
47+
* Per-user-prompt mode: if last message is user then it is user
4648
*/
47-
function getCompatibleInitiator(
49+
function getPerUserPromptInitiator(
4850
payload: ChatCompletionsPayload,
4951
): "user" | "agent" {
5052
const lastMessage = payload.messages.at(-1)

src/lib/state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export interface State {
1717
lastRequestTimestamp?: number
1818

1919
// Header mode configuration
20-
headerMode: "savings" | "compatible"
20+
headerMode: "savings" | "per-user-prompt"
2121
}
2222

2323
export const state: State = {

src/start.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ export async function runServer(options: RunServerOptions): Promise<void> {
4343
state.showToken = options.showToken
4444

4545
// Set header mode
46-
state.headerMode = options.headerMode as "savings" | "compatible"
46+
state.headerMode = options.headerMode as "savings" | "per-user-prompt"
4747

48-
if (state.headerMode === "compatible") {
49-
consola.info("Using compatible mode - VS Code extension compatibility")
48+
if (state.headerMode === "per-user-prompt") {
49+
consola.info(
50+
"Using per-user-prompt mode - mimics VS Code extension behavior",
51+
)
5052
} else {
5153
consola.info("Using savings mode - optimized for premium requests savings")
5254
}
@@ -184,7 +186,7 @@ export const start = defineCommand({
184186
type: "string",
185187
default: "savings",
186188
description:
187-
"Header mode: savings (default, cost-optimized) or compatible (VS Code Copilot extension behavior)",
189+
"Header mode: savings (default, cost-optimized) or per-user-prompt (VS Code Copilot extension behavior)",
188190
},
189191
},
190192
run({ args }) {

0 commit comments

Comments
 (0)