Skip to content

fix(ai): SkillRemoteHandler#createDraft passes skillCard as targetVersion and loses skillCard content #14908

@yuzhiping

Description

@yuzhiping

Bug Report

Module

consoleSkillRemoteHandler

Description

SkillRemoteHandler#createDraft has a parameter mismatch compared to the correct inner (local) implementation SkillInnerHandler#createDraft.

The remote handler calls the 4-parameter overload of SkillMaintainerService#createDraft, passing form.getSkillCard() into the targetVersion argument slot. The 4-parameter overload then delegates to the 5-parameter version with skillCard = null, so:

  1. targetVersion receives the skill card JSON string — wrong value.
  2. skillCard is silently set to null — the actual skill content is lost entirely.

Code Comparison

SkillMaintainerService#createDraft full signature (5-parameter)

String createDraft(String namespaceId, String skillName, String basedOnVersion,
                   String targetVersion, String skillCard) throws NacosException;

4-parameter overload (delegates with skillCard = null)

default String createDraft(String namespaceId, String skillName, String basedOnVersion, String targetVersion) {
    return createDraft(namespaceId, skillName, basedOnVersion, targetVersion, null); // skillCard forced to null
}

SkillInnerHandler#createDraft (correct — calls SkillOperationService which takes a Skill object)

return skillOperationService.createDraft(
    form.getNamespaceId(), form.getSkillName(), form.getBasedOnVersion(),
    form.getTargetVersion(), form.getResolvedInitialSkillOrNull()); // Skill object

SkillRemoteHandler#createDraft (buggy)

return clientHolder.getAiMaintainerService().skill().createDraft(
    form.getNamespaceId(), form.getSkillName(),
    form.getBasedOnVersion(), form.getSkillCard()); // ❌ skillCard lands in targetVersion slot; skillCard becomes null

Impact

When running in cluster/remote mode, calling createDraft via the Console will:

  • Set targetVersion to the skill card JSON string (wrong value).
  • Send skillCard = null to the server, losing the skill content entirely.

Expected Fix

SkillMaintainerService#createDraft takes String skillCard as the 5th parameter (not a Skill object like SkillOperationService). The correct remote call is:

return clientHolder.getAiMaintainerService().skill().createDraft(
    form.getNamespaceId(), form.getSkillName(), form.getBasedOnVersion(),
    form.getTargetVersion(), form.getSkillCard()); // ✅ correct parameter order

Environment

  • Branch: develop
  • File: console/src/main/java/com/alibaba/nacos/console/handler/impl/remote/ai/SkillRemoteHandler.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions