Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions serve/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,17 @@ def _bind(lib) -> None:


def version() -> str:
return _lib().waste_version().decode()
try:
return _lib().waste_version().decode()
except EngineError:
return "unknown"


def build_info() -> str:
return _lib().waste_build_info().decode()
try:
return _lib().waste_build_info().decode()
except EngineError:
return "unbuilt"


def physical_ram() -> int:
Expand Down
11 changes: 11 additions & 0 deletions serve/kimitools.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,19 @@ def feed_marker(self, marker: str, delta: Delta) -> bool:
self.calls.append(self._current)
self._state = "arguments"
elif marker == _CALL_END:
if self._state == "header":
self._current = self._parse_header()
self.calls.append(self._current)
if self._current is not None:
self._current.json_block = self._arguments
self._current = None
self._state = "section"
elif marker == _SECTION_END:
if self._state == "header":
self._current = self._parse_header()
self.calls.append(self._current)
if self._current is not None:
self._current.json_block = self._arguments
self._current = None
self._state = "content"
else:
Expand All @@ -232,6 +240,9 @@ def feed_text(self, piece: str, delta: Delta) -> bool:

def finish(self) -> None:
"""Flush a call whose arguments the stream ended in the middle of."""
if self._state == "header":
self._current = self._parse_header()
self.calls.append(self._current)
if self._current is not None:
self._current.json_block = self._arguments

Expand Down
34 changes: 34 additions & 0 deletions tests/serve/test_chatfmt.py
Original file line number Diff line number Diff line change
Expand Up @@ -693,3 +693,37 @@ def test_kimi_tool_call_delta_reports_change(self):
)

self.assertIn(0, delta.tool_calls)

def test_kimi_tool_call_without_arguments_marker(self):
p = self.parser()

self.feed(p, [
(1002, "<|tool_calls_section_begin|>"),
(1004, "<|tool_call_begin|>"),
(2001, "functions.get_time:0"),
(1006, "<|tool_call_end|>"),
(1003, "<|tool_calls_section_end|>"),
(1001, "<|im_end|>"),
])

self.assertEqual(len(p.tool_calls), 1)
call = p.tool_calls[0]
self.assertEqual(call.name, "get_time")
self.assertEqual(call.index, 0)
self.assertEqual(call.json_block, "")

def test_kimi_tool_call_stream_ended_in_header(self):
p = self.parser()

self.feed(p, [
(1002, "<|tool_calls_section_begin|>"),
(1004, "<|tool_call_begin|>"),
(2001, "functions.get_time:0"),
])
p.finish()

self.assertEqual(len(p.tool_calls), 1)
call = p.tool_calls[0]
self.assertEqual(call.name, "get_time")
self.assertEqual(call.index, 0)
self.assertEqual(call.json_block, "")
Loading