編集画面での処理

Last-modified: 2023-07-04 (火) 20:08:13

※ここに書かれている情報はユーザーがAIのべりすとを利用する中で、作者さんの発言やJavaScriptの動作、サーバーとの通信ログなどから推測した動作です。
これは公式の仕様書ではなく、このページを編集したユーザー(たち)が動作確認した以降もここにある通りの動作をしている保証はありません。
その点を十分に注意ください。

各GUIの使い方は機能説明に書かれているため、ここでは作成したデータをフロントエンド/バックエンドサーバーに送るときの事前処理や、結果を受け取ったときの事後処理などについて説明する。

都度行われる処理

タイトルと本文の変更や、その入力領域のクリックなどが行われると、データの保存とサーバーにデータを送るための下準備といえる処理が行われる。
この処理は適当なタイミングで実行されるため、仮に都度行われる処理とここでは称することにする。

まずシャーディングで分かれている入力欄のテキストを、コメントや最新出力の色変えを削除しながらつなぎ合わせる。
そして3回以上続く改行を2回に置換したり、「@_」によるコメントを削除したりする。
「@_」コメントの削除は末尾の改行まで削除するので、

A
@_ 12345
B

という文は

A
B

と全く同じである。
最後に、処理したテキストの末尾が改行か半角スペースならそれを削除する。

なお、同じタイミングでページタイトルの変更も行われる。

フロントエンドの事前処理

「続きを書く」を押すと、まず前述の都度行われる処理が実行される。
次に「【最新】入力文の確定置換」「【最新】入力文の確定置換(正規表現)」「【本文全体】入力文の確定置換」「【本文全体】入力文の確定置換(正規表現)」の適用、「@endpoint」より前までの本文の取得、各項目への文字数上限の適用、連続する文字の省略、長すぎる一行の自動改行が順に行われる。

「【最新】入力文の確定置換」「【最新】入力文の確定置換(正規表現)」「【本文全体】入力文の確定置換」「【本文全体】入力文の確定置換(正規表現)」の適用

本文のシャーディングの最後の枠に対して、「【最新】入力文の確定置換」「【最新】入力文の確定置換(正規表現)」、すべての枠に対して「【本文全体】入力文の確定置換」「【本文全体】入力文の確定置換(正規表現)」が上から順番に適用される。
最初に「|」による対象のランダム化が解決され、「【最新】入力文の確定置換」「【本文全体】入力文の確定置換」の場合はその後にINのテキストの中にある特定記号の全角化が行われる。
対象は次の通り。

/
*
.
?
(
)
[
]
{
}

そして、置換が行われる。
置換が一度実行されるたびに、上で書いた都度行われる処理が実行される。
ただし、複数の確定置換のスクリプトがある場合に2回目以降の置換の対象となるのは、直前に実行したスクリプトの置換結果であるため、3回以上の連続改行や「@_」コメントの除去はスクリプトの置換対象のテキストに対しては適用されない。
つまり、1つめの確定置換で「@_ ~~~」のような行を挿入してもスクリプトが全て適用されるまでは「@_」が削除されないので、2つめの確定置換で「@_ ~~~」を置換対象にすることができる。
この項目以後で使う本文テキストには、除去が行われた後のテキストが使用される。

この項目の処理が行われる前に、すべての種別のスクリプトのIN/OUTが1,000文字を超えていないかのチェックが入る。
超えている場合は1,000文字になるように末尾がカットされるが、GUIの入力制限でそもそも1,000文字しか入力できないので、基本的にこのチェックに引っかかることはないと思われる。

「@endpoint」より前までの本文の取得

本文中に「@endpoint」が存在する場合は、本文を上から検索して、最初に見つかった「@endpoint」の直前までを以降の処理対象の本文とする。

各項目への文字数上限の適用

メモリの場合は5,000文字、脚注の場合は2,000文字を超えている場合、それぞれの文字数に収まるように末尾が削除される。
本文の場合は、ロングターム・メモリが有効なら100,000文字、そうでないなら10,000文字を上限として、末尾から数えてその文字数だけを以降の処理対象の本文とする。

連続する文字の省略

次の表に従い、置換が行われる。ついでに「 」から半角スペースへの置換と、処理対象の本文の先頭にある空白の削除も行われる。

