feat: complete academic symbol lexicon heal, 2-column Cooper extraction, and updated assets
This commit is contained in:
@@ -3,6 +3,7 @@ import '../models/interpreter_persona.dart';
|
||||
import '../models/word_model.dart';
|
||||
import '../g4f/g4f.dart';
|
||||
import 'settings_repository.dart';
|
||||
import 'words_repository.dart';
|
||||
|
||||
class AiOracleService {
|
||||
static final AiOracleService _instance = AiOracleService._internal();
|
||||
@@ -32,6 +33,47 @@ class AiOracleService {
|
||||
];
|
||||
}
|
||||
|
||||
/// Generates an enhanced revision of a symbol based on its full pre-prompt
|
||||
Future<String> generateSymbolRevision({
|
||||
required String prePrompt,
|
||||
}) async {
|
||||
try {
|
||||
final g4fResult = await _client.chat.completions.create(
|
||||
model: G4FModels.gpt4o,
|
||||
messages: [
|
||||
Message(
|
||||
role: Role.system,
|
||||
content:
|
||||
'Ты — Архитектор Смыслов, верховный мифолог, культуролог и онтологический герменевт. '
|
||||
'Твоя задача — провести глубочайшее, бескомпромиссное и многомерное ОБОГАЩЕНИЕ сакрального Архетипа. '
|
||||
'Напиши захватывающую, монументальную, живую и литературную статью-эссе, которую по-настоящему интересно читать. '
|
||||
'СТРОЖАЙШИЕ ПРАВИЛА: '
|
||||
'Абсолютный запрет на гадательную терминологию (никаких оракулов, раскладов, карт, вопрошающих, гаданий). '
|
||||
'Запрет на лень и краткость: длинный, плотный, фактурный текст. '
|
||||
'Обязательный мультикультурный синтез: этимология, космогонии (Шумер, Египет, Греция, Иудаизм, Кельты, Суфизм, Дао), наука (квантовая механика, биология), алхимия. '
|
||||
'Формат ответа строго в markdown с заголовками ##:\n'
|
||||
'## ЯДРО\n'
|
||||
'## ОРАКУЛ\n'
|
||||
'## ТЕНЬ\n'
|
||||
'## ВОПРОС\n'
|
||||
'## ЖЕСТ\n'
|
||||
'Метрика: в самом конце точное количество символов.',
|
||||
),
|
||||
Message(
|
||||
role: Role.user,
|
||||
content: prePrompt,
|
||||
),
|
||||
],
|
||||
);
|
||||
if (g4fResult.trim().length > 20) {
|
||||
return g4fResult.trim();
|
||||
}
|
||||
} catch (e) {
|
||||
print('G4F Revision Error: $e');
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/// Interprets a full multi-word session narrative (1 to 9 words)
|
||||
Future<String> interpretSession({
|
||||
required List<SessionWord> words,
|
||||
@@ -77,7 +119,8 @@ class AiOracleService {
|
||||
$wordsNarrative
|
||||
${newlyAddedWord != null ? "Только что вытянут уточняющий знак: #${newlyAddedWord.formattedSessionNumber} «${newlyAddedWord.word.toUpperCase()}» (${newlyAddedWord.symbolicMeaning})." : ""}
|
||||
|
||||
Ответь в своём голосе, 3–4 предложения. Привяжи ответ к знакам и вопросу. Без тумана. Один ясный вывод или шаг.''';
|
||||
Ответь в своём голосе, 3–5 предложений. Привяжи ответ к законам знаков и вопросу.
|
||||
Закон знака побеждает голос: не выдумывай людей, руны и события, которых нет в законах. Если канон знака пуст — не раздувай его.''';
|
||||
|
||||
final messages = [
|
||||
Message(role: Role.system, content: voice.systemPrompt),
|
||||
@@ -119,7 +162,7 @@ ${newlyAddedWord != null ? "Только что вытянут уточняющ
|
||||
final wordsStr = words
|
||||
.asMap()
|
||||
.entries
|
||||
.map((e) => 'Знак ${e.key + 1}: #${e.value.formattedSessionNumber} «${e.value.word.toUpperCase()}» (${e.value.category}). Смысл знака: ${e.value.symbolicMeaning}')
|
||||
.map((e) => _signDossier(e.key + 1, e.value))
|
||||
.join('\n');
|
||||
|
||||
return '''$qStr
|
||||
@@ -127,7 +170,64 @@ ${newlyAddedWord != null ? "Только что вытянут уточняющ
|
||||
Выпавшие знаки жребия:
|
||||
$wordsStr
|
||||
|
||||
${persona.userTask}''';
|
||||
${persona.userTask}
|
||||
|
||||
$_fidelityRules''';
|
||||
}
|
||||
|
||||
static const String _fidelityRules = '''Закон знака побеждает голос.
|
||||
- Разбери знаки по порядку. Назови каждый и опирайся только на переданный закон.
|
||||
- Голос — интонация. Он не подменяет смысл и не превращает слова в руны, нити, тропы, круг близких, утробу или протоколы, если этого нет в законе.
|
||||
- Если у знака написано «канон пуст», так и скажи. Читай само слово буквально и не раздувай заготовку в историю.
|
||||
- Знак-сдвиг (наречие, обстоятельство, оператор «сдвиг») не отдельный миф: он меняет соседний знак — срок, место или способ.
|
||||
- Если задание голоса спорит с законом знака, побеждает закон знака.
|
||||
- В конце один физический шаг, который следует из законов.''';
|
||||
|
||||
String _signDossier(int index, SessionWord w) {
|
||||
final live = WordsRepository().getWordByName(w.word);
|
||||
final law = ((live != null && live.core.trim().isNotEmpty) ? live.core : w.symbolicMeaning).trim();
|
||||
final stock = _isStockCanon(law);
|
||||
final buf = StringBuffer()
|
||||
..writeln('Знак $index: #${w.formattedSessionNumber} «${w.word.toUpperCase()}»')
|
||||
..writeln('Часть речи: ${w.partOfSpeech.isEmpty ? 'не указана' : w.partOfSpeech}. Разряд: ${w.category}.');
|
||||
|
||||
if (live != null) {
|
||||
final op = WordItemLocalization.localizeOperator(live.operator);
|
||||
if (op.isNotEmpty) buf.writeln('Оператор: $op.');
|
||||
}
|
||||
|
||||
if (stock) {
|
||||
buf.writeln('Закон знака: КАНОН ПУСТ. В досье заготовка, не смысл. Читай слово «${w.word}» буквально.');
|
||||
} else {
|
||||
buf.writeln('Закон знака (единственный разрешённый смысл): $law');
|
||||
}
|
||||
|
||||
final shadow = live?.shadow.trim() ?? '';
|
||||
if (shadow.isNotEmpty && !_isStockShadow(shadow)) {
|
||||
buf.writeln('Тень: $shadow');
|
||||
}
|
||||
|
||||
final desc = live?.cleanDescription.trim() ?? '';
|
||||
if (desc.isNotEmpty && desc != law && !_isStockCanon(desc)) {
|
||||
buf.writeln('Описание: $desc');
|
||||
}
|
||||
return buf.toString().trimRight();
|
||||
}
|
||||
|
||||
bool _isStockCanon(String text) {
|
||||
final t = text.toLowerCase();
|
||||
return t.contains('сакральный символ') ||
|
||||
t.contains('архетипический образ в поле судьбы') ||
|
||||
t.contains('ключевую сферу кристаллизации') ||
|
||||
t.contains('вектор трансформации') ||
|
||||
t.contains('модус судьбы') ||
|
||||
t.contains('активный процесс духовной динамики');
|
||||
}
|
||||
|
||||
bool _isStockShadow(String text) {
|
||||
final t = text.toLowerCase();
|
||||
return t.contains('искажение первообраза') ||
|
||||
t.contains('суета, поспешность, насилие над естественным ритмом');
|
||||
}
|
||||
|
||||
String _synthesizeDeepSacredNarrative(List<SessionWord> words, String question) {
|
||||
@@ -174,9 +274,11 @@ ${persona.userTask}''';
|
||||
String _withPersonaPrefix(String body) {
|
||||
switch (persona.id) {
|
||||
case 'orc':
|
||||
return 'Слушай. $body';
|
||||
return 'Вааагх. $body';
|
||||
case 'techpriest':
|
||||
return 'Диагностика. $body';
|
||||
case 'aeldari':
|
||||
return 'По нитям судеб. $body';
|
||||
case 'analyst':
|
||||
return 'Рабочая гипотеза. $body';
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user