Skip to content

Commit d9376ae

Browse files
committed
fix: ToolFromCallable with custom name
Fixes @tool("customName") not working after JetBrains#791.
1 parent 88b9d96 commit d9376ae

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

agents/agents-tools/src/jvmMain/kotlin/ai/koog/agents/core/tools/reflect/ToolFromCallable.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public class ToolFromCallable(
109109
override val argsSerializer: KSerializer<VarArgs>
110110
get() = VarArgsSerializer(callable)
111111

112-
override val name: String = callable.name
112+
override val name: String = descriptor.name
113113
override val description: String = descriptor.description
114114

115115
/**

agents/agents-tools/src/jvmTest/kotlin/ai/koog/agents/core/tools/reflect/ToolsFromCallableTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ interface ToolSet1 : ToolSet1BaseInterface, ToolSet {
8383
@LLMDescription("int argument overridden")
8484
intArg: Int
8585
): String
86+
87+
@Tool("customName")
88+
fun toolWithCustomName(): String
8689
}
8790

8891
open class ToolSet1Impl : ToolSet1 {
@@ -117,6 +120,10 @@ open class ToolSet1Impl : ToolSet1 {
117120
override fun toolBase2OverriddenInInterface(intArg: Int): String {
118121
return "toolBase2OverriddenInInterface called: $intArg"
119122
}
123+
124+
override fun toolWithCustomName(): String {
125+
return "toolWithCustomName called"
126+
}
120127
}
121128

122129
class DerivedToolSet1Impl : ToolSet1Impl() {
@@ -280,6 +287,7 @@ class ToolsFromCallableTest {
280287
#2: ToolDescriptor(name=tool4, description=Perfect tool 4, requiredParameters=[ToolParameterDescriptor(name=arg, description=int argument, type=Integer)], optionalParameters=[])
281288
#3: ToolDescriptor(name=toolBase1, description=Base tool 1, requiredParameters=[], optionalParameters=[])
282289
#4: ToolDescriptor(name=toolBase2OverriddenInInterface, description=Base tool 2 description overridden, requiredParameters=[ToolParameterDescriptor(name=intArg, description=int argument overridden, type=Integer)], optionalParameters=[])
290+
#5: ToolDescriptor(name=customName, description=toolWithCustomName, requiredParameters=[], optionalParameters=[])
283291
""".trim()
284292
),
285293
Arguments.of(
@@ -291,6 +299,7 @@ class ToolsFromCallableTest {
291299
#3: ToolDescriptor(name=tool4, description=Perfect tool 4, requiredParameters=[ToolParameterDescriptor(name=arg, description=int argument, type=Integer)], optionalParameters=[])
292300
#4: ToolDescriptor(name=toolBase1, description=Base tool 1, requiredParameters=[], optionalParameters=[])
293301
#5: ToolDescriptor(name=toolBase2OverriddenInInterface, description=Base tool 2 description overridden, requiredParameters=[ToolParameterDescriptor(name=intArg, description=int argument overridden, type=Integer)], optionalParameters=[])
302+
#6: ToolDescriptor(name=customName, description=toolWithCustomName, requiredParameters=[], optionalParameters=[])
294303
""".trim()
295304
),
296305
Arguments.of(
@@ -299,6 +308,7 @@ class ToolsFromCallableTest {
299308
#0: ToolDescriptor(name=tool1, description=The best tool number 1, requiredParameters=[ToolParameterDescriptor(name=arg, description=int argument, type=Integer)], optionalParameters=[])
300309
#1: ToolDescriptor(name=toolBase1, description=Base tool 1, requiredParameters=[], optionalParameters=[])
301310
#2: ToolDescriptor(name=toolBase2OverriddenInInterface, description=Base tool 2 description overridden, requiredParameters=[ToolParameterDescriptor(name=intArg, description=int argument overridden, type=Integer)], optionalParameters=[])
311+
#3: ToolDescriptor(name=customName, description=toolWithCustomName, requiredParameters=[], optionalParameters=[])
302312
""".trim()
303313
),
304314
)
@@ -335,4 +345,25 @@ class ToolsFromCallableTest {
335345
}.trim()
336346
assertEquals(expectedDescription, rendered)
337347
}
348+
349+
@Test
350+
fun testToolPropertiesOnClasses() {
351+
val tools = ToolSet1Impl().asTools(json)
352+
val rendered = buildString {
353+
for ((i, tool) in tools.withIndex()) {
354+
appendLine("#$i: name=${tool.name} description=${tool.description}")
355+
}
356+
}.trim()
357+
assertEquals(
358+
"""
359+
#0: name=tool1 description=The best tool number 1
360+
#1: name=tool2 description=Wonderful tool number 2
361+
#2: name=tool4 description=Perfect tool 4
362+
#3: name=toolBase1 description=Base tool 1
363+
#4: name=toolBase2OverriddenInInterface description=Base tool 2 description overridden
364+
#5: name=customName description=toolWithCustomName
365+
""".trim(),
366+
rendered
367+
)
368+
}
338369
}

0 commit comments

Comments
 (0)