条件対象
3回以上の連続を、2回の連続に置換(例:ああ*あ→ああ)あ, い, う, え, お, か, き, く, け, こ, は, ひ, ふ, へ, ほ, ん, ぁ, ぃ, ぅ, ぇ, ぉ, っ, が, ぎ, ぐ, げ, ご, ば, び, ぶ, べ, ぼ, ア, イ, ウ, エ, オ, カ, キ, ク, ケ, コ, ハ, ヒ, フ, ヘ, ホ, ン, ァ, ィ, ゥ, ェ, ォ, ッ, ン, ガ, ギ, グ, ゲ, ゴ, バ, ビ, ブ, ベ, ボ, 「, 『, 」, 』, ♪, !, ?, !, ?, 、, 。, ~, ―(ダッシュ記号), (改行)
4回以上の連続を、3回の連続に置換(例:ららら*ら→ららら)ら, り, る, れ, ろ, ラ, リ, ル, レ, ロ, ☆, ★
2回以上8回以下の連続を1個の文字に置換した上で、更にその文字の2回以上7回以下の連続を1個の文字に置換
!?*!?→!?!?
2回以上の連続を、3回の連続に置換(例:・・*・→・・・)・, ., -
9回以上の連続を、3回の連続に置換(例:ああああああああああああああ→あああ)全ての文字

長すぎる一行の自動改行

一行で500文字以上の場合は自動改行の対象になる。
その場合、対象行の中央から先頭に向かって、次の表にある区切り文字を検索する。優先順位に従って検索し、最初に見つかった文字の後ろを区切り位置とする。
例えば、中央から前の部分が「~(長い文章)~、~~~!~~~」という行だった場合、「!」の方が中央寄りにあるものの、「、」の方が優先順位が高いため、「~(長い文章)~、」「~~~!~~~(中央から後ろの部分)」という2つの行に分けられる。

優先順位区切り文字
1
2! または ?
3.
4! または ?
5,
6(半角スペース) または (全角スペース)

なお、表の文字が見つからない場合、または見つかっても先頭から50文字以内にある場合は、行の中央で分割される。
また、分割して2行目になった部分の先頭の空白は削除される。

この処理は20回を上限として繰り返し実行され、自動改行が行われなくなった時点で繰り返しは打ち切られる。

フロントエンドの事後処理/バックエンドの事前処理

フロントエンドからのレスポンスには、エラーでなければ、整形されたデータと使用したキャラクターブックのタグ情報が含まれている。
使用したキャラクターブックのタグ情報はこの時点で、「最後にAIが使用したタグ」へと反映される。

バックエンドの事後処理

バックエンドからのレスポンスにエラーがなければ、最初にCookieへ上書き禁止情報がセットされる。
これは、もし別タブで編集画面を開いていて、そちらでも同時に「続きを書く」をしてしまった場合でも、保存データが混ざってしまわないようにするためのガードである。

その後は現在の本文データの取得・整形とUNDO履歴への追加、出力結果の先頭へ"「"の追加、出力結果の先頭に改行を追加するかの判定、既定の置換処理、禁止ワード処理、スクリプト処理、トリム処理、出力結果の挿入、出力結果が追加された本文データのUNDO履歴への追加が順番に行われる。

本文データの取得とUNDO履歴への追加

各シャーディング枠のテキストを、末尾が改行でなければ末尾に改行を追加しつつ、つなぎ合わせる。
全てのテキストをつなぎ合わせた後、それをUNDO履歴へと追加する。ただしリトライの場合は既にそのデータは追加されているので、ここではしない。
その後、テキスト末尾の改行とテキスト装飾(前回出力やコメントの色変え)を削除する。

出力結果の先頭へ"「"の追加

フロントエンドからの返り値のwritingmodeが1なら、サーバーから返ってきた出力結果の先頭に"「"を追加する。その前には改行も挿入する。
writingmodeはフロントエンドにて、出力モードがセリフ、かつ、テキストの末尾がかぎ括弧の中にあるかどうかを判定して、中になければ1を返していると思われる。

出力結果の先頭に改行を追加するかの判定

都度行われる処理で保存されたテキストの末尾が、"」"・"』"・")"のいずれかの場合、出力結果の先頭に改行を付け足す。
ただし、都度行われる処理で保存されたテキストの最後の行に"」"が2つ以上連続している場合は、改行を付け足さない。
この処理はモデルがノイマンの場合は行われない。

