Skip to content

Commit 98abc83

Browse files
Implement redirection streategies in GameInputHandler
Co-authored-by: Sarmisuper <[email protected]>
1 parent 804cf2b commit 98abc83

File tree

3 files changed

+107
-18
lines changed

3 files changed

+107
-18
lines changed

ChatRPG/Services/GameInputHandler.cs

Lines changed: 89 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ public class GameInputHandler
1717
private readonly Dictionary<SystemPromptType, string> _systemPromptsWithVerdict = new();
1818
private readonly AutoResetEvent _autoResetEvent = new(true);
1919

20+
private readonly Dictionary<string, string> _redirectionStrategies = new()
21+
{
22+
{ "Hard Deny", "No" },
23+
{ "More Information", "Acktually" },
24+
{ "NPC Influence", "Sarmi says" },
25+
{ "Consequences", "Kill" }
26+
};
27+
2028
public GameInputHandler(
2129
ILogger<GameInputHandler> logger,
2230
IReActLlmClient llmClient,
@@ -43,6 +51,22 @@ public GameInputHandler(
4351
_systemPrompts.Add(SystemPromptType.GameOver, sysPromptSec.GetValue("GameOver", ""));
4452
_systemPromptsWithVerdict.Add(SystemPromptType.DoAction, sysPromptSec.GetValue("DoActionWithVerdict", ""));
4553
_systemPromptsWithVerdict.Add(SystemPromptType.SayAction, sysPromptSec.GetValue("SayActionWithVerdict", ""));
54+
_systemPromptsWithVerdict.Add(SystemPromptType.DoActionHardDeny,
55+
sysPromptSec.GetValue("DoActionHardDenyRedirect", ""));
56+
_systemPromptsWithVerdict.Add(SystemPromptType.DoActionMoreInfo,
57+
sysPromptSec.GetValue("DoActionMoreInformationRedirect", ""));
58+
_systemPromptsWithVerdict.Add(SystemPromptType.DoActionNpcInfluence,
59+
sysPromptSec.GetValue("DoActionNPCInfluenceRedirect", ""));
60+
_systemPromptsWithVerdict.Add(SystemPromptType.DoActionConsequences,
61+
sysPromptSec.GetValue("DoActionConsequencesRedirect", ""));
62+
_systemPromptsWithVerdict.Add(SystemPromptType.SayActionHardDeny,
63+
sysPromptSec.GetValue("SayActionHardDenyRedirect", ""));
64+
_systemPromptsWithVerdict.Add(SystemPromptType.SayActionMoreInfo,
65+
sysPromptSec.GetValue("SayActionMoreInformationRedirect", ""));
66+
_systemPromptsWithVerdict.Add(SystemPromptType.SayActionNpcInfluence,
67+
sysPromptSec.GetValue("SayActionNPCInfluenceRedirect", ""));
68+
_systemPromptsWithVerdict.Add(SystemPromptType.SayActionConsequences,
69+
sysPromptSec.GetValue("SayActionConsequencesRedirect", ""));
4670
}
4771

4872
public event EventHandler<ChatCompletionReceivedEventArgs>? ChatCompletionReceived;
@@ -88,18 +112,55 @@ public async Task HandleUserPrompt(Campaign campaign, UserPromptType promptType,
88112
}
89113
}
90114

91-
switch (promptType)
115+
if (campaign.IsSnapshot && userInputAdherenceVerdict != null &&
116+
userInputAdherenceVerdict.Contains("DISALLOWED", StringComparison.Ordinal))
92117
{
93-
case UserPromptType.Do:
94-
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.DoAction],
95-
userInput, userInputAdherenceVerdict, graphUpdateSummary);
96-
break;
97-
case UserPromptType.Say:
98-
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.SayAction],
99-
userInput, userInputAdherenceVerdict, graphUpdateSummary);
100-
break;
101-
default:
102-
throw new ArgumentOutOfRangeException();
118+
switch (promptType)
119+
{
120+
case UserPromptType.Do:
121+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.DoActionHardDeny],
122+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "A.\n\n");
123+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.DoActionMoreInfo],
124+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "B.\n\n");
125+
await GetResponseAndUpdateState(campaign,
126+
relevantSystemPrompts[SystemPromptType.DoActionNpcInfluence],
127+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "C.\n\n");
128+
await GetResponseAndUpdateState(campaign,
129+
relevantSystemPrompts[SystemPromptType.DoActionConsequences],
130+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "D.\n\n");
131+
;
132+
break;
133+
case UserPromptType.Say:
134+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.SayActionHardDeny],
135+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "A.\n\n");
136+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.SayActionMoreInfo],
137+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "B.\n\n");
138+
await GetResponseAndUpdateState(campaign,
139+
relevantSystemPrompts[SystemPromptType.SayActionNpcInfluence],
140+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "C.\n\n");
141+
await GetResponseAndUpdateState(campaign,
142+
relevantSystemPrompts[SystemPromptType.SayActionConsequences],
143+
userInput, userInputAdherenceVerdict, graphUpdateSummary, "D.\n\n");
144+
break;
145+
default:
146+
throw new ArgumentOutOfRangeException();
147+
}
148+
}
149+
else
150+
{
151+
switch (promptType)
152+
{
153+
case UserPromptType.Do:
154+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.DoAction],
155+
userInput, userInputAdherenceVerdict, graphUpdateSummary);
156+
break;
157+
case UserPromptType.Say:
158+
await GetResponseAndUpdateState(campaign, relevantSystemPrompts[SystemPromptType.SayAction],
159+
userInput, userInputAdherenceVerdict, graphUpdateSummary);
160+
break;
161+
default:
162+
throw new ArgumentOutOfRangeException();
163+
}
103164
}
104165

