Skip to content

0.71.0

@azure-tools/typespec-azure-resource-manager

Section titled “@azure-tools/typespec-azure-resource-manager”
  • #5197 Remove modelDeploymentRef from the experimental Agent base type AgentDefinitionAppliance model. The appliance owns the entire agent definition, so the property is now Platform-only and remains available on AgentDefinitionPlatform. As a result AgentDefinitionAppliance takes a single template parameter (AgentDefinitionAppliance<HasInstructions> instead of AgentDefinitionAppliance<HasModelDeploymentRef, HasInstructions>), and AgentPropertiesAppliance.definition is read-only again since it no longer needs to carry a client-writable field.
  • #5109 Add no-openapi-client-extensions linter rule that flags use of the @typespec/openapi @extension decorator to emit client-altering x-ms-*/x-nullable OpenAPI extensions (e.g. x-ms-long-running-operation, x-ms-pageable, x-ms-enum, x-ms-client-name, x-ms-secret). These extensions only affect the OpenAPI output, so other emitters produce an incorrect representation of the API; use the equivalent TypeSpec construct instead.
  • #4891 Add built-in support for Azure service groups as extension resource targets and ARM resource identifier scopes.
  • #4880 Replace the no-unnamed-union linter rule with no-unnamed-types in @azure-tools/typespec-azure-core. The new rule flags anonymous models in addition to unnamed unions, walking the type graph from operations to detect anonymous models on the client surface. The no-unnamed-types rule has been removed from @azure-tools/typespec-client-generator-core.

@azure-tools/typespec-azure-resource-manager

Section titled “@azure-tools/typespec-azure-resource-manager”
  • #4892 Add the experimental Relationship base type for Azure Resource Manager extension resources. RelationshipProperties provides the baseTypes descriptor, source and target resource and tenant identifiers, and provisioning state. Resource providers can extend this property bag with relationship-specific information and expose the relationship against any ARM resource scope.

    Example of creating a dependency relationship with RP-specific metadata and operations:

    using Azure.ResourceManager;
    using Azure.ResourceManager.BaseTypes.Relationships;
    model DependencyOfMetadata {
    sourceType: string;
    targetType: string;
    description?: string;
    }
    model DependencyOfProperties is RelationshipProperties {
    metadata: DependencyOfMetadata;
    }
    #suppress "@azure-tools/typespec-azure-resource-manager/basetypes-experimental" "Experimental BaseTypes"
    model DependencyOf is Relationship<DependencyOfProperties> {
    ...ResourceNameParameter<
    Resource = DependencyOf,
    KeyName = "relationshipName",
    SegmentName = "dependencyOf",
    NamePattern = "^[a-zA-Z0-9_.-]{1,64}$"
    >;
    }
    interface DependencyOfOps<Scope extends Azure.ResourceManager.Foundations.SimpleResource> {
    get is Extension.Read<Scope, DependencyOf>;
    create is Extension.CreateOrReplaceAsync<Scope, DependencyOf>;
    update is Extension.CustomPatchAsync<
    Scope,
    DependencyOf,
    Azure.ResourceManager.Foundations.ResourceUpdateModel<DependencyOf, DependencyOfProperties>
    >;
    delete is Extension.DeleteWithoutOkAsync<Scope, DependencyOf>;
    list is Extension.ListByTarget<Scope, DependencyOf>;
    }
  • #4891 Add built-in support for Azure service groups as extension resource targets and ARM resource identifier scopes.

  • #5169 Adding a new billing-data common type. This provides standardization of billing properties in e.g. prepaid resource types.

  • #4808 Split arm-resource-operation lint rule: add use-operation-decorator, use-api-version, and use-interface as separate rules replacing the original combined rule.

@azure-tools/typespec-client-generator-core

