diff --git a/console/deploy/console.yaml b/console/deploy/console.yaml
index f8a3a0f..5797442 100644
--- a/console/deploy/console.yaml
+++ b/console/deploy/console.yaml
@@ -58,7 +58,7 @@ spec:
serviceAccountName: fission-console
containers:
- name: console
- image: naeel/fission-console:v1.3.89
+ image: naeel/fission-console:v1.3.90
imagePullPolicy: Always
ports:
- containerPort: 8090
diff --git a/console/internal/model/types.go b/console/internal/model/types.go
index 74e115f..3edd03d 100644
--- a/console/internal/model/types.go
+++ b/console/internal/model/types.go
@@ -70,7 +70,7 @@ type LangEnvDef struct {
// LangEnvMap сопоставляет идентификатор языка (string) с описанием среды выполнения.
// Ключ используется в createFunctionRequest.Language и как суффикс имени Environment.
var LangEnvMap = map[string]LangEnvDef{
- "python": {Image: "naeel/fission-python-env:v1.0"},
+ "python": {Image: "naeel/fission-python-env:v1.1"},
"nodejs": {Image: "ghcr.io/fission/node-env"},
"go": {Image: "ghcr.io/fission/go-env", BuilderImage: "naeel/go-builder-fast:v1"},
"php": {Image: "ghcr.io/fission/php-env"},
diff --git a/console/ui/index.html b/console/ui/index.html
index 421d8b2..a4c4bb6 100644
--- a/console/ui/index.html
+++ b/console/ui/index.html
@@ -103,7 +103,7 @@
NUBES
FISSION CONSOLE
- v1.3.89
+ v1.3.90
@@ -308,9 +308,9 @@
-
+psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace; font-size:12px; background:#1a1a2e; border:1px dashed #3a3a5c; border-radius:4px; color:#cdd6f4; padding:6px 8px; resize:none; overflow-y:auto;">
@@ -453,9 +453,9 @@ psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace
-
+psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace; font-size:12px; background:#1a1a2e; border:1px dashed #3a3a5c; border-radius:4px; color:#cdd6f4; padding:6px 8px; resize:none; overflow-y:auto;">
@@ -626,7 +626,7 @@ psycopg2-binary" style="width:100%; box-sizing:border-box; font-family:monospace
- v1.3.89
+ v1.3.90
diff --git a/console/ui/js/ai.js b/console/ui/js/ai.js
index 846eaf8..01193ff 100644
--- a/console/ui/js/ai.js
+++ b/console/ui/js/ai.js
@@ -1,5 +1,43 @@
/* ai.js — AI/LLM функции: проверка, генерация, объяснение, ассистент */
+// PYTHON_STDLIB — стандартная библиотека Python (не требуют pip install).
+var PYTHON_STDLIB = new Set([
+ 'os','sys','json','time','re','math','io','collections','itertools','functools',
+ 'datetime','pathlib','urllib','http','threading','asyncio','logging','random',
+ 'string','struct','hashlib','hmac','base64','uuid','copy','abc','typing',
+ 'dataclasses','contextlib','enum','warnings','traceback','inspect','importlib',
+ 'subprocess','socket','ssl','email','html','xml','csv','sqlite3','unittest',
+ 'gc','weakref','array','queue','heapq','bisect','decimal','fractions',
+ 'statistics','textwrap','difflib','shutil','glob','fnmatch','tempfile',
+ 'zipfile','tarfile','gzip','bz2','lzma','pickle','shelve','codecs',
+ 'unicodedata','ast','dis','types','builtins','operator','numbers','cmath',
+ 'pprint','reprlib','platform','signal','mmap','ctypes','multiprocessing',
+ 'concurrent','select','selectors','errno','atexit','sched','calendar',
+ 'locale','gettext','argparse','getopt','shlex','configparser','tokenize',
+ 'runpy','pkgutil','site','sysconfig','distutils','zipimport','abc','io',
+ '__future__','_thread','threading','contextvars','netrc','plistlib',
+ 'html','xml','http','urllib','email','mailbox','mimetypes','encodings',
+ 'codecs','unicodedata','readline','rlcompleter','curses','idlelib','tkinter',
+]);
+
+// detectExternalPythonImports — возвращает список модулей, которых нет в stdlib.
+function detectExternalPythonImports(code) {
+ var external = [];
+ var seen = {};
+ var patterns = [/^import\s+([\w]+)/gm, /^from\s+([\w]+)/gm];
+ for (var pi = 0; pi < patterns.length; pi++) {
+ var m;
+ while ((m = patterns[pi].exec(code)) !== null) {
+ var mod = m[1];
+ if (!PYTHON_STDLIB.has(mod) && !seen[mod]) {
+ seen[mod] = true;
+ external.push(mod);
+ }
+ }
+ }
+ return external;
+}
+
function llmGeneratedWarning(lang) {
var text = 'Сделано LLM. Не доверяй, проверяй!';
switch (lang) {
@@ -45,7 +83,25 @@ async function aiCheck(codeId, langId, resultId) {
var data = await requestJSON(API_BASE + '/ai/check', 'POST', { language: lang, code: code });
resEl.style.background = data.ok ? '#1a3a1a' : '#3a1a1a';
resEl.style.color = data.ok ? '#8f8' : '#f88';
- resEl.textContent = data.result || '(пустой ответ)';
+ var resultText = data.result || '(пустой ответ)';
+
+ // Для Python: проверяем внешние импорты vs поле зависимостей
+ if (lang === 'python') {
+ var depsId = codeId.replace('-code', '-deps'); // cc-code→cc-deps, e-code→e-deps
+ var depsEl = document.getElementById(depsId);
+ var depsVal = depsEl ? depsEl.value.trim() : '';
+ var external = detectExternalPythonImports(code);
+ if (external.length > 0 && !depsVal) {
+ resultText += '\n\n⚠️ Внешние библиотеки: ' + external.join(', ') +
+ '\nДобавьте их в поле "Зависимости (requirements.txt)" или убедитесь что они уже есть в Python-окружении.';
+ if (data.ok) {
+ resEl.style.background = '#3a2a00';
+ resEl.style.color = '#ffa';
+ }
+ }
+ }
+
+ resEl.textContent = resultText;
} catch (e) {
resEl.style.background = '#3a2a00';
resEl.style.color = '#ffa';