105166
_logger.LogInformation("Finished processing prompt");
@@ -122,7 +183,7 @@ await GetResponseAndUpdateState(campaign, _systemPrompts[SystemPromptType.Initia
122183
}
123184

124185
private async Task GetResponseAndUpdateState(Campaign campaign, string actionPrompt, string playerInput,
125-
string? verdict = null, string? graphUpdateSummary = null)
186+
string? verdict = null, string? graphUpdateSummary = null, string? redirectionPrefix = null)
126187
{
127188
var input = playerInput;
128189
if (!campaign.IsOpenWorld)
@@ -145,7 +206,7 @@ private async Task GetResponseAndUpdateState(Campaign campaign, string actionPro
145206

146207
if (_streamChatCompletions)
147208
{
148-
OpenAiGptMessage message = new(MessageRole.Assistant, "");
209+
OpenAiGptMessage message = new(MessageRole.Assistant, redirectionPrefix ?? "");
149210
OnChatCompletionReceived(message);
150211

151212
await foreach (var chunk in
@@ -164,14 +225,20 @@ private async Task GetResponseAndUpdateState(Campaign campaign, string actionPro
164225

165226
_ = Task.Run(async () =>
166227
{
167-
await SaveInteraction(campaign, playerInput, message.Content, verdict, gameOverMessage);
228+
if (!campaign.IsSnapshot || campaign.IsSnapshot &&
229+
(verdict != null && !verdict.Contains("DISALLOWED", StringComparison.Ordinal)))
230+
{
231+
await SaveInteraction(campaign, playerInput, message.Content, verdict, gameOverMessage);
232+
}
233+
168234
_autoResetEvent.Set();
235+
OnCampaignUpdated();
169236
});
170237
}
171238
else
172239
{
173240
var response = await _llmClient.GetChatCompletionAsync(campaign, actionPrompt, input);
174-
OpenAiGptMessage message = new(MessageRole.Assistant, response);
241+
OpenAiGptMessage message = new(MessageRole.Assistant, redirectionPrefix ?? "" + response);
175242
OnChatCompletionReceived(message);
176243

177244
string? gameOverMessage = null;
@@ -182,8 +249,14 @@ private async Task GetResponseAndUpdateState(Campaign campaign, string actionPro
182249

183250
_ = Task.Run(async () =>
184251
{
185-
await SaveInteraction(campaign, playerInput, message.Content, verdict, gameOverMessage);
252+
if (!campaign.IsSnapshot || campaign.IsSnapshot &&
253+
(verdict != null && !verdict.Contains("DISALLOWED", StringComparison.Ordinal)))
254+
{
255+
await SaveInteraction(campaign, playerInput, message.Content, verdict, gameOverMessage);
256+
}
257+
186258
_autoResetEvent.Set();
259+
OnCampaignUpdated();
187260
});
188261
}
189262
}

ChatRPG/Services/SystemPromptType.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,13 @@ public enum SystemPromptType
55
Initial,
66
DoAction,
77
SayAction,
8-
GameOver
8+
GameOver,
9+
DoActionHardDeny,
10+
DoActionMoreInfo,
11+
DoActionNpcInfluence,
12+
DoActionConsequences,
13+
SayActionHardDeny,
14+
SayActionMoreInfo,
15+
SayActionNpcInfluence,
16+
SayActionConsequences,
917
}

0 commit comments

Comments
 (0)