Skip to content

Commit 85b4f0f

Browse files
committed
feat(Anthropic): 添加AI提示和聊天完成相关DTO类
添加AIPrompt基础类,实现Anthropic聊天完成相关数据传输对象 删除旧的AnthropicCacheControl类并重构为更完整的实现
1 parent 2d1b4b2 commit 85b4f0f

164 files changed

Lines changed: 3877 additions & 4892 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"chatgpt.openOnStartup": true
3+
}

ClaudeCodeProxy.sln.DotSettings.user

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAuthorizationAppBuilderExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8a7e5a6adb024a09af92d5777226b85613908_003F29_003F4be2b806_003FAuthorizationAppBuilderExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
77
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAuthorizationMiddleware_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F53bf9f89c50e40e0af040ef27892cc8a13910_003F3c_003F467f3f90_003FAuthorizationMiddleware_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
88
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAwaitTaskContinuation_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003Fe5_003Ff52f45c5_003FAwaitTaskContinuation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
9+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACacheExtensions_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9c36427260a64cf19d661db9e62747cd11920_003F78_003F81d0de9a_003FCacheExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
910
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACancellationToken_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb95edcc1c50e44ebbf7efbbca83c493ee8e928_003F54_003F893d63ba_003FCancellationToken_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1011
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConfiguredTaskAwaitable_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003Ffb_003Fc66ba7e6_003FConfiguredTaskAwaitable_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1112
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConfiguredTaskAwaitable_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003Ffb_003Fc66ba7e6_003FConfiguredTaskAwaitable_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -41,8 +42,10 @@
4142
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASQLite3Provider_005Fe_005Fsqlite3_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F99cde15f6b9f4c6fbc0caeb0da8e19a39000_003F7a_003F5f726a7e_003FSQLite3Provider_005Fe_005Fsqlite3_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4243
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteConnection_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc7a59cb727594ed7a94648b2d66dbf702aa28_003F33_003Fa131695c_003FSqliteConnection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4344
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStackFrameIterator_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003Fb6_003F4aa91425_003FStackFrameIterator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
45+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStackFrameIterator_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003F2854ce6d56c18d0d837d3a3ef9c4f2c7c77691fa3528c8394986ac7ce7719_003FStackFrameIterator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4446
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStackFrameIterator_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb95edcc1c50e44ebbf7efbbca83c493ee8e928_003Ff0_003F2a2ad48b_003FStackFrameIterator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4547
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStackFrameIterator_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003Fb6_003F4aa91425_003FStackFrameIterator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
48+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStream_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fd1287462d4ec4078c61b8e92a0952fb7de3e7e877d279e390a4c136a6365126_003FStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4649
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb3de04a3bd424a618270569579853d0b47928_003F33_003Fd79c2392_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4750
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUseMiddlewareExtensions_002Ecs_002Fl_003AC_0021_003FUsers_003Ftoken_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd455287e79b847419df3187cd3b7294f50938_003F1b_003F751afbab_003FUseMiddlewareExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4851
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AValueTask_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb241c378a97f4447a2e6baf64e656013e8e910_003F25_003F9ca0be61_003FValueTask_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@@ -62,6 +65,18 @@
6265

6366

6467

68+
69+
70+
71+
72+
73+
74+
75+
76+
77+
78+
79+
6580

6681

6782
</wpf:ResourceDictionary>

Directory.Build.props

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<Project>
2-
<!-- See https://aka.ms/dotnet/msbuild/customize for more details on customizing your build -->
3-
<PropertyGroup>
4-
<!-- 统一版本号管理 -->
5-
<Version>0.1.7</Version>
6-
<AssemblyVersion>$(Version)</AssemblyVersion>
7-
<FileVersion>$(Version)</FileVersion>
8-
<InformationalVersion>$(Version)</InformationalVersion>
9-
10-
<!-- 产品信息 -->
11-
<Product>ClaudeCodeProxy</Product>
12-
<Company>AIDotNet</Company>
13-
<Copyright>Copyright © AIDotNet 2025</Copyright>
14-
<Description>Claude API代理服务,提供API密钥管理、请求监控和费用统计功能</Description>
15-
</PropertyGroup>
2+
<!-- See https://aka.ms/dotnet/msbuild/customize for more details on customizing your build -->
3+
<PropertyGroup>
4+
<!-- 统一版本号管理 -->
5+
<Version>0.1.7</Version>
6+
<AssemblyVersion>$(Version)</AssemblyVersion>
7+
<FileVersion>$(Version)</FileVersion>
8+
<InformationalVersion>$(Version)</InformationalVersion>
9+
10+
<!-- 产品信息 -->
11+
<Product>ClaudeCodeProxy</Product>
12+
<Company>AIDotNet</Company>
13+
<Copyright>Copyright © AIDotNet 2025</Copyright>
14+
<Description>Claude API代理服务,提供API密钥管理、请求监控和费用统计功能</Description>
15+
</PropertyGroup>
1616
</Project>

