/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------------------------------------------*/
// AUTO-GENERATED FILE - DO NOT EDIT
// Generated from: api.schema.json
using System.Text.Json;
using System.Text.Json.Serialization;
using StreamJsonRpc;
namespace GitHub.Copilot.SDK.Rpc;
public class PingResult
{
/// Echoed message (or default greeting)
[JsonPropertyName("message")]
public string Message { get; set; } = string.Empty;
/// Server timestamp in milliseconds
[JsonPropertyName("timestamp")]
public double Timestamp { get; set; }
/// Server protocol version number
[JsonPropertyName("protocolVersion")]
public double ProtocolVersion { get; set; }
}
internal class PingRequest
{
[JsonPropertyName("message")]
public string? Message { get; set; }
}
public class ModelCapabilitiesSupports
{
[JsonPropertyName("vision")]
public bool Vision { get; set; }
/// Whether this model supports reasoning effort configuration
[JsonPropertyName("reasoningEffort")]
public bool ReasoningEffort { get; set; }
}
public class ModelCapabilitiesLimits
{
[JsonPropertyName("max_prompt_tokens")]
public double? MaxPromptTokens { get; set; }
[JsonPropertyName("max_output_tokens")]
public double? MaxOutputTokens { get; set; }
[JsonPropertyName("max_context_window_tokens")]
public double MaxContextWindowTokens { get; set; }
}
/// Model capabilities and limits
public class ModelCapabilities
{
[JsonPropertyName("supports")]
public ModelCapabilitiesSupports Supports { get; set; } = new();
[JsonPropertyName("limits")]
public ModelCapabilitiesLimits Limits { get; set; } = new();
}
/// Policy state (if applicable)
public class ModelPolicy
{
[JsonPropertyName("state")]
public string State { get; set; } = string.Empty;
[JsonPropertyName("terms")]
public string Terms { get; set; } = string.Empty;
}
/// Billing information
public class ModelBilling
{
[JsonPropertyName("multiplier")]
public double Multiplier { get; set; }
}
public class Model
{
/// Model identifier (e.g., "claude-sonnet-4.5")
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;
/// Display name
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
/// Model capabilities and limits
[JsonPropertyName("capabilities")]
public ModelCapabilities Capabilities { get; set; } = new();
/// Policy state (if applicable)
[JsonPropertyName("policy")]
public ModelPolicy? Policy { get; set; }
/// Billing information
[JsonPropertyName("billing")]
public ModelBilling? Billing { get; set; }
/// Supported reasoning effort levels (only present if model supports reasoning effort)
[JsonPropertyName("supportedReasoningEfforts")]
public List? SupportedReasoningEfforts { get; set; }
/// Default reasoning effort level (only present if model supports reasoning effort)
[JsonPropertyName("defaultReasoningEffort")]
public string? DefaultReasoningEffort { get; set; }
}
public class ModelsListResult
{
/// List of available models with full metadata
[JsonPropertyName("models")]
public List Models { get; set; } = new();
}
public class Tool
{
/// Tool identifier (e.g., "bash", "grep", "str_replace_editor")
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
/// Optional namespaced name for declarative filtering (e.g., "playwright/navigate" for MCP tools)
[JsonPropertyName("namespacedName")]
public string? NamespacedName { get; set; }
/// Description of what the tool does
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
/// JSON Schema for the tool's input parameters
[JsonPropertyName("parameters")]
public Dictionary? Parameters { get; set; }
/// Optional instructions for how to use this tool effectively
[JsonPropertyName("instructions")]
public string? Instructions { get; set; }
}
public class ToolsListResult
{
/// List of available built-in tools with metadata
[JsonPropertyName("tools")]
public List Tools { get; set; } = new();
}
internal class ToolsListRequest
{
[JsonPropertyName("model")]
public string? Model { get; set; }
}
public class AccountGetQuotaResultQuotaSnapshotsValue
{
/// Number of requests included in the entitlement
[JsonPropertyName("entitlementRequests")]
public double EntitlementRequests { get; set; }
/// Number of requests used so far this period
[JsonPropertyName("usedRequests")]
public double UsedRequests { get; set; }
/// Percentage of entitlement remaining
[JsonPropertyName("remainingPercentage")]
public double RemainingPercentage { get; set; }
/// Number of overage requests made this period
[JsonPropertyName("overage")]
public double Overage { get; set; }
/// Whether pay-per-request usage is allowed when quota is exhausted
[JsonPropertyName("overageAllowedWithExhaustedQuota")]
public bool OverageAllowedWithExhaustedQuota { get; set; }
/// Date when the quota resets (ISO 8601)
[JsonPropertyName("resetDate")]
public string? ResetDate { get; set; }
}
public class AccountGetQuotaResult
{
/// Quota snapshots keyed by type (e.g., chat, completions, premium_interactions)
[JsonPropertyName("quotaSnapshots")]
public Dictionary QuotaSnapshots { get; set; } = new();
}
public class SessionModelGetCurrentResult
{
[JsonPropertyName("modelId")]
public string? ModelId { get; set; }
}
internal class SessionModelGetCurrentRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionModelSwitchToResult
{
[JsonPropertyName("modelId")]
public string? ModelId { get; set; }
}
internal class SessionModelSwitchToRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("modelId")]
public string ModelId { get; set; } = string.Empty;
}
public class SessionModeGetResult
{
/// The current agent mode.
[JsonPropertyName("mode")]
public SessionModeGetResultMode Mode { get; set; }
}
internal class SessionModeGetRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionModeSetResult
{
/// The agent mode after switching.
[JsonPropertyName("mode")]
public SessionModeGetResultMode Mode { get; set; }
}
internal class SessionModeSetRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("mode")]
public SessionModeGetResultMode Mode { get; set; }
}
public class SessionPlanReadResult
{
/// Whether plan.md exists in the workspace
[JsonPropertyName("exists")]
public bool Exists { get; set; }
/// The content of plan.md, or null if it does not exist
[JsonPropertyName("content")]
public string? Content { get; set; }
}
internal class SessionPlanReadRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionPlanUpdateResult
{
}
internal class SessionPlanUpdateRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("content")]
public string Content { get; set; } = string.Empty;
}
public class SessionPlanDeleteResult
{
}
internal class SessionPlanDeleteRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionWorkspaceListFilesResult
{
/// Relative file paths in the workspace files directory
[JsonPropertyName("files")]
public List Files { get; set; } = new();
}
internal class SessionWorkspaceListFilesRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionWorkspaceReadFileResult
{
/// File content as a UTF-8 string
[JsonPropertyName("content")]
public string Content { get; set; } = string.Empty;
}
internal class SessionWorkspaceReadFileRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("path")]
public string Path { get; set; } = string.Empty;
}
public class SessionWorkspaceCreateFileResult
{
}
internal class SessionWorkspaceCreateFileRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("path")]
public string Path { get; set; } = string.Empty;
[JsonPropertyName("content")]
public string Content { get; set; } = string.Empty;
}
public class SessionFleetStartResult
{
/// Whether fleet mode was successfully activated
[JsonPropertyName("started")]
public bool Started { get; set; }
}
internal class SessionFleetStartRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("prompt")]
public string? Prompt { get; set; }
}
public class Agent
{
/// Unique identifier of the custom agent
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
/// Human-readable display name
[JsonPropertyName("displayName")]
public string DisplayName { get; set; } = string.Empty;
/// Description of the agent's purpose
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
}
public class SessionAgentListResult
{
/// Available custom agents
[JsonPropertyName("agents")]
public List Agents { get; set; } = new();
}
internal class SessionAgentListRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionAgentGetCurrentResultAgent
{
/// Unique identifier of the custom agent
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
/// Human-readable display name
[JsonPropertyName("displayName")]
public string DisplayName { get; set; } = string.Empty;
/// Description of the agent's purpose
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
}
public class SessionAgentGetCurrentResult
{
/// Currently selected custom agent, or null if using the default agent
[JsonPropertyName("agent")]
public SessionAgentGetCurrentResultAgent? Agent { get; set; }
}
internal class SessionAgentGetCurrentRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
/// The newly selected custom agent
public class SessionAgentSelectResultAgent
{
/// Unique identifier of the custom agent
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
/// Human-readable display name
[JsonPropertyName("displayName")]
public string DisplayName { get; set; } = string.Empty;
/// Description of the agent's purpose
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
}
public class SessionAgentSelectResult
{
/// The newly selected custom agent
[JsonPropertyName("agent")]
public SessionAgentSelectResultAgent Agent { get; set; } = new();
}
internal class SessionAgentSelectRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
}
public class SessionAgentDeselectResult
{
}
internal class SessionAgentDeselectRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
public class SessionCompactionCompactResult
{
/// Whether compaction completed successfully
[JsonPropertyName("success")]
public bool Success { get; set; }
/// Number of tokens freed by compaction
[JsonPropertyName("tokensRemoved")]
public double TokensRemoved { get; set; }
/// Number of messages removed during compaction
[JsonPropertyName("messagesRemoved")]
public double MessagesRemoved { get; set; }
}
internal class SessionCompactionCompactRequest
{
[JsonPropertyName("sessionId")]
public string SessionId { get; set; } = string.Empty;
}
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum SessionModeGetResultMode
{
[JsonStringEnumMemberName("interactive")]
Interactive,
[JsonStringEnumMemberName("plan")]
Plan,
[JsonStringEnumMemberName("autopilot")]
Autopilot,
}
/// Typed server-scoped RPC methods (no session required).
public class ServerRpc
{
private readonly JsonRpc _rpc;
internal ServerRpc(JsonRpc rpc)
{
_rpc = rpc;
Models = new ModelsApi(rpc);
Tools = new ToolsApi(rpc);
Account = new AccountApi(rpc);
}
/// Calls "ping".
public async Task PingAsync(string? message = null, CancellationToken cancellationToken = default)
{
var request = new PingRequest { Message = message };
return await CopilotClient.InvokeRpcAsync(_rpc, "ping", [request], cancellationToken);
}
/// Models APIs.
public ModelsApi Models { get; }
/// Tools APIs.
public ToolsApi Tools { get; }
/// Account APIs.
public AccountApi Account { get; }
}
/// Server-scoped Models APIs.
public class ModelsApi
{
private readonly JsonRpc _rpc;
internal ModelsApi(JsonRpc rpc)
{
_rpc = rpc;
}
/// Calls "models.list".
public async Task ListAsync(CancellationToken cancellationToken = default)
{
return await CopilotClient.InvokeRpcAsync(_rpc, "models.list", [], cancellationToken);
}
}
/// Server-scoped Tools APIs.
public class ToolsApi
{
private readonly JsonRpc _rpc;
internal ToolsApi(JsonRpc rpc)
{
_rpc = rpc;
}
/// Calls "tools.list".
public async Task ListAsync(string? model = null, CancellationToken cancellationToken = default)
{
var request = new ToolsListRequest { Model = model };
return await CopilotClient.InvokeRpcAsync(_rpc, "tools.list", [request], cancellationToken);
}
}
/// Server-scoped Account APIs.
public class AccountApi
{
private readonly JsonRpc _rpc;
internal AccountApi(JsonRpc rpc)
{
_rpc = rpc;
}
/// Calls "account.getQuota".
public async Task GetQuotaAsync(CancellationToken cancellationToken = default)
{
return await CopilotClient.InvokeRpcAsync(_rpc, "account.getQuota", [], cancellationToken);
}
}
/// Typed session-scoped RPC methods.
public class SessionRpc
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal SessionRpc(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
Model = new ModelApi(rpc, sessionId);
Mode = new ModeApi(rpc, sessionId);
Plan = new PlanApi(rpc, sessionId);
Workspace = new WorkspaceApi(rpc, sessionId);
Fleet = new FleetApi(rpc, sessionId);
Agent = new AgentApi(rpc, sessionId);
Compaction = new CompactionApi(rpc, sessionId);
}
public ModelApi Model { get; }
public ModeApi Mode { get; }
public PlanApi Plan { get; }
public WorkspaceApi Workspace { get; }
public FleetApi Fleet { get; }
public AgentApi Agent { get; }
public CompactionApi Compaction { get; }
}
public class ModelApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal ModelApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.model.getCurrent".
public async Task GetCurrentAsync(CancellationToken cancellationToken = default)
{
var request = new SessionModelGetCurrentRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.model.getCurrent", [request], cancellationToken);
}
/// Calls "session.model.switchTo".
public async Task SwitchToAsync(string modelId, CancellationToken cancellationToken = default)
{
var request = new SessionModelSwitchToRequest { SessionId = _sessionId, ModelId = modelId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.model.switchTo", [request], cancellationToken);
}
}
public class ModeApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal ModeApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.mode.get".
public async Task GetAsync(CancellationToken cancellationToken = default)
{
var request = new SessionModeGetRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.mode.get", [request], cancellationToken);
}
/// Calls "session.mode.set".
public async Task SetAsync(SessionModeGetResultMode mode, CancellationToken cancellationToken = default)
{
var request = new SessionModeSetRequest { SessionId = _sessionId, Mode = mode };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.mode.set", [request], cancellationToken);
}
}
public class PlanApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal PlanApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.plan.read".
public async Task ReadAsync(CancellationToken cancellationToken = default)
{
var request = new SessionPlanReadRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.plan.read", [request], cancellationToken);
}
/// Calls "session.plan.update".
public async Task UpdateAsync(string content, CancellationToken cancellationToken = default)
{
var request = new SessionPlanUpdateRequest { SessionId = _sessionId, Content = content };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.plan.update", [request], cancellationToken);
}
/// Calls "session.plan.delete".
public async Task DeleteAsync(CancellationToken cancellationToken = default)
{
var request = new SessionPlanDeleteRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.plan.delete", [request], cancellationToken);
}
}
public class WorkspaceApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal WorkspaceApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.workspace.listFiles".
public async Task ListFilesAsync(CancellationToken cancellationToken = default)
{
var request = new SessionWorkspaceListFilesRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.workspace.listFiles", [request], cancellationToken);
}
/// Calls "session.workspace.readFile".
public async Task ReadFileAsync(string path, CancellationToken cancellationToken = default)
{
var request = new SessionWorkspaceReadFileRequest { SessionId = _sessionId, Path = path };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.workspace.readFile", [request], cancellationToken);
}
/// Calls "session.workspace.createFile".
public async Task CreateFileAsync(string path, string content, CancellationToken cancellationToken = default)
{
var request = new SessionWorkspaceCreateFileRequest { SessionId = _sessionId, Path = path, Content = content };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.workspace.createFile", [request], cancellationToken);
}
}
public class FleetApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal FleetApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.fleet.start".
public async Task StartAsync(string? prompt, CancellationToken cancellationToken = default)
{
var request = new SessionFleetStartRequest { SessionId = _sessionId, Prompt = prompt };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.fleet.start", [request], cancellationToken);
}
}
public class AgentApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal AgentApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.agent.list".
public async Task ListAsync(CancellationToken cancellationToken = default)
{
var request = new SessionAgentListRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.agent.list", [request], cancellationToken);
}
/// Calls "session.agent.getCurrent".
public async Task GetCurrentAsync(CancellationToken cancellationToken = default)
{
var request = new SessionAgentGetCurrentRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.agent.getCurrent", [request], cancellationToken);
}
/// Calls "session.agent.select".
public async Task SelectAsync(string name, CancellationToken cancellationToken = default)
{
var request = new SessionAgentSelectRequest { SessionId = _sessionId, Name = name };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.agent.select", [request], cancellationToken);
}
/// Calls "session.agent.deselect".
public async Task DeselectAsync(CancellationToken cancellationToken = default)
{
var request = new SessionAgentDeselectRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.agent.deselect", [request], cancellationToken);
}
}
public class CompactionApi
{
private readonly JsonRpc _rpc;
private readonly string _sessionId;
internal CompactionApi(JsonRpc rpc, string sessionId)
{
_rpc = rpc;
_sessionId = sessionId;
}
/// Calls "session.compaction.compact".
public async Task CompactAsync(CancellationToken cancellationToken = default)
{
var request = new SessionCompactionCompactRequest { SessionId = _sessionId };
return await CopilotClient.InvokeRpcAsync(_rpc, "session.compaction.compact", [request], cancellationToken);
}
}
[JsonSourceGenerationOptions(
JsonSerializerDefaults.Web,
AllowOutOfOrderMetadataProperties = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(AccountGetQuotaResult))]
[JsonSerializable(typeof(AccountGetQuotaResultQuotaSnapshotsValue))]
[JsonSerializable(typeof(Agent))]
[JsonSerializable(typeof(Model))]
[JsonSerializable(typeof(ModelBilling))]
[JsonSerializable(typeof(ModelCapabilities))]
[JsonSerializable(typeof(ModelCapabilitiesLimits))]
[JsonSerializable(typeof(ModelCapabilitiesSupports))]
[JsonSerializable(typeof(ModelPolicy))]
[JsonSerializable(typeof(ModelsListResult))]
[JsonSerializable(typeof(PingRequest))]
[JsonSerializable(typeof(PingResult))]
[JsonSerializable(typeof(SessionAgentDeselectRequest))]
[JsonSerializable(typeof(SessionAgentDeselectResult))]
[JsonSerializable(typeof(SessionAgentGetCurrentRequest))]
[JsonSerializable(typeof(SessionAgentGetCurrentResult))]
[JsonSerializable(typeof(SessionAgentGetCurrentResultAgent))]
[JsonSerializable(typeof(SessionAgentListRequest))]
[JsonSerializable(typeof(SessionAgentListResult))]
[JsonSerializable(typeof(SessionAgentSelectRequest))]
[JsonSerializable(typeof(SessionAgentSelectResult))]
[JsonSerializable(typeof(SessionAgentSelectResultAgent))]
[JsonSerializable(typeof(SessionCompactionCompactRequest))]
[JsonSerializable(typeof(SessionCompactionCompactResult))]
[JsonSerializable(typeof(SessionFleetStartRequest))]
[JsonSerializable(typeof(SessionFleetStartResult))]
[JsonSerializable(typeof(SessionModeGetRequest))]
[JsonSerializable(typeof(SessionModeGetResult))]
[JsonSerializable(typeof(SessionModeSetRequest))]
[JsonSerializable(typeof(SessionModeSetResult))]
[JsonSerializable(typeof(SessionModelGetCurrentRequest))]
[JsonSerializable(typeof(SessionModelGetCurrentResult))]
[JsonSerializable(typeof(SessionModelSwitchToRequest))]
[JsonSerializable(typeof(SessionModelSwitchToResult))]
[JsonSerializable(typeof(SessionPlanDeleteRequest))]
[JsonSerializable(typeof(SessionPlanDeleteResult))]
[JsonSerializable(typeof(SessionPlanReadRequest))]
[JsonSerializable(typeof(SessionPlanReadResult))]
[JsonSerializable(typeof(SessionPlanUpdateRequest))]
[JsonSerializable(typeof(SessionPlanUpdateResult))]
[JsonSerializable(typeof(SessionWorkspaceCreateFileRequest))]
[JsonSerializable(typeof(SessionWorkspaceCreateFileResult))]
[JsonSerializable(typeof(SessionWorkspaceListFilesRequest))]
[JsonSerializable(typeof(SessionWorkspaceListFilesResult))]
[JsonSerializable(typeof(SessionWorkspaceReadFileRequest))]
[JsonSerializable(typeof(SessionWorkspaceReadFileResult))]
[JsonSerializable(typeof(Tool))]
[JsonSerializable(typeof(ToolsListRequest))]
[JsonSerializable(typeof(ToolsListResult))]
internal partial class RpcJsonContext : JsonSerializerContext;