ai plan v2
This commit is contained in:
+34
-11
@@ -78,6 +78,7 @@ namespace AnotherReplayReader
|
||||
private Model _model = new();
|
||||
private string? _cached;
|
||||
private TimeIndexedPrefixSums? _cachedPrefixSums;
|
||||
private ImmutableArray<EventSpan> _cachedSpans = ImmutableArray<EventSpan>.Empty;
|
||||
private ReplayFactIndex? _cachedFactIndex;
|
||||
|
||||
public EventDump()
|
||||
@@ -168,23 +169,21 @@ namespace AnotherReplayReader
|
||||
_textBox.Text = "正在加载,请稍候";
|
||||
_tokenUsageLabel.Content = "";
|
||||
Show();
|
||||
var (text, prefixSums) = await Task.Run(() =>
|
||||
{
|
||||
var text = GeneratePlainText(_model, out var prefixSums);
|
||||
return (text, prefixSums);
|
||||
});
|
||||
var (text, prefixSums, spans) = await Task.Run(() => GeneratePlainText(_model));
|
||||
var (bytesCount, estimatedTokenCount) = AIAnalyze.EstimateTokenCount(text);
|
||||
_textBox.Text = text;
|
||||
_cached = text;
|
||||
_cachedPrefixSums = prefixSums;
|
||||
_cachedSpans = spans;
|
||||
_cachedFactIndex = ReplayFactIndex.Build(_model.Commands, _stringHashes);
|
||||
// display KB and K tokens in _tokenUsageLabel
|
||||
_tokenUsageLabel.Content = $"大小: {bytesCount / 1024.0:0.00} KiB,估计Token数: {estimatedTokenCount / 1000.0:0.00} K";
|
||||
}
|
||||
|
||||
private static string GeneratePlainText(Model model, out TimeIndexedPrefixSums prefixSums)
|
||||
private static (string Text, TimeIndexedPrefixSums PrefixSums, ImmutableArray<EventSpan> EventSpans) GeneratePlainText(Model model)
|
||||
{
|
||||
prefixSums = new([], []);
|
||||
var prefixSums = new TimeIndexedPrefixSums([], []);
|
||||
var spans = ImmutableArray.CreateBuilder<EventSpan>();
|
||||
var sb = new StringBuilder();
|
||||
for (int chunkIndex = 0; chunkIndex < model.Commands.Length; ++chunkIndex)
|
||||
{
|
||||
@@ -196,6 +195,7 @@ namespace AnotherReplayReader
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var blockStart = sb.Length;
|
||||
prefixSums.Add(time, filtered.Count);
|
||||
sb.AppendLine($"[{TimeStampToString(time, model.Level)}]");
|
||||
foreach (var command in filtered)
|
||||
@@ -233,14 +233,18 @@ namespace AnotherReplayReader
|
||||
0x207 when i == 1 && j == 1 => $"序列:{ProductionQueueTypeToString((int)value)}",
|
||||
0x207 or 0x208 or 0x209 when i == 0 => $"{text}(建造者)",
|
||||
0x205 or 0x206 when i == 0 => $"{text}(出兵建筑)",
|
||||
0x252 => $"{model.PlayerNameByGameSlotIndex((int)command.Data[0].Value)}已主动退出游戏",
|
||||
0x252 => $"{model.PlayerNameByGameSlotIndex(FirstInt32(command.Data[0]) ?? 0)}已主动退出游戏",
|
||||
0x22E when i == 0 => j == 0 ? StanceToString((int)value) : null,
|
||||
_ => text,
|
||||
});
|
||||
sb.AppendLine();
|
||||
}
|
||||
var blockLength = sb.Length - blockStart;
|
||||
var tokens = (int)Math.Ceiling(
|
||||
Encoding.UTF8.GetByteCount(sb.ToString(blockStart, blockLength)) / 2.2);
|
||||
spans.Add(new EventSpan(time, blockStart, blockLength, tokens));
|
||||
}
|
||||
return sb.ToString();
|
||||
return (sb.ToString(), prefixSums, spans.ToImmutable());
|
||||
}
|
||||
|
||||
private static bool ShouldDisplay(CompactLevel level, ImmutableArray<CommandChunk> commands, int i)
|
||||
@@ -265,7 +269,12 @@ namespace AnotherReplayReader
|
||||
}
|
||||
if (commandId is 0x1F5) // 选择单位
|
||||
{
|
||||
var isNewSelection = ((bool[])chunk.Data[0].Value)[0];
|
||||
var isNewSelection = chunk.Data[0].Value switch
|
||||
{
|
||||
bool[] bools => bools.Length > 0 && bools[0],
|
||||
bool b => b,
|
||||
_ => false,
|
||||
};
|
||||
if (chunk.Data.Length <= 1 || chunk.Data[1].Count == 0)
|
||||
{
|
||||
// 空选择:
|
||||
@@ -324,6 +333,13 @@ namespace AnotherReplayReader
|
||||
_ => $"无效({value})"
|
||||
};
|
||||
|
||||
private static int? FirstInt32(CommandArgumentEntry entry) =>
|
||||
entry.Count == 1 && entry.Value is int singleInt
|
||||
? singleInt
|
||||
: entry.Value is int[] ints && ints.Length > 0
|
||||
? ints[0]
|
||||
: (int?)null;
|
||||
|
||||
private static string StanceToString(int value) => value switch
|
||||
{
|
||||
0 => "Guard",
|
||||
@@ -453,7 +469,14 @@ namespace AnotherReplayReader
|
||||
_aiPanel.GetRequestContext = _aiSettings.GetCurrentContext!;
|
||||
_aiPanel.GetPromptSettings = _aiSettings.GetPromptSettings;
|
||||
|
||||
await _aiPanel.StartAnalysisAsync(replay, _model.Players, cached, cachedPrefixSums, factIndex, _cancellation.Token);
|
||||
await _aiPanel.StartAnalysisAsync(
|
||||
replay,
|
||||
_model.Players,
|
||||
cached,
|
||||
cachedPrefixSums,
|
||||
factIndex,
|
||||
_cachedSpans,
|
||||
_cancellation.Token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user