既定の置換処理

モデルがノイマンの場合、出力に対して次の置換が行われる。

備考
<&lt;
>&gt;
(\\n)<br>
(<\/p>)<br>

モデルがノイマン以外の場合、出力に対して次の置換が行われる。

備考
......……
...……
!ただし、!の直前が半角なら置換を行わない
?ただし、?の直前が半角なら置換を行わない
~
(
)
<
>
:
http:http:
https:https:
([^a-zA-Z0-9!? ])(半角スペース)([^a-zA-Z0-9!? ])$1\n$2スペースを改行に置換。でりだのみ
;(半角スペース);\nスペースを改行に置換
)(半角スペース))\nスペースを改行に置換
」(半角スペース)」\nスペースを改行に置換
』(半角スペース)』\nスペースを改行に置換
。(半角スペース)。\nスペースを改行に置換
】(半角スペース)】\nスペースを改行に置換
(半角スペース)「\n「スペースを改行に置換
(半角スペース)『\n『スペースを改行に置換
(半角スペース)(\n(スペースを改行に置換
。(半角スペース)。\nスペースを改行に置換
……(半角スペース)……\nスペースを改行に置換
(半角スペース)・\n・スペースを改行に置換
~(半角スペース)~\nスペースを改行に置換
(半角スペース)([0-9])\.\n$1.スペースを改行に置換
(半角スペース)([0-9][0-9])\.\n$1.スペースを改行に置換
(半角スペース)([0-9][0-9][0-9])\.\n$1.スペースを改行に置換
(半角スペース)([0-9][0-9][0-9][0-9])\.\n$1.スペースを改行に置換
(半角スペース)第([0-9])話(半角スペース)\n第$1話\nスペースを改行に置換
(半角スペース)第([0-9][0-9])話(半角スペース)\n第$1話\nスペースを改行に置換
(半角スペース)第([0-9][0-9][0-9])話(半角スペース)\n第$1話\nスペースを改行に置換
(半角スペース)第([0-9])章(半角スペース)\n第$1章\nスペースを改行に置換
(半角スペース)第([0-9][0-9])章(半角スペース)\n第$1章\nスペースを改行に置換
(半角スペース)第([0-9][0-9][0-9])章(半角スペース)\n第$1章\nスペースを改行に置換
(半角スペース)第([0-9])位:\n第$1位:スペースを改行に置換
(半角スペース)第([0-9][0-9])位:\n第$1位:スペースを改行に置換
(半角スペース)第([0-9][0-9][0-9])位:\n第$1位:スペースを改行に置換
(半角スペース)終章\n終章スペースを改行に置換
(半角スペース)☆\n☆スペースを改行に置換
(半角スペース)★\n★スペースを改行に置換
(半角スペース)===\n===スペースを改行に置換
===(半角スペース)===\nスペースを改行に置換
(半角スペース)――\n――スペースを改行に置換
――(半角スペース)――\nスペースを改行に置換
--(半角スペース)--\nスペースを改行に置換
・(半角スペース)・・\n・スペースを改行に置換
◆◆◆(半角スペース)◆◆◆\nスペースを改行に置換
■■■(半角スペース)■■■\nスペースを改行に置換
□□□(半角スペース)□□□\nスペースを改行に置換
■□(半角スペース)■□(半角スペース)\nスペースを改行に置換
□■(半角スペース)□■(半角スペース)\nスペースを改行に置換
☆☆☆(半角スペース)☆☆☆\nスペースを改行に置換
☆ ☆ ☆(半角スペース)☆ ☆ ☆\nスペースを改行に置換
***(半角スペース)\n***\nスペースを改行に置換
* * *(半角スペース)\n* * *\nスペースを改行に置換
(半角スペース)※\n※スペースを改行に置換
(半角スペース)はじめに(半角スペース)\nはじめに\nスペースを改行に置換
(半角スペース)おわりに(半角スペース)\nおわりに\nスペースを改行に置換
(半角スペース)終わりに(半角スペース)\n終わりに\nスペースを改行に置換
(半角スペース)あとがき(半角スペース)\nあとがき\nスペースを改行に置換
(半角スペース)(.*?):\n$1:スペースを改行に置換
#(.*?)__(.*?)_#$1
[chapter:
[chapter]
」\n)」)
、じめ、
、へと、
、える、
、える。
「、は、
「、
「\n「
「。
」\n」
、\n、
。\n。
。\n」。」
!\n」!」
?\n」?」
)(
、にそれ、それ
てきたいたてきていた
わからって、わかって
っったった
セクショッンセクション
ぇ髏ぇ~
ゃ髏ゃ~
咀咀咀嚼
狼狼え狼狽え
あ\u0020\u309Aあ゛
い\u0020\u309Aい゛
う\u0020\u309Aう゛
え\u0020\u309Aえ゛
お\u0020\u309Aお゛
ア\u0020\u309Aア゛
イ\u0020\u309Aイ゛
ウ\u0020\u309Aウ゛
エ\u0020\u309Aエ゛
オ\u0020\u309Aオ゛
ぁ\u0020\u309Aぁ゛
ぃ\u0020\u309Aぃ゛
ぅ\u0020\u309Aぅ゛
ぇ\u0020\u309Aぇ゛
ぉ\u0020\u309Aぉ゛
っ\u0020\u309Aっ゛
ァ\u0020\u309Aァ゛
ィ\u0020\u309Aィ゛
ゥ\u0020\u309Aゥ゛
ェ\u0020\u309Aェ゛
ォ\u0020\u309Aォ゛
ッ\u0020\u309Aッ゛
~\u0020\u309A~゛
\uFE0E

最後に以下の共通処理を行う。

備考
(\\\")"
(.)\1{12,}$1$1$1$1$1$1同じ文字の13回以上の連続を6回まで短縮する
\n\n\n<br>
\n<br>
\r<br>
<unk>

置換の結果、出力の文字数が2以下になった場合は出力を止める。
(エラーメッセージ:何らかの原因で、AIは有意な出力を返せませんでした。もう一度お試しください。)

禁止ワード処理

「禁止ワードで必ず出力を切る」がOFFでなければ、禁止ワードによる出力のトリミングを行う。

トリミングにはフロントエンドから返ってきた禁止ワード(既定の禁止ワードやコンテントフィルターによる禁止ワードを含む)を使う。
各禁止ワードを出力の中から検索し、その中でもっとも手前に出てくるワードの位置を記録する。
そして、その位置までで出力を切り取る。
そのとき、出力が2文字以下になった場合は出力を止める。
(エラーメッセージ:AIの推論がユーザー指定の禁止ワードで始まっていたため、出力に失敗しました。何度もこの状態が繰り返される場合、「禁止ワードで必ず出力を切る」設定をオフにしてください。)

「出力文の置換」「出力文の置換(正規表現)」「単語の言い換え」「単語の言い換え(正規表現)」の適用

出力に対して、「出力文の置換」「出力文の置換(正規表現)」「単語の言い換え」「単語の言い換え(正規表現)」が上から順番に適用される。
最初に「|」による対象のランダム化が解決され、「出力文の置換」と「単語の言い換え」の場合はその後にINのテキストの中にある特定記号の全角化が行われる。
対象は次の通り。

/
*
.
?
(
)
[
]
{
}

トリム処理

「出力をトリムする」がONでならば、出力のトリミングを行う。
以下で示す区切り文字で出力が終わるように、出力の末尾を切り取る。
出力の中に複数の区切り文字がある場合は、より後ろにある方の区切り文字が採用される。
なお、区切り文字が出力の先頭から49文字以内にある場合は、トリミングを行わない。

区切り文字
\n
!
?
)
(半角スペース)

出力結果の挿入

本文入力欄に出力結果を挿入する。その際に設定に応じた色になるようにHTMLタグで装飾する。
通常は本文のシャーディングを行った後に、その最後のシャーディング枠のテキストの末尾に出力を追加し、同時に末尾にスクロールする。
「@endpoint」がある場合は、最初に書かれている「@endpoint」の直前に挿入し、その位置へとスクロールする。(スクロールするかは環境による)

出力結果が追加された本文データのUNDO履歴への追加

都度行われる処理を行った後、現在のテキストをUNDO履歴に追加する。
この出力がリトライの場合は、リトライ回数(UNDO/REDOボタンに表示される数字を計算するベースとなる数字)を更新する。
そしてTIPSを表示しきっていなければ表示し、「続きの文を書く」等のボタンを再表示する。
最後に、Cookieへ上書き禁止情報を解除し、ローカル/リモートへの保存も行う。