docker-compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
context: .
1818
dockerfile: src/ClaudeCodeProxy.Host/Dockerfile
1919
healthcheck:
20-
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
20+
test: [ "CMD", "curl", "-f", "http://localhost:8080/health" ]
2121
interval: 30s
2222
timeout: 10s
2323
retries: 3

src/ClaudeCodeProxy.Abstraction/Anthropic/AnthropicCacheControl.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace ClaudeCodeProxy.Abstraction.Anthropic;
4+
5+
public sealed class AnthropicCacheControls
6+
{
7+
[JsonPropertyName("type")] public string? Type { get; set; }
8+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace ClaudeCodeProxy.Abstraction.Anthropic;
4+
5+
public class AnthropicStreamDto
6+
{
7+
[JsonPropertyName("type")] public string? Type { get; set; }
8+
9+
[JsonPropertyName("index")] public int? Index { get; set; }
10+
11+
[JsonPropertyName("content_block")] public AnthropicChatCompletionDtoContentBlock? ContentBlock { get; set; }
12+
13+
[JsonPropertyName("delta")] public AnthropicChatCompletionDtoDelta? Delta { get; set; }
14+
15+
[JsonPropertyName("message")] public AnthropicChatCompletionDto? Message { get; set; }
16+
17+
[JsonPropertyName("usage")] public AnthropicCompletionDtoUsage? Usage { get; set; }
18+
19+
[JsonPropertyName("error")] public AnthropicStreamErrorDto? Error { get; set; }
20+
}
21+
22+
public class AnthropicStreamErrorDto
23+
{
24+
[JsonPropertyName("type")] public string? Type { get; set; }
25+
26+
[JsonPropertyName("message")] public string? Message { get; set; }
27+
}
28+
29+
public class AnthropicChatCompletionDtoDelta
30+
{
31+
[JsonPropertyName("type")] public string? Type { get; set; }
32+
33+
[JsonPropertyName("text")] public string? Text { get; set; }
34+
35+
[JsonPropertyName("thinking")] public string? Thinking { get; set; }
36+
37+
[JsonPropertyName("partial_json")] public string? PartialJson { get; set; }
38+
39+
[JsonPropertyName("stop_reason")] public string? StopReason { get; set; }
40+
}
41+
42+
public class AnthropicChatCompletionDtoContentBlock
43+
{
44+
[JsonPropertyName("type")] public string? Type { get; set; }
45+
46+
[JsonPropertyName("thinking")] public string? Thinking { get; set; }
47+
48+
[JsonPropertyName("signature")] public string? Signature { get; set; }
49+
50+
[JsonPropertyName("id")] public string? Id { get; set; }
51+
52+
[JsonPropertyName("name")] public string? Name { get; set; }
53+
54+
[JsonPropertyName("input")] public object? Input { get; set; }
55+
56+
[JsonPropertyName("server_name")] public string? ServerName { get; set; }
57+
58+
[JsonPropertyName("is_error")] public bool? IsError { get; set; }
59+
60+
[JsonPropertyName("tool_use_id")] public string? ToolUseId { get; set; }
61+
62+
[JsonPropertyName("content")] public object? Content { get; set; }
63+
}
64+
65+
public class AnthropicChatCompletionDto
66+
{
67+
public string id { get; set; }
68+
69+
public string type { get; set; }
70+
71+
public string role { get; set; }
72+
73+
public AnthropicChatCompletionDtoContent[] content { get; set; }
74+
75+
public string model { get; set; }
76+
77+
public string stop_reason { get; set; }
78+
79+
public object stop_sequence { get; set; }
80+
81+
public AnthropicCompletionDtoUsage Usage { get; set; }
82+
}
83+
84+
public class AnthropicChatCompletionDtoContent
85+
{
86+
public string type { get; set; }
87+
88+
public string? text { get; set; }
89+
90+
public string? id { get; set; }
91+
92+
public string? name { get; set; }
93+
94+
public object? input { get; set; }
95+
96+
[JsonPropertyName("thinking")] public string? Thinking { get; set; }
97+
98+
public string? signature { get; set; }
99+
}
100+
101+
public class AnthropicCompletionDtoUsage
102+
{
103+
[JsonPropertyName("input_tokens")] public int? InputTokens { get; set; }
104+
105+
[JsonPropertyName("cache_creation_input_tokens")]
106+
public int? CacheCreationInputTokens { get; set; }
107+
108+
[JsonPropertyName("cache_read_input_tokens")]
109+
public int? CacheReadInputTokens { get; set; }
110+
111+
[JsonPropertyName("output_tokens")] public int? OutputTokens { get; set; }
112+
113+
[JsonPropertyName("server_tool_use")] public AnthropicServerToolUse? ServerToolUse { get; set; }
114+
}
115+
116+
public class AnthropicServerToolUse
117+
{
118+
[JsonPropertyName("web_search_requests")]
119+
public int? WebSearchRequests { get; set; }
120+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace ClaudeCodeProxy.Abstraction.Anthropic;
4+
5+
public class AnthropicCitationsItem
6+
{
7+
[JsonPropertyName("enabled")]
8+
public bool Enabled { get; set; }
9+
}
10+
11+
12+
public class AnthropicCitations
13+
{
14+
[JsonPropertyName("type")]
15+
public string? Type { get; set; }
16+
17+
[JsonPropertyName("cited_text")]
18+
public string? CitedText { get; set; }
19+
20+
[JsonPropertyName("document_index")]
21+
public int? DocumentIndex { get; set; }
22+
23+
[JsonPropertyName("document_title")]
24+
public string? DocumentTitle { get; set; }
25+
26+
[JsonPropertyName("start_char_index")]
27+
public int? StartCharIndex { get; set; }
28+
29+
[JsonPropertyName("end_char_index")]
30+
public int? EndCharIndex { get; set; }
31+
}
32+

src/ClaudeCodeProxy.Abstraction/Anthropic/AnthropicInput.cs

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
using System.ComponentModel.DataAnnotations;
22
using System.Text.Json;
33
using System.Text.Json.Serialization;
4-
using ClaudeCodeProxy.Abstraction;
5-
using ClaudeCodeProxy.Abstraction.Anthropic;
64

7-
namespace Thor.Abstractions.Anthropic;
5+
namespace ClaudeCodeProxy.Abstraction.Anthropic;
86

97
public sealed class AnthropicInput
108
{
@@ -18,6 +16,8 @@ public sealed class AnthropicInput
1816

1917
[JsonPropertyName("tools")] public IList<AnthropicMessageTool>? Tools { get; set; }
2018

19+
[JsonPropertyName("betas")] public object? Betas { get; set; }
20+
2121
[JsonPropertyName("tool_choice")]
2222
public object ToolChoiceCalculated
2323
{
@@ -45,13 +45,13 @@ public object ToolChoiceCalculated
4545
}
4646
}
4747

48-
[JsonIgnore] public string ToolChoiceString { get; set; }
48+
[JsonIgnore] public string? ToolChoiceString { get; set; }
4949

5050
[JsonIgnore] public AnthropicTooChoiceInput? ToolChoice { get; set; }
5151

5252
[JsonIgnore] public IList<AnthropicMessageContent>? Systems { get; set; }
5353

54-
[JsonIgnore] public string System { get; set; }
54+
[JsonIgnore] public string? System { get; set; }
5555

5656
[JsonPropertyName("system")]
5757
public object SystemCalculated
@@ -86,6 +86,37 @@ public object SystemCalculated
8686
[JsonPropertyName("temperature")] public double? Temperature { get; set; }
8787

8888
[JsonPropertyName("metadata")] public Dictionary<string, object>? Metadata { get; set; }
89+
90+
[JsonPropertyName("stop_reason")] public string? StopReason { get; set; }
91+
92+
[JsonPropertyName("mcp_servers")] public AnthropicMcpServersInput? McpServers { get; set; }
93+
}
94+
95+
public class AnthropicMcpServersInput
96+
{
97+
[JsonPropertyName("type")]
98+
public string? Type { get; set; }
99+
100+
[JsonPropertyName("url")]
101+
public string? Url { get; set; }
102+
103+
[JsonPropertyName("name")]
104+
public string? Name { get; set; }
105+
106+
[JsonPropertyName("authorization_token")]
107+
public string? AuthorizationToken { get; set; }
108+
109+
[JsonPropertyName("tool_configuration")]
110+
public AnthropicMcpServersToolConfigurationInput? ToolConfiguration { get; set; }
111+
}
112+
113+
public class AnthropicMcpServersToolConfigurationInput
114+
{
115+
[JsonPropertyName("enabled")]
116+
public bool? Enabled { get; set; }
117+
118+
[JsonPropertyName("allowed_tools")]
119+
public string[]? AllowedTools { get; set; }
89120
}
90121

91122
public class AnthropicThinkingInput
@@ -113,6 +144,12 @@ public class AnthropicMessageTool
113144
[JsonPropertyName("description")] public string? Description { get; set; }
114145

115146
[JsonPropertyName("input_schema")] public InputSchema? InputSchema { get; set; }
147+
148+
[JsonPropertyName("max_uses")] public string? MaxUses { get; set; }
149+
150+
[JsonPropertyName("allowed_domains")] public string[]? AllowedDomains { get; set; }
151+
152+
[JsonPropertyName("blocked_domains")] public string[]? BlockedDomains { get; set; }
116153
}
117154

118155
public class InputSchema
@@ -130,10 +167,5 @@ public class InputSchemaValue
130167

131168
public string description { get; set; }
132169

133-
public InputSchemaValueItems? items { get; set; }
134-
}
135-
136-
public class InputSchemaValueItems
137-
{
138-
public string? type { get; set; }
170+
public InputSchemaValue? items { get; set; }
139171
}

0 commit comments

Comments
 (0)