@xtruder/opencode-claude-max-plugin 0.1.14 → 0.1.16

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/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { LanguageModelV2 } from "@ai-sdk/provider";
1
+ import type { LanguageModelV3 } from "@ai-sdk/provider";
2
2
  import type { Plugin } from "@opencode-ai/plugin";
3
3
  export interface AnthropicSDKProviderOptions {
4
4
  /**
@@ -35,7 +35,7 @@ export interface AnthropicSDKProvider {
35
35
  /**
36
36
  * Get a language model by model ID.
37
37
  */
38
- languageModel(modelId: string): LanguageModelV2;
38
+ languageModel(modelId: string): LanguageModelV3;
39
39
  }
40
40
  /**
41
41
  * Create an Anthropic SDK provider for use with OpenCode / Vercel AI SDK.
package/build/index.js CHANGED
@@ -155,9 +155,6 @@ function convertPrompt(prompt) {
155
155
  break;
156
156
  }
157
157
  }
158
- while (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
159
- messages.pop();
160
- }
161
158
  return {
162
159
  system: systemParts.length > 0 ? systemParts.join(`
163
160
 
@@ -240,12 +237,15 @@ function convertAssistantMessage(message) {
240
237
  function convertToolMessage(message) {
241
238
  const content = [];
242
239
  for (const part of message.content) {
243
- const resultContent = formatToolResultContent(part.output);
240
+ if (part.type !== "tool-result")
241
+ continue;
242
+ const output = part.output;
243
+ const resultContent = formatToolResultContent(output);
244
244
  content.push({
245
245
  type: "tool_result",
246
246
  tool_use_id: part.toolCallId,
247
247
  content: resultContent,
248
- is_error: part.output.type === "error-text" || part.output.type === "error-json" ? true : undefined
248
+ is_error: output.type === "error-text" || output.type === "error-json" ? true : undefined
249
249
  });
250
250
  }
251
251
  return { role: "user", content };
@@ -507,18 +507,20 @@ function generateId() {
507
507
  return `block-${Date.now()}-${idCounter++}`;
508
508
  }
509
509
  function mapFinishReason(stopReason) {
510
- switch (stopReason) {
511
- case "end_turn":
512
- return "stop";
513
- case "stop_sequence":
514
- return "stop";
515
- case "max_tokens":
516
- return "length";
517
- case "tool_use":
518
- return "tool-calls";
519
- default:
520
- return "unknown";
521
- }
510
+ const unified = (() => {
511
+ switch (stopReason) {
512
+ case "end_turn":
513
+ case "stop_sequence":
514
+ return "stop";
515
+ case "max_tokens":
516
+ return "length";
517
+ case "tool_use":
518
+ return "tool-calls";
519
+ default:
520
+ return "other";
521
+ }
522
+ })();
523
+ return { unified, raw: stopReason ?? undefined };
522
524
  }
523
525
  function convertStream(anthropicStream, modelId) {
524
526
  const blockStates = new Map;
@@ -545,10 +547,17 @@ function convertStream(anthropicStream, modelId) {
545
547
  type: "finish",
546
548
  finishReason,
547
549
  usage: {
548
- inputTokens: inputTokens ?? 0,
549
- outputTokens: outputTokens ?? 0,
550
- totalTokens: (inputTokens ?? 0) + (outputTokens ?? 0) + (cachedInputTokens ?? 0) + (cacheCreationTokens ?? 0),
551
- cachedInputTokens
550
+ inputTokens: {
551
+ total: inputTokens ?? 0,
552
+ noCache: undefined,
553
+ cacheRead: cachedInputTokens ?? 0,
554
+ cacheWrite: cacheCreationTokens ?? 0
555
+ },
556
+ outputTokens: {
557
+ total: outputTokens ?? 0,
558
+ text: undefined,
559
+ reasoning: undefined
560
+ }
552
561
  },
553
562
  providerMetadata: {
554
563
  anthropic: {
@@ -694,18 +703,20 @@ function handleApiError(error) {
694
703
  throw error;
695
704
  }
696
705
  function mapFinishReason2(stopReason) {
697
- switch (stopReason) {
698
- case "end_turn":
699
- return "stop";
700
- case "stop_sequence":
701
- return "stop";
702
- case "max_tokens":
703
- return "length";
704
- case "tool_use":
705
- return "tool-calls";
706
- default:
707
- return "unknown";
708
- }
706
+ const unified = (() => {
707
+ switch (stopReason) {
708
+ case "end_turn":
709
+ case "stop_sequence":
710
+ return "stop";
711
+ case "max_tokens":
712
+ return "length";
713
+ case "tool_use":
714
+ return "tool-calls";
715
+ default:
716
+ return "other";
717
+ }
718
+ })();
719
+ return { unified, raw: stopReason ?? undefined };
709
720
  }
710
721
  var BILLING_SYSTEM_BLOCK = {
711
722
  type: "text",
@@ -794,7 +805,7 @@ class AnthropicSDKModel {
794
805
  client;
795
806
  providerName;
796
807
  isOAuth;
797
- specificationVersion = "v2";
808
+ specificationVersion = "v3";
798
809
  provider;
799
810
  modelId;
800
811
  supportedUrls = {};
@@ -809,13 +820,13 @@ class AnthropicSDKModel {
809
820
  const { system, messages } = convertPrompt(options.prompt);
810
821
  const warnings = [];
811
822
  if (options.presencePenalty != null) {
812
- warnings.push({ type: "unsupported-setting", setting: "presencePenalty" });
823
+ warnings.push({ type: "compatibility", feature: "presencePenalty" });
813
824
  }
814
825
  if (options.frequencyPenalty != null) {
815
- warnings.push({ type: "unsupported-setting", setting: "frequencyPenalty" });
826
+ warnings.push({ type: "compatibility", feature: "frequencyPenalty" });
816
827
  }
817
828
  if (options.seed != null) {
818
- warnings.push({ type: "unsupported-setting", setting: "seed" });
829
+ warnings.push({ type: "compatibility", feature: "seed" });
819
830
  }
820
831
  const tools = options.toolChoice?.type === "none" ? undefined : convertTools(options.tools);
821
832
  const toolChoice = options.toolChoice?.type === "none" ? undefined : convertToolChoice(options.toolChoice);
@@ -977,10 +988,17 @@ class AnthropicSDKModel {
977
988
  content,
978
989
  finishReason: mapFinishReason2(response.stop_reason),
979
990
  usage: {
980
- inputTokens: response.usage.input_tokens,
981
- outputTokens: response.usage.output_tokens,
982
- totalTokens: response.usage.input_tokens + response.usage.output_tokens + cacheReadTokens + cacheCreateTokens,
983
- cachedInputTokens: cacheReadTokens
991
+ inputTokens: {
992
+ total: response.usage.input_tokens,
993
+ noCache: undefined,
994
+ cacheRead: cacheReadTokens,
995
+ cacheWrite: cacheCreateTokens
996
+ },
997
+ outputTokens: {
998
+ total: response.usage.output_tokens,
999
+ text: undefined,
1000
+ reasoning: undefined
1001
+ }
984
1002
  },
985
1003
  providerMetadata: {
986
1004
  anthropic: {
@@ -1006,6 +1024,30 @@ class AnthropicSDKModel {
1006
1024
  stream: true
1007
1025
  }, { signal: options.abortSignal });
1008
1026
  } catch (error) {
1027
+ if (error instanceof APIError && error.status === 400 && error.message?.includes("must end with a user message")) {
1028
+ return {
1029
+ stream: new ReadableStream({
1030
+ start(controller) {
1031
+ controller.enqueue({ type: "stream-start", warnings });
1032
+ controller.enqueue({
1033
+ type: "finish",
1034
+ finishReason: { unified: "stop", raw: undefined },
1035
+ usage: {
1036
+ inputTokens: {
1037
+ total: 0,
1038
+ noCache: undefined,
1039
+ cacheRead: undefined,
1040
+ cacheWrite: undefined
1041
+ },
1042
+ outputTokens: { total: 0, text: undefined, reasoning: undefined }
1043
+ }
1044
+ });
1045
+ controller.close();
1046
+ }
1047
+ }),
1048
+ request: { body: params }
1049
+ };
1050
+ }
1009
1051
  handleApiError(error);
1010
1052
  }
1011
1053
  const stream = convertStream(anthropicStream, this.modelId);
package/build/model.d.ts CHANGED
@@ -1,19 +1,19 @@
1
- import type { LanguageModelV2, LanguageModelV2CallOptions } from "@ai-sdk/provider";
1
+ import type { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult } from "@ai-sdk/provider";
2
2
  import type Anthropic from "@anthropic-ai/sdk";
3
- type DoGenerateResult = Awaited<ReturnType<LanguageModelV2["doGenerate"]>>;
4
- type DoStreamResult = Awaited<ReturnType<LanguageModelV2["doStream"]>>;
5
- export declare class AnthropicSDKModel implements LanguageModelV2 {
3
+ type DoGenerateResult = LanguageModelV3GenerateResult;
4
+ type DoStreamResult = LanguageModelV3StreamResult;
5
+ export declare class AnthropicSDKModel implements LanguageModelV3 {
6
6
  private client;
7
7
  private providerName;
8
8
  private isOAuth;
9
- readonly specificationVersion: "v2";
9
+ readonly specificationVersion: "v3";
10
10
  readonly provider: string;
11
11
  readonly modelId: string;
12
12
  readonly supportedUrls: Record<string, RegExp[]>;
13
13
  constructor(modelId: string, client: Anthropic, providerName: string, isOAuth?: boolean);
14
14
  private buildParams;
15
- doGenerate(options: LanguageModelV2CallOptions): Promise<DoGenerateResult>;
16
- doStream(options: LanguageModelV2CallOptions): Promise<DoStreamResult>;
15
+ doGenerate(options: LanguageModelV3CallOptions): Promise<DoGenerateResult>;
16
+ doStream(options: LanguageModelV3CallOptions): Promise<DoStreamResult>;
17
17
  }
18
18
  export {};
19
19
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAK3B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAU9C,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;AAC1E,KAAK,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AAsLtE,qBAAa,iBAAkB,YAAW,eAAe;IAQrD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;IATjB,QAAQ,CAAC,oBAAoB,EAAG,IAAI,CAAS;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAK;gBAGnD,OAAO,EAAE,MAAM,EACP,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,OAAe;IAMlC,OAAO,CAAC,WAAW;IA2Lb,UAAU,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoF1E,QAAQ,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;CA6C7E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAI1B,6BAA6B,EAC7B,2BAA2B,EAE5B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAU9C,KAAK,gBAAgB,GAAG,6BAA6B,CAAA;AACrD,KAAK,cAAc,GAAG,2BAA2B,CAAA;AAwLjD,qBAAa,iBAAkB,YAAW,eAAe;IAQrD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;IATjB,QAAQ,CAAC,oBAAoB,EAAG,IAAI,CAAS;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAK;gBAGnD,OAAO,EAAE,MAAM,EACP,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,OAAe;IAMlC,OAAO,CAAC,WAAW;IA2Lb,UAAU,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuF1E,QAAQ,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;CA6E7E"}
package/build/prompt.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { LanguageModelV2Prompt } from "@ai-sdk/provider";
1
+ import type { LanguageModelV3Prompt } from "@ai-sdk/provider";
2
2
  import type Anthropic from "@anthropic-ai/sdk";
3
3
  type AnthropicMessage = Anthropic.MessageCreateParams["messages"][number];
4
4
  type AnthropicSystemParam = Anthropic.MessageCreateParams["system"];
@@ -6,6 +6,6 @@ export interface ConvertedPrompt {
6
6
  system: AnthropicSystemParam;
7
7
  messages: AnthropicMessage[];
8
8
  }
9
- export declare function convertPrompt(prompt: LanguageModelV2Prompt): ConvertedPrompt;
9
+ export declare function convertPrompt(prompt: LanguageModelV3Prompt): ConvertedPrompt;
10
10
  export {};
11
11
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA0B,MAAM,kBAAkB,CAAA;AACrF,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,gBAAgB,GAAG,SAAS,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzE,KAAK,oBAAoB,GAAG,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;AAEnE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAwC5E"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA0B,MAAM,kBAAkB,CAAA;AACrF,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,gBAAgB,GAAG,SAAS,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzE,KAAK,oBAAoB,GAAG,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;AAEnE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAiC5E"}
package/build/stream.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { LanguageModelV2StreamPart } from "@ai-sdk/provider";
1
+ import type { LanguageModelV3StreamPart } from "@ai-sdk/provider";
2
2
  import type Anthropic from "@anthropic-ai/sdk";
3
3
  type MessageStreamEvent = Anthropic.MessageStreamEvent;
4
- export declare function convertStream(anthropicStream: AsyncIterable<MessageStreamEvent>, modelId: string): ReadableStream<LanguageModelV2StreamPart>;
4
+ export declare function convertStream(anthropicStream: AsyncIterable<MessageStreamEvent>, modelId: string): ReadableStream<LanguageModelV3StreamPart>;
5
5
  export {};
6
6
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAA+B,MAAM,kBAAkB,CAAA;AAC9F,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,kBAAkB,GAAG,SAAS,CAAC,kBAAkB,CAAA;AAiCtD,wBAAgB,aAAa,CAC3B,eAAe,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAClD,OAAO,EAAE,MAAM,GACd,cAAc,CAAC,yBAAyB,CAAC,CAqD3C"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAA+B,MAAM,kBAAkB,CAAA;AAC9F,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,kBAAkB,GAAG,SAAS,CAAC,kBAAkB,CAAA;AAmCtD,wBAAgB,aAAa,CAC3B,eAAe,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAClD,OAAO,EAAE,MAAM,GACd,cAAc,CAAC,yBAAyB,CAAC,CAwD3C"}
package/build/tools.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { LanguageModelV2FunctionTool, LanguageModelV2ProviderDefinedTool, LanguageModelV2ToolChoice } from "@ai-sdk/provider";
1
+ import type { LanguageModelV3FunctionTool, LanguageModelV3ProviderTool, LanguageModelV3ToolChoice } from "@ai-sdk/provider";
2
2
  import type Anthropic from "@anthropic-ai/sdk";
3
3
  type AnthropicTool = Anthropic.Tool;
4
4
  type AnthropicToolChoice = Anthropic.MessageCreateParams["tool_choice"];
5
- export declare function convertTools(tools: Array<LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool> | undefined): AnthropicTool[] | undefined;
6
- export declare function convertToolChoice(toolChoice: LanguageModelV2ToolChoice | undefined): AnthropicToolChoice | undefined;
5
+ export declare function convertTools(tools: Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool> | undefined): AnthropicTool[] | undefined;
6
+ export declare function convertToolChoice(toolChoice: LanguageModelV3ToolChoice | undefined): AnthropicToolChoice | undefined;
7
7
  export {};
8
8
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,kCAAkC,EAClC,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,aAAa,GAAG,SAAS,CAAC,IAAI,CAAA;AACnC,KAAK,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;AAwBvE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,CAAC,2BAA2B,GAAG,kCAAkC,CAAC,GAAG,SAAS,GACzF,aAAa,EAAE,GAAG,SAAS,CAY7B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,yBAAyB,GAAG,SAAS,GAChD,mBAAmB,GAAG,SAAS,CAcjC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAA;AAG9C,KAAK,aAAa,GAAG,SAAS,CAAC,IAAI,CAAA;AACnC,KAAK,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;AAwBvE,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,CAAC,2BAA2B,GAAG,2BAA2B,CAAC,GAAG,SAAS,GAClF,aAAa,EAAE,GAAG,SAAS,CAY7B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,yBAAyB,GAAG,SAAS,GAChD,mBAAmB,GAAG,SAAS,CAcjC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtruder/opencode-claude-max-plugin",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "OpenCode plugin for Claude Max/Pro subscription via @anthropic-ai/sdk - uses Claude Code OAuth credentials",
5
5
  "keywords": [
6
6
  "ai-sdk",
@@ -37,7 +37,7 @@
37
37
  "@anthropic-ai/sdk": "0.74.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@ai-sdk/provider": "2.0.1",
40
+ "@ai-sdk/provider": "3.0.8",
41
41
  "@ai-sdk/provider-utils": "3.0.2",
42
42
  "@opencode-ai/plugin": "^1.3.0",
43
43
  "ai": "5.0.124",