gitlab-ai-provider 5.3.3 → 6.0.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
4
4
 
5
+ ## 6.0.0 (2026-03-26)
6
+
7
+ - feat!: migrate to AI SDK v6 (LanguageModelV3) ([21c1165](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/21c1165))
8
+ - Merge branch 'ai-sdk-v6' into 'main' ([a527717](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/a527717)), closes [#3](https://gitlab.com/vglafirov/gitlab-ai-provider/issues/3)
9
+ - chore: add .worktrees to .gitignore ([a7df2fb](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/a7df2fb))
10
+
11
+ ### BREAKING CHANGE
12
+
13
+ - This release migrates the provider to AI SDK v6 which
14
+ requires @ai-sdk/provider-utils v4+ and uses the LanguageModelV3 interface.
15
+ Consumers must upgrade to AI SDK v6 compatible tooling.
16
+
17
+ * Migrate models and provider to LanguageModelV3 for AI SDK v6
18
+ * Add AI SDK v6 support with updated streaming and tool-call handling
19
+ * Fix streaming tool-call handling and normalize v3 tool-result output
20
+ * Fix per-tool strict mode in OpenAI responses
21
+ * Fix unknown finish reason mapping for v6 compatibility
22
+ * Fix cache and add v3 contract tests
23
+ * Rebuild dist
24
+
5
25
  ## <small>5.3.3 (2026-03-25)</small>
6
26
 
7
27
  - Merge branch 'vg/tools-fix' into 'main' ([d33e8c0](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/d33e8c0))
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2StreamPart } from '@ai-sdk/provider';
1
+ import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, LanguageModelV3Content, LanguageModelV3FinishReason, LanguageModelV3Usage, LanguageModelV3StreamPart } from '@ai-sdk/provider';
2
2
  import { z } from 'zod';
3
3
 
