outlines
1from enum import Enum
2
3from llama_cpp import Llama, LogitsProcessorList
4from pydantic import BaseModel, constr
5
6from outlines.generate.processors import JSONLogitsProcessor
7from outlines.models.llamacpp import LlamaCppTokenizer
8
9
10class Weapon(str, Enum):
11sword = "sword"
12axe = "axe"
13mace = "mace"
14spear = "spear"
15bow = "bow"
16crossbow = "crossbow"
17
18
19class Armor(str, Enum):
20leather = "leather"
21chainmail = "chainmail"
22plate = "plate"
23
24
25class Character(BaseModel):
26name: constr(max_length=10)
27age: int
28armor: Armor
29weapon: Weapon
30strength: int
31
32
33if __name__ == "__main__":
34llama = Llama("./phi-2.Q4_K_M.gguf")
35tokenizer = LlamaCppTokenizer(llama)
36
37prompt = "Instruct: You are a leading role play gamer. You have seen thousands of different characters and their attributes.\nPlease return a JSON object with common attributes of an RPG character. Give me a character description\nOutput:"
38
39logits_processor = JSONLogitsProcessor(Character, tokenizer)
40
41json_str = llama.create_completion(
42prompt,
43top_k=40,
44top_p=0.95,
45temperature=0.7,
46max_tokens=100,
47logits_processor=LogitsProcessorList([logits_processor]),
48)["choices"][0]["text"]
49
50print(json_str)
51