Skip to content

Commit b5d2a46

Browse files
committed
better complex parameter support - still temporary untill full support comes to RubyLLM
1 parent 5ade6ae commit b5d2a46

File tree

3 files changed

+48
-20
lines changed

3 files changed

+48
-20
lines changed

lib/ruby_llm/mcp.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def client(*args, **kwargs)
1919
def support_complex_parameters!
2020
require_relative "mcp/providers/open_ai/complex_parameter_support"
2121
require_relative "mcp/providers/anthropic/complex_parameter_support"
22+
require_relative "mcp/providers/gemini/complex_parameter_support"
2223
end
2324
end
2425
end

lib/ruby_llm/mcp/providers/anthropic/complex_parameter_support.rb

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,36 @@ module MCP
55
module Providers
66
module Anthropic
77
module ComplexParameterSupport
8+
module_function
9+
810
def clean_parameters(parameters)
911
parameters.transform_values do |param|
10-
format = {
11-
type: param.type,
12-
description: param.description
13-
}.compact
12+
build_properties(param).compact
13+
end
14+
end
1415

15-
if param.type == "array"
16-
format[:items] = param.items
17-
elsif param.type == "object"
18-
format[:properties] = clean_parameters(param.properties)
19-
end
16+
def required_parameters(parameters)
17+
parameters.select { |_, param| param.required }.keys
18+
end
2019

21-
format
20+
def build_properties(param)
21+
case param.type
22+
when :array
23+
{
24+
type: param.type,
25+
items: { type: param.item_type }
26+
}
27+
when :object
28+
{
29+
type: param.type,
30+
properties: clean_parameters(param.properties),
31+
required: required_parameters(param.properties)
32+
}
33+
else
34+
{
35+
type: param.type,
36+
description: param.description
37+
}
2238
end
2339
end
2440
end

lib/ruby_llm/mcp/providers/open_ai/complex_parameter_support.rb

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,29 @@ module MCP
55
module Providers
66
module OpenAI
77
module ComplexParameterSupport
8+
module_function
9+
810
def param_schema(param)
9-
format = {
10-
type: param.type,
11-
description: param.description
12-
}.compact
11+
properties = case param.type
12+
when :array
13+
{
14+
type: param.type,
15+
items: { type: param.item_type }
16+
}
17+
when :object
18+
{
19+
type: param.type,
20+
properties: param.properties.transform_values { |value| param_schema(value) },
21+
required: param.properties.select { |_, p| p.required }.keys
22+
}
23+
else
24+
{
25+
type: param.type,
26+
description: param.description
27+
}
28+
end
1329

14-
if param.type == "array"
15-
format[:items] = param.items
16-
elsif param.type == "object"
17-
format[:properties] = param.properties.transform_values { |value| param_schema(value) }
18-
end
19-
format
30+
properties.compact
2031
end
2132
end
2233
end

0 commit comments

Comments
 (0)