feat: finally nailed down phases 1-4
This commit is contained in:
47
MLXServerTests/Server/ToolCallParserTests.swift
Normal file
47
MLXServerTests/Server/ToolCallParserTests.swift
Normal file
@@ -0,0 +1,47 @@
|
||||
import XCTest
|
||||
@testable import MLX_Server
|
||||
|
||||
final class ToolCallParserTests: XCTestCase {
|
||||
func testParseGemmaToolCodeBlockExtractsToolCallAndStripsFence() throws {
|
||||
let tools = [mockWeatherTool]
|
||||
let text = "Before\n```tool_code\nweather(city=\"Berlin\")\n```\nAfter"
|
||||
|
||||
let parsed = ToolCallParser.parse(text: text, tools: tools)
|
||||
|
||||
XCTAssertEqual(parsed.0, "Before\n\nAfter")
|
||||
let toolCall = try XCTUnwrap(parsed.1.first)
|
||||
XCTAssertEqual(toolCall.name, "weather")
|
||||
XCTAssertEqual(toolCall.arguments, #"{"city":"Berlin"}"#)
|
||||
}
|
||||
|
||||
func testParseQwenToolCallTagExtractsJSONPayloadAndStripsTag() throws {
|
||||
let text = "<tool_call>{\"name\":\"weather\",\"arguments\":{\"city\":\"Paris\"}}</tool_call>"
|
||||
|
||||
let parsed = ToolCallParser.parse(text: text, tools: [mockWeatherTool])
|
||||
|
||||
XCTAssertEqual(parsed.0, "")
|
||||
let toolCall = try XCTUnwrap(parsed.1.first)
|
||||
XCTAssertEqual(toolCall.name, "weather")
|
||||
XCTAssertEqual(toolCall.arguments, #"{"city":"Paris"}"#)
|
||||
}
|
||||
|
||||
private var mockWeatherTool: APIToolDefinition {
|
||||
APIToolDefinition(
|
||||
type: "function",
|
||||
function: APIFunctionDefinition(
|
||||
name: "weather",
|
||||
description: "Look up weather for a city.",
|
||||
parameters: [
|
||||
"type": AnyCodable("object"),
|
||||
"properties": AnyCodable([
|
||||
"city": [
|
||||
"type": "string",
|
||||
"description": "City name"
|
||||
]
|
||||
]),
|
||||
"required": AnyCodable(["city"])
|
||||
]
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user