pi-anthropic-oauth 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,12 +1,11 @@
1
1
  # Pi Anthropic OAuth
2
2
 
3
- [![npm](https://img.shields.io/npm/v/pi-anthropic-oauth?style=flat-square&logo=npm&logoColor=white&label=npm&color=7c3aed)](https://www.npmjs.com/package/pi-anthropic-oauth) [![downloads](https://img.shields.io/npm/dm/pi-anthropic-oauth?style=flat-square&logo=npm&logoColor=white&label=downloads&color=7c3aed)](https://www.npmjs.com/package/pi-anthropic-oauth) [![node](https://img.shields.io/badge/node-%3E%3D18-7c3aed?style=flat-square&logo=nodedotjs&logoColor=white)](https://nodejs.org)
3
+ [![npm](https://img.shields.io/npm/v/pi-anthropic-oauth?style=flat-square&logo=npm&logoColor=white&label=npm&color=7c3aed)](https://www.npmjs.com/package/pi-anthropic-oauth) [![node](https://img.shields.io/badge/node-%3E%3D18-7c3aed?style=flat-square&logo=nodedotjs&logoColor=white)](https://nodejs.org)
4
4
 
5
5
  Claude Pro/Max OAuth extension for Pi.
6
6
 
7
7
  > [!WARNING]
8
8
  > Use this at your own risk. This may go against Anthropic's terms.
9
- > I do not recommend using this with gsd2 or any extensions that will cause heavy token usage.
10
9
 
11
10
  ## Install
12
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-anthropic-oauth",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Claude Pro/Max OAuth extension for Pi",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/convert.ts CHANGED
@@ -98,8 +98,6 @@ export function convertPiMessagesToAnthropic(
98
98
  for (const block of message.content) {
99
99
  if (block.type === "text" && block.text.trim()) {
100
100
  blocks.push({ type: "text", text: sanitizeSurrogates(block.text) });
101
- } else if (block.type === "thinking" && block.thinking.trim()) {
102
- blocks.push({ type: "text", text: sanitizeSurrogates(block.thinking) });
103
101
  } else if (block.type === "toolCall") {
104
102
  blocks.push({
105
103
  type: "tool_use",
package/src/index.ts CHANGED
@@ -7,12 +7,21 @@ import { loginAnthropic, refreshAnthropicToken } from "./auth.js";
7
7
  import { streamAnthropicOAuth } from "./stream.js";
8
8
 
9
9
  const MODELS = [
10
+ {
11
+ id: "claude-opus-4-7",
12
+ name: "Claude Opus 4.7",
13
+ reasoning: true,
14
+ input: ["text", "image"] as ("text" | "image")[],
15
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
16
+ contextWindow: 1000000,
17
+ maxTokens: 128000,
18
+ },
10
19
  {
11
20
  id: "claude-opus-4-6",
12
21
  name: "Claude Opus 4.6",
13
22
  reasoning: true,
14
23
  input: ["text", "image"] as ("text" | "image")[],
15
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
24
+ cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
16
25
  contextWindow: 1000000,
17
26
  maxTokens: 128000,
18
27
  },
@@ -21,7 +30,7 @@ const MODELS = [
21
30
  name: "Claude Sonnet 4.6",
22
31
  reasoning: true,
23
32
  input: ["text", "image"] as ("text" | "image")[],
24
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
33
+ cost: { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
25
34
  contextWindow: 1000000,
26
35
  maxTokens: 64000,
27
36
  },
@@ -30,10 +39,19 @@ const MODELS = [
30
39
  name: "Claude Haiku 4.5",
31
40
  reasoning: true,
32
41
  input: ["text", "image"] as ("text" | "image")[],
33
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
42
+ cost: { input: 1, output: 5, cacheRead: 0.1, cacheWrite: 1.25 },
34
43
  contextWindow: 200000,
35
44
  maxTokens: 64000,
36
45
  },
46
+ {
47
+ id: "claude-opus-4-5-20251101",
48
+ name: "Claude Opus 4.5",
49
+ reasoning: true,
50
+ input: ["text", "image"] as ("text" | "image")[],
51
+ cost: { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 },
52
+ contextWindow: 200000,
53
+ maxTokens: 64000,
54
+ }
37
55
  ];
38
56
 
39
57
  function ensureClaudeCodeSymlink() {
@@ -42,7 +60,7 @@ function ensureClaudeCodeSymlink() {
42
60
  if (existsSync(target) && !existsSync(link)) {
43
61
  try {
44
62
  symlinkSync(target, link);
45
- } catch {}
63
+ } catch { }
46
64
  }
47
65
  }
48
66
 
package/src/stream.ts CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  type SimpleStreamOptions,
12
12
  type StopReason,
13
13
  } from "@mariozechner/pi-ai";
14
- import { USER_AGENT, isClaudeOAuthAccessToken } from "./auth.js";
14
+ import { USER_AGENT } from "./auth.js";
15
15
  import {
16
16
  convertPiMessagesToAnthropic,
17
17
  convertPiToolsToAnthropic,
@@ -63,8 +63,16 @@ function makeDefaultHeaders(
63
63
  }
64
64
 
65
65
  if (options?.headers) {
66
- for (const [key, value] of Object.entries(options.headers))
66
+ for (const [key, value] of Object.entries(options.headers)) {
67
+ const normalizedKey = key.toLowerCase();
68
+ if (
69
+ isOAuth &&
70
+ (normalizedKey === "x-api-key" || normalizedKey === "authorization")
71
+ ) {
72
+ continue;
73
+ }
67
74
  headers[key] = value;
75
+ }
68
76
  }
69
77
 
70
78
  return headers;
@@ -98,7 +106,7 @@ export function streamAnthropicOAuth(
98
106
 
99
107
  try {
100
108
  const apiKey = options?.apiKey ?? "";
101
- const isOAuth = isClaudeOAuthAccessToken(apiKey);
109
+ const isOAuth = true;
102
110
  const defaultHeaders = makeDefaultHeaders(isOAuth, options);
103
111
 
104
112
  if (isOAuth) defaultHeaders.authorization = `Bearer ${apiKey}`;