File size: 4,462 Bytes
b0e72b5
4fe3d9c
b0e72b5
 
 
 
c7a90d5
b0e72b5
e7ea6a7
b0e72b5
c7a90d5
 
b0e72b5
c7a90d5
 
 
 
b0e72b5
 
 
 
 
 
 
 
 
c7a90d5
 
 
 
b0e72b5
 
 
 
 
 
 
 
 
 
 
 
 
4fe3d9c
 
a054b11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4fe3d9c
 
 
bd049e0
4fe3d9c
 
 
 
 
c7a90d5
4fe3d9c
 
 
 
 
c7a90d5
e7ea6a7
c7a90d5
 
e7ea6a7
c7a90d5
 
 
 
 
 
 
 
a054b11
 
 
4975afb
 
 
29acba1
a054b11
29acba1
181ea28
29acba1
 
 
5a8160a
29acba1
 
a054b11
29acba1
 
 
a054b11
29acba1
 
a054b11
29acba1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import openai
import decider_questions

YES = True
NO = False

g_decider_utils_dbg_printing = False


def yesno(question, text, default):
    global g_decider_utils_dbg_printing

    prompt = text + "\n\n" + question

    if g_decider_utils_dbg_printing:
        print(prompt)

    hopefully_word_yes_or_no = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        temperature=0,
        max_tokens=20,  # At first I tried max_tokens = 1 or 2,  but the davinci-002 model produced zero output (immediate stop) unless I increased max_token to around 20
        frequency_penalty=0,
        presence_penalty=0,
        n=1,
    )["choices"][0]["text"]

    if g_decider_utils_dbg_printing:
        print(hopefully_word_yes_or_no)

    hopefully_word_yes_or_no = hopefully_word_yes_or_no.upper().strip()

    result = default

    if default == YES:
        if hopefully_word_yes_or_no.startswith("N"):
            result = NO

    if default == NO:
        if hopefully_word_yes_or_no.startswith("Y"):
            result = YES

    return result


def number(question, text, default=-1, maximum=6):
    global g_decider_utils_dbg_printing

    prompt = text + "\n\n" + question

    if g_decider_utils_dbg_printing:
        print(prompt)

    hopefully_number = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        temperature=0,
        max_tokens=20,  # At first I tried max_tokens = 1 or 2,  but the davinci-002 model produced zero output (immediate stop) unless I increased max_token to around 20
        frequency_penalty=0,
        presence_penalty=0,
        n=1,
    )["choices"][0]["text"]

    if g_decider_utils_dbg_printing:
        print(hopefully_number)

    hopefully_number = hopefully_number.upper().strip().split(" ")[0].strip(".")

    if g_decider_utils_dbg_printing:
        print(hopefully_number)

    if hopefully_number == "ONE":
        hopefully_number = "1"

    if hopefully_number == "TWO":
        hopefully_number = "2"

    if hopefully_number == "THREE":
        hopefully_number = "3"

    if hopefully_number == "FOUR":
        hopefully_number = "4"

    if hopefully_number == "FIVE":
        hopefully_number = "5"

    if hopefully_number == "SIX":
        hopefully_number = "6"

    result = default

    if hopefully_number.startswith("ALL"):
        result = maximum
    else:

        try:
            if hopefully_number.isnumeric():
                result = int(hopefully_number)
        except:
            pass

    return result


# In certain cases, I need more special-case logic in order to behave correctly,
# which we verify using the unit tests in run_unit_tests.py:


def special_case_is_running_away(text):
    might_really_be_fleeing = False
    for keyword in ["run", "away", "hide", "escape", "flee", "sprint", "teleport"]:
        if keyword in text.lower():
            might_really_be_fleeing = True
            break

    if might_really_be_fleeing:
        return yesno(decider_questions.QUESTION_IS_ACTION_RUNNING_AWAY, text, default=NO)
    else:
        return NO


def special_case_is_magic(text):
    is_magic = False
    for keyword in ["magic", "spell", "fly", "invisib", "levitat", "shapeshift", "morph", "shrink", "transform", "teleport", "dragon", "genie", "fairy", "demon", "devil", "angel", "griffin", "wand"]:
        if keyword in text.lower():
            is_magic = True
            break

    if is_magic:
        return YES
    else:
        return yesno(decider_questions.QUESTION_IS_ACTION_MAGIC, text, default=NO)


def special_case_is_action_lethal(text):
    if len(text.strip()) <= 3:
        return NO

    text_l = text.lower()

    is_negotiation = False
    for keyword in ["say", "ask", "negotiat", "warn", "fair", "consider", "please", "family", "children", "challenge", "request", "inquire", "price", "gold", "coin", "away", "don't shoot", "dont shoot"]:
        if keyword in text_l:
            is_negotiation = True
            break

    if is_negotiation:
        return NO

    aiming_but_not_shooting = False
    if ("aim" in text_l or "cock" in text_l or "pull" in text_l or "hammer" in text_l or "point" in text_l) and not ("shoot" in text_l or "fire" in text_l or "trigger" in text_l):
        aiming_but_not_shooting = True

    if aiming_but_not_shooting:
        return NO

    bool1 = yesno(decider_questions.QUESTION_IS_ACTION_LIKELY_LETHAL, text, default=NO)
    return bool1