54 lines
1.8 KiB
JavaScript
54 lines
1.8 KiB
JavaScript
import GameStateManager from './GameStateManager.js';
|
|
import { buildPrompt } from './PromptCompressor.js';
|
|
|
|
/**
|
|
* Extracts the first JSON code block from a string.
|
|
* @param {string} text The text to search.
|
|
* @returns {object|null} The parsed JSON object or null if not found.
|
|
*/
|
|
function extractJson(text) {
|
|
const match = /```json\n([\s\S]+?)\n```/.exec(text);
|
|
if (match && match[1]) {
|
|
try {
|
|
return JSON.parse(match[1]);
|
|
} catch (error) {
|
|
console.error('RTS-Mode: Failed to parse JSON from LLM response.', error);
|
|
return null;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Sends the user's command to the LLM and processes the turn.
|
|
* @param {string} userCmd The user's command.
|
|
*/
|
|
export async function sendTurn(userCmd) {
|
|
try {
|
|
const stateJSON = GameStateManager.toCompressedJSON();
|
|
const prompt = buildPrompt(stateJSON, userCmd);
|
|
|
|
// Using SillyTavern's built-in LLM broker
|
|
const reply = await window.LLMBroker.generate(prompt);
|
|
|
|
if (!reply) {
|
|
throw new Error('LLM returned an empty response.');
|
|
}
|
|
|
|
const diff = extractJson(reply);
|
|
if (diff) {
|
|
GameStateManager.applyDiff(diff);
|
|
// For now, log the narrative part to the console.
|
|
const narrative = reply.replace(/```json\n[\s\S]+?\n```/, '').trim();
|
|
console.log('RTS Narrative:', narrative);
|
|
} else {
|
|
console.warn('RTS-Mode: No valid JSON diff found in LLM response.');
|
|
// Log the raw reply for debugging.
|
|
console.log('Raw LLM Response:', reply);
|
|
}
|
|
} catch (error) {
|
|
console.error('RTS-Mode: Error during sendTurn:', error);
|
|
// Optionally, display an alert to the user.
|
|
alert(`RTS-Mode Error: ${error.message}`);
|
|
}
|
|
} |