from ctransformers import LLM, Config class MockLLM(LLM): def __init__(self): self._config = Config() self._llm = None @property def config(self): return self._config def tokenize(self, prompt, **kwargs): self.tokens = prompt.split(" ") return range(len(self.tokens)) def generate(self, tokens, **kwargs): return tokens def detokenize(self, tokens, decode=True): text = " " + self.tokens[tokens[0]] if not decode: text = text.encode() return text class TestLLM: def test_stop(self): llm = MockLLM() prompt = "foo bar baz lorem ipsum\ndolor" expected = [ ([], " foo bar baz lorem ipsum\ndolor"), (["dolor "], " foo bar baz lorem ipsum\ndolor"), (["ipsum "], " foo bar baz lorem ipsum\ndolor"), (["doloro"], " foo bar baz lorem ipsum\ndolor"), (["ipsumo"], " foo bar baz lorem ipsum\ndolor"), (["dolor"], " foo bar baz lorem ipsum\n"), (["ipsum"], " foo bar baz lorem "), (["olor"], " foo bar baz lorem ipsum\nd"), (["olo"], " foo bar baz lorem ipsum\nd"), (["psum"], " foo bar baz lorem i"), (["psu"], " foo bar baz lorem i"), (["z lor"], " foo bar ba"), (["rem", "or"], " foo bar baz l"), (["foo"], " "), (["f"], " "), ([" "], ""), (["\n"], " foo bar baz lorem ipsum"), (["m\nd"], " foo bar baz lorem ipsu"), ] for stop, response in expected: assert llm(prompt, stop=stop) == response if len(stop) == 1: assert llm(prompt, stop=stop[0]) == response