4
4
  interface GitLabAnthropicConfig {
@@ -47,8 +47,8 @@ interface GitLabAnthropicConfig {
47
47
  * for the duo-chat model. It connects to Claude through GitLab's cloud proxy
48
48
  * at https://cloud.gitlab.com/ai/v1/proxy/anthropic/
49
49
  */
50
- declare class GitLabAnthropicLanguageModel implements LanguageModelV2 {
51
- readonly specificationVersion: "v2";
50
+ declare class GitLabAnthropicLanguageModel implements LanguageModelV3 {
51
+ readonly specificationVersion: "v3";
52
52
  readonly modelId: string;
53
53
  readonly supportedUrls: Record<string, RegExp[]>;
54
54
  private readonly config;
@@ -86,22 +86,10 @@ declare class GitLabAnthropicLanguageModel implements LanguageModelV2 {
86
86
  * Convert Anthropic finish reason to AI SDK format
87
87
  */
88
88
  private convertFinishReason;
89
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
90
- content: LanguageModelV2Content[];
91
- finishReason: LanguageModelV2FinishReason;
92
- usage: LanguageModelV2Usage;
93
- warnings: LanguageModelV2CallWarning[];
94
- }>;
89
+ private createUsage;
90
+ doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult>;
95
91
  private doGenerateWithRetry;
96
- doStream(options: LanguageModelV2CallOptions): Promise<{
97
- stream: ReadableStream<LanguageModelV2StreamPart>;
98
- request?: {
99
- body?: unknown;
100
- };
101
- response?: {
102
- headers?: Record<string, string>;
103
- };
104
- }>;
92
+ doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
105
93
  private doStreamWithRetry;
106
94
  }
107
95
 
@@ -665,11 +653,11 @@ type WorkflowToolExecutor = (toolName: string, args: string, requestID: string)
665
653
  /**
666
654
  * GitLab Duo Agent Platform Language Model.
667
655
  *
668
- * Implements LanguageModelV2 by bridging the DWS WebSocket protocol
656
+ * Implements LanguageModelV3 by bridging the DWS WebSocket protocol
669
657
  * to the Vercel AI SDK stream part format.
670
658
  */
671
- declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
672
- readonly specificationVersion: "v2";
659
+ declare class GitLabWorkflowLanguageModel implements LanguageModelV3 {
660
+ readonly specificationVersion: "v3";
673
661
  readonly modelId: string;
674
662
  readonly supportedUrls: Record<string, RegExp[]>;
675
663
  private readonly config;
@@ -799,18 +787,10 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
799
787
  * Useful for consumers that need to track workflow state.
800
788
  */
801
789
  get workflowId(): string | null;
802
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
803
- content: LanguageModelV2Content[];
804
- finishReason: LanguageModelV2FinishReason;
805
- usage: LanguageModelV2Usage;
806
- warnings: LanguageModelV2CallWarning[];
807
- }>;
808
- doStream(options: LanguageModelV2CallOptions): Promise<{
809
- stream: ReadableStream<LanguageModelV2StreamPart>;
810
- request?: {
811
- body?: unknown;
812
- };
813
- }>;
790
+ private createUsage;
791
+ private createFinishReason;
792
+ doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult>;
793
+ doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
814
794
  private handleWorkflowEvent;
815
795
  private processCheckpoint;
816
796
  private executeToolAndRespond;
@@ -845,10 +825,10 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
845
825
  }
846
826
 
847
827
  interface GitLabProvider {
848
- (modelId: string): LanguageModelV2;
849
- readonly specificationVersion: 'v2';
850
- languageModel(modelId: string): LanguageModelV2;
851
- chat(modelId: string): LanguageModelV2;
828
+ (modelId: string): LanguageModelV3;
829
+ readonly specificationVersion: 'v3';
830
+ languageModel(modelId: string): LanguageModelV3;
831
+ chat(modelId: string): LanguageModelV3;
852
832
  /**
853
833
  * Create an agentic chat model with tool calling support
854
834
  *
@@ -888,7 +868,7 @@ interface GitLabProvider {
888
868
  * });
889
869
  */
890
870
  workflowChat(modelId: string, options?: GitLabWorkflowOptions): GitLabWorkflowLanguageModel;
891
- textEmbeddingModel(modelId: string): never;
871
+ embeddingModel(modelId: string): never;
892
872
  imageModel(modelId: string): never;
893
873
  }
894
874
  interface GitLabAgenticOptions {
@@ -1020,8 +1000,8 @@ interface GitLabOpenAIConfig {
1020
1000
  */
1021
1001
  aiGatewayHeaders?: Record<string, string>;
1022
1002
  }
1023
- declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1024
- readonly specificationVersion: "v2";
1003
+ declare class GitLabOpenAILanguageModel implements LanguageModelV3 {
1004
+ readonly specificationVersion: "v3";
1025
1005
  readonly modelId: string;
1026
1006
  readonly supportedUrls: Record<string, RegExp[]>;
1027
1007
  private readonly config;
@@ -1041,6 +1021,7 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1041
1021
  private convertToolChoice;
1042
1022
  private convertPrompt;
1043
1023
  private convertFinishReason;
1024
+ private createUsage;
1044
1025
  /**
1045
1026
  * Convert tools to Responses API format
1046
1027
  */
@@ -1059,16 +1040,16 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1059
1040
  * so we need to check the content for tool calls separately.
1060
1041
  */
1061
1042
  private convertResponsesStatus;
1062
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
1063
- content: LanguageModelV2Content[];
1064
- finishReason: LanguageModelV2FinishReason;
1065
- usage: LanguageModelV2Usage;
1066
- warnings: LanguageModelV2CallWarning[];
1043
+ doGenerate(options: LanguageModelV3CallOptions): Promise<{
1044
+ content: LanguageModelV3Content[];
1045
+ finishReason: LanguageModelV3FinishReason;
1046
+ usage: LanguageModelV3Usage;
1047
+ warnings: [];
1067
1048
  }>;
1068
1049
  private doGenerateWithChatApi;
1069
1050
  private doGenerateWithResponsesApi;
1070
- doStream(options: LanguageModelV2CallOptions): Promise<{
1071
- stream: ReadableStream<LanguageModelV2StreamPart>;
1051
+ doStream(options: LanguageModelV3CallOptions): Promise<{
1052
+ stream: ReadableStream<LanguageModelV3StreamPart>;
1072
1053
  request?: {
1073
1054
  body?: unknown;
1074
1055
  };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage, LanguageModelV2CallWarning, LanguageModelV2StreamPart } from '@ai-sdk/provider';
1
+ import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, LanguageModelV3Content, LanguageModelV3FinishReason, LanguageModelV3Usage, LanguageModelV3StreamPart } from '@ai-sdk/provider';
2
2
  import { z } from 'zod';
3
3
 
4
4
  interface GitLabAnthropicConfig {
@@ -47,8 +47,8 @@ interface GitLabAnthropicConfig {
47
47
  * for the duo-chat model. It connects to Claude through GitLab's cloud proxy
48
48
  * at https://cloud.gitlab.com/ai/v1/proxy/anthropic/
49
49
  */
50
- declare class GitLabAnthropicLanguageModel implements LanguageModelV2 {
51
- readonly specificationVersion: "v2";
50
+ declare class GitLabAnthropicLanguageModel implements LanguageModelV3 {
51
+ readonly specificationVersion: "v3";
52
52
  readonly modelId: string;
53
53
  readonly supportedUrls: Record<string, RegExp[]>;
54
54
  private readonly config;
@@ -86,22 +86,10 @@ declare class GitLabAnthropicLanguageModel implements LanguageModelV2 {
86
86
  * Convert Anthropic finish reason to AI SDK format
87
87
  */
88
88
  private convertFinishReason;
89
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
90
- content: LanguageModelV2Content[];
91
- finishReason: LanguageModelV2FinishReason;
92
- usage: LanguageModelV2Usage;
93
- warnings: LanguageModelV2CallWarning[];
94
- }>;
89
+ private createUsage;
90
+ doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult>;
95
91
  private doGenerateWithRetry;
96
- doStream(options: LanguageModelV2CallOptions): Promise<{
97
- stream: ReadableStream<LanguageModelV2StreamPart>;
98
- request?: {
99
- body?: unknown;
100
- };
101
- response?: {
102
- headers?: Record<string, string>;
103
- };
104
- }>;
92
+ doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
105
93
  private doStreamWithRetry;
106
94
  }
107
95
 
@@ -665,11 +653,11 @@ type WorkflowToolExecutor = (toolName: string, args: string, requestID: string)
665
653
  /**
666
654
  * GitLab Duo Agent Platform Language Model.
667
655
  *
668
- * Implements LanguageModelV2 by bridging the DWS WebSocket protocol
656
+ * Implements LanguageModelV3 by bridging the DWS WebSocket protocol
669
657
  * to the Vercel AI SDK stream part format.
670
658
  */
671
- declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
672
- readonly specificationVersion: "v2";
659
+ declare class GitLabWorkflowLanguageModel implements LanguageModelV3 {
660
+ readonly specificationVersion: "v3";
673
661
  readonly modelId: string;
674
662
  readonly supportedUrls: Record<string, RegExp[]>;
675
663
  private readonly config;
@@ -799,18 +787,10 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
799
787
  * Useful for consumers that need to track workflow state.
800
788
  */
801
789
  get workflowId(): string | null;
802
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
803
- content: LanguageModelV2Content[];
804
- finishReason: LanguageModelV2FinishReason;
805
- usage: LanguageModelV2Usage;
806
- warnings: LanguageModelV2CallWarning[];
807
- }>;
808
- doStream(options: LanguageModelV2CallOptions): Promise<{
809
- stream: ReadableStream<LanguageModelV2StreamPart>;
810
- request?: {
811
- body?: unknown;
812
- };
813
- }>;
790
+ private createUsage;
791
+ private createFinishReason;
792
+ doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult>;
793
+ doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
814
794
  private handleWorkflowEvent;
815
795
  private processCheckpoint;
816
796
  private executeToolAndRespond;
@@ -845,10 +825,10 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV2 {
845
825
  }
846
826
 
847
827
  interface GitLabProvider {
848
- (modelId: string): LanguageModelV2;
849
- readonly specificationVersion: 'v2';
850
- languageModel(modelId: string): LanguageModelV2;
851
- chat(modelId: string): LanguageModelV2;
828
+ (modelId: string): LanguageModelV3;
829
+ readonly specificationVersion: 'v3';
830
+ languageModel(modelId: string): LanguageModelV3;
831
+ chat(modelId: string): LanguageModelV3;
852
832
  /**
853
833
  * Create an agentic chat model with tool calling support
854
834
  *
@@ -888,7 +868,7 @@ interface GitLabProvider {
888
868
  * });
889
869
  */
890
870
  workflowChat(modelId: string, options?: GitLabWorkflowOptions): GitLabWorkflowLanguageModel;
891
- textEmbeddingModel(modelId: string): never;
871
+ embeddingModel(modelId: string): never;
892
872
  imageModel(modelId: string): never;
893
873
  }
894
874
  interface GitLabAgenticOptions {
@@ -1020,8 +1000,8 @@ interface GitLabOpenAIConfig {
1020
1000
  */
1021
1001
  aiGatewayHeaders?: Record<string, string>;
1022
1002
  }
1023
- declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1024
- readonly specificationVersion: "v2";
1003
+ declare class GitLabOpenAILanguageModel implements LanguageModelV3 {
1004
+ readonly specificationVersion: "v3";
1025
1005
  readonly modelId: string;
1026
1006
  readonly supportedUrls: Record<string, RegExp[]>;
1027
1007
  private readonly config;
@@ -1041,6 +1021,7 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1041
1021
  private convertToolChoice;
1042
1022
  private convertPrompt;
1043
1023
  private convertFinishReason;
1024
+ private createUsage;
1044
1025
  /**
1045
1026
  * Convert tools to Responses API format
1046
1027
  */
@@ -1059,16 +1040,16 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV2 {
1059
1040
  * so we need to check the content for tool calls separately.
1060
1041
  */
1061
1042
  private convertResponsesStatus;
1062
- doGenerate(options: LanguageModelV2CallOptions): Promise<{
1063
- content: LanguageModelV2Content[];
1064
- finishReason: LanguageModelV2FinishReason;
1065
- usage: LanguageModelV2Usage;
1066
- warnings: LanguageModelV2CallWarning[];
1043
+ doGenerate(options: LanguageModelV3CallOptions): Promise<{
1044
+ content: LanguageModelV3Content[];
1045
+ finishReason: LanguageModelV3FinishReason;
1046
+ usage: LanguageModelV3Usage;
1047
+ warnings: [];
1067
1048
  }>;
1068
1049
  private doGenerateWithChatApi;
1069
1050
  private doGenerateWithResponsesApi;
1070
- doStream(options: LanguageModelV2CallOptions): Promise<{
1071
- stream: ReadableStream<LanguageModelV2StreamPart>;
1051
+ doStream(options: LanguageModelV3CallOptions): Promise<{
1052
+ stream: ReadableStream<LanguageModelV3StreamPart>;
1072
1053
  request?: {
1073
1054
  body?: unknown;
1074
1055
  };