Skip to content

[Bug]: Improve skill YAML frontmatter parsing tolerance for unquoted colons in scalar values #1442

@hexly666

Description

@hexly666

AgentScope-Java is an open-source project. To involve a broader community, we recommend asking your questions in English.

Describe the bug

When loading a skill via FileSystemSkillRepository, the MarkdownSkillParser fails to parse YAML frontmatter if the description field contains unquoted : (colon followed by space) patterns. SnakeYAML interprets : as a key-value separator, causing a ScannerException.

To Reproduce
When loading a skill via FileSystemSkillRepository, the MarkdownSkillParser fails to parse YAML frontmatter if the description field contains unquoted : (colon followed by space) patterns. SnakeYAML interprets : as a key-value separator, causing a ScannerException.

Example problematic SKILL.md:

---
name: testskils
description: 测试skills, node: 无法找到EDI Partner、EDI Partner不存在、Partner配置错误、850订单没有生成SO、850订单报错、Can't find the EDI Customer setup in the EDI partner function、查不到850订单。处理EDI 850订单中无法找到EDI Partner的问题,当850报错包含Can't find the EDI Customer setup in the EDI partner function时使用此skill。
---
# Skill Content

**Expected behavior**
A clear and concise description of what you expected to happen.

**Error messages**
Detailed error messages.

**Environment (please complete the following information):**

- AgentScope-Java Version:  1.0.12
- Java Version: 21
- OS: macos

**Additional context**
org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here
 in 'string', line 2, column 28:
 description: 测试skills, node: 无法找到EDI Partner、EDI Partner不存在 ... 
 ^

 at org.yaml.snakeyaml.scanner.ScannerImpl.fetchValue(ScannerImpl.java:917)
 at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:406)
 at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:239)
 at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:637)
 at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)
 at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:57)
 at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:43)
 at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:136)
 at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:116)
 at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:249)
 at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:214)
 at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:396)
 at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:361)
 at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:329)
 at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:218)
 at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:141)
 at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:167)
 at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:179)
 at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:508)
 at org.yaml.snakeyaml.Yaml.load(Yaml.java:437)
 at io.agentscope.core.skill.util.MarkdownSkillParser.parseYamlMetadata(MarkdownSkillParser.java:155)
 at io.agentscope.core.skill.util.MarkdownSkillParser.parse(MarkdownSkillParser.java:113)
 at io.agentscope.core.skill.util.SkillUtil.createFrom(SkillUtil.java:91)
 at io.agentscope.core.skill.util.SkillFileSystemHelper.loadSkillFromDirectory(SkillFileSystemHelper.java:98)
 at io.agentscope.core.skill.util.SkillFileSystemHelper.lambda$getAllSkills$4(SkillFileSystemHelper.java:145)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
 at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
 at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
 at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
 at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
 at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
 at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
 at io.agentscope.core.skill.util.SkillFileSystemHelper.getAllSkills(SkillFileSystemHelper.java:141)
 at io.agentscope.core.skill.repository.FileSystemSkillRepository.getAllSkills(FileSystemSkillRepository.java:119)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions