nai-aclab 1.0.12 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app.py +2 -2
- package/package.json +1 -1
- package/web/index.html +122 -78
- package/web/main.js +504 -198
- package/web/styles.css +294 -0
package/app.py
CHANGED
|
@@ -337,8 +337,8 @@ class AppState:
|
|
|
337
337
|
def default_state() -> AppState:
|
|
338
338
|
return AppState(
|
|
339
339
|
categories=[
|
|
340
|
-
Category("메인 그림체 작가", [
|
|
341
|
-
Category("그림체 안정화 작가", [
|
|
340
|
+
Category("메인 그림체 작가", [], 1.0, 1.4, 0.05, 0),
|
|
341
|
+
Category("그림체 안정화 작가", [], 0.4, 0.9, 0.1, 0),
|
|
342
342
|
],
|
|
343
343
|
base_presets=[
|
|
344
344
|
PromptPreset("기본", "", "masterpiece, best quality, very aesthetic, detailed illustration"),
|
package/package.json
CHANGED
package/web/index.html
CHANGED
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
<aside class="sidebar">
|
|
12
12
|
<div class="brand">
|
|
13
13
|
<div class="brand-mark">NAI</div>
|
|
14
|
-
<div>
|
|
15
|
-
<strong>Artist Lab</strong>
|
|
16
|
-
<span>
|
|
14
|
+
<div>
|
|
15
|
+
<strong>Artist Lab</strong>
|
|
16
|
+
<span>NovelAI 작가 조합 실험실</span>
|
|
17
17
|
</div>
|
|
18
18
|
</div>
|
|
19
19
|
<nav class="nav" aria-label="Main">
|
|
20
|
-
<button class="nav-item active" data-tab="generate">⌘ 생성</button>
|
|
20
|
+
<button class="nav-item active" data-tab="generate">⌘ 이미지 생성</button>
|
|
21
21
|
<button class="nav-item" data-tab="batting">▦ 타율 테스트</button>
|
|
22
22
|
<button class="nav-item" data-tab="artists"># 작가 태그</button>
|
|
23
|
-
<button class="nav-item" data-tab="presets">▣ 프리셋</button>
|
|
23
|
+
<button class="nav-item" data-tab="presets">▣ 프롬프트 프리셋</button>
|
|
24
24
|
<button class="nav-item" data-tab="compare">≋ 가중치 비교</button>
|
|
25
|
-
<button class="nav-item" data-tab="history">◈
|
|
25
|
+
<button class="nav-item" data-tab="history">◈ 생성 기록</button>
|
|
26
26
|
</nav>
|
|
27
27
|
<div class="sidebar-tools">
|
|
28
28
|
<button class="nav-item settings-nav-item" data-tab="settings">⚙ API 설정</button>
|
|
@@ -33,18 +33,18 @@
|
|
|
33
33
|
</aside>
|
|
34
34
|
|
|
35
35
|
<main class="workspace">
|
|
36
|
-
<header class="topbar">
|
|
36
|
+
<header class="topbar">
|
|
37
37
|
<div>
|
|
38
38
|
<h1 id="pageTitle">생성</h1>
|
|
39
39
|
<p id="pageSubtitle">프리셋, 작가 조합, 생성 상태를 한 화면에서 조정합니다.</p>
|
|
40
|
-
</div>
|
|
40
|
+
</div>
|
|
41
41
|
<div class="top-actions">
|
|
42
|
-
<button class="
|
|
42
|
+
<button class="icon-button" id="refreshButton" type="button" title="저장된 내용을 다시 불러오기" aria-label="저장된 내용을 다시 불러오기">↻</button>
|
|
43
43
|
</div>
|
|
44
|
-
</header>
|
|
44
|
+
</header>
|
|
45
45
|
|
|
46
46
|
<section id="generate" class="tab-page active">
|
|
47
|
-
<section class="panel live-preview-panel">
|
|
47
|
+
<section class="panel live-preview-panel">
|
|
48
48
|
<div class="panel-header">
|
|
49
49
|
<div>
|
|
50
50
|
<h2>실시간 이미지 미리보기</h2>
|
|
@@ -53,16 +53,19 @@
|
|
|
53
53
|
</div>
|
|
54
54
|
<div id="liveGallery" class="live-gallery">
|
|
55
55
|
<p>아직 생성된 이미지가 없습니다.</p>
|
|
56
|
-
</div>
|
|
57
|
-
</section>
|
|
58
|
-
|
|
59
|
-
<
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
|
|
59
|
+
<section id="setupGuide" class="setup-guide" aria-label="생성 준비 상태"></section>
|
|
60
|
+
|
|
61
|
+
<div class="grid two-one">
|
|
60
62
|
<section class="panel">
|
|
61
|
-
<div class="panel-header">
|
|
62
|
-
<div>
|
|
63
|
-
<h2>생성 옵션</h2>
|
|
64
|
-
<p
|
|
65
|
-
</div>
|
|
63
|
+
<div class="panel-header">
|
|
64
|
+
<div>
|
|
65
|
+
<h2>생성 옵션</h2>
|
|
66
|
+
<p>프리셋과 이미지 수를 고른 뒤 바로 생성할 수 있습니다.</p>
|
|
67
|
+
</div>
|
|
68
|
+
<span class="mode-status" id="generationModeBadge"></span>
|
|
66
69
|
</div>
|
|
67
70
|
<div class="form-grid">
|
|
68
71
|
<label>
|
|
@@ -90,9 +93,9 @@
|
|
|
90
93
|
<p id="fixedArtistSummary">작가 태그는 생성할 때마다 랜덤으로 선택됩니다.</p>
|
|
91
94
|
<div id="fixedArtistList" class="artist-weight-list fixed-artist-list"></div>
|
|
92
95
|
</div>
|
|
93
|
-
<div class="button-row">
|
|
94
|
-
<button class="ghost-button" id="previewButton"
|
|
95
|
-
<button class="primary-button" id="generateButtonInline">이미지 생성</button>
|
|
96
|
+
<div class="button-row">
|
|
97
|
+
<button class="ghost-button" id="previewButton" type="button" title="이미지는 만들지 않고 랜덤 작가 조합과 최종 프롬프트만 다시 계산합니다.">작가 조합 다시 뽑기</button>
|
|
98
|
+
<button class="primary-button" id="generateButtonInline">이미지 생성</button>
|
|
96
99
|
<button class="danger-button" id="stopGenerateButton" type="button" disabled>생성 중지</button>
|
|
97
100
|
</div>
|
|
98
101
|
<div class="progress-wrap">
|
|
@@ -153,14 +156,16 @@
|
|
|
153
156
|
<button class="danger-button" id="stopBattingButton" type="button" disabled>생성 중지</button>
|
|
154
157
|
</div>
|
|
155
158
|
</div>
|
|
156
|
-
<div class="fixed-artist-panel">
|
|
157
|
-
<div class="fixed-artist-head">
|
|
158
|
-
<div class="mode-status" id="battingFixedArtistModeLabel">랜덤 가중치 모드</div>
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
<div class="fixed-artist-panel">
|
|
160
|
+
<div class="fixed-artist-head">
|
|
161
|
+
<div class="mode-status" id="battingFixedArtistModeLabel">랜덤 가중치 모드</div>
|
|
162
|
+
<button class="ghost-button" id="battingLoadWeightsButton" type="button">히스토리에서 가중치 고르기</button>
|
|
163
|
+
</div>
|
|
164
|
+
<p id="battingFixedArtistSummary">히스토리나 가중치 비교에서 마음에 드는 이미지의 가중치를 먼저 불러오세요.</p>
|
|
165
|
+
<div id="battingFixedArtistList" class="artist-weight-list fixed-artist-list"></div>
|
|
166
|
+
</div>
|
|
167
|
+
<div id="battingReadiness" class="inline-notice"></div>
|
|
168
|
+
<div id="battingSceneList" class="batting-scene-list"></div>
|
|
164
169
|
</section>
|
|
165
170
|
|
|
166
171
|
<section class="panel live-preview-panel">
|
|
@@ -219,24 +224,34 @@
|
|
|
219
224
|
<p>선택 태그 수가 비어 있으면 모든 태그를 포함합니다.</p>
|
|
220
225
|
</div>
|
|
221
226
|
</div>
|
|
222
|
-
<div class="form-grid compact">
|
|
223
|
-
<label><span>카테고리명</span><input id="catName" /></label>
|
|
224
|
-
<label><span>최소 가중치</span><input id="catMin" type="number" step="0.01" /></label>
|
|
225
|
-
<label><span>최대 가중치</span><input id="catMax" type="number" step="0.01" /></label>
|
|
226
|
-
<label
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
<
|
|
232
|
-
|
|
227
|
+
<div class="form-grid compact">
|
|
228
|
+
<label><span>카테고리명</span><input id="catName" /></label>
|
|
229
|
+
<label><span>최소 가중치</span><input id="catMin" type="number" step="0.01" /></label>
|
|
230
|
+
<label><span>최대 가중치</span><input id="catMax" type="number" step="0.01" /></label>
|
|
231
|
+
<label>
|
|
232
|
+
<span>가중치 간격</span>
|
|
233
|
+
<input id="catGranule" type="number" step="0.01" />
|
|
234
|
+
<small class="field-help">예: 0.05이면 1.00, 1.05, 1.10처럼 선택됩니다.</small>
|
|
235
|
+
</label>
|
|
236
|
+
<label>
|
|
237
|
+
<span>한 번에 사용할 태그 수</span>
|
|
238
|
+
<input id="catPicks" type="number" min="1" placeholder="비워두면 전체" />
|
|
239
|
+
<small class="field-help">비워두면 이 카테고리에 입력한 작가를 모두 사용합니다.</small>
|
|
240
|
+
</label>
|
|
241
|
+
</div>
|
|
242
|
+
<label class="text-label">
|
|
243
|
+
<span>태그 목록</span>
|
|
244
|
+
<textarea id="catTags" spellcheck="false" placeholder="artist:example_name 또는 1.2::artist:example_name ::, artist:another_name"></textarea>
|
|
245
|
+
<small class="field-help">쉼표로 붙여넣거나 한 줄에 하나씩 입력해도 artist:이름 부분만 자동 인식합니다.</small>
|
|
246
|
+
</label>
|
|
233
247
|
<div class="recognized-box">
|
|
234
248
|
<div>
|
|
235
|
-
<strong>인식된 artist 태그</strong>
|
|
236
|
-
<span id="recognizedCount">0개</span>
|
|
237
|
-
</div>
|
|
238
|
-
<div id="recognizedTags" class="tag-chips"></div>
|
|
239
|
-
</div>
|
|
249
|
+
<strong>인식된 artist 태그</strong>
|
|
250
|
+
<span id="recognizedCount">0개</span>
|
|
251
|
+
</div>
|
|
252
|
+
<div id="recognizedTags" class="tag-chips"></div>
|
|
253
|
+
</div>
|
|
254
|
+
<div id="categoryWeightPreview" class="inline-notice compact-notice"></div>
|
|
240
255
|
<div class="button-row">
|
|
241
256
|
<button class="danger-button" id="deleteCategoryButton">카테고리 삭제</button>
|
|
242
257
|
</div>
|
|
@@ -256,9 +271,13 @@
|
|
|
256
271
|
</div>
|
|
257
272
|
<div id="baseList" class="item-list horizontal"></div>
|
|
258
273
|
<label class="text-label short"><span>프리셋 이름</span><input id="baseName" /></label>
|
|
259
|
-
<label class="text-label"><span>베이스 프롬프트</span><textarea id="basePrompt" spellcheck="false"></textarea></label>
|
|
260
|
-
<label class="text-label"><span>퀄리티 프롬프트</span><textarea id="qualityPrompt" spellcheck="false"></textarea></label>
|
|
261
|
-
<label class="text-label"
|
|
274
|
+
<label class="text-label"><span>베이스 프롬프트</span><textarea id="basePrompt" spellcheck="false"></textarea></label>
|
|
275
|
+
<label class="text-label"><span>퀄리티 프롬프트</span><textarea id="qualityPrompt" spellcheck="false"></textarea></label>
|
|
276
|
+
<label class="text-label">
|
|
277
|
+
<span>공용 퀄리티 덮어쓰기 (선택)</span>
|
|
278
|
+
<textarea id="qualityOverridePrompt" spellcheck="false" placeholder="비워두면 각 베이스 프리셋의 퀄리티 프롬프트를 사용합니다."></textarea>
|
|
279
|
+
<small class="field-help">값이 있으면 모든 베이스 프리셋의 퀄리티 프롬프트 대신 이 내용을 사용합니다.</small>
|
|
280
|
+
</label>
|
|
262
281
|
<button class="danger-button" id="deleteBaseButton">베이스 프리셋 삭제</button>
|
|
263
282
|
</section>
|
|
264
283
|
<section class="panel">
|
|
@@ -272,35 +291,59 @@
|
|
|
272
291
|
<button class="icon-button" id="addCharButton" title="새 캐릭터">+</button>
|
|
273
292
|
</div>
|
|
274
293
|
</div>
|
|
275
|
-
<div id="charList" class="item-list horizontal"></div>
|
|
276
|
-
<label class="text-label short"><span>프리셋 이름</span><input id="charName" /></label>
|
|
277
|
-
<div id="
|
|
294
|
+
<div id="charList" class="item-list horizontal"></div>
|
|
295
|
+
<label class="text-label short"><span>프리셋 이름</span><input id="charName" /></label>
|
|
296
|
+
<div id="charSlotTabs" class="segment-control" role="tablist" aria-label="캐릭터 선택"></div>
|
|
297
|
+
<div id="characterEditors" class="character-editors"></div>
|
|
278
298
|
<button class="danger-button" id="deleteCharButton">캐릭터 프리셋 삭제</button>
|
|
279
299
|
</section>
|
|
280
300
|
</div>
|
|
281
301
|
</section>
|
|
282
302
|
|
|
283
|
-
<section id="settings" class="tab-page">
|
|
284
|
-
<div class="grid two-one">
|
|
285
|
-
<section class="panel">
|
|
286
|
-
<div class="panel-header">
|
|
287
|
-
<
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
303
|
+
<section id="settings" class="tab-page">
|
|
304
|
+
<div class="grid two-one">
|
|
305
|
+
<section class="panel">
|
|
306
|
+
<div class="panel-header">
|
|
307
|
+
<div>
|
|
308
|
+
<h2>NovelAI 연결</h2>
|
|
309
|
+
<p>실제 이미지를 만들려면 API 토큰이 필요합니다.</p>
|
|
310
|
+
</div>
|
|
311
|
+
<span id="apiConnectionStatus" class="mode-status"></span>
|
|
312
|
+
</div>
|
|
313
|
+
<div id="apiPrimaryForm" class="form-grid"></div>
|
|
314
|
+
<label class="switch-row feature-switch">
|
|
315
|
+
<input id="mockMode" type="checkbox" />
|
|
316
|
+
<span>
|
|
317
|
+
<strong>API 없이 체험하기</strong>
|
|
318
|
+
<small>NovelAI에 요청하지 않고 색상 목업 이미지를 생성합니다.</small>
|
|
319
|
+
</span>
|
|
320
|
+
</label>
|
|
321
|
+
<div class="button-row">
|
|
322
|
+
<button class="primary-button" id="saveSettingsButton">토큰 및 설정 저장</button>
|
|
323
|
+
</div>
|
|
324
|
+
<details class="advanced-settings">
|
|
325
|
+
<summary>고급 API 설정</summary>
|
|
326
|
+
<p>NovelAI 기본값을 바꿔야 할 때만 열어보세요.</p>
|
|
327
|
+
<div id="apiAdvancedForm" class="form-grid compact"></div>
|
|
328
|
+
</details>
|
|
329
|
+
</section>
|
|
330
|
+
<section class="panel">
|
|
331
|
+
<div class="panel-header">
|
|
332
|
+
<div>
|
|
333
|
+
<h2>제외할 내용</h2>
|
|
334
|
+
<p>이미지에 나오지 않았으면 하는 요소를 입력합니다.</p>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
<label class="text-label">
|
|
338
|
+
<span>공통 네거티브 프롬프트</span>
|
|
339
|
+
<textarea id="negativePrompt" spellcheck="false"></textarea>
|
|
340
|
+
<small class="field-help">모든 캐릭터에 공통으로 적용됩니다.</small>
|
|
341
|
+
</label>
|
|
342
|
+
<label class="text-label">
|
|
343
|
+
<span>UC 프롬프트 (선택)</span>
|
|
344
|
+
<textarea id="ucPrompt" spellcheck="false" placeholder="비워두면 공통 네거티브 프롬프트를 그대로 사용합니다."></textarea>
|
|
345
|
+
<small class="field-help">NovelAI의 legacy UC에 별도 내용을 보내고 싶을 때만 입력하세요.</small>
|
|
346
|
+
</label>
|
|
304
347
|
</section>
|
|
305
348
|
</div>
|
|
306
349
|
</section>
|
|
@@ -393,7 +436,7 @@
|
|
|
393
436
|
</aside>
|
|
394
437
|
</section>
|
|
395
438
|
</div>
|
|
396
|
-
<div id="presetPickerModal" class="image-modal" hidden>
|
|
439
|
+
<div id="presetPickerModal" class="image-modal" hidden>
|
|
397
440
|
<div class="image-modal-backdrop" id="presetPickerBackdrop"></div>
|
|
398
441
|
<section class="preset-picker-panel" role="dialog" aria-modal="true" aria-labelledby="presetPickerTitle">
|
|
399
442
|
<div class="panel-header">
|
|
@@ -404,8 +447,9 @@
|
|
|
404
447
|
<button class="icon-button" id="presetPickerCloseButton" title="닫기">×</button>
|
|
405
448
|
</div>
|
|
406
449
|
<div id="presetPickerList" class="preset-picker-list"></div>
|
|
407
|
-
</section>
|
|
408
|
-
</div>
|
|
409
|
-
<
|
|
450
|
+
</section>
|
|
451
|
+
</div>
|
|
452
|
+
<div id="toastRegion" class="toast-region" aria-live="polite" aria-atomic="true"></div>
|
|
453
|
+
<script src="/web/main.js"></script>
|
|
410
454
|
</body>
|
|
411
455
|
</html>
|