Section titled “@azure-tools/typespec-client-generator-core”
  • #4867 Add csharp-model-suffix and csharp-use-standard-acronyms linter rules for C# SDK model naming.
  • #4977 Added versionsEnum field to SdkClientType providing a direct reference from each client to its Versions enum. This enables code generators to properly map clients to their version enums, especially for mixed api-version scenarios.
  • #5101 Add warning diagnostic when @clientDefaultValue value type does not match the property type
  • #4880 Replace the no-unnamed-union linter rule with no-unnamed-types in @azure-tools/typespec-azure-core. The new rule flags anonymous models in addition to unnamed unions, walking the type graph from operations to detect anonymous models on the client surface. The no-unnamed-types rule has been removed from @azure-tools/typespec-client-generator-core.
  • #4882 add sseMetadata with per-event information for server-sent event (SSE) streams
  • #4867 Add csharp-model-suffix and csharp-use-standard-acronyms linter rules for C# SDK model naming.

  • #5109 Add no-openapi-client-extensions linter rule that flags use of the @typespec/openapi @extension decorator to emit client-altering x-ms-*/x-nullable OpenAPI extensions (e.g. x-ms-long-running-operation, x-ms-pageable, x-ms-enum, x-ms-client-name, x-ms-secret). These extensions only affect the OpenAPI output, so other emitters produce an incorrect representation of the API; use the equivalent TypeSpec construct instead.

  • #4892 Add the experimental Relationship base type for Azure Resource Manager extension resources. RelationshipProperties provides the baseTypes descriptor, source and target resource and tenant identifiers, and provisioning state. Resource providers can extend this property bag with relationship-specific information and expose the relationship against any ARM resource scope.

    Example of creating a dependency relationship with RP-specific metadata and operations:

    using Azure.ResourceManager;
    using Azure.ResourceManager.BaseTypes.Relationships;
    model DependencyOfMetadata {
    sourceType: string;
    targetType: string;
    description?: string;
    }
    model DependencyOfProperties is RelationshipProperties {
    metadata: DependencyOfMetadata;
    }
    #suppress "@azure-tools/typespec-azure-resource-manager/basetypes-experimental" "Experimental BaseTypes"
    model DependencyOf is Relationship<DependencyOfProperties> {
    ...ResourceNameParameter<
    Resource = DependencyOf,
    KeyName = "relationshipName",
    SegmentName = "dependencyOf",
    NamePattern = "^[a-zA-Z0-9_.-]{1,64}$"
    >;
    }
    interface DependencyOfOps<Scope extends Azure.ResourceManager.Foundations.SimpleResource> {
    get is Extension.Read<Scope, DependencyOf>;
    create is Extension.CreateOrReplaceAsync<Scope, DependencyOf>;
    update is Extension.CustomPatchAsync<
    Scope,
    DependencyOf,
    Azure.ResourceManager.Foundations.ResourceUpdateModel<DependencyOf, DependencyOfProperties>
    >;
    delete is Extension.DeleteWithoutOkAsync<Scope, DependencyOf>;
    list is Extension.ListByTarget<Scope, DependencyOf>;
    }
  • #4808 Split arm-resource-operation lint rule: add use-operation-decorator, use-api-version, and use-interface as separate rules replacing the original combined rule.

  • #4880 Replace the no-unnamed-union linter rule with no-unnamed-types in @azure-tools/typespec-azure-core. The new rule flags anonymous models in addition to unnamed unions, walking the type graph from operations to detect anonymous models on the client surface. The no-unnamed-types rule has been removed from @azure-tools/typespec-client-generator-core.

  • #4959 Add e2e scenario for @clientApiVersions decorator to verify clients can send api-version from an extended client enum.
  • #4891 Add built-in support for Azure service groups as extension resource targets and ARM resource identifier scopes.
  • #4632 Add tests for ARM getLro, postActionPaging, markAsPageable, postPagingLroWithBody, routedGet, and createOrReplaceOptionalBody
  • #5109 The no-openapi rule no longer flags the @extension decorator. Client-altering x-ms-* extensions emitted through @extension are handled by the no-openapi-client-extensions rule instead.

@azure-tools/typespec-azure-resource-manager

Section titled “@azure-tools/typespec-azure-resource-manager”
  • #4904 Constrain the baseType field of the experimental BaseTypeInfo to a new BaseType extensible enum (a union of Agent and Relationship with a string variant) instead of a free-form string, following the Azure no-enum / no-closed-literal-union conventions.
  • #5100 Refine the experimental Agent base type input model: add an input property to ConversationProperties (mirroring ResponseProperties.input, required on create), rename ConversationItem to InputItem, make its role property read-only, and change the content field on InputItem/ResponseItem to Record<unknown> to support polymorphic content.
  • #5178 Make modelDeploymentRef writable in the experimental Agent base type AgentDefinitionAppliance model instead of read-only, so the client can select the underlying model deployment in both the Appliance and Platform deployment models. AgentPropertiesAppliance.definition is no longer read-only either, since a read-only container would keep every nested field unsettable; the service-owned fields inside the definition remain read-only.
  • #4978 Fix the Agent base type contract version in the @azureBaseType decorator on the Agent resource template, correcting a typo where it was set to 2024-06-01 instead of 2026-04-01.
  • #5126 Fix visibility-sealed errors reported for the resource name property when emitters or versioning re-apply the ARM resource decorators on a copy of the resource type

@azure-tools/typespec-client-generator-core

Section titled “@azure-tools/typespec-client-generator-core”
  • #4979 Surface @encode(string) on boolean types in SdkBuiltInType so downstream emitters can generate string-encoded boolean (de)serialization.
  • #5027 Detect operation name conflicts when multiple services are combined into one client via @client({service: [ServiceA, ServiceB]}). Previously only same-namespace duplicates were caught; now cross-service operation name collisions emit the existing duplicate-client-name diagnostic.
  • #5146 Add wireType to SdkBuiltInType interface and populate it from the encodedAs parameter of @encode for integer, boolean, and bytes types. Previously, wireType was only set for datetime and duration types.
  • #4981 Fix ResponseAsBool_HeadAsBoolean scenario coverage always failing. Split it into two scenarios (exists and notExists) so the intentional 404 response of notExists is validated with passOnCode(404) instead of passOnSuccess (which requires all endpoints to return 2xx). Endpoint paths are unchanged.
  • #4991 Fix the postPagingLroWithBody ARM scenario to declare the LRO final result (ArmLroLocationHeader<FinalResult = ProductListResult>) so the accepted response’s location header points at the paged result type.