SenY commited on
Commit
7eff197
·
verified ·
1 Parent(s): 5be709f

Upload 6 files

Browse files
Files changed (3) hide show
  1. control.js +29 -22
  2. index.html +16 -14
  3. prompt.js +13 -1
control.js CHANGED
@@ -32,19 +32,6 @@ document.getElementById('sidebarToggle').addEventListener('click', function () {
32
  }
33
  });
34
 
35
- function resizeQueryTextarea() {
36
- const queryTextarea = document.getElementById('query');
37
- const cardBody = queryTextarea.closest('.card-body');
38
- queryTextarea.style.minHeight = cardBody.offsetHeight + 'px';
39
- }
40
-
41
- document.addEventListener('DOMContentLoaded', function () {
42
- resizeQueryTextarea();
43
- initSidebarResize(); // 新しい関数を呼び出し
44
- });
45
-
46
- window.addEventListener('resize', resizeQueryTextarea);
47
-
48
  // サイドバーのリサイズ機能を修正
49
  function initSidebarResize() {
50
  const sidebarContainer = document.getElementById('sidebar-container');
@@ -92,18 +79,38 @@ function initClearStorageButton() {
92
  });
93
  }
94
 
 
 
 
 
 
 
95
  // DOMContentLoadedイベントリスナーを更新
96
  document.addEventListener('DOMContentLoaded', function () {
97
- resizeQueryTextarea();
98
  initSidebarResize();
99
  initClearStorageButton();
100
- // addDynamicStyles(); // この行を削除
101
-
102
- // 初期状態でサイドバーを非表示にする処理も不要になるため、削除
103
- // const sidebarContainer = document.getElementById('sidebar-container');
104
- // const content = document.getElementById('content');
105
- // sidebarContainer.classList.remove('active');
106
- // content.classList.remove('sidebar-active');
107
  });
108
 
109
- window.addEventListener('resize', resizeQueryTextarea);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
  });
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  // サイドバーのリサイズ機能を修正
36
  function initSidebarResize() {
37
  const sidebarContainer = document.getElementById('sidebar-container');
 
79
  });
80
  }
81
 
82
+ function resizeMain() {
83
+ if (window.innerWidth >= 768) {
84
+ document.querySelector("main").style.height = `calc(100vh - ${document.querySelector("main").offsetTop}px)`
85
+ }
86
+ }
87
+
88
  // DOMContentLoadedイベントリスナーを更新
89
  document.addEventListener('DOMContentLoaded', function () {
90
+ resizeMain();
91
  initSidebarResize();
92
  initClearStorageButton();
93
+ updateModelList(); // 新しい関数を呼び出し
 
 
 
 
 
 
94
  });
95
 
96
+ window.addEventListener("resize", resizeMain);
97
+
98
+ async function updateModelList() {
99
+ try {
100
+ const models = await getModelList();
101
+ const endpointSelect = document.getElementById('endpointSelect');
102
+ const currentOptions = Array.from(endpointSelect.options).map(option => option.value);
103
+
104
+ models.forEach(model => {
105
+ const modelPath = `models/${model.name.split('/').pop()}`;
106
+ if (!currentOptions.includes(modelPath)) {
107
+ const option = document.createElement('option');
108
+ option.value = modelPath;
109
+ option.textContent = model.name.split('/').pop();
110
+ endpointSelect.appendChild(option);
111
+ }
112
+ });
113
+ } catch (error) {
114
+ console.error('モデルリストの更新中にエラーが発生しました:', error);
115
+ }
116
+ }
index.html CHANGED
@@ -10,7 +10,7 @@
10
  crossorigin="anonymous">
11
  <style>
12
  textarea.form-control {
13
- min-height: 15vh;
14
  }
15
 
16
  #sidebar-container {
@@ -131,10 +131,12 @@
131
  <div class="form-group mb-3">
132
  <label for="endpointSelect" class="form-label" id="endpointSelectLabel">エンドポイント</label>
133
  <select class="form-select" id="endpointSelect">
134
- <option value="gemini-1.5-pro-exp-0827">gemini-1.5-pro-exp-0827</option>
135
- <option value="gemini-1.5-flash-exp-0827">gemini-1.5-flash-exp-0827</option>
136
- <option value="gemini-1.5-pro-latest">gemini-1.5-pro-latest</option>
137
- <option value="gemini-1.5-flash-latest">gemini-1.5-flash-latest</option>
 
 
138
  </select>
139
  </div>
140
 
@@ -184,9 +186,9 @@
184
  </div>
185
  </nav>
186
 
187
- <div class="container mt-3">
188
- <div class="row">
189
- <div id="inputQuery" class="col-lg-4 col-md-12 mb-4">
190
  <div class="card h-100">
191
  <div class="card-header bg-primary text-white">
192
  <h5 class="mb-0" id="inputQueryTitle">入力クエリ</h5>
@@ -211,7 +213,7 @@
211
  </div>
212
  </div>
213
  </div>
214
- <div id="outputPrompt" class="col-lg-8 col-md-12 mb-4">
215
  <div class="card h-100">
216
  <div class="card-header bg-success text-white">
217
  <h5 class="mb-0" id="outputPromptTitle">生成されたプロンプト</h5>
@@ -221,13 +223,13 @@
221
  <label for="promptEn" class="form-label" id="promptEnLabel">English Prompt</label>
222
  <textarea class="form-control" id="promptEn" placeholder="English Prompt"></textarea>
223
  </div>
224
- <div class="form-group mt-3">
225
- <label for="promptMyLanguage" class="form-label" id="promptMyLanguageLabel">Your
226
  Language Translation</label>
227
  <textarea class="form-control" id="promptMyLanguage" disabled></textarea>
228
  </div>
229
- <div class="form-group mt-3">
230
- <label for="danbooruTags" class="form-label" id="danbooruTagsLabel">
231
  danbooru tags
232
  </label>
233
  <input type="text" class="form-control" id="danbooruTags" placeholder="danbooru tags"
@@ -236,7 +238,7 @@
236
  </div>
237
  </div>
238
  </div>
239
- </div>
240
  </div>
241
  </div>
242
 
 
10
  crossorigin="anonymous">
11
  <style>
12
  textarea.form-control {
13
+ min-height: 25vh;
14
  }
15
 
16
  #sidebar-container {
 
131
  <div class="form-group mb-3">
132
  <label for="endpointSelect" class="form-label" id="endpointSelectLabel">エンドポイント</label>
133
  <select class="form-select" id="endpointSelect">
134
+ <option value="models/gemini-1.5-pro-002">gemini-1.5-pro-002</option>
135
+ <option value="models/gemini-1.5-flash-002">gemini-1.5-flash-002</option>
136
+ <option value="models/gemini-1.5-pro-exp-0827">gemini-1.5-pro-exp-0827</option>
137
+ <option value="models/gemini-1.5-flash-exp-0827">gemini-1.5-flash-exp-0827</option>
138
+ <option value="models/gemini-1.5-pro-latest">gemini-1.5-pro-latest</option>
139
+ <option value="models/gemini-1.5-flash-latest">gemini-1.5-flash-latest</option>
140
  </select>
141
  </div>
142
 
 
186
  </div>
187
  </nav>
188
 
189
+ <div class="container">
190
+ <main class="row">
191
+ <div id="inputQuery" class="col-lg-4 col-md-12 mb-4 h-100">
192
  <div class="card h-100">
193
  <div class="card-header bg-primary text-white">
194
  <h5 class="mb-0" id="inputQueryTitle">入力クエリ</h5>
 
213
  </div>
214
  </div>
215
  </div>
216
+ <div id="outputPrompt" class="col-lg-8 col-md-12 mb-4 h-100">
217
  <div class="card h-100">
218
  <div class="card-header bg-success text-white">
219
  <h5 class="mb-0" id="outputPromptTitle">生成されたプロンプト</h5>
 
223
  <label for="promptEn" class="form-label" id="promptEnLabel">English Prompt</label>
224
  <textarea class="form-control" id="promptEn" placeholder="English Prompt"></textarea>
225
  </div>
226
+ <div class="form-group">
227
+ <label for="promptMyLanguage" class="form-label mt-3" id="promptMyLanguageLabel">Your
228
  Language Translation</label>
229
  <textarea class="form-control" id="promptMyLanguage" disabled></textarea>
230
  </div>
231
+ <div class="form-group">
232
+ <label for="danbooruTags" class="form-label mt-3" id="danbooruTagsLabel">
233
  danbooru tags
234
  </label>
235
  <input type="text" class="form-control" id="danbooruTags" placeholder="danbooru tags"
 
238
  </div>
239
  </div>
240
  </div>
241
+ </main>
242
  </div>
243
  </div>
244
 
prompt.js CHANGED
@@ -1,3 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
  function generatePrompt() {
2
  if (!document.getElementById('apiKey').value) {
3
  alert("APIキーを入力してください");
@@ -23,7 +35,7 @@ function generatePrompt() {
23
  }
24
 
25
  const selectedEndpoint = document.getElementById('endpointSelect').value;
26
- const url = `https://generativelanguage.googleapis.com/v1beta/models/${selectedEndpoint}:generateContent?key=` + document.getElementById('apiKey').value;
27
 
28
  const text = `「 ${query} 」をテーマに画像生成AIに送るプロンプトを考えてください。
29
  背景や小物のディテイール、構図、視覚効果など視覚的な情報のみに言及すること。
 
1
+ async function getModelList() {
2
+ const url = 'https://generativelanguage.googleapis.com/v1beta/models?key=' + document.getElementById('apiKey').value;
3
+ const response = await fetch(url);
4
+ const data = await response.json();
5
+ return data.models
6
+ .filter(x => x.supportedGenerationMethods.includes("generateContent"))
7
+ .filter(x => {
8
+ const versionMatch = x.name.match(/gemini-(\d+\.\d+)/);
9
+ return versionMatch && parseFloat(versionMatch[1]) >= 1.5;
10
+ });
11
+ }
12
+
13
  function generatePrompt() {
14
  if (!document.getElementById('apiKey').value) {
15
  alert("APIキーを入力してください");
 
35
  }
36
 
37
  const selectedEndpoint = document.getElementById('endpointSelect').value;
38
+ const url = `https://generativelanguage.googleapis.com/v1beta/${selectedEndpoint}:generateContent?key=` + document.getElementById('apiKey').value;
39
 
40
  const text = `「 ${query} 」をテーマに画像生成AIに送るプロンプトを考えてください。
41
  背景や小物のディテイール、構図、視覚効果など視覚的な情報のみに言及すること。