Skip to content

[Bug]:多模型代理设置不统一及 MarkdownSkillParser 多行文本解析问题 #1184

@lhstack

Description

@lhstack

Describe the bug

  1. 代理设置 API 不统一:不同 ChatModel 实现类的代理设置方式不一致,缺少统一的代理配置 API,导致多供应商智能体开发时配置困扰。
  2. MarkdownSkillParser 无法解析多行 description:使用 | > 格式的多行文本描述时解析失败,导致无法直接安装 GitHub 上提供的 skill 文件。

To Reproduce

问题一:代理设置不统一

// DashScopeChatModel 和 OpenAIChatModel - 可通过 OkHttpTransport 设置代理
val model = DashScopeChatModel.builder()
            .apiKey(provider.apiKey)
            .modelName(modelName)
            .stream(streamingEnabled)
            .httpTransport(OkHttpTransport(HttpTransportConfig.builder().also {
                if (provider.proxyEnabled) {
                    if (provider.proxyType == AgentProxyType.HTTP.id) {
                        it.proxy(ProxyConfig.http(provider.proxyHost, provider.proxyPort))
                    } else {
                        it.proxy(ProxyConfig.socks5(provider.proxyHost, provider.proxyPort))
                    }
                }
            }.build()))
            .endpointType(resolveDashScopeEndpoint(settings))
            .defaultOptions(defaultOptions)
            .baseUrl(provider.baseUrl)
            .formatter(formatter)
            .build()

// AnthropicChatModel - 内部支持代理但未暴露给调用者
// 无法直接设置,需要重写类

// GeminiChatModel - 通过 clientOptions 设置
// OllamaChatModel - 通过 HttpTransport 设置

问题二:MarkdownSkillParser 解析失败

# GitHub 上提供的 skill 文件格式
name: example_skill
description: |
  This is a multi-line
  description that should
  work properly

执行安装时解析失败,需手动将 | > 改为单行文本。

Expected behavior

  1. 统一代理设置 API:所有 ChatModel 实现类应提供统一的代理设置方式,例如:

    • 统一的 ProxyOptions 配置类
    • 或在 Builder 中提供一致的 proxy() 方法
  2. 正确解析多行 YAML:MarkdownSkillParser 应能正确解析标准 YAML 的多行文本格式(|> 块标量)。

Error messages

问题一:尝试重写 AnthropicChatModel 时因 JDK 版本不一致导致编译/运行错误:

AnthropicChatFormatter 依赖的 JDK 版本与项目 JDK 版本不兼容

问题二:MarkdownSkillParser 解析多行 description 时丢失格式或解析失败。

Additional context

临时解决方案

  1. 代理问题:因无法统一设置,需为不同模型分别处理代理配置。

  2. MarkdownSkillParser 重写:使用 SnakeYAML 替代原有解析器:

static Map<String, String> parse(String yamlContent) {
    Map<String, String> result = new LinkedHashMap<>();
    Yaml yaml = new Yaml();
    Map map = yaml.loadAs(yamlContent, Map.class);
    map.forEach((key, value) -> 
        result.put(String.valueOf(key), String.valueOf(value))
    );
    return result;
}

建议改进

  1. 抽象统一的 TransportClientOptions 接口,支持代理、超时等通用配置
  2. 修复 MarkdownSkillParser 对 YAML 块标量(|>)的支持

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions