[model] support for LiquidAI's LFM2.5 (Liquid Foundation Models) (#9726)

This commit is contained in:
Vo Van Phuc
2026-01-07 13:14:47 +07:00
committed by GitHub
parent d43e1007e8
commit b4e051bea4
4 changed files with 229 additions and 0 deletions

View File

@@ -292,3 +292,91 @@ def test_qwen_multi_tool_extractor():
("test_tool", """{"foo": "bar", "size": 10}"""),
("another_tool", """{"foo": "job", "size": 2}"""),
]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_function_formatter():
formatter = FunctionFormatter(slots=["{{content}}<|im_end|>\n"], tool_format="lfm")
tool_calls = json.dumps(FUNCTION)
assert formatter.apply(content=tool_calls) == [
"""<|tool_call_start|>[tool_name(foo="bar", size=10)]<|tool_call_end|><|im_end|>\n"""
]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_multi_function_formatter():
formatter = FunctionFormatter(slots=["{{content}}<|im_end|>\n"], tool_format="lfm")
tool_calls = json.dumps([FUNCTION] * 2)
assert formatter.apply(content=tool_calls) == [
"""<|tool_call_start|>[tool_name(foo="bar", size=10), tool_name(foo="bar", size=10)]<|tool_call_end|>"""
"<|im_end|>\n"
]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_formatter():
formatter = ToolFormatter(tool_format="lfm")
assert formatter.apply(content=json.dumps(TOOLS)) == [
"List of tools: <|tool_list_start|>" + json.dumps(TOOLS, ensure_ascii=False) + "<|tool_list_end|>"
]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_extractor():
formatter = ToolFormatter(tool_format="lfm")
result = """<|tool_call_start|>[test_tool(foo="bar", size=10)]<|tool_call_end|>"""
assert formatter.extract(result) == [("test_tool", """{"foo": "bar", "size": 10}""")]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_multi_tool_extractor():
formatter = ToolFormatter(tool_format="lfm")
result = """<|tool_call_start|>[test_tool(foo="bar", size=10), another_tool(foo="job", size=2)]<|tool_call_end|>"""
assert formatter.extract(result) == [
("test_tool", """{"foo": "bar", "size": 10}"""),
("another_tool", """{"foo": "job", "size": 2}"""),
]
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_extractor_with_nested_dict():
formatter = ToolFormatter(tool_format="lfm")
result = """<|tool_call_start|>[search(query="test", options={"limit": 10, "offset": 0})]<|tool_call_end|>"""
extracted = formatter.extract(result)
assert len(extracted) == 1
assert extracted[0][0] == "search"
args = json.loads(extracted[0][1])
assert args["query"] == "test"
assert args["options"] == {"limit": 10, "offset": 0}
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_extractor_with_list_arg():
formatter = ToolFormatter(tool_format="lfm")
result = """<|tool_call_start|>[batch_process(items=[1, 2, 3], enabled=True)]<|tool_call_end|>"""
extracted = formatter.extract(result)
assert len(extracted) == 1
assert extracted[0][0] == "batch_process"
args = json.loads(extracted[0][1])
assert args["items"] == [1, 2, 3]
assert args["enabled"] is True
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_extractor_no_match():
formatter = ToolFormatter(tool_format="lfm")
result = "This is a regular response without tool calls."
extracted = formatter.extract(result)
assert extracted == result
@pytest.mark.runs_on(["cpu", "mps"])
def test_lfm_tool_round_trip():
formatter = FunctionFormatter(slots=["{{content}}"], tool_format="lfm")
tool_formatter = ToolFormatter(tool_format="lfm")
original = {"name": "my_func", "arguments": {"arg1": "hello", "arg2": 42, "arg3": True}}
formatted = formatter.apply(content=json.dumps(original))
extracted = tool_formatter.extract(formatted[0])
assert len(extracted) == 1
assert extracted[0][0] == original["name"]
assert json.loads(extracted[0][1]) == original["arguments"]