Compare commits
16 Commits
25d75f40c7
...
8caaaa5bbc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8caaaa5bbc | ||
|
|
3f5fedb9ed | ||
|
|
53844a3a09 | ||
|
|
53014bb381 | ||
|
|
03bd0b6d03 | ||
|
|
b4927a8952 | ||
|
|
b14b2ecf22 | ||
|
|
42c0e4f5c2 | ||
|
|
88a82ed771 | ||
|
|
895983ac20 | ||
|
|
680fa905f8 | ||
|
|
ce0f908d20 | ||
|
|
e4ea1f168c | ||
|
|
915f994c45 | ||
|
|
762f866175 | ||
|
|
9428c6b785 |
@@ -715,8 +715,12 @@ def task_detail(
|
|||||||
store: DataProcessStore = Depends(get_data_process_store),
|
store: DataProcessStore = Depends(get_data_process_store),
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
with api_errors():
|
with api_errors():
|
||||||
|
# 兼容旧版曾在第五步前清空结果的异常任务;严格特征匹配且幂等。
|
||||||
|
store.recover_legacy_aborted_regeneration(task_id)
|
||||||
task = store.get_task(task_id)
|
task = store.get_task(task_id)
|
||||||
task["source_files"] = store.list_source_files(task_id)
|
source_files = store.list_source_files(task_id)
|
||||||
|
task["source_files"] = source_files
|
||||||
|
task["source_file_count"] = len(source_files)
|
||||||
return ok(task)
|
return ok(task)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ from openpyxl.utils.cell import range_boundaries
|
|||||||
from pptx import Presentation
|
from pptx import Presentation
|
||||||
from pypdf import PdfReader
|
from pypdf import PdfReader
|
||||||
|
|
||||||
|
from app.modules.data_process.constants import MAX_QA_PAIRS_PER_ITEM
|
||||||
|
|
||||||
TextFormat = Literal[
|
TextFormat = Literal[
|
||||||
"json",
|
"json",
|
||||||
"jsonl",
|
"jsonl",
|
||||||
@@ -2659,8 +2661,10 @@ def generate_standard_records(
|
|||||||
LLM 响应解析后的统一落库步骤。
|
LLM 响应解析后的统一落库步骤。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not 1 <= qa_pairs_per_item <= 5:
|
if not 1 <= qa_pairs_per_item <= MAX_QA_PAIRS_PER_ITEM:
|
||||||
raise ValueError("qa_pairs_per_item must be in [1, 5]")
|
raise ValueError(
|
||||||
|
f"qa_pairs_per_item must be in [1, {MAX_QA_PAIRS_PER_ITEM}]"
|
||||||
|
)
|
||||||
prefixes = (
|
prefixes = (
|
||||||
"请结合实际情况说明:",
|
"请结合实际情况说明:",
|
||||||
"请用通俗易懂的方式说明:",
|
"请用通俗易懂的方式说明:",
|
||||||
@@ -2677,7 +2681,13 @@ def generate_standard_records(
|
|||||||
variant_instruction = instruction
|
variant_instruction = instruction
|
||||||
if variant_index:
|
if variant_index:
|
||||||
if semantic_enrichment:
|
if semantic_enrichment:
|
||||||
variant_instruction = f"{prefixes[variant_index]}{instruction}"
|
prefix = prefixes[variant_index % len(prefixes)]
|
||||||
|
if variant_index >= len(prefixes):
|
||||||
|
prefix = (
|
||||||
|
f"{prefix.removesuffix(':')}"
|
||||||
|
f"(问法 {variant_index + 1}):"
|
||||||
|
)
|
||||||
|
variant_instruction = f"{prefix}{instruction}"
|
||||||
else:
|
else:
|
||||||
variant_instruction = f"{instruction}(问法 {variant_index + 1})"
|
variant_instruction = f"{instruction}(问法 {variant_index + 1})"
|
||||||
raw_id = f"{preview_id}:{variant_index + 1}"
|
raw_id = f"{preview_id}:{variant_index + 1}"
|
||||||
|
|||||||
7
backend/app/modules/data_process/constants.py
Normal file
7
backend/app/modules/data_process/constants.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
"""数据处理模块的共享限制。"""
|
||||||
|
|
||||||
|
MAX_QA_PAIRS_PER_ITEM = 50
|
||||||
|
MODEL_GENERATION_BATCH_SIZE = 10
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["MAX_QA_PAIRS_PER_ITEM", "MODEL_GENERATION_BATCH_SIZE"]
|
||||||
@@ -12,6 +12,10 @@ from urllib.parse import urlsplit, urlunsplit
|
|||||||
import httpx
|
import httpx
|
||||||
|
|
||||||
from app.modules.data_process.algorithms import normalize_text, stable_split_assignments
|
from app.modules.data_process.algorithms import normalize_text, stable_split_assignments
|
||||||
|
from app.modules.data_process.constants import (
|
||||||
|
MAX_QA_PAIRS_PER_ITEM,
|
||||||
|
MODEL_GENERATION_BATCH_SIZE,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ModelGenerationError(ValueError):
|
class ModelGenerationError(ValueError):
|
||||||
@@ -96,10 +100,20 @@ def _result_items(payload: Any) -> list[Mapping[str, Any]]:
|
|||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
def _prompt_messages(prompt: str, content: str, count: int) -> list[dict[str, str]]:
|
def _prompt_messages(
|
||||||
|
prompt: str,
|
||||||
|
content: str,
|
||||||
|
count: int,
|
||||||
|
*,
|
||||||
|
start_index: int,
|
||||||
|
total_count: int,
|
||||||
|
) -> list[dict[str, str]]:
|
||||||
|
end_index = start_index + count - 1
|
||||||
schema_instruction = (
|
schema_instruction = (
|
||||||
f"必须只返回 JSON 对象,格式为 {{\"items\":[{{\"instruction\":\"...\","
|
f"必须只返回 JSON 对象,格式为 {{\"items\":[{{\"instruction\":\"...\","
|
||||||
f"\"input\":\"...\",\"output\":\"...\"}}]}};items 必须包含 {count} 条。"
|
f"\"input\":\"...\",\"output\":\"...\"}}]}};items 必须包含 {count} 条。"
|
||||||
|
f"这是总计 {total_count} 条中的第 {start_index}-{end_index} 条,"
|
||||||
|
"各条必须使用不同的提问角度和表述,避免重复。"
|
||||||
"instruction 和 output 不得为空,不要输出 Markdown 代码围栏或分析过程。"
|
"instruction 和 output 不得为空,不要输出 Markdown 代码围栏或分析过程。"
|
||||||
)
|
)
|
||||||
base_prompt = (
|
base_prompt = (
|
||||||
@@ -131,11 +145,14 @@ def generate_model_records(
|
|||||||
) -> list[dict[str, Any]]:
|
) -> list[dict[str, Any]]:
|
||||||
"""调用 OpenAI 兼容接口,将预览切片生成标准训练记录。
|
"""调用 OpenAI 兼容接口,将预览切片生成标准训练记录。
|
||||||
|
|
||||||
单条调用失败会产生可人工修复的 invalid 结果,不会丢弃整批任务。
|
每个切片按安全批次调用模型;失败批次会产生一条可人工修复的
|
||||||
|
invalid 结果,已经成功的批次不会丢失。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not 1 <= qa_pairs_per_item <= 5:
|
if not 1 <= qa_pairs_per_item <= MAX_QA_PAIRS_PER_ITEM:
|
||||||
raise ModelGenerationError("qa_pairs_per_item must be in [1, 5]")
|
raise ModelGenerationError(
|
||||||
|
f"qa_pairs_per_item must be in [1, {MAX_QA_PAIRS_PER_ITEM}]"
|
||||||
|
)
|
||||||
endpoint = chat_completions_url(str(model.get("api_url") or ""))
|
endpoint = chat_completions_url(str(model.get("api_url") or ""))
|
||||||
model_name = str(model.get("online_model_name") or model.get("name") or "").strip()
|
model_name = str(model.get("online_model_name") or model.get("name") or "").strip()
|
||||||
if not model_name:
|
if not model_name:
|
||||||
@@ -161,12 +178,21 @@ def generate_model_records(
|
|||||||
content = normalize_text(
|
content = normalize_text(
|
||||||
str(item.get("edited_content") or item.get("original_content") or "")
|
str(item.get("edited_content") or item.get("original_content") or "")
|
||||||
)
|
)
|
||||||
|
for batch_offset in range(0, qa_pairs_per_item, MODEL_GENERATION_BATCH_SIZE):
|
||||||
|
batch_count = min(
|
||||||
|
MODEL_GENERATION_BATCH_SIZE,
|
||||||
|
qa_pairs_per_item - batch_offset,
|
||||||
|
)
|
||||||
|
batch_start = batch_offset + 1
|
||||||
|
batch_end = batch_offset + batch_count
|
||||||
request_payload: dict[str, Any] = {
|
request_payload: dict[str, Any] = {
|
||||||
"model": model_name,
|
"model": model_name,
|
||||||
"messages": _prompt_messages(
|
"messages": _prompt_messages(
|
||||||
str(config.get("generation_prompt") or ""),
|
str(config.get("generation_prompt") or ""),
|
||||||
content,
|
content,
|
||||||
qa_pairs_per_item,
|
batch_count,
|
||||||
|
start_index=batch_start,
|
||||||
|
total_count=qa_pairs_per_item,
|
||||||
),
|
),
|
||||||
"temperature": temperature,
|
"temperature": temperature,
|
||||||
"max_tokens": max_tokens,
|
"max_tokens": max_tokens,
|
||||||
@@ -178,27 +204,51 @@ def generate_model_records(
|
|||||||
generated_items: list[Mapping[str, Any]] | None = None
|
generated_items: list[Mapping[str, Any]] | None = None
|
||||||
for _ in range(retries + 1):
|
for _ in range(retries + 1):
|
||||||
try:
|
try:
|
||||||
response = http_client.post(endpoint, headers=headers, json=request_payload)
|
response = http_client.post(
|
||||||
|
endpoint,
|
||||||
|
headers=headers,
|
||||||
|
json=request_payload,
|
||||||
|
)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
body = response.json()
|
body = response.json()
|
||||||
if not isinstance(body, Mapping):
|
if not isinstance(body, Mapping):
|
||||||
raise ModelGenerationError("model response body must be a JSON object")
|
raise ModelGenerationError(
|
||||||
generated_items = _result_items(_json_payload(_message_content(body)))
|
"model response body must be a JSON object"
|
||||||
|
)
|
||||||
|
candidate_items = _result_items(
|
||||||
|
_json_payload(_message_content(body))
|
||||||
|
)
|
||||||
|
if len(candidate_items) < batch_count:
|
||||||
|
raise ModelGenerationError(
|
||||||
|
"model response contains fewer result objects than requested: "
|
||||||
|
f"expected {batch_count}, got {len(candidate_items)}"
|
||||||
|
)
|
||||||
|
generated_items = candidate_items
|
||||||
break
|
break
|
||||||
except (httpx.HTTPError, json.JSONDecodeError, ModelGenerationError) as exc:
|
except (
|
||||||
|
httpx.HTTPError,
|
||||||
|
json.JSONDecodeError,
|
||||||
|
ModelGenerationError,
|
||||||
|
) as exc:
|
||||||
last_error = exc
|
last_error = exc
|
||||||
|
|
||||||
if generated_items is None:
|
if generated_items is None:
|
||||||
error_message = str(last_error or "model generation failed")[:2000]
|
error_message = str(last_error or "model generation failed")[:2000]
|
||||||
result_id = f"result_{hashlib.sha256(f'{preview_id}:error'.encode()).hexdigest()[:16]}"
|
failure_instruction = (
|
||||||
|
f"模型生成失败,请人工补充(第 {batch_start}-{batch_end} 条)"
|
||||||
|
)
|
||||||
|
result_id = (
|
||||||
|
"result_"
|
||||||
|
f"{hashlib.sha256(f'{preview_id}:error:{batch_start}'.encode()).hexdigest()[:16]}"
|
||||||
|
)
|
||||||
results.append(
|
results.append(
|
||||||
{
|
{
|
||||||
"id": result_id,
|
"id": result_id,
|
||||||
"preview_item_id": preview_id,
|
"preview_item_id": preview_id,
|
||||||
"instruction": "模型生成失败,请人工补充",
|
"instruction": failure_instruction,
|
||||||
"input": content,
|
"input": content,
|
||||||
"output": "",
|
"output": "",
|
||||||
"original_instruction": "模型生成失败,请人工补充",
|
"original_instruction": failure_instruction,
|
||||||
"original_input": content,
|
"original_input": content,
|
||||||
"original_output": "",
|
"original_output": "",
|
||||||
"status": "invalid",
|
"status": "invalid",
|
||||||
@@ -206,13 +256,16 @@ def generate_model_records(
|
|||||||
"split": "train",
|
"split": "train",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if on_progress:
|
|
||||||
on_progress(item_index + 1, total_items)
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for variant_index, value in enumerate(generated_items[:qa_pairs_per_item]):
|
for batch_index, value in enumerate(generated_items[:batch_count]):
|
||||||
instruction = normalize_text(str(value.get("instruction") or value.get("question") or ""))
|
variant_index = batch_offset + batch_index
|
||||||
input_text = normalize_text(str(value.get("input") or value.get("context") or ""))
|
instruction = normalize_text(
|
||||||
|
str(value.get("instruction") or value.get("question") or "")
|
||||||
|
)
|
||||||
|
input_text = normalize_text(
|
||||||
|
str(value.get("input") or value.get("context") or "")
|
||||||
|
)
|
||||||
output = normalize_text(
|
output = normalize_text(
|
||||||
str(
|
str(
|
||||||
value.get("output")
|
value.get("output")
|
||||||
@@ -222,7 +275,9 @@ def generate_model_records(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
raw_id = f"{preview_id}:{variant_index + 1}:{instruction}:{output}"
|
raw_id = f"{preview_id}:{variant_index + 1}:{instruction}:{output}"
|
||||||
result_id = f"result_{hashlib.sha256(raw_id.encode()).hexdigest()[:16]}"
|
result_id = (
|
||||||
|
f"result_{hashlib.sha256(raw_id.encode()).hexdigest()[:16]}"
|
||||||
|
)
|
||||||
valid = bool(instruction and output)
|
valid = bool(instruction and output)
|
||||||
results.append(
|
results.append(
|
||||||
{
|
{
|
||||||
@@ -235,7 +290,11 @@ def generate_model_records(
|
|||||||
"original_input": input_text,
|
"original_input": input_text,
|
||||||
"original_output": output,
|
"original_output": output,
|
||||||
"status": "valid" if valid else "invalid",
|
"status": "valid" if valid else "invalid",
|
||||||
"error": None if valid else "model result is missing instruction or output",
|
"error": (
|
||||||
|
None
|
||||||
|
if valid
|
||||||
|
else "model result is missing instruction or output"
|
||||||
|
),
|
||||||
"split": "train",
|
"split": "train",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ _UNSTRUCTURED_PREVIEW_DEFAULTS: dict[str, Any] = {
|
|||||||
"preserve_code_blocks": True,
|
"preserve_code_blocks": True,
|
||||||
"preserve_lists": True,
|
"preserve_lists": True,
|
||||||
}
|
}
|
||||||
|
_REGENERATION_MARKER_KEY = "_regeneration_prepared"
|
||||||
|
|
||||||
|
|
||||||
class DataProcessStoreError(RuntimeError):
|
class DataProcessStoreError(RuntimeError):
|
||||||
@@ -129,6 +130,34 @@ def _preview_config_changed(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _regeneration_marker(task: dict[str, Any]) -> dict[str, Any] | None:
|
||||||
|
config = task.get("config")
|
||||||
|
if not isinstance(config, dict):
|
||||||
|
return None
|
||||||
|
marker = config.get(_REGENERATION_MARKER_KEY)
|
||||||
|
if not isinstance(marker, dict) or marker.get("prepared") is not True:
|
||||||
|
return None
|
||||||
|
return marker
|
||||||
|
|
||||||
|
|
||||||
|
def _is_regeneration_prepared(task: dict[str, Any]) -> bool:
|
||||||
|
return _regeneration_marker(task) is not None
|
||||||
|
|
||||||
|
|
||||||
|
def _public_task(item: dict[str, Any] | None) -> dict[str, Any] | None:
|
||||||
|
"""从 API 任务快照中移除服务端内部重新生成标记。"""
|
||||||
|
|
||||||
|
if item is None:
|
||||||
|
return None
|
||||||
|
public = dict(item)
|
||||||
|
config = public.get("config")
|
||||||
|
if isinstance(config, dict) and _REGENERATION_MARKER_KEY in config:
|
||||||
|
public["config"] = {
|
||||||
|
key: value for key, value in config.items() if key != _REGENERATION_MARKER_KEY
|
||||||
|
}
|
||||||
|
return public
|
||||||
|
|
||||||
|
|
||||||
def _serialize_value(value: Any) -> Any:
|
def _serialize_value(value: Any) -> Any:
|
||||||
if isinstance(value, (datetime, date)):
|
if isinstance(value, (datetime, date)):
|
||||||
return value.isoformat().replace("+00:00", "Z")
|
return value.isoformat().replace("+00:00", "Z")
|
||||||
@@ -174,6 +203,7 @@ def _decode_row(row: dict[str, Any] | None) -> dict[str, Any] | None:
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"quality_score": {},
|
"quality_score": {},
|
||||||
"versions": [],
|
"versions": [],
|
||||||
|
"output_datasets": [],
|
||||||
}.items():
|
}.items():
|
||||||
if key in item:
|
if key in item:
|
||||||
item[key] = _json_value(item[key], default)
|
item[key] = _json_value(item[key], default)
|
||||||
@@ -219,40 +249,45 @@ class DataProcessStore:
|
|||||||
tenant_id: str | None = None,
|
tenant_id: str | None = None,
|
||||||
project_id: str | None = None,
|
project_id: str | None = None,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
clauses = ["deleted_at IS NULL"]
|
clauses = ["task.deleted_at IS NULL"]
|
||||||
params: list[Any] = []
|
params: list[Any] = []
|
||||||
if keyword:
|
if keyword:
|
||||||
clauses.append("(name ILIKE %s OR COALESCE(description, '') ILIKE %s)")
|
clauses.append("(task.name ILIKE %s OR COALESCE(task.description, '') ILIKE %s)")
|
||||||
pattern = f"%{keyword.strip()}%"
|
pattern = f"%{keyword.strip()}%"
|
||||||
params.extend([pattern, pattern])
|
params.extend([pattern, pattern])
|
||||||
if status:
|
if status:
|
||||||
clauses.append("status = %s")
|
clauses.append("task.status = %s")
|
||||||
params.append(status)
|
params.append(status)
|
||||||
if process_type:
|
if process_type:
|
||||||
clauses.append("process_type = %s")
|
clauses.append("task.process_type = %s")
|
||||||
params.append(process_type)
|
params.append(process_type)
|
||||||
if tenant_id:
|
if tenant_id:
|
||||||
clauses.append("tenant_id = %s")
|
clauses.append("task.tenant_id = %s")
|
||||||
params.append(tenant_id)
|
params.append(tenant_id)
|
||||||
if project_id:
|
if project_id:
|
||||||
clauses.append("project_id = %s")
|
clauses.append("task.project_id = %s")
|
||||||
params.append(project_id)
|
params.append(project_id)
|
||||||
where = " AND ".join(clauses)
|
where = " AND ".join(clauses)
|
||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
total = conn.execute(
|
total = conn.execute(
|
||||||
f"SELECT COUNT(*) AS count FROM data_process_tasks WHERE {where}", params
|
f"SELECT COUNT(*) AS count FROM data_process_tasks task WHERE {where}",
|
||||||
|
params,
|
||||||
).fetchone()["count"]
|
).fetchone()["count"]
|
||||||
rows = conn.execute(
|
rows = conn.execute(
|
||||||
f"""
|
f"""
|
||||||
SELECT * FROM data_process_tasks
|
SELECT task.*,
|
||||||
|
(SELECT COUNT(*) FROM data_process_source_files source_file
|
||||||
|
WHERE source_file.task_id=task.id
|
||||||
|
AND source_file.deleted_at IS NULL) AS source_file_count
|
||||||
|
FROM data_process_tasks task
|
||||||
WHERE {where}
|
WHERE {where}
|
||||||
ORDER BY created_at DESC, id DESC
|
ORDER BY task.created_at DESC, task.id DESC
|
||||||
LIMIT %s OFFSET %s
|
LIMIT %s OFFSET %s
|
||||||
""",
|
""",
|
||||||
[*params, page_size, (page - 1) * page_size],
|
[*params, page_size, (page - 1) * page_size],
|
||||||
).fetchall()
|
).fetchall()
|
||||||
return {
|
return {
|
||||||
"items": [_decode_row(row) for row in rows],
|
"items": [_public_task(_decode_row(row)) for row in rows],
|
||||||
"total": int(total),
|
"total": int(total),
|
||||||
"page": page,
|
"page": page,
|
||||||
"page_size": page_size,
|
"page_size": page_size,
|
||||||
@@ -278,7 +313,13 @@ class DataProcessStore:
|
|||||||
payload.get("description") or "",
|
payload.get("description") or "",
|
||||||
payload["process_type"],
|
payload["process_type"],
|
||||||
payload.get("source_dataset_id"),
|
payload.get("source_dataset_id"),
|
||||||
json_dumps(payload.get("config") or {}),
|
json_dumps(
|
||||||
|
{
|
||||||
|
key: value
|
||||||
|
for key, value in (payload.get("config") or {}).items()
|
||||||
|
if key != _REGENERATION_MARKER_KEY
|
||||||
|
}
|
||||||
|
),
|
||||||
payload.get("tenant_id"),
|
payload.get("tenant_id"),
|
||||||
payload.get("project_id"),
|
payload.get("project_id"),
|
||||||
payload.get("owner_id"),
|
payload.get("owner_id"),
|
||||||
@@ -290,7 +331,7 @@ class DataProcessStore:
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
except psycopg.errors.UniqueViolation as exc:
|
except psycopg.errors.UniqueViolation as exc:
|
||||||
raise ConflictError("data process task name already exists") from exc
|
raise ConflictError("data process task name already exists") from exc
|
||||||
return _decode_row(row) or {}
|
return _public_task(_decode_row(row)) or {}
|
||||||
|
|
||||||
def get_task(self, task_id: str, *, for_update: bool = False) -> dict[str, Any]:
|
def get_task(self, task_id: str, *, for_update: bool = False) -> dict[str, Any]:
|
||||||
lock = " FOR UPDATE" if for_update else ""
|
lock = " FOR UPDATE" if for_update else ""
|
||||||
@@ -314,11 +355,21 @@ class DataProcessStore:
|
|||||||
'name', dataset.name,
|
'name', dataset.name,
|
||||||
'type', dataset.type,
|
'type', dataset.type,
|
||||||
'count', dataset.count,
|
'count', dataset.count,
|
||||||
'dataset_split', dataset.metadata::jsonb->>'dataset_split'
|
'dataset_split', CASE dataset.type
|
||||||
|
WHEN 'train' THEN 'train'
|
||||||
|
WHEN 'val' THEN 'validation'
|
||||||
|
WHEN 'test' THEN 'test'
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
) ORDER BY CASE dataset.type
|
) ORDER BY CASE dataset.type
|
||||||
WHEN 'train' THEN 1 WHEN 'val' THEN 2 WHEN 'test' THEN 3 ELSE 4 END), '[]'::json)
|
WHEN 'train' THEN 1 WHEN 'val' THEN 2 WHEN 'test' THEN 3 ELSE 4 END), '[]'::json)
|
||||||
FROM datasets dataset
|
FROM datasets dataset
|
||||||
WHERE dataset.source_task_id=task.id AND dataset.source='task')
|
WHERE dataset.source='task'
|
||||||
|
AND dataset.deleted_at IS NULL
|
||||||
|
AND (
|
||||||
|
dataset.source_task_id=task.id
|
||||||
|
OR (dataset.source_task_id IS NULL AND dataset.task_id=task.id)
|
||||||
|
))
|
||||||
AS output_datasets,
|
AS output_datasets,
|
||||||
CASE
|
CASE
|
||||||
WHEN task.started_at IS NOT NULL AND task.completed_at IS NOT NULL
|
WHEN task.started_at IS NOT NULL AND task.completed_at IS NOT NULL
|
||||||
@@ -332,7 +383,7 @@ class DataProcessStore:
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
if not row:
|
if not row:
|
||||||
raise NotFoundError("data process task not found")
|
raise NotFoundError("data process task not found")
|
||||||
return _decode_row(row) or {}
|
return _public_task(_decode_row(row)) or {}
|
||||||
|
|
||||||
def _task_in_connection(
|
def _task_in_connection(
|
||||||
self,
|
self,
|
||||||
@@ -354,9 +405,176 @@ class DataProcessStore:
|
|||||||
def _ensure_editable(task: dict[str, Any]) -> None:
|
def _ensure_editable(task: dict[str, Any]) -> None:
|
||||||
if task["status"] not in EDITABLE_STATUSES:
|
if task["status"] not in EDITABLE_STATUSES:
|
||||||
raise InvalidStateError(f"task cannot be edited while status is {task['status']}")
|
raise InvalidStateError(f"task cannot be edited while status is {task['status']}")
|
||||||
if task.get("output_dataset_id"):
|
if task.get("output_dataset_id") and not _is_regeneration_prepared(task):
|
||||||
raise InvalidStateError("published task cannot be edited")
|
raise InvalidStateError("published task cannot be edited")
|
||||||
|
|
||||||
|
def recover_legacy_aborted_regeneration(self, task_id: str) -> dict[str, Any]:
|
||||||
|
"""恢复旧版在真正开始生成前误删的上一轮结果。
|
||||||
|
|
||||||
|
旧实现会在 ``POST /regenerate`` 时立即把已发布任务置为 pending、
|
||||||
|
清空结果并解除输出指针。三个已发布数据集仍是独立完整产物,因此只在
|
||||||
|
这个特征完全匹配时,使用其记录恢复结果和任务状态。该操作幂等,不会
|
||||||
|
触碰正常的新建待生成任务或已经开始的新一轮生成。
|
||||||
|
"""
|
||||||
|
|
||||||
|
with self.connect() as conn:
|
||||||
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
|
if (
|
||||||
|
task.get("status") != "pending"
|
||||||
|
or task.get("generation_run_id")
|
||||||
|
or task.get("output_dataset_id")
|
||||||
|
or int(task.get("output_count") or 0) != 0
|
||||||
|
):
|
||||||
|
return {"recovered": False, "result_count": 0}
|
||||||
|
|
||||||
|
result_count = int(
|
||||||
|
(
|
||||||
|
conn.execute(
|
||||||
|
"SELECT COUNT(*) AS count FROM data_process_results WHERE task_id=%s",
|
||||||
|
(task_id,),
|
||||||
|
).fetchone()
|
||||||
|
or {}
|
||||||
|
).get("count")
|
||||||
|
or 0
|
||||||
|
)
|
||||||
|
if result_count:
|
||||||
|
return {"recovered": False, "result_count": result_count}
|
||||||
|
|
||||||
|
datasets = conn.execute(
|
||||||
|
"""
|
||||||
|
SELECT id, type, count, created_at
|
||||||
|
FROM datasets
|
||||||
|
WHERE source='task' AND deleted_at IS NULL
|
||||||
|
AND (
|
||||||
|
source_task_id=%s
|
||||||
|
OR (source_task_id IS NULL AND task_id=%s)
|
||||||
|
)
|
||||||
|
ORDER BY CASE type
|
||||||
|
WHEN 'train' THEN 1 WHEN 'val' THEN 2 WHEN 'test' THEN 3 ELSE 4
|
||||||
|
END, created_at, id
|
||||||
|
""",
|
||||||
|
(task_id, task_id),
|
||||||
|
).fetchall()
|
||||||
|
train_dataset = next(
|
||||||
|
(dataset for dataset in datasets if dataset.get("type") == "train"),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
if not train_dataset:
|
||||||
|
return {"recovered": False, "result_count": 0}
|
||||||
|
|
||||||
|
dataset_ids = [str(dataset["id"]) for dataset in datasets]
|
||||||
|
records = conn.execute(
|
||||||
|
"""
|
||||||
|
SELECT id, dataset_id, line_no, split, instruction, input, output,
|
||||||
|
raw, status, source_result_id, preview_item_id, created_at
|
||||||
|
FROM dataset_records
|
||||||
|
WHERE dataset_id = ANY(%s)
|
||||||
|
ORDER BY created_at, dataset_id, line_no NULLS LAST, id
|
||||||
|
""",
|
||||||
|
(dataset_ids,),
|
||||||
|
).fetchall()
|
||||||
|
if not records:
|
||||||
|
return {"recovered": False, "result_count": 0}
|
||||||
|
|
||||||
|
preview_rows = conn.execute(
|
||||||
|
"SELECT id FROM data_process_preview_items WHERE task_id=%s",
|
||||||
|
(task_id,),
|
||||||
|
).fetchall()
|
||||||
|
preview_ids = {str(row["id"]) for row in preview_rows}
|
||||||
|
used_result_ids: set[str] = set()
|
||||||
|
recovered_count = 0
|
||||||
|
for record in records:
|
||||||
|
raw = _json_value(record.get("raw"), {})
|
||||||
|
raw = raw if isinstance(raw, dict) else {}
|
||||||
|
candidate_id = str(
|
||||||
|
record.get("source_result_id")
|
||||||
|
or raw.get("source_result_id")
|
||||||
|
or ""
|
||||||
|
)
|
||||||
|
result_id = (
|
||||||
|
candidate_id
|
||||||
|
if candidate_id and candidate_id not in used_result_ids
|
||||||
|
else new_id("dpr")
|
||||||
|
)
|
||||||
|
used_result_ids.add(result_id)
|
||||||
|
candidate_preview_id = str(
|
||||||
|
record.get("preview_item_id")
|
||||||
|
or raw.get("preview_item_id")
|
||||||
|
or ""
|
||||||
|
)
|
||||||
|
preview_item_id = (
|
||||||
|
candidate_preview_id if candidate_preview_id in preview_ids else None
|
||||||
|
)
|
||||||
|
instruction = str(record.get("instruction") or raw.get("instruction") or "")
|
||||||
|
input_text = str(record.get("input") or raw.get("input") or "")
|
||||||
|
output = str(record.get("output") or raw.get("output") or "")
|
||||||
|
split = str(record.get("split") or raw.get("split") or "") or None
|
||||||
|
status = str(record.get("status") or "valid")
|
||||||
|
if status not in {"valid", "modified", "invalid"}:
|
||||||
|
status = "valid"
|
||||||
|
created_at = record.get("created_at") or utcnow()
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
INSERT INTO data_process_results
|
||||||
|
(id, task_id, preview_item_id, instruction, input, output,
|
||||||
|
original_instruction, original_input, original_output, status,
|
||||||
|
error, split, quality_score, created_at, updated_at)
|
||||||
|
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
|
||||||
|
NULL, %s, '{}', %s, %s)
|
||||||
|
""",
|
||||||
|
(
|
||||||
|
result_id,
|
||||||
|
task_id,
|
||||||
|
preview_item_id,
|
||||||
|
instruction,
|
||||||
|
input_text,
|
||||||
|
output,
|
||||||
|
instruction,
|
||||||
|
input_text,
|
||||||
|
output,
|
||||||
|
status,
|
||||||
|
split,
|
||||||
|
created_at,
|
||||||
|
created_at,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
UPDATE dataset_records
|
||||||
|
SET source_result_id=%s, preview_item_id=%s
|
||||||
|
WHERE id=%s
|
||||||
|
""",
|
||||||
|
(result_id, preview_item_id, record["id"]),
|
||||||
|
)
|
||||||
|
recovered_count += 1
|
||||||
|
|
||||||
|
now = utcnow()
|
||||||
|
published_at = max(
|
||||||
|
(dataset.get("created_at") for dataset in datasets if dataset.get("created_at")),
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
UPDATE data_process_tasks
|
||||||
|
SET status='completed', progress=100, output_dataset_id=%s,
|
||||||
|
output_count=%s, filtered_count=0, duplicate_count=0,
|
||||||
|
error_count=(SELECT COUNT(*) FROM data_process_results
|
||||||
|
WHERE task_id=%s AND status='invalid'),
|
||||||
|
failure_reason=NULL, completed_at=COALESCE(completed_at, %s),
|
||||||
|
updated_at=%s
|
||||||
|
WHERE id=%s
|
||||||
|
""",
|
||||||
|
(
|
||||||
|
train_dataset["id"],
|
||||||
|
recovered_count,
|
||||||
|
task_id,
|
||||||
|
published_at,
|
||||||
|
now,
|
||||||
|
task_id,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return {"recovered": True, "result_count": recovered_count}
|
||||||
|
|
||||||
def update_task(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
def update_task(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
||||||
allowed = {
|
allowed = {
|
||||||
"name",
|
"name",
|
||||||
@@ -365,14 +583,30 @@ class DataProcessStore:
|
|||||||
"source_dataset_id",
|
"source_dataset_id",
|
||||||
}
|
}
|
||||||
values: dict[str, Any] = {key: value for key, value in payload.items() if key in allowed}
|
values: dict[str, Any] = {key: value for key, value in payload.items() if key in allowed}
|
||||||
if payload.get("config") is not None:
|
if not values and payload.get("config") is None:
|
||||||
values["config"] = json_dumps(payload["config"])
|
|
||||||
if not values:
|
|
||||||
return self.get_task(task_id)
|
return self.get_task(task_id)
|
||||||
try:
|
try:
|
||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
task = self._task_in_connection(conn, task_id, for_update=True)
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
self._ensure_editable(task)
|
self._ensure_editable(task)
|
||||||
|
regeneration_prepared = _is_regeneration_prepared(task)
|
||||||
|
if regeneration_prepared and any(
|
||||||
|
key in payload and payload.get(key) != task.get(key)
|
||||||
|
for key in ("process_type", "source_dataset_id")
|
||||||
|
):
|
||||||
|
raise InvalidStateError(
|
||||||
|
"process type and source dataset cannot change during regeneration"
|
||||||
|
)
|
||||||
|
if payload.get("config") is not None:
|
||||||
|
next_config = {
|
||||||
|
key: value
|
||||||
|
for key, value in payload["config"].items()
|
||||||
|
if key != _REGENERATION_MARKER_KEY
|
||||||
|
}
|
||||||
|
current_marker = _regeneration_marker(task)
|
||||||
|
if current_marker:
|
||||||
|
next_config[_REGENERATION_MARKER_KEY] = current_marker
|
||||||
|
values["config"] = json_dumps(next_config)
|
||||||
invalidates_results = (
|
invalidates_results = (
|
||||||
("config" in payload and payload.get("config") != task.get("config"))
|
("config" in payload and payload.get("config") != task.get("config"))
|
||||||
or (
|
or (
|
||||||
@@ -384,7 +618,7 @@ class DataProcessStore:
|
|||||||
and payload.get("source_dataset_id") != task.get("source_dataset_id")
|
and payload.get("source_dataset_id") != task.get("source_dataset_id")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if invalidates_results:
|
if invalidates_results and not regeneration_prepared:
|
||||||
values.update(
|
values.update(
|
||||||
{
|
{
|
||||||
"status": "pending",
|
"status": "pending",
|
||||||
@@ -424,20 +658,21 @@ class DataProcessStore:
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
except psycopg.errors.UniqueViolation as exc:
|
except psycopg.errors.UniqueViolation as exc:
|
||||||
raise ConflictError("data process task name already exists") from exc
|
raise ConflictError("data process task name already exists") from exc
|
||||||
return _decode_row(row) or {}
|
return _public_task(_decode_row(row)) or {}
|
||||||
|
|
||||||
def prepare_regeneration(
|
def prepare_regeneration(
|
||||||
self,
|
self,
|
||||||
task_id: str,
|
task_id: str,
|
||||||
payload: dict[str, Any],
|
payload: dict[str, Any],
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
"""在一个事务中将已有任务恢复为可重新生成状态。
|
"""非破坏性地保存重新生成配置。
|
||||||
|
|
||||||
已发布数据集是可被其他任务使用的独立产物,此处只解除当前任务的
|
准备阶段保留任务当前状态、结果、切片及已发布数据集。真正开始
|
||||||
输出指针,不删除数据集实体。用户完成新一轮生成后,可再次发布
|
生成时,才在同一事务内切换运行状态并清理上一轮结果。
|
||||||
以原子替换三个分割数据集的内容。
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# 先修复曾被旧版 prepare 提前清空的任务,再建立新的非破坏性草稿标记。
|
||||||
|
self.recover_legacy_aborted_regeneration(task_id)
|
||||||
try:
|
try:
|
||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
task = self._task_in_connection(conn, task_id, for_update=True)
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
@@ -454,54 +689,50 @@ class DataProcessStore:
|
|||||||
|
|
||||||
current_config = dict(task.get("config") or {})
|
current_config = dict(task.get("config") or {})
|
||||||
next_config = dict(payload.get("config") or {})
|
next_config = dict(payload.get("config") or {})
|
||||||
|
next_config.pop(_REGENERATION_MARKER_KEY, None)
|
||||||
preview_invalidated = _preview_config_changed(
|
preview_invalidated = _preview_config_changed(
|
||||||
process_type,
|
process_type,
|
||||||
current_config,
|
current_config,
|
||||||
next_config,
|
next_config,
|
||||||
)
|
)
|
||||||
|
now = utcnow()
|
||||||
|
next_config[_REGENERATION_MARKER_KEY] = {
|
||||||
|
"prepared": True,
|
||||||
|
"preview_invalidated": preview_invalidated,
|
||||||
|
"prepared_at": now,
|
||||||
|
}
|
||||||
|
# 002 迁移前发布的数据集只有 task_id。先补齐新关联字段,保证
|
||||||
|
# 解除任务输出指针后,详情和后续重新发布仍能定位原来的三份数据集。
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
UPDATE datasets
|
||||||
|
SET source_task_id=%s, updated_at=%s
|
||||||
|
WHERE source='task' AND source_task_id IS NULL AND task_id=%s
|
||||||
|
AND deleted_at IS NULL
|
||||||
|
""",
|
||||||
|
(task_id, now, task_id),
|
||||||
|
)
|
||||||
published_row = conn.execute(
|
published_row = conn.execute(
|
||||||
"""
|
"""
|
||||||
SELECT EXISTS(
|
SELECT EXISTS(
|
||||||
SELECT 1 FROM datasets
|
SELECT 1 FROM datasets
|
||||||
WHERE source_task_id=%s AND source='task'
|
WHERE source='task' AND deleted_at IS NULL
|
||||||
|
AND (
|
||||||
|
source_task_id=%s
|
||||||
|
OR (source_task_id IS NULL AND task_id=%s)
|
||||||
|
)
|
||||||
) AS exists
|
) AS exists
|
||||||
""",
|
""",
|
||||||
(task_id,),
|
(task_id, task_id),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
published_outputs_preserved = bool(task.get("output_dataset_id")) or bool(
|
published_outputs_preserved = bool(task.get("output_dataset_id")) or bool(
|
||||||
published_row and published_row.get("exists")
|
published_row and published_row.get("exists")
|
||||||
)
|
)
|
||||||
|
|
||||||
# 删除顺序保证结果不再指向即将被替换的切片。
|
|
||||||
conn.execute(
|
|
||||||
"DELETE FROM data_process_results WHERE task_id=%s",
|
|
||||||
(task_id,),
|
|
||||||
)
|
|
||||||
if preview_invalidated:
|
|
||||||
conn.execute(
|
|
||||||
"DELETE FROM data_process_preview_items WHERE task_id=%s",
|
|
||||||
(task_id,),
|
|
||||||
)
|
|
||||||
preview_count = 0
|
|
||||||
else:
|
|
||||||
preview_row = conn.execute(
|
|
||||||
"""
|
|
||||||
SELECT COUNT(*) AS count FROM data_process_preview_items
|
|
||||||
WHERE task_id=%s
|
|
||||||
""",
|
|
||||||
(task_id,),
|
|
||||||
).fetchone()
|
|
||||||
preview_count = int((preview_row or {}).get("count") or 0)
|
|
||||||
|
|
||||||
now = utcnow()
|
|
||||||
row = conn.execute(
|
row = conn.execute(
|
||||||
"""
|
"""
|
||||||
UPDATE data_process_tasks
|
UPDATE data_process_tasks
|
||||||
SET name=%s, description=%s, config=%s, status='pending', progress=%s,
|
SET name=%s, description=%s, config=%s, updated_at=%s
|
||||||
output_dataset_id=NULL, output_count=0, filtered_count=0,
|
|
||||||
duplicate_count=0, error_count=0, failure_reason=NULL,
|
|
||||||
generation_run_id=NULL, started_at=NULL, completed_at=NULL,
|
|
||||||
updated_at=%s
|
|
||||||
WHERE id=%s
|
WHERE id=%s
|
||||||
RETURNING *
|
RETURNING *
|
||||||
""",
|
""",
|
||||||
@@ -509,7 +740,6 @@ class DataProcessStore:
|
|||||||
payload["name"],
|
payload["name"],
|
||||||
payload.get("description") or "",
|
payload.get("description") or "",
|
||||||
json_dumps(next_config),
|
json_dumps(next_config),
|
||||||
20 if preview_count else 0,
|
|
||||||
now,
|
now,
|
||||||
task_id,
|
task_id,
|
||||||
),
|
),
|
||||||
@@ -517,7 +747,7 @@ class DataProcessStore:
|
|||||||
except psycopg.errors.UniqueViolation as exc:
|
except psycopg.errors.UniqueViolation as exc:
|
||||||
raise ConflictError("data process task name already exists") from exc
|
raise ConflictError("data process task name already exists") from exc
|
||||||
return {
|
return {
|
||||||
"task": _decode_row(row) or {},
|
"task": _public_task(_decode_row(row)) or {},
|
||||||
"preview_invalidated": preview_invalidated,
|
"preview_invalidated": preview_invalidated,
|
||||||
"published_outputs_preserved": published_outputs_preserved,
|
"published_outputs_preserved": published_outputs_preserved,
|
||||||
}
|
}
|
||||||
@@ -641,9 +871,6 @@ class DataProcessStore:
|
|||||||
),
|
),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
created.append(_decode_row(row) or {})
|
created.append(_decode_row(row) or {})
|
||||||
# 前端会只对本次新增的源文件构建预览,因此必须保留旧
|
|
||||||
# 文件的切片。任何源文件增加都会使旧生成结果失效。
|
|
||||||
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
|
||||||
preview_row = conn.execute(
|
preview_row = conn.execute(
|
||||||
"""
|
"""
|
||||||
SELECT COUNT(*) AS count FROM data_process_preview_items
|
SELECT COUNT(*) AS count FROM data_process_preview_items
|
||||||
@@ -652,12 +879,32 @@ class DataProcessStore:
|
|||||||
(task_id,),
|
(task_id,),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
preview_count = int((preview_row or {}).get("count") or 0)
|
preview_count = int((preview_row or {}).get("count") or 0)
|
||||||
|
if _is_regeneration_prepared(task):
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
UPDATE data_process_tasks
|
||||||
|
SET input_count=(
|
||||||
|
SELECT COALESCE(SUM(record_count), 0)
|
||||||
|
FROM data_process_source_files
|
||||||
|
WHERE task_id=%s AND deleted_at IS NULL
|
||||||
|
), updated_at=%s
|
||||||
|
WHERE id=%s
|
||||||
|
""",
|
||||||
|
(task_id, now, task_id),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# 前端会只对本次新增的源文件构建预览,因此保留旧文件切片,
|
||||||
|
# 但普通未发布任务的旧生成结果已经不再有效。
|
||||||
|
conn.execute(
|
||||||
|
"DELETE FROM data_process_results WHERE task_id=%s", (task_id,)
|
||||||
|
)
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"""
|
"""
|
||||||
UPDATE data_process_tasks
|
UPDATE data_process_tasks
|
||||||
SET status='pending', progress=%s, output_count=0, filtered_count=0,
|
SET status='pending', progress=%s, output_count=0, filtered_count=0,
|
||||||
duplicate_count=0, error_count=0, failure_reason=NULL,
|
duplicate_count=0, error_count=0, failure_reason=NULL,
|
||||||
generation_run_id=NULL, started_at=NULL, completed_at=NULL, input_count=(
|
generation_run_id=NULL, started_at=NULL, completed_at=NULL,
|
||||||
|
input_count=(
|
||||||
SELECT COALESCE(SUM(record_count), 0)
|
SELECT COALESCE(SUM(record_count), 0)
|
||||||
FROM data_process_source_files
|
FROM data_process_source_files
|
||||||
WHERE task_id=%s AND deleted_at IS NULL
|
WHERE task_id=%s AND deleted_at IS NULL
|
||||||
@@ -746,10 +993,26 @@ class DataProcessStore:
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
if not row:
|
if not row:
|
||||||
raise NotFoundError("source file not found")
|
raise NotFoundError("source file not found")
|
||||||
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"DELETE FROM data_process_preview_items WHERE source_file_id=%s", (file_id,)
|
"DELETE FROM data_process_preview_items WHERE source_file_id=%s", (file_id,)
|
||||||
)
|
)
|
||||||
|
now = utcnow()
|
||||||
|
if _is_regeneration_prepared(task):
|
||||||
|
conn.execute(
|
||||||
|
"""
|
||||||
|
UPDATE data_process_tasks
|
||||||
|
SET input_count=(SELECT COALESCE(SUM(record_count), 0)
|
||||||
|
FROM data_process_source_files
|
||||||
|
WHERE task_id=%s AND deleted_at IS NULL),
|
||||||
|
updated_at=%s
|
||||||
|
WHERE id=%s
|
||||||
|
""",
|
||||||
|
(task_id, now, task_id),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
conn.execute(
|
||||||
|
"DELETE FROM data_process_results WHERE task_id=%s", (task_id,)
|
||||||
|
)
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"""
|
"""
|
||||||
UPDATE data_process_tasks
|
UPDATE data_process_tasks
|
||||||
@@ -761,7 +1024,7 @@ class DataProcessStore:
|
|||||||
updated_at=%s
|
updated_at=%s
|
||||||
WHERE id=%s
|
WHERE id=%s
|
||||||
""",
|
""",
|
||||||
(task_id, utcnow(), task_id),
|
(task_id, now, task_id),
|
||||||
)
|
)
|
||||||
|
|
||||||
def replace_preview_items(
|
def replace_preview_items(
|
||||||
@@ -792,6 +1055,8 @@ class DataProcessStore:
|
|||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
task = self._task_in_connection(conn, task_id, for_update=True)
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
self._ensure_editable(task)
|
self._ensure_editable(task)
|
||||||
|
regeneration_prepared = _is_regeneration_prepared(task)
|
||||||
|
if not regeneration_prepared:
|
||||||
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
||||||
if selected_ids is None:
|
if selected_ids is None:
|
||||||
conn.execute(
|
conn.execute(
|
||||||
@@ -847,6 +1112,12 @@ class DataProcessStore:
|
|||||||
),
|
),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
created.append(_decode_row(row) or {})
|
created.append(_decode_row(row) or {})
|
||||||
|
if regeneration_prepared:
|
||||||
|
conn.execute(
|
||||||
|
"UPDATE data_process_tasks SET updated_at=%s WHERE id=%s",
|
||||||
|
(now, task_id),
|
||||||
|
)
|
||||||
|
else:
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"""
|
"""
|
||||||
UPDATE data_process_tasks
|
UPDATE data_process_tasks
|
||||||
@@ -949,7 +1220,7 @@ class DataProcessStore:
|
|||||||
now,
|
now,
|
||||||
),
|
),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
self._invalidate_results(conn, task_id, now)
|
self._invalidate_results(conn, task, task_id, now)
|
||||||
return _decode_row(row) or {}
|
return _decode_row(row) or {}
|
||||||
|
|
||||||
def update_preview_item(
|
def update_preview_item(
|
||||||
@@ -996,7 +1267,7 @@ class DataProcessStore:
|
|||||||
task_id,
|
task_id,
|
||||||
),
|
),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
self._invalidate_results(conn, task_id, now)
|
self._invalidate_results(conn, task, task_id, now)
|
||||||
return _decode_row(row) or {}
|
return _decode_row(row) or {}
|
||||||
|
|
||||||
def delete_preview_item(self, task_id: str, preview_id: str) -> None:
|
def delete_preview_item(self, task_id: str, preview_id: str) -> None:
|
||||||
@@ -1009,14 +1280,21 @@ class DataProcessStore:
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
if not row:
|
if not row:
|
||||||
raise NotFoundError("preview item not found")
|
raise NotFoundError("preview item not found")
|
||||||
self._invalidate_results(conn, task_id, utcnow())
|
self._invalidate_results(conn, task, task_id, utcnow())
|
||||||
|
|
||||||
def _invalidate_results(
|
def _invalidate_results(
|
||||||
self,
|
self,
|
||||||
conn: psycopg.Connection[dict[str, Any]],
|
conn: psycopg.Connection[dict[str, Any]],
|
||||||
|
task: dict[str, Any],
|
||||||
task_id: str,
|
task_id: str,
|
||||||
now: str,
|
now: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
if _is_regeneration_prepared(task):
|
||||||
|
conn.execute(
|
||||||
|
"UPDATE data_process_tasks SET updated_at=%s WHERE id=%s",
|
||||||
|
(now, task_id),
|
||||||
|
)
|
||||||
|
return
|
||||||
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"""
|
"""
|
||||||
@@ -1034,7 +1312,8 @@ class DataProcessStore:
|
|||||||
raise DataProcessStoreError("incremental generation is not supported")
|
raise DataProcessStoreError("incremental generation is not supported")
|
||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
task = self._task_in_connection(conn, task_id, for_update=True)
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
if task.get("output_dataset_id"):
|
regeneration_prepared = _is_regeneration_prepared(task)
|
||||||
|
if task.get("output_dataset_id") and not regeneration_prepared:
|
||||||
raise InvalidStateError("published task cannot be regenerated")
|
raise InvalidStateError("published task cannot be regenerated")
|
||||||
if task["status"] == "running":
|
if task["status"] == "running":
|
||||||
raise ConflictError("data process task is already running")
|
raise ConflictError("data process task is already running")
|
||||||
@@ -1047,16 +1326,19 @@ class DataProcessStore:
|
|||||||
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
conn.execute("DELETE FROM data_process_results WHERE task_id=%s", (task_id,))
|
||||||
now = utcnow()
|
now = utcnow()
|
||||||
generation_run_id = new_id("dprun")
|
generation_run_id = new_id("dprun")
|
||||||
|
next_config = dict(task.get("config") or {})
|
||||||
|
next_config.pop(_REGENERATION_MARKER_KEY, None)
|
||||||
row = conn.execute(
|
row = conn.execute(
|
||||||
"""
|
"""
|
||||||
UPDATE data_process_tasks
|
UPDATE data_process_tasks
|
||||||
SET status='running', progress=30, failure_reason=NULL, started_at=%s,
|
SET config=%s, status='running', progress=30, failure_reason=NULL,
|
||||||
completed_at=NULL, filtered_count=0, duplicate_count=0, error_count=0,
|
started_at=%s, completed_at=NULL, output_dataset_id=NULL,
|
||||||
|
output_count=0, filtered_count=0, duplicate_count=0, error_count=0,
|
||||||
generation_run_id=%s, updated_at=%s
|
generation_run_id=%s, updated_at=%s
|
||||||
WHERE id=%s
|
WHERE id=%s
|
||||||
RETURNING *
|
RETURNING *
|
||||||
""",
|
""",
|
||||||
(now, generation_run_id, now, task_id),
|
(json_dumps(next_config), now, generation_run_id, now, task_id),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
return _decode_row(row) or {}
|
return _decode_row(row) or {}
|
||||||
|
|
||||||
@@ -1374,6 +1656,10 @@ class DataProcessStore:
|
|||||||
"""按精确配额发布训练、验证、测试三个独立数据集。"""
|
"""按精确配额发布训练、验证、测试三个独立数据集。"""
|
||||||
with self.connect() as conn:
|
with self.connect() as conn:
|
||||||
task = self._task_in_connection(conn, task_id, for_update=True)
|
task = self._task_in_connection(conn, task_id, for_update=True)
|
||||||
|
if _is_regeneration_prepared(task):
|
||||||
|
raise InvalidStateError(
|
||||||
|
"regeneration must start and complete before publishing"
|
||||||
|
)
|
||||||
if task["status"] != "completed":
|
if task["status"] != "completed":
|
||||||
raise InvalidStateError("only a completed task can be published")
|
raise InvalidStateError("only a completed task can be published")
|
||||||
rows = conn.execute(
|
rows = conn.execute(
|
||||||
@@ -1460,10 +1746,14 @@ class DataProcessStore:
|
|||||||
existing_datasets = conn.execute(
|
existing_datasets = conn.execute(
|
||||||
"""
|
"""
|
||||||
SELECT * FROM datasets
|
SELECT * FROM datasets
|
||||||
WHERE source_task_id=%s AND source='task'
|
WHERE source='task' AND deleted_at IS NULL
|
||||||
|
AND (
|
||||||
|
source_task_id=%s
|
||||||
|
OR (source_task_id IS NULL AND task_id=%s)
|
||||||
|
)
|
||||||
ORDER BY created_at, id
|
ORDER BY created_at, id
|
||||||
""",
|
""",
|
||||||
(task_id,),
|
(task_id, task_id),
|
||||||
).fetchall()
|
).fetchall()
|
||||||
existing_by_split: dict[str, dict[str, Any]] = {}
|
existing_by_split: dict[str, dict[str, Any]] = {}
|
||||||
primary_existing = None
|
primary_existing = None
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ from typing import Any, Literal
|
|||||||
|
|
||||||
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
||||||
|
|
||||||
|
from app.modules.data_process.constants import MAX_QA_PAIRS_PER_ITEM
|
||||||
|
|
||||||
|
|
||||||
def _config_value(config: dict[str, Any], snake_name: str, camel_name: str, default: Any) -> Any:
|
def _config_value(config: dict[str, Any], snake_name: str, camel_name: str, default: Any) -> Any:
|
||||||
if snake_name in config:
|
if snake_name in config:
|
||||||
@@ -89,8 +91,14 @@ def _validate_process_config(config: dict[str, Any]) -> None:
|
|||||||
pairs = _config_value(config, snake_name, camel_name, None)
|
pairs = _config_value(config, snake_name, camel_name, None)
|
||||||
if pairs is None:
|
if pairs is None:
|
||||||
continue
|
continue
|
||||||
if isinstance(pairs, bool) or not isinstance(pairs, int) or not 1 <= pairs <= 5:
|
if (
|
||||||
raise ValueError(f"{snake_name} must be an integer in [1, 5]")
|
isinstance(pairs, bool)
|
||||||
|
or not isinstance(pairs, int)
|
||||||
|
or not 1 <= pairs <= MAX_QA_PAIRS_PER_ITEM
|
||||||
|
):
|
||||||
|
raise ValueError(
|
||||||
|
f"{snake_name} must be an integer in [1, {MAX_QA_PAIRS_PER_ITEM}]"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DataProcessStatus(StrEnum):
|
class DataProcessStatus(StrEnum):
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from app.modules.data_process.algorithms import (
|
|||||||
detect_document_structure,
|
detect_document_structure,
|
||||||
detect_pdf_document_noise,
|
detect_pdf_document_noise,
|
||||||
detect_text_format,
|
detect_text_format,
|
||||||
estimate_token_count,
|
|
||||||
extract_pdf_page_texts,
|
extract_pdf_page_texts,
|
||||||
extract_structured_records,
|
extract_structured_records,
|
||||||
generate_standard_records,
|
generate_standard_records,
|
||||||
@@ -748,3 +747,26 @@ def test_generate_standard_records_supports_json_qa_and_stable_variants() -> Non
|
|||||||
split={"train": 100, "validation": 0, "test": 0},
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
split_seed="task-1",
|
split_seed="task-1",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_standard_records_supports_fifty_unique_semantic_variants() -> None:
|
||||||
|
records = generate_standard_records(
|
||||||
|
[{"id": "preview-50", "edited_content": "问:如何操作?\n答:按步骤操作。"}],
|
||||||
|
qa_pairs_per_item=50,
|
||||||
|
semantic_enrichment=True,
|
||||||
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
|
split_seed="task-50",
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(records) == 50
|
||||||
|
assert len({record["id"] for record in records}) == 50
|
||||||
|
assert len({record["instruction"] for record in records}) == 50
|
||||||
|
assert all(record["status"] == "valid" for record in records)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("qa_pairs_per_item", [0, 51])
|
||||||
|
def test_generate_standard_records_rejects_out_of_range_count(
|
||||||
|
qa_pairs_per_item: int,
|
||||||
|
) -> None:
|
||||||
|
with pytest.raises(ValueError, match=r"\[1, 50\]"):
|
||||||
|
generate_standard_records([], qa_pairs_per_item=qa_pairs_per_item)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class FakeDataProcessStore:
|
|||||||
self.previews: dict[str, list[dict[str, Any]]] = {}
|
self.previews: dict[str, list[dict[str, Any]]] = {}
|
||||||
self.results: dict[str, list[dict[str, Any]]] = {}
|
self.results: dict[str, list[dict[str, Any]]] = {}
|
||||||
self.datasets: dict[str, dict[str, Any]] = {}
|
self.datasets: dict[str, dict[str, Any]] = {}
|
||||||
|
self.regeneration_prepared: set[str] = set()
|
||||||
self.sequence = 0
|
self.sequence = 0
|
||||||
|
|
||||||
def _id(self, prefix: str) -> str:
|
def _id(self, prefix: str) -> str:
|
||||||
@@ -37,7 +38,13 @@ class FakeDataProcessStore:
|
|||||||
return f"{prefix}_{self.sequence}"
|
return f"{prefix}_{self.sequence}"
|
||||||
|
|
||||||
def list_tasks(self, *, page: int, page_size: int, **filters: Any) -> dict[str, Any]:
|
def list_tasks(self, *, page: int, page_size: int, **filters: Any) -> dict[str, Any]:
|
||||||
items = list(self.tasks.values())
|
items = [
|
||||||
|
{
|
||||||
|
**item,
|
||||||
|
"source_file_count": len(self.sources.get(str(item["id"]), [])),
|
||||||
|
}
|
||||||
|
for item in self.tasks.values()
|
||||||
|
]
|
||||||
for field in ("status", "process_type", "tenant_id", "project_id"):
|
for field in ("status", "process_type", "tenant_id", "project_id"):
|
||||||
if filters.get(field):
|
if filters.get(field):
|
||||||
items = [item for item in items if item.get(field) == filters[field]]
|
items = [item for item in items if item.get(field) == filters[field]]
|
||||||
@@ -75,7 +82,22 @@ class FakeDataProcessStore:
|
|||||||
def get_task(self, task_id: str) -> dict[str, Any]:
|
def get_task(self, task_id: str) -> dict[str, Any]:
|
||||||
if task_id not in self.tasks:
|
if task_id not in self.tasks:
|
||||||
raise NotFoundError("data process task not found")
|
raise NotFoundError("data process task not found")
|
||||||
return deepcopy(self.tasks[task_id])
|
task = deepcopy(self.tasks[task_id])
|
||||||
|
split_order = {"train": 0, "val": 1, "test": 2}
|
||||||
|
task["output_datasets"] = sorted(
|
||||||
|
(
|
||||||
|
deepcopy(dataset)
|
||||||
|
for dataset in self.datasets.values()
|
||||||
|
if dataset.get("source_task_id") == task_id
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
),
|
||||||
|
key=lambda dataset: split_order.get(str(dataset.get("type")), 3),
|
||||||
|
)
|
||||||
|
return task
|
||||||
|
|
||||||
|
def recover_legacy_aborted_regeneration(self, task_id: str) -> dict[str, Any]:
|
||||||
|
self.get_task(task_id)
|
||||||
|
return {"recovered": False, "result_count": 0}
|
||||||
|
|
||||||
def update_task(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
def update_task(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
||||||
self.get_task(task_id)
|
self.get_task(task_id)
|
||||||
@@ -92,27 +114,19 @@ class FakeDataProcessStore:
|
|||||||
raise InvalidStateError("data process task was modified by another request")
|
raise InvalidStateError("data process task was modified by another request")
|
||||||
if payload["process_type"] != task["process_type"]:
|
if payload["process_type"] != task["process_type"]:
|
||||||
raise InvalidStateError("process_type cannot be changed during regeneration")
|
raise InvalidStateError("process_type cannot be changed during regeneration")
|
||||||
published_outputs_preserved = bool(task.get("output_dataset_id"))
|
published_outputs_preserved = bool(task.get("output_dataset_id")) or any(
|
||||||
self.results[task_id] = []
|
dataset.get("source_task_id") == task_id
|
||||||
|
for dataset in self.datasets.values()
|
||||||
|
)
|
||||||
task.update(
|
task.update(
|
||||||
{
|
{
|
||||||
"name": payload["name"],
|
"name": payload["name"],
|
||||||
"description": payload["description"],
|
"description": payload["description"],
|
||||||
"config": deepcopy(payload["config"]),
|
"config": deepcopy(payload["config"]),
|
||||||
"status": "pending",
|
|
||||||
"progress": 20,
|
|
||||||
"output_dataset_id": None,
|
|
||||||
"output_count": 0,
|
|
||||||
"filtered_count": 0,
|
|
||||||
"duplicate_count": 0,
|
|
||||||
"error_count": 0,
|
|
||||||
"failure_reason": None,
|
|
||||||
"generation_run_id": None,
|
|
||||||
"started_at": None,
|
|
||||||
"completed_at": None,
|
|
||||||
"updated_at": "2026-07-25T20:00:00Z",
|
"updated_at": "2026-07-25T20:00:00Z",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
self.regeneration_prepared.add(task_id)
|
||||||
return {
|
return {
|
||||||
"task": deepcopy(task),
|
"task": deepcopy(task),
|
||||||
"preview_invalidated": False,
|
"preview_invalidated": False,
|
||||||
@@ -323,13 +337,19 @@ class FakeDataProcessStore:
|
|||||||
def start_generation(self, task_id: str, *, replace_existing: bool) -> dict[str, Any]:
|
def start_generation(self, task_id: str, *, replace_existing: bool) -> dict[str, Any]:
|
||||||
if not self.previews[task_id]:
|
if not self.previews[task_id]:
|
||||||
raise InvalidStateError("preview must be built before generation")
|
raise InvalidStateError("preview must be built before generation")
|
||||||
|
task = self.tasks[task_id]
|
||||||
|
if task.get("output_dataset_id") and task_id not in self.regeneration_prepared:
|
||||||
|
raise InvalidStateError("published task cannot be regenerated")
|
||||||
if replace_existing:
|
if replace_existing:
|
||||||
self.results[task_id] = []
|
self.results[task_id] = []
|
||||||
self.tasks[task_id].update(
|
task.update(
|
||||||
status="running",
|
status="running",
|
||||||
progress=30,
|
progress=30,
|
||||||
|
output_dataset_id=None,
|
||||||
|
output_count=0,
|
||||||
generation_run_id=self._id("dprun"),
|
generation_run_id=self._id("dprun"),
|
||||||
)
|
)
|
||||||
|
self.regeneration_prepared.discard(task_id)
|
||||||
return self.get_task(task_id)
|
return self.get_task(task_id)
|
||||||
|
|
||||||
def generation_is_running(self, task_id: str, generation_run_id: str) -> bool:
|
def generation_is_running(self, task_id: str, generation_run_id: str) -> bool:
|
||||||
@@ -469,15 +489,55 @@ class FakeDataProcessStore:
|
|||||||
|
|
||||||
def publish(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
def publish(self, task_id: str, payload: dict[str, Any]) -> dict[str, Any]:
|
||||||
task = self.tasks[task_id]
|
task = self.tasks[task_id]
|
||||||
|
if task_id in self.regeneration_prepared:
|
||||||
|
raise InvalidStateError("regeneration must start and complete before publishing")
|
||||||
|
published = [
|
||||||
|
dataset
|
||||||
|
for dataset in self.datasets.values()
|
||||||
|
if dataset.get("source_task_id") == task_id
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
]
|
||||||
if task.get("output_dataset_id"):
|
if task.get("output_dataset_id"):
|
||||||
return {"dataset": deepcopy(self.datasets[task["output_dataset_id"]]), "created": False}
|
train_dataset = self.datasets[task["output_dataset_id"]]
|
||||||
|
return {
|
||||||
|
"dataset": deepcopy(train_dataset),
|
||||||
|
"datasets": deepcopy(published),
|
||||||
|
"output_datasets": deepcopy(published),
|
||||||
|
"created": False,
|
||||||
|
}
|
||||||
if task["status"] != "completed":
|
if task["status"] != "completed":
|
||||||
raise InvalidStateError("only a completed task can be published")
|
raise InvalidStateError("only a completed task can be published")
|
||||||
|
split_specs = (
|
||||||
|
("train", "训练集"),
|
||||||
|
("val", "验证集"),
|
||||||
|
("test", "测试集"),
|
||||||
|
)
|
||||||
|
for dataset_type, label in split_specs:
|
||||||
dataset_id = self._id("dataset")
|
dataset_id = self._id("dataset")
|
||||||
dataset = {"id": dataset_id, "name": payload["dataset_name"], "source_task_id": task_id}
|
self.datasets[dataset_id] = {
|
||||||
self.datasets[dataset_id] = dataset
|
"id": dataset_id,
|
||||||
task["output_dataset_id"] = dataset_id
|
"name": f"{payload['dataset_name']}-{label}",
|
||||||
return {"dataset": deepcopy(dataset), "created": True}
|
"type": dataset_type,
|
||||||
|
"count": len(self.results[task_id]),
|
||||||
|
"source": "task",
|
||||||
|
"task_id": task_id,
|
||||||
|
"source_task_id": task_id,
|
||||||
|
"deleted_at": None,
|
||||||
|
}
|
||||||
|
published = [
|
||||||
|
dataset
|
||||||
|
for dataset in self.datasets.values()
|
||||||
|
if dataset.get("source_task_id") == task_id
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
]
|
||||||
|
train_dataset = next(dataset for dataset in published if dataset["type"] == "train")
|
||||||
|
task["output_dataset_id"] = train_dataset["id"]
|
||||||
|
return {
|
||||||
|
"dataset": deepcopy(train_dataset),
|
||||||
|
"datasets": deepcopy(published),
|
||||||
|
"output_datasets": deepcopy(published),
|
||||||
|
"created": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def make_client(
|
def make_client(
|
||||||
@@ -673,6 +733,83 @@ def test_data_process_full_contract_without_database(tmp_path: Path) -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_task_list_exposes_document_and_generation_counts(
|
||||||
|
tmp_path: Path,
|
||||||
|
) -> None:
|
||||||
|
client, store, _ = make_client(tmp_path)
|
||||||
|
task_id = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={"name": "列表契约", "process_type": "unstructured", "config": {}},
|
||||||
|
).json()["data"]["id"]
|
||||||
|
store.sources[task_id] = [{"id": "source-1"}, {"id": "source-2"}]
|
||||||
|
store.tasks[task_id].update(
|
||||||
|
{
|
||||||
|
"status": "pending",
|
||||||
|
"output_count": 17,
|
||||||
|
"output_dataset_id": None,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
response = client.get("/modelTF/data-process")
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
item = response.json()["data"]["items"][0]
|
||||||
|
assert item["status"] == "pending"
|
||||||
|
assert item["source_file_count"] == 2
|
||||||
|
assert item["output_count"] == 17
|
||||||
|
assert item["output_dataset_id"] is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_task_detail_uses_returned_source_files_as_document_count(tmp_path: Path) -> None:
|
||||||
|
client, store, _ = make_client(tmp_path)
|
||||||
|
task_id = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={"name": "详情文档数", "process_type": "unstructured", "config": {}},
|
||||||
|
).json()["data"]["id"]
|
||||||
|
store.tasks[task_id]["source_file_count"] = 99
|
||||||
|
store.sources[task_id] = [
|
||||||
|
{"id": "source-1", "name": "一.pdf", "content": "正文一"},
|
||||||
|
{"id": "source-2", "name": "二.pdf", "content": "正文二"},
|
||||||
|
]
|
||||||
|
|
||||||
|
response = client.get(f"/modelTF/data-process/{task_id}")
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
detail = response.json()["data"]
|
||||||
|
assert len(detail["source_files"]) == 2
|
||||||
|
assert detail["source_file_count"] == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_generation_start_response_clears_previous_output_count(
|
||||||
|
tmp_path: Path,
|
||||||
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
|
) -> None:
|
||||||
|
client, store, _ = make_client(tmp_path)
|
||||||
|
task_id = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={"name": "新一轮生成", "process_type": "structured", "config": {}},
|
||||||
|
).json()["data"]["id"]
|
||||||
|
store.tasks[task_id]["output_count"] = 28
|
||||||
|
store.previews[task_id] = [
|
||||||
|
{
|
||||||
|
"id": "preview-1",
|
||||||
|
"source_file_id": None,
|
||||||
|
"original_content": '{"question":"新问题","answer":"新答案"}',
|
||||||
|
"edited_content": '{"question":"新问题","answer":"新答案"}',
|
||||||
|
"status": "original",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
monkeypatch.setattr(data_process_endpoint, "_run_generation", lambda *args: None)
|
||||||
|
|
||||||
|
response = client.post(f"/modelTF/data-process/{task_id}/generate")
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
progress = response.json()["data"]
|
||||||
|
assert progress["status"] == "running"
|
||||||
|
assert progress["output_count"] == 0
|
||||||
|
assert store.tasks[task_id]["output_count"] == 0
|
||||||
|
|
||||||
|
|
||||||
def test_preview_build_replaces_only_selected_files_and_reports_file_counts(
|
def test_preview_build_replaces_only_selected_files_and_reports_file_counts(
|
||||||
tmp_path: Path,
|
tmp_path: Path,
|
||||||
) -> None:
|
) -> None:
|
||||||
@@ -836,6 +973,13 @@ def test_regenerate_endpoint_prepares_an_existing_published_task(tmp_path: Path)
|
|||||||
"output_count": 2,
|
"output_count": 2,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
store.datasets["dataset_train"] = {
|
||||||
|
"id": "dataset_train",
|
||||||
|
"name": "原训练集",
|
||||||
|
"type": "train",
|
||||||
|
"source_task_id": task_id,
|
||||||
|
"deleted_at": None,
|
||||||
|
}
|
||||||
store.previews[task_id] = [{"id": "preview_1", "edited_content": "原切片"}]
|
store.previews[task_id] = [{"id": "preview_1", "edited_content": "原切片"}]
|
||||||
store.results[task_id] = [{"id": "result_1"}]
|
store.results[task_id] = [{"id": "result_1"}]
|
||||||
|
|
||||||
@@ -852,13 +996,104 @@ def test_regenerate_endpoint_prepares_an_existing_published_task(tmp_path: Path)
|
|||||||
|
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
data = response.json()["data"]
|
data = response.json()["data"]
|
||||||
assert data["task"]["status"] == "pending"
|
assert data["task"]["status"] == "completed"
|
||||||
assert data["task"]["output_dataset_id"] is None
|
assert data["task"]["output_dataset_id"] == "dataset_train"
|
||||||
|
assert data["task"]["output_count"] == 2
|
||||||
assert data["preview_invalidated"] is False
|
assert data["preview_invalidated"] is False
|
||||||
assert data["published_outputs_preserved"] is True
|
assert data["published_outputs_preserved"] is True
|
||||||
assert store.results[task_id] == []
|
assert store.results[task_id] == [{"id": "result_1"}]
|
||||||
assert store.previews[task_id][0]["id"] == "preview_1"
|
assert store.previews[task_id][0]["id"] == "preview_1"
|
||||||
|
|
||||||
|
detail = client.get(f"/modelTF/data-process/{task_id}").json()["data"]
|
||||||
|
assert detail["status"] == "completed"
|
||||||
|
assert detail["output_dataset_id"] == "dataset_train"
|
||||||
|
assert detail["output_count"] == 2
|
||||||
|
assert [item["id"] for item in detail["output_datasets"]] == ["dataset_train"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_published_split_datasets_remain_in_detail_after_regeneration(
|
||||||
|
tmp_path: Path,
|
||||||
|
monkeypatch: pytest.MonkeyPatch,
|
||||||
|
) -> None:
|
||||||
|
client, store, _ = make_client(tmp_path)
|
||||||
|
task_id = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={"name": "保留旧发布数据", "process_type": "structured", "config": {}},
|
||||||
|
).json()["data"]["id"]
|
||||||
|
store.tasks[task_id].update(
|
||||||
|
{
|
||||||
|
"status": "completed",
|
||||||
|
"updated_at": "2026-07-27T09:00:00Z",
|
||||||
|
"output_count": 1,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
store.results[task_id] = [
|
||||||
|
{
|
||||||
|
"id": "result_1",
|
||||||
|
"status": "valid",
|
||||||
|
"instruction": "问题",
|
||||||
|
"input": "",
|
||||||
|
"output": "答案",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
store.previews[task_id] = [{"id": "preview_1", "edited_content": "原切片"}]
|
||||||
|
|
||||||
|
published = client.post(
|
||||||
|
f"/modelTF/data-process/{task_id}/publish",
|
||||||
|
json={"dataset_name": "保留旧发布数据集"},
|
||||||
|
)
|
||||||
|
assert published.status_code == 200
|
||||||
|
published_datasets = published.json()["data"]["datasets"]
|
||||||
|
assert len(published_datasets) == 3
|
||||||
|
published_ids = {item["id"] for item in published_datasets}
|
||||||
|
assert store.tasks[task_id]["output_dataset_id"] in published_ids
|
||||||
|
|
||||||
|
regenerated = client.post(
|
||||||
|
f"/modelTF/data-process/{task_id}/regenerate",
|
||||||
|
json={
|
||||||
|
"name": "保留旧发布数据",
|
||||||
|
"description": "更换生成配置后退出",
|
||||||
|
"process_type": "structured",
|
||||||
|
"config": {"generation_model_id": "model_2"},
|
||||||
|
"expected_updated_at": "2026-07-27T09:00:00Z",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
assert regenerated.status_code == 200
|
||||||
|
original_output_dataset_id = store.tasks[task_id]["output_dataset_id"]
|
||||||
|
prepared_task = regenerated.json()["data"]["task"]
|
||||||
|
assert prepared_task["status"] == "completed"
|
||||||
|
assert prepared_task["output_dataset_id"] == original_output_dataset_id
|
||||||
|
assert prepared_task["output_count"] == 1
|
||||||
|
assert store.results[task_id][0]["id"] == "result_1"
|
||||||
|
|
||||||
|
detail = client.get(f"/modelTF/data-process/{task_id}")
|
||||||
|
assert detail.status_code == 200
|
||||||
|
detail_data = detail.json()["data"]
|
||||||
|
assert detail_data["status"] == "completed"
|
||||||
|
assert detail_data["output_dataset_id"] == original_output_dataset_id
|
||||||
|
assert detail_data["output_count"] == 1
|
||||||
|
assert len(detail_data["output_datasets"]) == 3
|
||||||
|
assert {item["id"] for item in detail_data["output_datasets"]} == published_ids
|
||||||
|
assert set(store.datasets) == published_ids
|
||||||
|
retained_results = client.get(f"/modelTF/data-process/{task_id}/results").json()["data"]
|
||||||
|
assert retained_results["total"] == 1
|
||||||
|
assert retained_results["items"][0]["id"] == "result_1"
|
||||||
|
|
||||||
|
monkeypatch.setattr(data_process_endpoint, "_run_generation", lambda *args: None)
|
||||||
|
started = client.post(f"/modelTF/data-process/{task_id}/generate")
|
||||||
|
assert started.status_code == 200
|
||||||
|
running = started.json()["data"]
|
||||||
|
assert running["status"] == "running"
|
||||||
|
assert running["output_count"] == 0
|
||||||
|
assert store.results[task_id] == []
|
||||||
|
assert set(store.datasets) == published_ids
|
||||||
|
|
||||||
|
running_detail = client.get(f"/modelTF/data-process/{task_id}").json()["data"]
|
||||||
|
assert running_detail["status"] == "running"
|
||||||
|
assert running_detail["output_dataset_id"] is None
|
||||||
|
assert running_detail["output_count"] == 0
|
||||||
|
assert {item["id"] for item in running_detail["output_datasets"]} == published_ids
|
||||||
|
|
||||||
|
|
||||||
def test_regenerate_endpoint_validates_snapshot_and_locked_process_type(
|
def test_regenerate_endpoint_validates_snapshot_and_locked_process_type(
|
||||||
tmp_path: Path,
|
tmp_path: Path,
|
||||||
@@ -945,6 +1180,47 @@ def test_config_validation_and_stop_state(tmp_path: Path) -> None:
|
|||||||
assert stopped.json()["data"]["status"] == "stopped"
|
assert stopped.json()["data"]["status"] == "stopped"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("config_key", ["qa_pairs_per_row", "qa_pairs_per_chunk"])
|
||||||
|
@pytest.mark.parametrize("count", [1, 50])
|
||||||
|
def test_qa_pair_config_accepts_supported_boundaries(
|
||||||
|
tmp_path: Path,
|
||||||
|
config_key: str,
|
||||||
|
count: int,
|
||||||
|
) -> None:
|
||||||
|
client, _, _ = make_client(tmp_path)
|
||||||
|
response = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={
|
||||||
|
"name": "问答数量边界",
|
||||||
|
"process_type": "unstructured",
|
||||||
|
"config": {config_key: count},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("config_key", ["qa_pairs_per_row", "qa_pairs_per_chunk"])
|
||||||
|
@pytest.mark.parametrize("count", [0, 51])
|
||||||
|
def test_qa_pair_config_rejects_out_of_range_boundaries(
|
||||||
|
tmp_path: Path,
|
||||||
|
config_key: str,
|
||||||
|
count: int,
|
||||||
|
) -> None:
|
||||||
|
client, _, _ = make_client(tmp_path)
|
||||||
|
response = client.post(
|
||||||
|
"/modelTF/data-process",
|
||||||
|
json={
|
||||||
|
"name": "问答数量越界",
|
||||||
|
"process_type": "unstructured",
|
||||||
|
"config": {config_key: count},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.status_code == 422
|
||||||
|
assert "[1, 50]" in response.text
|
||||||
|
|
||||||
|
|
||||||
def test_upload_batch_is_atomic_and_empty_files_are_rejected(tmp_path: Path) -> None:
|
def test_upload_batch_is_atomic_and_empty_files_are_rejected(tmp_path: Path) -> None:
|
||||||
client, store, storage = make_client(tmp_path)
|
client, store, storage = make_client(tmp_path)
|
||||||
task_id = client.post(
|
task_id = client.post(
|
||||||
|
|||||||
@@ -3,8 +3,13 @@ from __future__ import annotations
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
|
import pytest
|
||||||
|
|
||||||
from app.modules.data_process.generation import chat_completions_url, generate_model_records
|
from app.modules.data_process.generation import (
|
||||||
|
ModelGenerationError,
|
||||||
|
chat_completions_url,
|
||||||
|
generate_model_records,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_chat_completions_url_accepts_host_base_and_complete_url() -> None:
|
def test_chat_completions_url_accepts_host_base_and_complete_url() -> None:
|
||||||
@@ -100,3 +105,165 @@ def test_generate_model_records_keeps_partial_failure_for_manual_repair() -> Non
|
|||||||
assert len(records) == 1
|
assert len(records) == 1
|
||||||
assert records[0]["status"] == "invalid"
|
assert records[0]["status"] == "invalid"
|
||||||
assert records[0]["error"]
|
assert records[0]["error"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_model_records_batches_fifty_results_with_unique_ids() -> None:
|
||||||
|
requests: list[httpx.Request] = []
|
||||||
|
|
||||||
|
def handler(request: httpx.Request) -> httpx.Response:
|
||||||
|
requests.append(request)
|
||||||
|
batch_start = (len(requests) - 1) * 10 + 1
|
||||||
|
batch_end = batch_start + 9
|
||||||
|
payload = json.loads(request.content)
|
||||||
|
system_prompt = payload["messages"][0]["content"]
|
||||||
|
assert "items 必须包含 10 条" in system_prompt
|
||||||
|
assert f"第 {batch_start}-{batch_end} 条" in system_prompt
|
||||||
|
return httpx.Response(
|
||||||
|
200,
|
||||||
|
json={
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"message": {
|
||||||
|
"content": json.dumps(
|
||||||
|
{
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"instruction": "同一问题",
|
||||||
|
"input": "来源正文",
|
||||||
|
"output": "同一答案",
|
||||||
|
}
|
||||||
|
for _ in range(batch_start, batch_end + 1)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
ensure_ascii=False,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
records = generate_model_records(
|
||||||
|
[{"id": "preview-50", "edited_content": "来源正文"}],
|
||||||
|
model={"name": "model", "api_url": "https://model.example/v1"},
|
||||||
|
config={},
|
||||||
|
task_id="task-50",
|
||||||
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
|
qa_pairs_per_item=50,
|
||||||
|
client=httpx.Client(transport=httpx.MockTransport(handler)),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(requests) == 5
|
||||||
|
assert len(records) == 50
|
||||||
|
assert len({record["id"] for record in records}) == 50
|
||||||
|
assert {record["instruction"] for record in records} == {"同一问题"}
|
||||||
|
assert all(record["status"] == "valid" for record in records)
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_model_records_preserves_successful_batches_when_one_fails() -> None:
|
||||||
|
request_count = 0
|
||||||
|
|
||||||
|
def handler(_: httpx.Request) -> httpx.Response:
|
||||||
|
nonlocal request_count
|
||||||
|
request_count += 1
|
||||||
|
if request_count == 2:
|
||||||
|
return httpx.Response(500)
|
||||||
|
return httpx.Response(
|
||||||
|
200,
|
||||||
|
json={
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"message": {
|
||||||
|
"content": json.dumps(
|
||||||
|
{
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"instruction": f"问题 {index}",
|
||||||
|
"output": f"答案 {index}",
|
||||||
|
}
|
||||||
|
for index in range(1, 11)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
ensure_ascii=False,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
records = generate_model_records(
|
||||||
|
[{"id": "preview-partial", "edited_content": "来源正文"}],
|
||||||
|
model={"name": "model", "api_url": "https://model.example/v1"},
|
||||||
|
config={"generation_retries": 0},
|
||||||
|
task_id="task-partial",
|
||||||
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
|
qa_pairs_per_item=20,
|
||||||
|
client=httpx.Client(transport=httpx.MockTransport(handler)),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(records) == 11
|
||||||
|
assert sum(record["status"] == "valid" for record in records) == 10
|
||||||
|
failed = next(record for record in records if record["status"] == "invalid")
|
||||||
|
assert "第 11-20 条" in failed["instruction"]
|
||||||
|
assert len({record["id"] for record in records}) == len(records)
|
||||||
|
|
||||||
|
|
||||||
|
def test_generate_model_records_retries_short_batch_then_marks_it_invalid() -> None:
|
||||||
|
request_count = 0
|
||||||
|
|
||||||
|
def handler(_: httpx.Request) -> httpx.Response:
|
||||||
|
nonlocal request_count
|
||||||
|
request_count += 1
|
||||||
|
return httpx.Response(
|
||||||
|
200,
|
||||||
|
json={
|
||||||
|
"choices": [
|
||||||
|
{
|
||||||
|
"message": {
|
||||||
|
"content": json.dumps(
|
||||||
|
{
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"instruction": "只有一条",
|
||||||
|
"output": "不足本批要求数量",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
ensure_ascii=False,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
records = generate_model_records(
|
||||||
|
[{"id": "preview-short", "edited_content": "来源正文"}],
|
||||||
|
model={"name": "model", "api_url": "https://model.example/v1"},
|
||||||
|
config={"generation_retries": 1},
|
||||||
|
task_id="task-short",
|
||||||
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
|
qa_pairs_per_item=10,
|
||||||
|
client=httpx.Client(transport=httpx.MockTransport(handler)),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert request_count == 2
|
||||||
|
assert len(records) == 1
|
||||||
|
assert records[0]["status"] == "invalid"
|
||||||
|
assert "expected 10, got 1" in records[0]["error"]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("qa_pairs_per_item", [0, 51])
|
||||||
|
def test_generate_model_records_rejects_out_of_range_count(
|
||||||
|
qa_pairs_per_item: int,
|
||||||
|
) -> None:
|
||||||
|
with pytest.raises(ModelGenerationError, match=r"\[1, 50\]"):
|
||||||
|
generate_model_records(
|
||||||
|
[],
|
||||||
|
model={"name": "model", "api_url": "https://model.example/v1"},
|
||||||
|
config={},
|
||||||
|
task_id="task-invalid",
|
||||||
|
split={"train": 100, "validation": 0, "test": 0},
|
||||||
|
qa_pairs_per_item=qa_pairs_per_item,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
from collections.abc import Iterator
|
from collections.abc import Iterator
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
@@ -31,9 +32,13 @@ class _Result:
|
|||||||
|
|
||||||
|
|
||||||
class _PublishConnection:
|
class _PublishConnection:
|
||||||
def __init__(self, results: list[dict[str, Any]]):
|
def __init__(
|
||||||
|
self,
|
||||||
|
results: list[dict[str, Any]],
|
||||||
|
datasets: list[dict[str, Any]] | None = None,
|
||||||
|
):
|
||||||
self.results = results
|
self.results = results
|
||||||
self.datasets: list[dict[str, Any]] = []
|
self.datasets: list[dict[str, Any]] = datasets or []
|
||||||
self.files: list[dict[str, Any]] = []
|
self.files: list[dict[str, Any]] = []
|
||||||
self.records: list[dict[str, Any]] = []
|
self.records: list[dict[str, Any]] = []
|
||||||
|
|
||||||
@@ -47,16 +52,38 @@ class _PublishConnection:
|
|||||||
)
|
)
|
||||||
if normalized.startswith("SELECT * FROM data_process_results"):
|
if normalized.startswith("SELECT * FROM data_process_results"):
|
||||||
return _Result(rows=self.results)
|
return _Result(rows=self.results)
|
||||||
if normalized.startswith("SELECT * FROM datasets WHERE source_task_id"):
|
if normalized.startswith("SELECT * FROM datasets WHERE source='task'"):
|
||||||
return _Result(rows=self.datasets)
|
assert "source_task_id=%s" in normalized
|
||||||
|
assert "source_task_id IS NULL AND task_id=%s" in normalized
|
||||||
|
assert "deleted_at IS NULL" in normalized
|
||||||
|
source_task_id, legacy_task_id = params
|
||||||
|
return _Result(
|
||||||
|
rows=[
|
||||||
|
item
|
||||||
|
for item in self.datasets
|
||||||
|
if item.get("source") == "task"
|
||||||
|
and item.get("deleted_at") is None
|
||||||
|
and (
|
||||||
|
item.get("source_task_id") == source_task_id
|
||||||
|
or (
|
||||||
|
item.get("source_task_id") is None
|
||||||
|
and item.get("task_id") == legacy_task_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
if normalized.startswith("INSERT INTO datasets"):
|
if normalized.startswith("INSERT INTO datasets"):
|
||||||
dataset = {
|
dataset = {
|
||||||
"id": params[0],
|
"id": params[0],
|
||||||
"name": params[1],
|
"name": params[1],
|
||||||
"type": params[2],
|
"type": params[2],
|
||||||
|
"source": "task",
|
||||||
|
"task_id": params[4],
|
||||||
|
"source_task_id": params[5],
|
||||||
"count": params[8],
|
"count": params[8],
|
||||||
"record_count": params[9],
|
"record_count": params[9],
|
||||||
"metadata": params[11],
|
"metadata": params[11],
|
||||||
|
"deleted_at": None,
|
||||||
}
|
}
|
||||||
self.datasets.append(dataset)
|
self.datasets.append(dataset)
|
||||||
return _Result(row=dataset)
|
return _Result(row=dataset)
|
||||||
@@ -118,12 +145,34 @@ class _PublishStore(DataProcessStore):
|
|||||||
|
|
||||||
|
|
||||||
class _RegenerationConnection:
|
class _RegenerationConnection:
|
||||||
def __init__(self, task: dict[str, Any]) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
task: dict[str, Any],
|
||||||
|
datasets: list[dict[str, Any]] | None = None,
|
||||||
|
) -> None:
|
||||||
self.task = task
|
self.task = task
|
||||||
self.datasets = [
|
self.datasets = datasets or [
|
||||||
{"id": "dataset_train"},
|
{
|
||||||
{"id": "dataset_validation"},
|
"id": "dataset_train",
|
||||||
{"id": "dataset_test"},
|
"source": "task",
|
||||||
|
"task_id": task["id"],
|
||||||
|
"source_task_id": task["id"],
|
||||||
|
"deleted_at": None,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dataset_validation",
|
||||||
|
"source": "task",
|
||||||
|
"task_id": task["id"],
|
||||||
|
"source_task_id": task["id"],
|
||||||
|
"deleted_at": None,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dataset_test",
|
||||||
|
"source": "task",
|
||||||
|
"task_id": task["id"],
|
||||||
|
"source_task_id": task["id"],
|
||||||
|
"deleted_at": None,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
self.sources = [{"id": "source_1"}]
|
self.sources = [{"id": "source_1"}]
|
||||||
self.previews = [{"id": "preview_1"}]
|
self.previews = [{"id": "preview_1"}]
|
||||||
@@ -133,8 +182,35 @@ class _RegenerationConnection:
|
|||||||
normalized = " ".join(sql.split())
|
normalized = " ".join(sql.split())
|
||||||
if params is not None:
|
if params is not None:
|
||||||
assert normalized.count("%s") == len(params)
|
assert normalized.count("%s") == len(params)
|
||||||
|
if normalized.startswith("UPDATE datasets SET source_task_id="):
|
||||||
|
source_task_id, _, legacy_task_id = params
|
||||||
|
for dataset in self.datasets:
|
||||||
|
if (
|
||||||
|
dataset.get("source") == "task"
|
||||||
|
and dataset.get("source_task_id") is None
|
||||||
|
and dataset.get("task_id") == legacy_task_id
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
):
|
||||||
|
dataset["source_task_id"] = source_task_id
|
||||||
|
return _Result()
|
||||||
if normalized.startswith("SELECT EXISTS("):
|
if normalized.startswith("SELECT EXISTS("):
|
||||||
return _Result(row={"exists": bool(self.datasets)})
|
assert "source_task_id=%s" in normalized
|
||||||
|
assert "source_task_id IS NULL AND task_id=%s" in normalized
|
||||||
|
assert "deleted_at IS NULL" in normalized
|
||||||
|
source_task_id, legacy_task_id = params
|
||||||
|
exists = any(
|
||||||
|
dataset.get("source") == "task"
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
and (
|
||||||
|
dataset.get("source_task_id") == source_task_id
|
||||||
|
or (
|
||||||
|
dataset.get("source_task_id") is None
|
||||||
|
and dataset.get("task_id") == legacy_task_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
for dataset in self.datasets
|
||||||
|
)
|
||||||
|
return _Result(row={"exists": exists})
|
||||||
if normalized.startswith("DELETE FROM data_process_results"):
|
if normalized.startswith("DELETE FROM data_process_results"):
|
||||||
self.results.clear()
|
self.results.clear()
|
||||||
return _Result()
|
return _Result()
|
||||||
@@ -149,18 +225,7 @@ class _RegenerationConnection:
|
|||||||
"name": params[0],
|
"name": params[0],
|
||||||
"description": params[1],
|
"description": params[1],
|
||||||
"config": params[2],
|
"config": params[2],
|
||||||
"status": "pending",
|
"updated_at": params[3],
|
||||||
"progress": params[3],
|
|
||||||
"output_dataset_id": None,
|
|
||||||
"output_count": 0,
|
|
||||||
"filtered_count": 0,
|
|
||||||
"duplicate_count": 0,
|
|
||||||
"error_count": 0,
|
|
||||||
"failure_reason": None,
|
|
||||||
"generation_run_id": None,
|
|
||||||
"started_at": None,
|
|
||||||
"completed_at": None,
|
|
||||||
"updated_at": params[4],
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return _Result(row=dict(self.task))
|
return _Result(row=dict(self.task))
|
||||||
@@ -183,6 +248,295 @@ class _RegenerationStore(DataProcessStore):
|
|||||||
return dict(self._conn.task)
|
return dict(self._conn.task)
|
||||||
|
|
||||||
|
|
||||||
|
class _TaskDetailConnection:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
task: dict[str, Any],
|
||||||
|
datasets: list[dict[str, Any]],
|
||||||
|
) -> None:
|
||||||
|
self.task = task
|
||||||
|
self.datasets = datasets
|
||||||
|
|
||||||
|
def execute(self, sql: str, params: Any = None) -> _Result:
|
||||||
|
normalized = " ".join(sql.split())
|
||||||
|
assert normalized.startswith("SELECT task.*")
|
||||||
|
assert "dataset.source_task_id=task.id" in normalized
|
||||||
|
assert "dataset.source_task_id IS NULL AND dataset.task_id=task.id" in normalized
|
||||||
|
assert "dataset.deleted_at IS NULL" in normalized
|
||||||
|
assert "dataset.metadata::jsonb" not in normalized
|
||||||
|
assert "WHEN 'train' THEN 'train'" in normalized
|
||||||
|
assert "WHEN 'val' THEN 'validation'" in normalized
|
||||||
|
assert "WHEN 'test' THEN 'test'" in normalized
|
||||||
|
task_id = params[0]
|
||||||
|
visible = [
|
||||||
|
dataset
|
||||||
|
for dataset in self.datasets
|
||||||
|
if dataset.get("source") == "task"
|
||||||
|
and dataset.get("deleted_at") is None
|
||||||
|
and (
|
||||||
|
dataset.get("source_task_id") == task_id
|
||||||
|
or (
|
||||||
|
dataset.get("source_task_id") is None
|
||||||
|
and dataset.get("task_id") == task_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
return _Result(
|
||||||
|
row={
|
||||||
|
**self.task,
|
||||||
|
"output_datasets": json.dumps(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": item["id"],
|
||||||
|
"name": item["name"],
|
||||||
|
"type": item["type"],
|
||||||
|
"count": item["count"],
|
||||||
|
"dataset_split": item["dataset_split"],
|
||||||
|
}
|
||||||
|
for item in visible
|
||||||
|
]
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class _TaskDetailStore(DataProcessStore):
|
||||||
|
def __init__(self, conn: _TaskDetailConnection) -> None:
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def connect(self) -> Iterator[_TaskDetailConnection]:
|
||||||
|
yield self._conn
|
||||||
|
|
||||||
|
|
||||||
|
class _TaskListConnection:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.task = {
|
||||||
|
**_regeneration_task(
|
||||||
|
status="pending",
|
||||||
|
output_dataset_id=None,
|
||||||
|
output_count=17,
|
||||||
|
),
|
||||||
|
"created_at": "2026-07-25T18:00:00Z",
|
||||||
|
"deleted_at": None,
|
||||||
|
}
|
||||||
|
self.sources = [
|
||||||
|
{"task_id": "task-1", "deleted_at": None},
|
||||||
|
{"task_id": "task-1", "deleted_at": None},
|
||||||
|
{"task_id": "task-1", "deleted_at": "2026-07-26T00:00:00Z"},
|
||||||
|
]
|
||||||
|
|
||||||
|
def execute(self, sql: str, params: Any = None) -> _Result:
|
||||||
|
normalized = " ".join(sql.split())
|
||||||
|
if normalized.startswith("SELECT COUNT(*) AS count FROM data_process_tasks task"):
|
||||||
|
assert "task.deleted_at IS NULL" in normalized
|
||||||
|
return _Result(row={"count": 1})
|
||||||
|
assert normalized.startswith("SELECT task.*")
|
||||||
|
assert "source_file.task_id=task.id" in normalized
|
||||||
|
assert "source_file.deleted_at IS NULL" in normalized
|
||||||
|
source_file_count = sum(
|
||||||
|
item["task_id"] == self.task["id"] and item["deleted_at"] is None
|
||||||
|
for item in self.sources
|
||||||
|
)
|
||||||
|
return _Result(
|
||||||
|
rows=[
|
||||||
|
{
|
||||||
|
**self.task,
|
||||||
|
"source_file_count": source_file_count,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class _TaskListStore(DataProcessStore):
|
||||||
|
def __init__(self, conn: _TaskListConnection) -> None:
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def connect(self) -> Iterator[_TaskListConnection]:
|
||||||
|
yield self._conn
|
||||||
|
|
||||||
|
|
||||||
|
class _LegacyRecoveryConnection:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.task = {
|
||||||
|
**_regeneration_task(
|
||||||
|
status="pending",
|
||||||
|
progress=20,
|
||||||
|
output_dataset_id=None,
|
||||||
|
output_count=0,
|
||||||
|
generation_run_id=None,
|
||||||
|
started_at=None,
|
||||||
|
completed_at=None,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
self.datasets = [
|
||||||
|
{"id": "dataset_train", "type": "train", "count": 1, "created_at": "2026-07-25T18:12:00Z"},
|
||||||
|
{"id": "dataset_test", "type": "test", "count": 1, "created_at": "2026-07-25T18:12:00Z"},
|
||||||
|
]
|
||||||
|
self.records = [
|
||||||
|
{
|
||||||
|
"id": "record_train",
|
||||||
|
"dataset_id": "dataset_train",
|
||||||
|
"line_no": 1,
|
||||||
|
"split": "train",
|
||||||
|
"instruction": "训练问题",
|
||||||
|
"input": "",
|
||||||
|
"output": "训练答案",
|
||||||
|
"raw": json.dumps(
|
||||||
|
{
|
||||||
|
"source_result_id": "result_train",
|
||||||
|
"preview_item_id": "preview_1",
|
||||||
|
}
|
||||||
|
),
|
||||||
|
"status": "valid",
|
||||||
|
"source_result_id": None,
|
||||||
|
"preview_item_id": None,
|
||||||
|
"created_at": "2026-07-25T18:12:00Z",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "record_test",
|
||||||
|
"dataset_id": "dataset_test",
|
||||||
|
"line_no": 1,
|
||||||
|
"split": "test",
|
||||||
|
"instruction": "测试问题",
|
||||||
|
"input": "输入",
|
||||||
|
"output": "测试答案",
|
||||||
|
"raw": json.dumps({"source_result_id": "result_test"}),
|
||||||
|
"status": "modified",
|
||||||
|
"source_result_id": None,
|
||||||
|
"preview_item_id": None,
|
||||||
|
"created_at": "2026-07-25T18:12:00Z",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
self.previews = [{"id": "preview_1"}]
|
||||||
|
self.results: list[dict[str, Any]] = []
|
||||||
|
|
||||||
|
def execute(self, sql: str, params: Any = None) -> _Result:
|
||||||
|
normalized = " ".join(sql.split())
|
||||||
|
if normalized.startswith("SELECT COUNT(*) AS count FROM data_process_results"):
|
||||||
|
return _Result(row={"count": len(self.results)})
|
||||||
|
if normalized.startswith("SELECT id, type, count, created_at FROM datasets"):
|
||||||
|
return _Result(rows=list(self.datasets))
|
||||||
|
if normalized.startswith("SELECT id, dataset_id, line_no, split"):
|
||||||
|
return _Result(rows=list(self.records))
|
||||||
|
if normalized.startswith("SELECT id FROM data_process_preview_items"):
|
||||||
|
return _Result(rows=list(self.previews))
|
||||||
|
if normalized.startswith("INSERT INTO data_process_results"):
|
||||||
|
self.results.append(
|
||||||
|
{
|
||||||
|
"id": params[0],
|
||||||
|
"task_id": params[1],
|
||||||
|
"preview_item_id": params[2],
|
||||||
|
"instruction": params[3],
|
||||||
|
"input": params[4],
|
||||||
|
"output": params[5],
|
||||||
|
"status": params[9],
|
||||||
|
"split": params[10],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return _Result()
|
||||||
|
if normalized.startswith("UPDATE dataset_records SET source_result_id="):
|
||||||
|
record = next(item for item in self.records if item["id"] == params[2])
|
||||||
|
record["source_result_id"] = params[0]
|
||||||
|
record["preview_item_id"] = params[1]
|
||||||
|
return _Result()
|
||||||
|
if normalized.startswith("UPDATE data_process_tasks SET status='completed'"):
|
||||||
|
self.task.update(
|
||||||
|
{
|
||||||
|
"status": "completed",
|
||||||
|
"progress": 100,
|
||||||
|
"output_dataset_id": params[0],
|
||||||
|
"output_count": params[1],
|
||||||
|
"completed_at": params[3],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return _Result()
|
||||||
|
raise AssertionError(f"unexpected SQL: {normalized}")
|
||||||
|
|
||||||
|
|
||||||
|
class _LegacyRecoveryStore(DataProcessStore):
|
||||||
|
def __init__(self, conn: _LegacyRecoveryConnection) -> None:
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def connect(self) -> Iterator[_LegacyRecoveryConnection]:
|
||||||
|
yield self._conn
|
||||||
|
|
||||||
|
def _task_in_connection(
|
||||||
|
self, conn: Any, task_id: str, *, for_update: bool = False
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
assert task_id == "task-1"
|
||||||
|
assert for_update is True
|
||||||
|
return dict(self._conn.task)
|
||||||
|
|
||||||
|
|
||||||
|
class _StartGenerationConnection:
|
||||||
|
def __init__(self, *, published_prepared: bool = False, preview_count: int = 1) -> None:
|
||||||
|
config = {"chunk_method": "fixed", "temperature": 0.7}
|
||||||
|
if published_prepared:
|
||||||
|
config["_regeneration_prepared"] = {
|
||||||
|
"prepared": True,
|
||||||
|
"preview_invalidated": False,
|
||||||
|
}
|
||||||
|
self.task = {
|
||||||
|
**_regeneration_task(
|
||||||
|
status="completed" if published_prepared else "pending",
|
||||||
|
config=config,
|
||||||
|
output_dataset_id="dataset_train" if published_prepared else None,
|
||||||
|
output_count=28,
|
||||||
|
),
|
||||||
|
"generation_run_id": None,
|
||||||
|
}
|
||||||
|
self.preview_count = preview_count
|
||||||
|
self.results = [{"id": "old-result"}]
|
||||||
|
|
||||||
|
def execute(self, sql: str, params: Any = None) -> _Result:
|
||||||
|
normalized = " ".join(sql.split())
|
||||||
|
if normalized.startswith("SELECT COUNT(*) AS count FROM data_process_preview_items"):
|
||||||
|
return _Result(row={"count": self.preview_count})
|
||||||
|
if normalized.startswith("DELETE FROM data_process_results"):
|
||||||
|
self.results.clear()
|
||||||
|
return _Result()
|
||||||
|
assert normalized.startswith("UPDATE data_process_tasks SET config=%s, status='running'")
|
||||||
|
assert "output_dataset_id=NULL" in normalized
|
||||||
|
assert "output_count=0" in normalized
|
||||||
|
self.task.update(
|
||||||
|
{
|
||||||
|
"config": params[0],
|
||||||
|
"status": "running",
|
||||||
|
"progress": 30,
|
||||||
|
"output_count": 0,
|
||||||
|
"output_dataset_id": None,
|
||||||
|
"failure_reason": None,
|
||||||
|
"started_at": params[1],
|
||||||
|
"completed_at": None,
|
||||||
|
"filtered_count": 0,
|
||||||
|
"duplicate_count": 0,
|
||||||
|
"error_count": 0,
|
||||||
|
"generation_run_id": params[2],
|
||||||
|
"updated_at": params[3],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return _Result(row=dict(self.task))
|
||||||
|
|
||||||
|
|
||||||
|
class _StartGenerationStore(DataProcessStore):
|
||||||
|
def __init__(self, conn: _StartGenerationConnection) -> None:
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def connect(self) -> Iterator[_StartGenerationConnection]:
|
||||||
|
yield self._conn
|
||||||
|
|
||||||
|
def _task_in_connection(
|
||||||
|
self, conn: Any, task_id: str, *, for_update: bool = False
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
assert task_id == "task-1"
|
||||||
|
assert for_update is True
|
||||||
|
return dict(self._conn.task)
|
||||||
|
|
||||||
|
|
||||||
def test_decode_row_serializes_postgres_numeric_values_as_json_numbers() -> None:
|
def test_decode_row_serializes_postgres_numeric_values_as_json_numbers() -> None:
|
||||||
decoded = _decode_row(
|
decoded = _decode_row(
|
||||||
{
|
{
|
||||||
@@ -194,6 +548,20 @@ def test_decode_row_serializes_postgres_numeric_values_as_json_numbers() -> None
|
|||||||
assert decoded == {"progress": 100.0, "duration_seconds": 389.0}
|
assert decoded == {"progress": 100.0, "duration_seconds": 389.0}
|
||||||
|
|
||||||
|
|
||||||
|
def test_decode_row_decodes_aggregated_output_datasets_json() -> None:
|
||||||
|
decoded = _decode_row(
|
||||||
|
{
|
||||||
|
"id": "task-1",
|
||||||
|
"output_datasets": '[{"id":"dataset_train","type":"train"}]',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert decoded == {
|
||||||
|
"id": "task-1",
|
||||||
|
"output_datasets": [{"id": "dataset_train", "type": "train"}],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
("process_type", "current", "next_config", "expected"),
|
("process_type", "current", "next_config", "expected"),
|
||||||
[
|
[
|
||||||
@@ -314,6 +682,119 @@ def _regeneration_task(**updates: Any) -> dict[str, Any]:
|
|||||||
return task
|
return task
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_tasks_exposes_source_and_generation_counts() -> None:
|
||||||
|
page = _TaskListStore(_TaskListConnection()).list_tasks(page=1, page_size=20)
|
||||||
|
|
||||||
|
assert page["total"] == 1
|
||||||
|
assert page["page"] == 1
|
||||||
|
assert page["page_size"] == 20
|
||||||
|
item = page["items"][0]
|
||||||
|
assert item["status"] == "pending"
|
||||||
|
assert item["source_file_count"] == 2
|
||||||
|
assert item["output_count"] == 17
|
||||||
|
assert item["output_dataset_id"] is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_start_generation_clears_previous_output_count() -> None:
|
||||||
|
conn = _StartGenerationConnection()
|
||||||
|
|
||||||
|
task = _StartGenerationStore(conn).start_generation("task-1")
|
||||||
|
|
||||||
|
assert task["status"] == "running"
|
||||||
|
assert task["output_count"] == 0
|
||||||
|
assert conn.results == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_prepared_published_task_is_only_cleared_when_generation_starts() -> None:
|
||||||
|
conn = _StartGenerationConnection(published_prepared=True)
|
||||||
|
|
||||||
|
task = _StartGenerationStore(conn).start_generation("task-1")
|
||||||
|
|
||||||
|
assert task["status"] == "running"
|
||||||
|
assert task["output_dataset_id"] is None
|
||||||
|
assert task["output_count"] == 0
|
||||||
|
assert "_regeneration_prepared" not in task["config"]
|
||||||
|
assert conn.results == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_prepared_published_task_survives_generation_preflight_failure() -> None:
|
||||||
|
conn = _StartGenerationConnection(published_prepared=True, preview_count=0)
|
||||||
|
|
||||||
|
with pytest.raises(InvalidStateError, match="preview must be built"):
|
||||||
|
_StartGenerationStore(conn).start_generation("task-1")
|
||||||
|
|
||||||
|
assert conn.task["status"] == "completed"
|
||||||
|
assert conn.task["output_dataset_id"] == "dataset_train"
|
||||||
|
assert conn.task["output_count"] == 28
|
||||||
|
assert "_regeneration_prepared" in conn.task["config"]
|
||||||
|
assert conn.results == [{"id": "old-result"}]
|
||||||
|
|
||||||
|
|
||||||
|
def test_legacy_aborted_regeneration_recovers_results_and_published_state() -> None:
|
||||||
|
conn = _LegacyRecoveryConnection()
|
||||||
|
store = _LegacyRecoveryStore(conn)
|
||||||
|
|
||||||
|
recovered = store.recover_legacy_aborted_regeneration("task-1")
|
||||||
|
|
||||||
|
assert recovered == {"recovered": True, "result_count": 2}
|
||||||
|
assert conn.task["status"] == "completed"
|
||||||
|
assert conn.task["progress"] == 100
|
||||||
|
assert conn.task["output_dataset_id"] == "dataset_train"
|
||||||
|
assert conn.task["output_count"] == 2
|
||||||
|
assert [item["id"] for item in conn.results] == ["result_train", "result_test"]
|
||||||
|
assert conn.results[0]["preview_item_id"] == "preview_1"
|
||||||
|
assert conn.results[1]["preview_item_id"] is None
|
||||||
|
assert conn.records[0]["source_result_id"] == "result_train"
|
||||||
|
assert conn.records[0]["preview_item_id"] == "preview_1"
|
||||||
|
|
||||||
|
repeated = store.recover_legacy_aborted_regeneration("task-1")
|
||||||
|
assert repeated == {"recovered": False, "result_count": 0}
|
||||||
|
assert len(conn.results) == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_normal_pending_task_is_not_mistaken_for_legacy_regeneration() -> None:
|
||||||
|
conn = _LegacyRecoveryConnection()
|
||||||
|
conn.datasets = []
|
||||||
|
conn.records = []
|
||||||
|
|
||||||
|
result = _LegacyRecoveryStore(conn).recover_legacy_aborted_regeneration("task-1")
|
||||||
|
|
||||||
|
assert result == {"recovered": False, "result_count": 0}
|
||||||
|
assert conn.task["status"] == "pending"
|
||||||
|
assert conn.results == []
|
||||||
|
|
||||||
|
|
||||||
|
def _legacy_published_datasets(task_id: str = "task-1") -> list[dict[str, Any]]:
|
||||||
|
specs = (
|
||||||
|
("dataset_train", "制度问答-训练集", "train", "train", 22),
|
||||||
|
("dataset_validation", "制度问答-验证集", "val", "validation", 3),
|
||||||
|
("dataset_test", "制度问答-测试集", "test", "test", 3),
|
||||||
|
)
|
||||||
|
dataset_ids = {split: dataset_id for dataset_id, _, _, split, _ in specs}
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"id": dataset_id,
|
||||||
|
"name": name,
|
||||||
|
"type": dataset_type,
|
||||||
|
"source": "task",
|
||||||
|
"task_id": task_id,
|
||||||
|
"source_task_id": None,
|
||||||
|
"count": count,
|
||||||
|
"record_count": count,
|
||||||
|
"dataset_split": split,
|
||||||
|
"metadata": json.dumps(
|
||||||
|
{
|
||||||
|
"base_dataset_name": "制度问答",
|
||||||
|
"dataset_split": split,
|
||||||
|
"split_dataset_ids": dataset_ids,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
"deleted_at": None,
|
||||||
|
}
|
||||||
|
for dataset_id, name, dataset_type, split, count in specs
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_prepare_regeneration_preserves_outputs_sources_and_generation_only_preview() -> None:
|
def test_prepare_regeneration_preserves_outputs_sources_and_generation_only_preview() -> None:
|
||||||
conn = _RegenerationConnection(_regeneration_task())
|
conn = _RegenerationConnection(_regeneration_task())
|
||||||
original_datasets = list(conn.datasets)
|
original_datasets = list(conn.datasets)
|
||||||
@@ -332,19 +813,82 @@ def test_prepare_regeneration_preserves_outputs_sources_and_generation_only_prev
|
|||||||
|
|
||||||
assert result["preview_invalidated"] is False
|
assert result["preview_invalidated"] is False
|
||||||
assert result["published_outputs_preserved"] is True
|
assert result["published_outputs_preserved"] is True
|
||||||
assert result["task"]["output_dataset_id"] is None
|
assert result["task"]["output_dataset_id"] == "dataset_train"
|
||||||
assert result["task"]["status"] == "pending"
|
assert result["task"]["status"] == "completed"
|
||||||
assert result["task"]["progress"] == 20
|
assert result["task"]["progress"] == 100
|
||||||
assert result["task"]["output_count"] == 0
|
assert result["task"]["output_count"] == 28
|
||||||
assert result["task"]["started_at"] is None
|
assert result["task"]["started_at"] == "2026-07-25T18:00:00Z"
|
||||||
assert result["task"]["completed_at"] is None
|
assert result["task"]["completed_at"] == "2026-07-25T18:05:00Z"
|
||||||
assert conn.results == []
|
assert "_regeneration_prepared" not in result["task"]["config"]
|
||||||
|
stored_config = json.loads(conn.task["config"])
|
||||||
|
assert stored_config["_regeneration_prepared"]["prepared"] is True
|
||||||
|
assert conn.results == [{"id": "result_1"}]
|
||||||
assert conn.previews == [{"id": "preview_1"}]
|
assert conn.previews == [{"id": "preview_1"}]
|
||||||
assert conn.datasets == original_datasets
|
assert conn.datasets == original_datasets
|
||||||
assert conn.sources == original_sources
|
assert conn.sources == original_sources
|
||||||
|
|
||||||
|
|
||||||
def test_prepare_regeneration_deletes_preview_when_chunk_configuration_changes() -> None:
|
def test_prepare_regeneration_backfills_and_keeps_legacy_task_datasets_visible() -> None:
|
||||||
|
legacy_datasets = _legacy_published_datasets()
|
||||||
|
# 历史 metadata 可能不是合法 JSON,详情查询不能再依赖 metadata::jsonb。
|
||||||
|
legacy_datasets[0]["metadata"] = "{legacy-invalid-json"
|
||||||
|
deleted_dataset = {
|
||||||
|
**legacy_datasets[0],
|
||||||
|
"id": "dataset_deleted",
|
||||||
|
"name": "已删除训练集",
|
||||||
|
"deleted_at": "2026-07-25T20:00:00Z",
|
||||||
|
}
|
||||||
|
unrelated_dataset = {
|
||||||
|
**legacy_datasets[0],
|
||||||
|
"id": "dataset_unrelated",
|
||||||
|
"name": "其他任务训练集",
|
||||||
|
"task_id": "task-other",
|
||||||
|
}
|
||||||
|
conn = _RegenerationConnection(
|
||||||
|
_regeneration_task(),
|
||||||
|
[*legacy_datasets, deleted_dataset, unrelated_dataset],
|
||||||
|
)
|
||||||
|
|
||||||
|
before = _TaskDetailStore(_TaskDetailConnection(conn.task, conn.datasets)).get_task(
|
||||||
|
"task-1"
|
||||||
|
)
|
||||||
|
assert [item["id"] for item in before["output_datasets"]] == [
|
||||||
|
"dataset_train",
|
||||||
|
"dataset_validation",
|
||||||
|
"dataset_test",
|
||||||
|
]
|
||||||
|
|
||||||
|
result = _RegenerationStore(conn).prepare_regeneration(
|
||||||
|
"task-1",
|
||||||
|
{
|
||||||
|
"name": "原任务",
|
||||||
|
"description": "",
|
||||||
|
"process_type": "unstructured",
|
||||||
|
"config": {"chunk_method": "fixed", "temperature": 0.2},
|
||||||
|
"expected_updated_at": "2026-07-25T18:05:00Z",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["published_outputs_preserved"] is True
|
||||||
|
assert result["task"]["output_dataset_id"] == "dataset_train"
|
||||||
|
assert len(conn.datasets) == 5
|
||||||
|
assert all(
|
||||||
|
item["source_task_id"] == "task-1" for item in conn.datasets[:3]
|
||||||
|
)
|
||||||
|
assert deleted_dataset["source_task_id"] is None
|
||||||
|
assert unrelated_dataset["source_task_id"] is None
|
||||||
|
|
||||||
|
after = _TaskDetailStore(_TaskDetailConnection(conn.task, conn.datasets)).get_task(
|
||||||
|
"task-1"
|
||||||
|
)
|
||||||
|
assert [item["id"] for item in after["output_datasets"]] == [
|
||||||
|
"dataset_train",
|
||||||
|
"dataset_validation",
|
||||||
|
"dataset_test",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_prepare_regeneration_defers_preview_deletion_when_chunk_configuration_changes() -> None:
|
||||||
conn = _RegenerationConnection(_regeneration_task(output_dataset_id=None))
|
conn = _RegenerationConnection(_regeneration_task(output_dataset_id=None))
|
||||||
|
|
||||||
result = _RegenerationStore(conn).prepare_regeneration(
|
result = _RegenerationStore(conn).prepare_regeneration(
|
||||||
@@ -360,9 +904,11 @@ def test_prepare_regeneration_deletes_preview_when_chunk_configuration_changes()
|
|||||||
|
|
||||||
assert result["preview_invalidated"] is True
|
assert result["preview_invalidated"] is True
|
||||||
assert result["published_outputs_preserved"] is True
|
assert result["published_outputs_preserved"] is True
|
||||||
assert result["task"]["progress"] == 0
|
assert result["task"]["status"] == "completed"
|
||||||
assert conn.previews == []
|
assert result["task"]["progress"] == 100
|
||||||
assert conn.results == []
|
assert result["task"]["output_count"] == 28
|
||||||
|
assert conn.previews == [{"id": "preview_1"}]
|
||||||
|
assert conn.results == [{"id": "result_1"}]
|
||||||
assert len(conn.datasets) == 3
|
assert len(conn.datasets) == 3
|
||||||
|
|
||||||
|
|
||||||
@@ -467,6 +1013,37 @@ def test_publish_creates_three_independent_datasets_with_exact_counts() -> None:
|
|||||||
assert republished["created"] is False
|
assert republished["created"] is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_publish_reuses_legacy_task_id_only_split_datasets() -> None:
|
||||||
|
results = [
|
||||||
|
{
|
||||||
|
"id": f"result-{index}",
|
||||||
|
"status": "valid",
|
||||||
|
"instruction": f"问题 {index}",
|
||||||
|
"input": "",
|
||||||
|
"output": f"答案 {index}",
|
||||||
|
"preview_item_id": f"preview-{index}",
|
||||||
|
}
|
||||||
|
for index in range(10)
|
||||||
|
]
|
||||||
|
legacy_datasets = _legacy_published_datasets()
|
||||||
|
original_ids = [item["id"] for item in legacy_datasets]
|
||||||
|
conn = _PublishConnection(results, legacy_datasets)
|
||||||
|
|
||||||
|
published = _PublishStore(conn).publish(
|
||||||
|
"task-1",
|
||||||
|
{
|
||||||
|
"dataset_name": "不会创建新数据集",
|
||||||
|
"storage_type": "local",
|
||||||
|
"format": "alpaca_jsonl",
|
||||||
|
"split": {"train": 80, "validation": 10, "test": 10},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert published["created"] is False
|
||||||
|
assert [item["id"] for item in published["datasets"]] == original_ids
|
||||||
|
assert [item["id"] for item in conn.datasets] == original_ids
|
||||||
|
|
||||||
|
|
||||||
def test_publish_keeps_all_three_datasets_when_a_small_split_is_empty() -> None:
|
def test_publish_keeps_all_three_datasets_when_a_small_split_is_empty() -> None:
|
||||||
conn = _PublishConnection(
|
conn = _PublishConnection(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
import{d as C,bf as g,D as E,H as O,o as _,e as B,s as D,Z as $,w as A,c as I,aL as K,q as t,n as v,aa as r,g as q,bg as M,y as u,z as N,P as k}from"./index-C8bRaOsd.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";const V={class:"app-confirm-header"},z={class:"app-confirm-heading"},H={class:"app-confirm-icon","aria-hidden":"true"},L={class:"app-confirm-body"},P={class:"app-confirm-actions"},S=C({__name:"AppConfirmDialog",setup(j,{expose:x}){const c=u(!1),m=u(),p=u(),d=`app-confirm-title-${g()}`,y=`app-confirm-message-${g()}`,n=N({title:"请确认操作",message:"",confirmText:"确定",cancelText:"取消",tone:"warning",closeOnOverlay:!1});let o=null,i=null;function s(a){c.value=!1;const e=o;o=null,e==null||e(a)}function h(a){return o&&s(!1),Object.assign(n,{confirmText:"确定",cancelText:"取消",tone:"warning",closeOnOverlay:!1,...a}),c.value=!0,new Promise(e=>{o=e})}function w(){n.closeOnOverlay&&s(!1)}function T(a){var b;if(a.key==="Escape"){a.preventDefault(),s(!1);return}if(a.key!=="Tab")return;const e=Array.from(((b=m.value)==null?void 0:b.querySelectorAll("button:not([disabled])"))??[]),l=e[0],f=e[e.length-1];!l||!f||(a.shiftKey&&document.activeElement===l?(a.preventDefault(),f.focus()):!a.shiftKey&&document.activeElement===f&&(a.preventDefault(),l.focus()))}return E(c,async a=>{var e;if(a){i=document.activeElement instanceof HTMLElement?document.activeElement:null,await k(),(e=p.value)==null||e.focus();return}await k(),i==null||i.focus(),i=null}),O(()=>{o==null||o(!1),o=null}),x({open:h}),(a,e)=>(_(),B(M,{to:"body"},[D($,{name:"app-confirm"},{default:A(()=>[c.value?(_(),I("div",{key:0,class:"app-confirm-overlay",onMousedown:K(w,["self"])},[t("section",{ref_key:"dialogRef",ref:m,class:v(["app-confirm-dialog",`is-${n.tone}`]),role:"alertdialog","aria-modal":!0,"aria-labelledby":d,"aria-describedby":y,onKeydown:T},[t("header",V,[t("div",z,[t("span",H,[t("i",{class:v(n.tone==="primary"?"fa fa-question-circle":"fa fa-exclamation-triangle")},null,2)]),t("h2",{id:d},r(n.title),1)]),t("button",{class:"app-confirm-close",type:"button","aria-label":"关闭确认弹窗",onClick:e[0]||(e[0]=l=>s(!1))},[...e[3]||(e[3]=[t("i",{class:"fa fa-times","aria-hidden":"true"},null,-1)])])]),t("div",L,[t("p",{id:y},r(n.message),1)]),t("footer",P,[t("button",{ref_key:"cancelButtonRef",ref:p,class:"app-confirm-button is-cancel",type:"button",onClick:e[1]||(e[1]=l=>s(!1))},r(n.cancelText),513),t("button",{class:"app-confirm-button is-confirm",type:"button",onClick:e[2]||(e[2]=l=>s(!0))},r(n.confirmText),1)])],34)],32)):q("",!0)]),_:1})]))}}),G=R(S,[["__scopeId","data-v-8d3bf6ad"]]);export{G as A};
|
import{d as C,bf as g,D as E,H as O,o as _,e as B,s as D,Z as $,w as A,c as I,aL as K,q as t,n as v,aa as r,g as q,bg as M,y as u,z as N,P as k}from"./index-CGB0A5x_.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";const V={class:"app-confirm-header"},z={class:"app-confirm-heading"},H={class:"app-confirm-icon","aria-hidden":"true"},L={class:"app-confirm-body"},P={class:"app-confirm-actions"},S=C({__name:"AppConfirmDialog",setup(j,{expose:x}){const c=u(!1),m=u(),p=u(),d=`app-confirm-title-${g()}`,y=`app-confirm-message-${g()}`,n=N({title:"请确认操作",message:"",confirmText:"确定",cancelText:"取消",tone:"warning",closeOnOverlay:!1});let o=null,i=null;function s(a){c.value=!1;const e=o;o=null,e==null||e(a)}function h(a){return o&&s(!1),Object.assign(n,{confirmText:"确定",cancelText:"取消",tone:"warning",closeOnOverlay:!1,...a}),c.value=!0,new Promise(e=>{o=e})}function w(){n.closeOnOverlay&&s(!1)}function T(a){var b;if(a.key==="Escape"){a.preventDefault(),s(!1);return}if(a.key!=="Tab")return;const e=Array.from(((b=m.value)==null?void 0:b.querySelectorAll("button:not([disabled])"))??[]),l=e[0],f=e[e.length-1];!l||!f||(a.shiftKey&&document.activeElement===l?(a.preventDefault(),f.focus()):!a.shiftKey&&document.activeElement===f&&(a.preventDefault(),l.focus()))}return E(c,async a=>{var e;if(a){i=document.activeElement instanceof HTMLElement?document.activeElement:null,await k(),(e=p.value)==null||e.focus();return}await k(),i==null||i.focus(),i=null}),O(()=>{o==null||o(!1),o=null}),x({open:h}),(a,e)=>(_(),B(M,{to:"body"},[D($,{name:"app-confirm"},{default:A(()=>[c.value?(_(),I("div",{key:0,class:"app-confirm-overlay",onMousedown:K(w,["self"])},[t("section",{ref_key:"dialogRef",ref:m,class:v(["app-confirm-dialog",`is-${n.tone}`]),role:"alertdialog","aria-modal":!0,"aria-labelledby":d,"aria-describedby":y,onKeydown:T},[t("header",V,[t("div",z,[t("span",H,[t("i",{class:v(n.tone==="primary"?"fa fa-question-circle":"fa fa-exclamation-triangle")},null,2)]),t("h2",{id:d},r(n.title),1)]),t("button",{class:"app-confirm-close",type:"button","aria-label":"关闭确认弹窗",onClick:e[0]||(e[0]=l=>s(!1))},[...e[3]||(e[3]=[t("i",{class:"fa fa-times","aria-hidden":"true"},null,-1)])])]),t("div",L,[t("p",{id:y},r(n.message),1)]),t("footer",P,[t("button",{ref_key:"cancelButtonRef",ref:p,class:"app-confirm-button is-cancel",type:"button",onClick:e[1]||(e[1]=l=>s(!1))},r(n.cancelText),513),t("button",{class:"app-confirm-button is-confirm",type:"button",onClick:e[2]||(e[2]=l=>s(!0))},r(n.confirmText),1)])],34)],32)):q("",!0)]),_:1})]))}}),G=R(S,[["__scopeId","data-v-8d3bf6ad"]]);export{G as A};
|
||||||
@@ -1 +1 @@
|
|||||||
import{a as B,E as K}from"./el-form-item-DGwcZKHQ.js";import{E as M}from"./index-CoLjyrxq.js";import{E as h}from"./index-B2Z3XS2S.js";import{E as I}from"./el-tag-11zBoTqA.js";import{E as R}from"./el-divider-sRU3cxL5.js";import{E as F}from"./el-slider-DwabRetH.js";import{d as L,G as z,e as V,w as s,ac as D,y as $,o as f,s as a,x as p,q as j,c as k,ad as A,aa as b,f as E,M as G,g as J,v as O,z as H,j as _,A as P}from"./index-C8bRaOsd.js";import"./el-popper-BY86ZM1h.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-input-number-HkIYFERV.js";import{P as Q}from"./PageCard-BsRjYlIm.js";import{u as W}from"./usePolling-LoVQKNlA.js";import{a as X}from"./compare-Blil53uq.js";import{a as Y}from"./status-Dl1fykxa.js";import{_ as Z}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./debounce-BADwekKz.js";import"./toNumber-Bt8UgFrr.js";import"./clamp-CNwRTQDt.js";import"./index-BpW9Z31J.js";import"./index-COFtI18L.js";import"./el-card-BXAZ-Y4u.js";const tt={class:"model-list"},et={key:0,class:"empty-hint"},ot=L({__name:"CompareChatView",setup(at){const T=D(),y=O(),x=T.params.id,n=$(null),e=H({systemPrompt:"",question:"",temperature:.7,topP:.9,topK:40,maxTokens:2048}),m=_(()=>{var l;if(!((l=n.value)!=null&&l.load_status))return[];try{return(typeof n.value.load_status=="string"?JSON.parse(n.value.load_status):n.value.load_status).loaded_models||[]}catch{return[]}}),C=_(()=>m.value.length>0&&m.value.every(l=>l.status==="ready"||l.status==="running")),g=_(()=>m.value.some(l=>l.status==="starting"));async function c(){try{n.value=await X(x)}catch{}}function S(){var u,i;if(!e.question.trim()){P.warning("请输入问题");return}if(g.value){P.warning("模型仍在启动中,请稍候");return}const l=new URLSearchParams({taskId:x,taskName:((u=n.value)==null?void 0:u.model_name)||((i=n.value)==null?void 0:i.name)||"",question:e.question,systemPrompt:e.systemPrompt,temperature:String(e.temperature),topP:String(e.topP),topK:String(e.topK),maxTokens:String(e.maxTokens)}),t=y.resolve(`/model-compare/result?${l.toString()}`).href;window.open(t,"_blank")}const{start:q}=W(c,5e3,{immediate:!1});return z(async()=>{await c(),q()}),(l,t)=>{const u=R,i=I,v=M,r=B,d=F,w=h,U=K;return f(),V(Q,{title:"模型对比配置"},{default:s(()=>[a(u,{"content-position":"left"},{default:s(()=>[...t[7]||(t[7]=[p("已启动模型",-1)])]),_:1}),j("div",tt,[(f(!0),k(G,null,A(m.value,(o,N)=>(f(),V(i,{key:N,type:o.status==="ready"||o.status==="running"?"success":o.status==="starting"?"warning":"danger",size:"large"},{default:s(()=>[p(b(o.model_name)+" ("+b(E(Y)(o.status))+") ",1)]),_:2},1032,["type"]))),128)),m.value.length?J("",!0):(f(),k("span",et,"暂无已启动模型"))]),a(u,{"content-position":"left"},{default:s(()=>[...t[8]||(t[8]=[p("对话配置",-1)])]),_:1}),a(U,{"label-width":"120px",style:{"max-width":"700px"}},{default:s(()=>[a(r,{label:"系统提示词"},{default:s(()=>[a(v,{modelValue:e.systemPrompt,"onUpdate:modelValue":t[0]||(t[0]=o=>e.systemPrompt=o),type:"textarea",rows:3,placeholder:"可选"},null,8,["modelValue"])]),_:1}),a(r,{label:"问题"},{default:s(()=>[a(v,{modelValue:e.question,"onUpdate:modelValue":t[1]||(t[1]=o=>e.question=o),type:"textarea",rows:4,placeholder:"请输入要对比的问题"},null,8,["modelValue"])]),_:1}),a(r,{label:"Temperature"},{default:s(()=>[a(d,{modelValue:e.temperature,"onUpdate:modelValue":t[2]||(t[2]=o=>e.temperature=o),min:0,max:2,step:.1,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Top-p"},{default:s(()=>[a(d,{modelValue:e.topP,"onUpdate:modelValue":t[3]||(t[3]=o=>e.topP=o),min:0,max:1,step:.05,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Top-k"},{default:s(()=>[a(d,{modelValue:e.topK,"onUpdate:modelValue":t[4]||(t[4]=o=>e.topK=o),min:1,max:100,step:1,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Max Tokens"},{default:s(()=>[a(d,{modelValue:e.maxTokens,"onUpdate:modelValue":t[5]||(t[5]=o=>e.maxTokens=o),min:256,max:4096,step:128,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,null,{default:s(()=>[a(w,{type:"primary",disabled:!C.value||g.value,onClick:S},{default:s(()=>[...t[9]||(t[9]=[p(" 开始对比 ",-1)])]),_:1},8,["disabled"]),a(w,{onClick:t[6]||(t[6]=o=>E(y).back())},{default:s(()=>[...t[10]||(t[10]=[p("返回",-1)])]),_:1})]),_:1})]),_:1})]),_:1})}}}),Ut=Z(ot,[["__scopeId","data-v-fbe74cb0"]]);export{Ut as default};
|
import{a as B,E as K}from"./el-form-item-Ct_zBuY0.js";import{E as M}from"./index-CbmPSBt0.js";import{E as h}from"./index-CCavIuTY.js";import{E as I}from"./el-tag-C_D80BPW.js";import{E as R}from"./el-divider-DF2VMDw-.js";import{E as F}from"./el-slider-CM3VEvCM.js";import{d as L,G as z,e as V,w as s,ac as D,y as $,o as f,s as a,x as p,q as j,c as k,ad as A,aa as b,f as E,M as G,g as J,v as O,z as H,j as _,A as P}from"./index-CGB0A5x_.js";import"./el-popper-DvBtRO32.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-input-number-VAjRO6-I.js";import{P as Q}from"./PageCard-D1lOaeEG.js";import{u as W}from"./usePolling-B4Zfd6BY.js";import{a as X}from"./compare-ClXsFp7Q.js";import{a as Y}from"./status-Dl1fykxa.js";import{_ as Z}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./debounce-Bqww2DS8.js";import"./toNumber-IRhFg6gN.js";import"./clamp-BqqU4KQ-.js";import"./index-BPwPlcbL.js";import"./index-CL2S8yHq.js";import"./el-card-BWcR1iD2.js";const tt={class:"model-list"},et={key:0,class:"empty-hint"},ot=L({__name:"CompareChatView",setup(at){const T=D(),y=O(),x=T.params.id,n=$(null),e=H({systemPrompt:"",question:"",temperature:.7,topP:.9,topK:40,maxTokens:2048}),m=_(()=>{var l;if(!((l=n.value)!=null&&l.load_status))return[];try{return(typeof n.value.load_status=="string"?JSON.parse(n.value.load_status):n.value.load_status).loaded_models||[]}catch{return[]}}),C=_(()=>m.value.length>0&&m.value.every(l=>l.status==="ready"||l.status==="running")),g=_(()=>m.value.some(l=>l.status==="starting"));async function c(){try{n.value=await X(x)}catch{}}function S(){var u,i;if(!e.question.trim()){P.warning("请输入问题");return}if(g.value){P.warning("模型仍在启动中,请稍候");return}const l=new URLSearchParams({taskId:x,taskName:((u=n.value)==null?void 0:u.model_name)||((i=n.value)==null?void 0:i.name)||"",question:e.question,systemPrompt:e.systemPrompt,temperature:String(e.temperature),topP:String(e.topP),topK:String(e.topK),maxTokens:String(e.maxTokens)}),t=y.resolve(`/model-compare/result?${l.toString()}`).href;window.open(t,"_blank")}const{start:q}=W(c,5e3,{immediate:!1});return z(async()=>{await c(),q()}),(l,t)=>{const u=R,i=I,v=M,r=B,d=F,w=h,U=K;return f(),V(Q,{title:"模型对比配置"},{default:s(()=>[a(u,{"content-position":"left"},{default:s(()=>[...t[7]||(t[7]=[p("已启动模型",-1)])]),_:1}),j("div",tt,[(f(!0),k(G,null,A(m.value,(o,N)=>(f(),V(i,{key:N,type:o.status==="ready"||o.status==="running"?"success":o.status==="starting"?"warning":"danger",size:"large"},{default:s(()=>[p(b(o.model_name)+" ("+b(E(Y)(o.status))+") ",1)]),_:2},1032,["type"]))),128)),m.value.length?J("",!0):(f(),k("span",et,"暂无已启动模型"))]),a(u,{"content-position":"left"},{default:s(()=>[...t[8]||(t[8]=[p("对话配置",-1)])]),_:1}),a(U,{"label-width":"120px",style:{"max-width":"700px"}},{default:s(()=>[a(r,{label:"系统提示词"},{default:s(()=>[a(v,{modelValue:e.systemPrompt,"onUpdate:modelValue":t[0]||(t[0]=o=>e.systemPrompt=o),type:"textarea",rows:3,placeholder:"可选"},null,8,["modelValue"])]),_:1}),a(r,{label:"问题"},{default:s(()=>[a(v,{modelValue:e.question,"onUpdate:modelValue":t[1]||(t[1]=o=>e.question=o),type:"textarea",rows:4,placeholder:"请输入要对比的问题"},null,8,["modelValue"])]),_:1}),a(r,{label:"Temperature"},{default:s(()=>[a(d,{modelValue:e.temperature,"onUpdate:modelValue":t[2]||(t[2]=o=>e.temperature=o),min:0,max:2,step:.1,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Top-p"},{default:s(()=>[a(d,{modelValue:e.topP,"onUpdate:modelValue":t[3]||(t[3]=o=>e.topP=o),min:0,max:1,step:.05,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Top-k"},{default:s(()=>[a(d,{modelValue:e.topK,"onUpdate:modelValue":t[4]||(t[4]=o=>e.topK=o),min:1,max:100,step:1,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,{label:"Max Tokens"},{default:s(()=>[a(d,{modelValue:e.maxTokens,"onUpdate:modelValue":t[5]||(t[5]=o=>e.maxTokens=o),min:256,max:4096,step:128,"show-input":"",style:{"max-width":"500px"}},null,8,["modelValue"])]),_:1}),a(r,null,{default:s(()=>[a(w,{type:"primary",disabled:!C.value||g.value,onClick:S},{default:s(()=>[...t[9]||(t[9]=[p(" 开始对比 ",-1)])]),_:1},8,["disabled"]),a(w,{onClick:t[6]||(t[6]=o=>E(y).back())},{default:s(()=>[...t[10]||(t[10]=[p("返回",-1)])]),_:1})]),_:1})]),_:1})]),_:1})}}}),Ut=Z(ot,[["__scopeId","data-v-fbe74cb0"]]);export{Ut as default};
|
||||||
@@ -1 +1 @@
|
|||||||
import{E as D}from"./el-alert-CdZFij8S.js";import{E as $}from"./index-B2Z3XS2S.js";import{E as z}from"./el-tag-11zBoTqA.js";import{E as F}from"./el-card-BXAZ-Y4u.js";import{d as O,G as U,H as J,c as d,q as i,aa as c,f as v,s as N,w as m,M as K,ad as A,ac as G,y as g,o as r,x as p,e as y,g as H}from"./index-C8bRaOsd.js";import{_ as L}from"./MarkdownView.vue_vue_type_style_index_0_lang-ChNJyyZs.js";import{a as W,c as j}from"./compare-Blil53uq.js";import{_ as Q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./vnode-B9WOR-0a.js";const X={class:"compare-result"},Y={class:"result-header"},Z={class:"header-actions"},tt={class:"result-grid"},et={class:"card-header"},st={class:"model-name"},ot={key:0,class:"error-text"},at={key:1,class:"streaming-text"},nt={key:3,class:"loading-text"},lt={key:4,class:"result-stats"},rt=O({__name:"CompareResultView",setup(it){const u=G(),q=u.query.taskId,k=decodeURIComponent(u.query.question||""),h=decodeURIComponent(u.query.systemPrompt||""),E=Number(u.query.temperature||.7),P=Number(u.query.topP||.9),I=Number(u.query.topK||40),b=Number(u.query.maxTokens||2048),w=u.query.taskName,l=g([]),C=g(!1),x=g([]),f=new Set;async function B(){if(!C.value){C.value=!0;try{const s=await W(q);let t=[];s.load_status&&(t=(typeof s.load_status=="string"?JSON.parse(s.load_status):s.load_status).loaded_models||[]),x.value=t,l.value=t.map(o=>({name:o.model_name||"模型",content:"",displayContent:"",isTyping:!1,status:"loading"})),await Promise.all(t.map((o,e)=>S(o,e)))}catch{}}}async function S(s,t){const o=Date.now();try{const e=await V(j({port:s.port,model_name:s.model_name,messages:[...h?[{role:"system",content:h}]:[],{role:"user",content:k}],temperature:E,top_p:P,top_k:I,max_tokens:b}),3e5),a=(e==null?void 0:e.response)||(e==null?void 0:e.content)||(e==null?void 0:e.data)||JSON.stringify(e),_=(Date.now()-o)/1e3;l.value[t].content=a,l.value[t].status="done",l.value[t].stats={totalTime:_,charsPerSec:_>0?Number((a.length/_).toFixed(1)):0},M(t,a)}catch(e){l.value[t].content="推理失败: "+(e.message||""),l.value[t].status="error"}}async function V(s,t){let o=null;try{return await Promise.race([s,new Promise((e,a)=>{o=setTimeout(()=>a(new Error("推理超时")),t)})])}finally{o&&clearTimeout(o)}}function M(s,t){let o=0;l.value[s].isTyping=!0;const e=Math.max(2,Math.ceil(t.length/30)),a=setInterval(()=>{o+=e,l.value[s].displayContent=t.slice(0,o),o>=t.length&&(clearInterval(a),f.delete(a),l.value[s].displayContent=t,l.value[s].isTyping=!1)},50);f.add(a)}return U(B),J(()=>{f.forEach(clearInterval),f.clear()}),(s,t)=>{const o=$,e=D,a=z,_=F;return r(),d("div",X,[i("div",Y,[i("h2",null,"对比结果"+c(v(w)?` - ${v(w)}`:""),1),i("div",Z,[N(o,{onClick:t[0]||(t[0]=n=>s.$router.push("/model-inference"))},{default:m(()=>[...t[1]||(t[1]=[p("返回列表",-1)])]),_:1})])]),N(e,{type:"info",closable:!1,"show-icon":"",class:"question-box"},{title:m(()=>[t[2]||(t[2]=i("strong",null,"问题:",-1)),p(c(v(k)),1)]),_:1}),i("div",tt,[(r(!0),d(K,null,A(l.value,(n,R)=>(r(),y(_,{key:R,shadow:"hover",class:"result-card"},{header:m(()=>[i("div",et,[i("span",st,c(n.name),1),n.status==="loading"?(r(),y(a,{key:0,type:"warning",size:"small"},{default:m(()=>[...t[3]||(t[3]=[p("生成中...",-1)])]),_:1})):n.status==="done"?(r(),y(a,{key:1,type:"success",size:"small"},{default:m(()=>[...t[4]||(t[4]=[p("完成",-1)])]),_:1})):(r(),y(a,{key:2,type:"danger",size:"small"},{default:m(()=>[...t[5]||(t[5]=[p("失败",-1)])]),_:1}))])]),default:m(()=>{var T;return[n.status==="error"?(r(),d("div",ot,c(n.content),1)):n.isTyping?(r(),d("div",at,c(n.displayContent),1)):n.displayContent?(r(),y(L,{key:2,content:n.displayContent},null,8,["content"])):(r(),d("div",nt,[...t[6]||(t[6]=[i("i",{class:"fa fa-spinner fa-spin"},null,-1),p(" 正在生成回答... ",-1)])])),n.stats?(r(),d("div",lt,[i("span",null,"耗时 "+c((T=n.stats.totalTime)==null?void 0:T.toFixed(1))+"s",1),i("span",null,"速度 "+c(n.stats.charsPerSec)+" 字/秒",1)])):H("",!0)]}),_:2},1024))),128))])])}}}),gt=Q(rt,[["__scopeId","data-v-8391f389"]]);export{gt as default};
|
import{E as D}from"./el-alert-DBfM1mZE.js";import{E as $}from"./index-CCavIuTY.js";import{E as z}from"./el-tag-C_D80BPW.js";import{E as F}from"./el-card-BWcR1iD2.js";import{d as O,G as U,H as J,c as d,q as i,aa as c,f as v,s as N,w as m,M as K,ad as A,ac as G,y as g,o as r,x as p,e as y,g as H}from"./index-CGB0A5x_.js";import{_ as L}from"./MarkdownView.vue_vue_type_style_index_0_lang-DqO2Wm8-.js";import{a as W,c as j}from"./compare-ClXsFp7Q.js";import{_ as Q}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./vnode-DFpZw5lG.js";const X={class:"compare-result"},Y={class:"result-header"},Z={class:"header-actions"},tt={class:"result-grid"},et={class:"card-header"},st={class:"model-name"},ot={key:0,class:"error-text"},at={key:1,class:"streaming-text"},nt={key:3,class:"loading-text"},lt={key:4,class:"result-stats"},rt=O({__name:"CompareResultView",setup(it){const u=G(),q=u.query.taskId,k=decodeURIComponent(u.query.question||""),h=decodeURIComponent(u.query.systemPrompt||""),E=Number(u.query.temperature||.7),P=Number(u.query.topP||.9),I=Number(u.query.topK||40),b=Number(u.query.maxTokens||2048),w=u.query.taskName,l=g([]),C=g(!1),x=g([]),f=new Set;async function B(){if(!C.value){C.value=!0;try{const s=await W(q);let t=[];s.load_status&&(t=(typeof s.load_status=="string"?JSON.parse(s.load_status):s.load_status).loaded_models||[]),x.value=t,l.value=t.map(o=>({name:o.model_name||"模型",content:"",displayContent:"",isTyping:!1,status:"loading"})),await Promise.all(t.map((o,e)=>S(o,e)))}catch{}}}async function S(s,t){const o=Date.now();try{const e=await V(j({port:s.port,model_name:s.model_name,messages:[...h?[{role:"system",content:h}]:[],{role:"user",content:k}],temperature:E,top_p:P,top_k:I,max_tokens:b}),3e5),a=(e==null?void 0:e.response)||(e==null?void 0:e.content)||(e==null?void 0:e.data)||JSON.stringify(e),_=(Date.now()-o)/1e3;l.value[t].content=a,l.value[t].status="done",l.value[t].stats={totalTime:_,charsPerSec:_>0?Number((a.length/_).toFixed(1)):0},M(t,a)}catch(e){l.value[t].content="推理失败: "+(e.message||""),l.value[t].status="error"}}async function V(s,t){let o=null;try{return await Promise.race([s,new Promise((e,a)=>{o=setTimeout(()=>a(new Error("推理超时")),t)})])}finally{o&&clearTimeout(o)}}function M(s,t){let o=0;l.value[s].isTyping=!0;const e=Math.max(2,Math.ceil(t.length/30)),a=setInterval(()=>{o+=e,l.value[s].displayContent=t.slice(0,o),o>=t.length&&(clearInterval(a),f.delete(a),l.value[s].displayContent=t,l.value[s].isTyping=!1)},50);f.add(a)}return U(B),J(()=>{f.forEach(clearInterval),f.clear()}),(s,t)=>{const o=$,e=D,a=z,_=F;return r(),d("div",X,[i("div",Y,[i("h2",null,"对比结果"+c(v(w)?` - ${v(w)}`:""),1),i("div",Z,[N(o,{onClick:t[0]||(t[0]=n=>s.$router.push("/model-inference"))},{default:m(()=>[...t[1]||(t[1]=[p("返回列表",-1)])]),_:1})])]),N(e,{type:"info",closable:!1,"show-icon":"",class:"question-box"},{title:m(()=>[t[2]||(t[2]=i("strong",null,"问题:",-1)),p(c(v(k)),1)]),_:1}),i("div",tt,[(r(!0),d(K,null,A(l.value,(n,R)=>(r(),y(_,{key:R,shadow:"hover",class:"result-card"},{header:m(()=>[i("div",et,[i("span",st,c(n.name),1),n.status==="loading"?(r(),y(a,{key:0,type:"warning",size:"small"},{default:m(()=>[...t[3]||(t[3]=[p("生成中...",-1)])]),_:1})):n.status==="done"?(r(),y(a,{key:1,type:"success",size:"small"},{default:m(()=>[...t[4]||(t[4]=[p("完成",-1)])]),_:1})):(r(),y(a,{key:2,type:"danger",size:"small"},{default:m(()=>[...t[5]||(t[5]=[p("失败",-1)])]),_:1}))])]),default:m(()=>{var T;return[n.status==="error"?(r(),d("div",ot,c(n.content),1)):n.isTyping?(r(),d("div",at,c(n.displayContent),1)):n.displayContent?(r(),y(L,{key:2,content:n.displayContent},null,8,["content"])):(r(),d("div",nt,[...t[6]||(t[6]=[i("i",{class:"fa fa-spinner fa-spin"},null,-1),p(" 正在生成回答... ",-1)])])),n.stats?(r(),d("div",lt,[i("span",null,"耗时 "+c((T=n.stats.totalTime)==null?void 0:T.toFixed(1))+"s",1),i("span",null,"速度 "+c(n.stats.charsPerSec)+" 字/秒",1)])):H("",!0)]}),_:2},1024))),128))])])}}}),gt=Q(rt,[["__scopeId","data-v-8391f389"]]);export{gt as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{a as N,E as v}from"./el-form-item-DGwcZKHQ.js";import{E as b}from"./el-popper-BY86ZM1h.js";import{E as O}from"./index-CoLjyrxq.js";import{E as S}from"./index-B2Z3XS2S.js";import{E as g,a as E}from"./el-select-DzauTPwe.js";import{d as J,e as V,w as e,o as w,q as t,s as l,x as i,z as x,A as C}from"./index-C8bRaOsd.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-scrollbar-CMp13_RQ.js";import"./el-tag-11zBoTqA.js";import{P as U}from"./PageCard-BsRjYlIm.js";import{_ as y}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./index-DE1Gc93o.js";import"./index-BpW9Z31J.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./vnode-B9WOR-0a.js";import"./index-BVldZEzQ.js";import"./scroll-DL9cY7fX.js";import"./clamp-CNwRTQDt.js";import"./toNumber-Bt8UgFrr.js";import"./_baseIteratee-7-PMrTPE.js";import"./el-card-BXAZ-Y4u.js";const F={class:"converter-panel"},L={class:"form-row"},T={class:"panel-footer"},B={class:"actions"},k=J({__name:"DataConvertView",setup(I){const a=x({outputName:"converted-data",encoding:"UTF-8"});function p(){C.info("当前仅完成界面设计,转换功能将在后续接入")}function d(){Object.assign(a,{outputName:"converted-data",encoding:"UTF-8"})}return(j,o)=>{const n=N,m=O,u=E,f=g,c=v,r=S,_=b;return w(),V(U,{class:"data-convert-page",title:"数据类型转换",subtitle:"将 JSON 文件转换为便于训练和评测使用的 JSONL 格式"},{default:e(()=>[t("div",F,[o[9]||(o[9]=t("div",{class:"panel-header"},[t("div",{class:"tool-icon","aria-hidden":"true"},[t("i",{class:"fa fa-exchange"})]),t("div",null,[t("h3",null,"JSON 转 JSONL"),t("p",null,"每条 JSON 数据将输出为 JSONL 文件中的一行记录")])],-1)),l(c,{class:"converter-form","label-position":"top"},{default:e(()=>[l(n,{label:"转换类型"},{default:e(()=>[...o[2]||(o[2]=[t("div",{class:"format-field","aria-label":"JSON 转 JSONL"},[t("span",null,"JSON"),t("i",{class:"fa fa-long-arrow-right","aria-hidden":"true"}),t("span",null,"JSONL")],-1)])]),_:1}),l(n,{label:"源文件",required:""},{default:e(()=>[t("button",{class:"upload-zone",type:"button",onClick:p},[...o[3]||(o[3]=[t("i",{class:"fa fa-cloud-upload","aria-hidden":"true"},null,-1),t("span",{class:"upload-content"},[t("strong",null,"点击选择或拖拽 JSON 文件到此处"),t("small",null,"仅支持 .json 格式,单文件不超过 200 MB")],-1),t("span",{class:"select-button"},"选择文件",-1)])])]),_:1}),t("div",L,[l(n,{label:"输出文件名"},{default:e(()=>[l(m,{modelValue:a.outputName,"onUpdate:modelValue":o[0]||(o[0]=s=>a.outputName=s)},{append:e(()=>[...o[4]||(o[4]=[i(".jsonl",-1)])]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"字符编码"},{default:e(()=>[l(f,{modelValue:a.encoding,"onUpdate:modelValue":o[1]||(o[1]=s=>a.encoding=s),style:{width:"100%"}},{default:e(()=>[l(u,{label:"UTF-8",value:"UTF-8"})]),_:1},8,["modelValue"])]),_:1})]),o[5]||(o[5]=t("div",{class:"format-tip"},[t("i",{class:"fa fa-info-circle","aria-hidden":"true"}),t("span",null,"支持由 JSON 数组转换为 JSONL,每个数组元素输出为一行。")],-1))]),_:1}),t("div",T,[o[8]||(o[8]=t("span",{class:"prototype-label"},"当前为 UI 原型,暂不执行实际转换",-1)),t("div",B,[l(r,{onClick:d},{default:e(()=>[...o[6]||(o[6]=[i("重置",-1)])]),_:1}),l(_,{content:"转换功能将在后续开发中接入",placement:"top"},{default:e(()=>[t("span",null,[l(r,{type:"primary",disabled:""},{default:e(()=>[...o[7]||(o[7]=[i("开始转换",-1)])]),_:1})])]),_:1})])])])]),_:1})}}}),it=y(k,[["__scopeId","data-v-89a8493f"]]);export{it as default};
|
import{a as N,E as v}from"./el-form-item-Ct_zBuY0.js";import{E as b}from"./el-popper-DvBtRO32.js";import{E as O}from"./index-CbmPSBt0.js";import{E as S}from"./index-CCavIuTY.js";import{E as g,a as E}from"./el-select-C59URVI0.js";import{d as J,e as V,w as e,o as w,q as t,s as l,x as i,z as x,A as C}from"./index-CGB0A5x_.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-scrollbar-p6_f_LH2.js";import"./el-tag-C_D80BPW.js";import{P as U}from"./PageCard-D1lOaeEG.js";import{_ as y}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./index-DMVRI44M.js";import"./index-BPwPlcbL.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./vnode-DFpZw5lG.js";import"./index-khuXz7sd.js";import"./scroll-C0BSy_Rk.js";import"./clamp-BqqU4KQ-.js";import"./toNumber-IRhFg6gN.js";import"./_baseIteratee-uVh0OyD5.js";import"./el-card-BWcR1iD2.js";const F={class:"converter-panel"},L={class:"form-row"},T={class:"panel-footer"},B={class:"actions"},k=J({__name:"DataConvertView",setup(I){const a=x({outputName:"converted-data",encoding:"UTF-8"});function p(){C.info("当前仅完成界面设计,转换功能将在后续接入")}function d(){Object.assign(a,{outputName:"converted-data",encoding:"UTF-8"})}return(j,o)=>{const n=N,m=O,u=E,f=g,c=v,r=S,_=b;return w(),V(U,{class:"data-convert-page",title:"数据类型转换",subtitle:"将 JSON 文件转换为便于训练和评测使用的 JSONL 格式"},{default:e(()=>[t("div",F,[o[9]||(o[9]=t("div",{class:"panel-header"},[t("div",{class:"tool-icon","aria-hidden":"true"},[t("i",{class:"fa fa-exchange"})]),t("div",null,[t("h3",null,"JSON 转 JSONL"),t("p",null,"每条 JSON 数据将输出为 JSONL 文件中的一行记录")])],-1)),l(c,{class:"converter-form","label-position":"top"},{default:e(()=>[l(n,{label:"转换类型"},{default:e(()=>[...o[2]||(o[2]=[t("div",{class:"format-field","aria-label":"JSON 转 JSONL"},[t("span",null,"JSON"),t("i",{class:"fa fa-long-arrow-right","aria-hidden":"true"}),t("span",null,"JSONL")],-1)])]),_:1}),l(n,{label:"源文件",required:""},{default:e(()=>[t("button",{class:"upload-zone",type:"button",onClick:p},[...o[3]||(o[3]=[t("i",{class:"fa fa-cloud-upload","aria-hidden":"true"},null,-1),t("span",{class:"upload-content"},[t("strong",null,"点击选择或拖拽 JSON 文件到此处"),t("small",null,"仅支持 .json 格式,单文件不超过 200 MB")],-1),t("span",{class:"select-button"},"选择文件",-1)])])]),_:1}),t("div",L,[l(n,{label:"输出文件名"},{default:e(()=>[l(m,{modelValue:a.outputName,"onUpdate:modelValue":o[0]||(o[0]=s=>a.outputName=s)},{append:e(()=>[...o[4]||(o[4]=[i(".jsonl",-1)])]),_:1},8,["modelValue"])]),_:1}),l(n,{label:"字符编码"},{default:e(()=>[l(f,{modelValue:a.encoding,"onUpdate:modelValue":o[1]||(o[1]=s=>a.encoding=s),style:{width:"100%"}},{default:e(()=>[l(u,{label:"UTF-8",value:"UTF-8"})]),_:1},8,["modelValue"])]),_:1})]),o[5]||(o[5]=t("div",{class:"format-tip"},[t("i",{class:"fa fa-info-circle","aria-hidden":"true"}),t("span",null,"支持由 JSON 数组转换为 JSONL,每个数组元素输出为一行。")],-1))]),_:1}),t("div",T,[o[8]||(o[8]=t("span",{class:"prototype-label"},"当前为 UI 原型,暂不执行实际转换",-1)),t("div",B,[l(r,{onClick:d},{default:e(()=>[...o[6]||(o[6]=[i("重置",-1)])]),_:1}),l(_,{content:"转换功能将在后续开发中接入",placement:"top"},{default:e(()=>[t("span",null,[l(r,{type:"primary",disabled:""},{default:e(()=>[...o[7]||(o[7]=[i("开始转换",-1)])]),_:1})])]),_:1})])])])]),_:1})}}}),it=y(k,[["__scopeId","data-v-89a8493f"]]);export{it as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/DataProcessDetailView-BWg5BFev.js
vendored
Normal file
1
frontend/dist/assets/DataProcessDetailView-BWg5BFev.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/DataProcessDetailView-Q-3-UF6d.css
vendored
Normal file
1
frontend/dist/assets/DataProcessDetailView-Q-3-UF6d.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
import{E as B}from"./index-B2Z3XS2S.js";import{E as C}from"./el-tag-11zBoTqA.js";import{E as N}from"./el-table-48yEgKcK.js";import{d as z,G as P,c as g,s as o,w as s,y as n,o as d,q as f,x as r,e as V,aa as c,A as I,v as L}from"./index-C8bRaOsd.js";import{E as M}from"./index-CKkhcTW-.js";import"./el-checkbox-Jsj5DifU.js";import{D as $}from"./DataTablePage-BByewB8Y.js";import{_ as S}from"./ModelStatusTag.vue_vue_type_script_setup_true_lang-hMjP8G6o.js";import{g as q,d as A}from"./dataProcess-VAqZJsUM.js";import{_ as G}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-CMp13_RQ.js";import"./index-DE1Gc93o.js";import"./el-popper-BY86ZM1h.js";import"./index-BpW9Z31J.js";import"./_baseClone-vUmDCUMu.js";import"./_baseIteratee-7-PMrTPE.js";import"./castArray-CJvOrS5l.js";import"./debounce-BADwekKz.js";import"./toNumber-Bt8UgFrr.js";import"./raf-BqR8BX9r.js";import"./validator-DZBWmtBZ.js";import"./index-BIY0gTx5.js";import"./clamp-CNwRTQDt.js";import"./index-CMlv-HLm.js";import"./scroll-DL9cY7fX.js";import"./index-CoLjyrxq.js";import"./index-BRf1Q2lS.js";import"./omit-BHHw65tB.js";import"./el-card-BXAZ-Y4u.js";import"./el-pagination-Ca9Xqxww.js";import"./el-select-DzauTPwe.js";import"./vnode-B9WOR-0a.js";import"./index-BVldZEzQ.js";import"./directive-D_bJoBNR.js";import"./el-tooltip-l0sNRNKZ.js";import"./status-Dl1fykxa.js";const R={class:"data-process-page",style:{height:"100%"}},j={key:1},F={class:"action-buttons"},H=z({__name:"DataProcessListView",setup(J){const y={structured:"结构化数据",unstructured:"非结构化数据",external:"外来数据源拉取"},h=L(),l=n([]),p=n(!1),m=n(null),u=n("");async function v(t=!1){t||(p.value=!0),u.value="";try{const a=await q({page:1,page_size:200});l.value=a.items}catch{u.value="数据处理任务加载失败,请稍后重试。"}finally{t||(p.value=!1)}}function x(t){const a=t.id;h.push({name:"data-process-detail",params:{id:a}})}async function b(t){try{await M.confirm(`确定删除数据处理任务“${t.name}”吗?删除后无法恢复。`,"确认删除",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"})}catch{return}m.value=t.id;try{await A(t.id),l.value=l.value.filter(a=>a.id!==t.id),I.success("数据处理任务已删除")}catch{}finally{m.value=null}}function D(t){if(!t)return"-";const a=new Date(t);return Number.isNaN(a.getTime())?t:a.toLocaleString("zh-CN",{hour12:!1})}function k(t){return t.source_dataset_name||t.source_dataset||"-"}function w(t){return t.output_dataset_name||t.output_dataset||"-"}return P(v),(t,a)=>{const i=N,E=C,_=B;return d(),g("div",R,[o($,{title:"",data:l.value,loading:p.value,searchable:"","search-fields":["name"],"create-text":"新建数据处理","create-to":"/data-process/create","row-key":"id","page-size":10,"empty-text":u.value||"暂无数据处理任务"},{columns:s(()=>[o(i,{label:"任务ID",prop:"id",align:"center",width:"100"}),o(i,{label:"任务名称",prop:"name",align:"center","show-overflow-tooltip":""}),o(i,{label:"任务状态",align:"center",width:"110"},{default:s(({row:e})=>[o(S,{status:e.status},null,8,["status"])]),_:1}),o(i,{label:"处理类型",align:"center",width:"140"},{default:s(({row:e})=>[e.process_type?(d(),V(E,{key:0,size:"small",type:"info",effect:"plain"},{default:s(()=>[r(c(y[e.process_type]||e.process_type),1)]),_:2},1024)):(d(),g("span",j,"-"))]),_:1}),o(i,{label:"源数据集",align:"center","show-overflow-tooltip":""},{default:s(({row:e})=>[r(c(k(e)),1)]),_:1}),o(i,{label:"输出数据集",align:"center","show-overflow-tooltip":""},{default:s(({row:e})=>[r(c(w(e)),1)]),_:1}),o(i,{label:"创建时间",align:"center",width:"190"},{default:s(({row:e})=>[r(c(D(e.create_time||e.created_at)),1)]),_:1})]),actions:s(({row:e})=>[f("div",F,[o(_,{type:"primary",link:"",size:"small",onClick:T=>x(e)},{default:s(()=>[...a[0]||(a[0]=[f("i",{class:"fa fa-file-text-o",style:{"margin-right":"4px"}},null,-1),r("详情 ",-1)])]),_:1},8,["onClick"]),o(_,{type:"danger",link:"",size:"small",loading:m.value===e.id,onClick:T=>b(e)},{default:s(()=>[...a[1]||(a[1]=[f("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),r("删除 ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data","loading","empty-text"])])}}}),Ct=G(H,[["__scopeId","data-v-71f2711e"]]);export{Ct as default};
|
|
||||||
1
frontend/dist/assets/DataProcessListView-CTap9XtA.js
vendored
Normal file
1
frontend/dist/assets/DataProcessListView-CTap9XtA.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import{E as z}from"./index-CCavIuTY.js";import{E as L}from"./el-tag-C_D80BPW.js";import{E as M}from"./el-table-DkdQ6gPU.js";import{d as P,G as V,c as h,s as o,w as s,y as c,o as d,q as f,x as n,f as b,aa as r,e as $,A as I,v as S}from"./index-CGB0A5x_.js";import{E as q}from"./index-BMrs0kLP.js";import"./el-checkbox-Ci1DH0Aj.js";import{D as A}from"./DataTablePage-CURtmoAI.js";import{g as F,d as G}from"./dataProcess-D7vRt2n_.js";import{d as v}from"./dataProcessStatus-BNY61_45.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-p6_f_LH2.js";import"./index-DMVRI44M.js";import"./el-popper-DvBtRO32.js";import"./index-BPwPlcbL.js";import"./_baseClone-CX1E8HTZ.js";import"./_baseIteratee-uVh0OyD5.js";import"./castArray-Cgg396Sr.js";import"./debounce-Bqww2DS8.js";import"./toNumber-IRhFg6gN.js";import"./raf-CCivjDro.js";import"./validator-D7tSoy2w.js";import"./index-Coa9QRND.js";import"./clamp-BqqU4KQ-.js";import"./index-C5EKbiob.js";import"./scroll-C0BSy_Rk.js";import"./index-CbmPSBt0.js";import"./index-D2-3cnGo.js";import"./omit-DaFv1hTo.js";import"./el-card-BWcR1iD2.js";import"./el-pagination-DGQ0vO_O.js";import"./el-select-C59URVI0.js";import"./vnode-DFpZw5lG.js";import"./index-khuXz7sd.js";import"./directive-vzjADwzS.js";import"./el-tooltip-l0sNRNKZ.js";const j={class:"data-process-page",style:{height:"100%"}},H={key:1},J={class:"action-buttons"},K=P({__name:"DataProcessListView",setup(O){const x={structured:"结构化数据",unstructured:"非结构化数据",external:"外来数据源拉取"},k=S(),l=c([]),p=c(!1),m=c(null),u=c("");async function D(t=!1){t||(p.value=!0),u.value="";try{const a=await F({page:1,page_size:200});l.value=a.items}catch{u.value="数据处理任务加载失败,请稍后重试。"}finally{t||(p.value=!1)}}function C(t){const a=t.id;k.push({name:"data-process-detail",params:{id:a}})}async function E(t){try{await q.confirm(`确定删除数据处理任务“${t.name}”吗?删除后无法恢复。`,"确认删除",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"})}catch{return}m.value=t.id;try{await G(t.id),l.value=l.value.filter(a=>a.id!==t.id),I.success("数据处理任务已删除")}catch{}finally{m.value=null}}function T(t){if(!t)return"-";const a=new Date(t);return Number.isNaN(a.getTime())?t:a.toLocaleString("zh-CN",{hour12:!1})}function _(t){const a=Number(t);return Number.isFinite(a)?Math.max(0,Math.trunc(a)):0}function w(t){return`${_(t.source_file_count)} 个`}function B(t){return`${_(t.output_count)} 条`}return V(D),(t,a)=>{const i=M,g=L,y=z;return d(),h("div",j,[o(A,{title:"",data:l.value,loading:p.value,searchable:"","search-fields":["name"],"create-text":"新建数据处理","create-to":"/data-process/create","row-key":"id","page-size":10,"empty-text":u.value||"暂无数据处理任务"},{columns:s(()=>[o(i,{label:"任务ID",prop:"id",align:"center",width:"100"}),o(i,{label:"任务名称",prop:"name",align:"center","show-overflow-tooltip":""}),o(i,{label:"任务状态",align:"center",width:"110"},{default:s(({row:e})=>[o(g,{type:b(v)(e).type,size:"small",effect:"light"},{default:s(()=>[n(r(b(v)(e).label),1)]),_:2},1032,["type"])]),_:1}),o(i,{label:"处理类型",align:"center",width:"140"},{default:s(({row:e})=>[e.process_type?(d(),$(g,{key:0,size:"small",type:"info",effect:"plain"},{default:s(()=>[n(r(x[e.process_type]||e.process_type),1)]),_:2},1024)):(d(),h("span",H,"-"))]),_:1}),o(i,{label:"文档数量",align:"center",width:"120"},{default:s(({row:e})=>[n(r(w(e)),1)]),_:1}),o(i,{label:"生成个数",align:"center",width:"120"},{default:s(({row:e})=>[n(r(B(e)),1)]),_:1}),o(i,{label:"创建时间",align:"center",width:"190"},{default:s(({row:e})=>[n(r(T(e.create_time||e.created_at)),1)]),_:1})]),actions:s(({row:e})=>[f("div",J,[o(y,{type:"primary",link:"",size:"small",onClick:N=>C(e)},{default:s(()=>[...a[0]||(a[0]=[f("i",{class:"fa fa-file-text-o",style:{"margin-right":"4px"}},null,-1),n("详情 ",-1)])]),_:1},8,["onClick"]),o(y,{type:"danger",link:"",size:"small",loading:m.value===e.id,onClick:N=>E(e)},{default:s(()=>[...a[1]||(a[1]=[f("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),n("删除 ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data","loading","empty-text"])])}}}),Nt=R(K,[["__scopeId","data-v-c2486738"]]);export{Nt as default};
|
||||||
1
frontend/dist/assets/DataProcessListView-CaGXlwvz.css
vendored
Normal file
1
frontend/dist/assets/DataProcessListView-CaGXlwvz.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.action-buttons[data-v-c2486738]{display:flex;justify-content:center;gap:8px}
|
||||||
@@ -1 +0,0 @@
|
|||||||
.action-buttons[data-v-71f2711e]{display:flex;justify-content:center;gap:8px}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E}from"./index-B2Z3XS2S.js";import{E as T}from"./el-tag-11zBoTqA.js";import{E as L}from"./el-table-48yEgKcK.js";import{d as A,y as f,G as V,e as k,w as e,ac as $,j as B,o as y,q as r,s as l,x as i,g as N,aa as p,f as b,aY as P,aZ as S,n as w,v as M,A as R}from"./index-C8bRaOsd.js";import"./el-checkbox-Jsj5DifU.js";import{D as q}from"./DataTablePage-BByewB8Y.js";import{g as G,d as I,a as Y}from"./dataset-sRW8EmKW.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-CMp13_RQ.js";import"./index-DE1Gc93o.js";import"./el-popper-BY86ZM1h.js";import"./index-BpW9Z31J.js";import"./_baseClone-vUmDCUMu.js";import"./_baseIteratee-7-PMrTPE.js";import"./castArray-CJvOrS5l.js";import"./debounce-BADwekKz.js";import"./toNumber-Bt8UgFrr.js";import"./raf-BqR8BX9r.js";import"./omit-BHHw65tB.js";import"./index-CoLjyrxq.js";import"./index-BRf1Q2lS.js";import"./el-card-BXAZ-Y4u.js";import"./el-pagination-Ca9Xqxww.js";import"./el-select-DzauTPwe.js";import"./vnode-B9WOR-0a.js";import"./index-BVldZEzQ.js";import"./scroll-DL9cY7fX.js";import"./clamp-CNwRTQDt.js";import"./directive-D_bJoBNR.js";import"./index-CKkhcTW-.js";import"./validator-DZBWmtBZ.js";import"./index-BIY0gTx5.js";import"./index-CMlv-HLm.js";import"./el-tooltip-l0sNRNKZ.js";const O={class:"capsule-tabs"},U={class:"action-buttons"},Z=A({__name:"DatasetListView",setup(F){const C=M(),D=$(),c=f(!1),u=f([]),n=f(D.query.tab==="task"?"task":"upload"),h=B(()=>n.value==="task"?u.value.filter(s=>s.source==="task"):u.value.filter(s=>s.source!=="task"));async function d(){c.value=!0;try{u.value=await G()||[]}catch{}finally{c.value=!1}}async function _(s){await I(s.id),u.value=u.value.filter(a=>a.id!==s.id),await d(),R.success("删除成功")}function x(s){C.push(`/dataset/${s.id}/preview`)}function z(s){window.open(Y(s.id),"_blank")}return V(d),(s,a)=>{const o=L,v=T,m=E;return y(),k(q,{title:"数据集管理",data:h.value,loading:c.value,searchable:"","search-fields":["name","description"],"create-text":n.value==="upload"?"上传数据集":"","create-to":"/dataset/create","delete-fn":_,"row-key":"id",onRefresh:d},{title:e(()=>[r("div",O,[r("button",{class:w(["capsule-tab-item",{active:n.value==="upload"}]),onClick:a[0]||(a[0]=t=>n.value="upload")}," 上传任务 ",2),r("button",{class:w(["capsule-tab-item",{active:n.value==="task"}]),onClick:a[1]||(a[1]=t=>n.value="task")}," 数据任务 ",2)])]),columns:e(()=>[n.value==="task"?(y(),k(o,{key:0,label:"任务ID",prop:"task_id",align:"center",width:"100"})):N("",!0),l(o,{label:"数据集名称",prop:"name",align:"center"}),l(o,{label:"数据类型",align:"center",width:"110"},{default:e(({row:t})=>[l(v,{type:"primary",size:"small"},{default:e(()=>[i(p(b(P)[String(t.type).toLowerCase()]||t.type||"-"),1)]),_:2},1024)]),_:1}),l(o,{label:"存储位置",align:"center",width:"110"},{default:e(({row:t})=>[l(v,{type:"success",size:"small"},{default:e(()=>[i(p(b(S)[t.storage_type]||t.storage_type||"-"),1)]),_:2},1024)]),_:1}),l(o,{label:"大小",align:"center",width:"100"},{default:e(({row:t})=>[i(p(t.size&&t.size!=="0 B"&&t.size!=="0"?t.size:"-"),1)]),_:1}),l(o,{label:"数据条数",align:"center",width:"100"},{default:e(({row:t})=>[i(p(t.count||0),1)]),_:1}),l(o,{label:"描述",align:"center","show-overflow-tooltip":""},{default:e(({row:t})=>[i(p(t.description||"-"),1)]),_:1}),l(o,{label:"创建时间",align:"center",width:"180"},{default:e(({row:t})=>[i(p(t.create_time?new Date(t.create_time).toLocaleString("zh-CN"):"-"),1)]),_:1})]),actions:e(({row:t})=>[r("div",U,[l(m,{type:"primary",link:"",size:"small",onClick:g=>x(t)},{default:e(()=>[...a[2]||(a[2]=[r("i",{class:"fa fa-eye",style:{"margin-right":"4px"}},null,-1),i("详情 ",-1)])]),_:1},8,["onClick"]),l(m,{type:"success",link:"",size:"small",onClick:g=>z(t)},{default:e(()=>[...a[3]||(a[3]=[r("i",{class:"fa fa-download",style:{"margin-right":"4px"}},null,-1),i("下载 ",-1)])]),_:1},8,["onClick"]),l(m,{type:"danger",link:"",size:"small",onClick:g=>_(t)},{default:e(()=>[...a[4]||(a[4]=[r("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),i("删除 ",-1)])]),_:1},8,["onClick"])])]),_:1},8,["data","loading","create-text"])}}}),Tt=j(Z,[["__scopeId","data-v-75b95d11"]]);export{Tt as default};
|
import{E}from"./index-CCavIuTY.js";import{E as T}from"./el-tag-C_D80BPW.js";import{E as L}from"./el-table-DkdQ6gPU.js";import{d as A,y as f,G as V,e as k,w as e,ac as $,j as B,o as y,q as r,s as l,x as i,g as N,aa as p,f as b,aY as P,aZ as S,n as w,v as M,A as R}from"./index-CGB0A5x_.js";import"./el-checkbox-Ci1DH0Aj.js";import{D as q}from"./DataTablePage-CURtmoAI.js";import{g as G,d as I,a as Y}from"./dataset-C_hkNkI5.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-p6_f_LH2.js";import"./index-DMVRI44M.js";import"./el-popper-DvBtRO32.js";import"./index-BPwPlcbL.js";import"./_baseClone-CX1E8HTZ.js";import"./_baseIteratee-uVh0OyD5.js";import"./castArray-Cgg396Sr.js";import"./debounce-Bqww2DS8.js";import"./toNumber-IRhFg6gN.js";import"./raf-CCivjDro.js";import"./omit-DaFv1hTo.js";import"./index-CbmPSBt0.js";import"./index-D2-3cnGo.js";import"./el-card-BWcR1iD2.js";import"./el-pagination-DGQ0vO_O.js";import"./el-select-C59URVI0.js";import"./vnode-DFpZw5lG.js";import"./index-khuXz7sd.js";import"./scroll-C0BSy_Rk.js";import"./clamp-BqqU4KQ-.js";import"./directive-vzjADwzS.js";import"./index-BMrs0kLP.js";import"./validator-D7tSoy2w.js";import"./index-Coa9QRND.js";import"./index-C5EKbiob.js";import"./el-tooltip-l0sNRNKZ.js";const O={class:"capsule-tabs"},U={class:"action-buttons"},Z=A({__name:"DatasetListView",setup(F){const C=M(),D=$(),c=f(!1),u=f([]),n=f(D.query.tab==="task"?"task":"upload"),h=B(()=>n.value==="task"?u.value.filter(s=>s.source==="task"):u.value.filter(s=>s.source!=="task"));async function d(){c.value=!0;try{u.value=await G()||[]}catch{}finally{c.value=!1}}async function _(s){await I(s.id),u.value=u.value.filter(a=>a.id!==s.id),await d(),R.success("删除成功")}function x(s){C.push(`/dataset/${s.id}/preview`)}function z(s){window.open(Y(s.id),"_blank")}return V(d),(s,a)=>{const o=L,v=T,m=E;return y(),k(q,{title:"数据集管理",data:h.value,loading:c.value,searchable:"","search-fields":["name","description"],"create-text":n.value==="upload"?"上传数据集":"","create-to":"/dataset/create","delete-fn":_,"row-key":"id",onRefresh:d},{title:e(()=>[r("div",O,[r("button",{class:w(["capsule-tab-item",{active:n.value==="upload"}]),onClick:a[0]||(a[0]=t=>n.value="upload")}," 上传任务 ",2),r("button",{class:w(["capsule-tab-item",{active:n.value==="task"}]),onClick:a[1]||(a[1]=t=>n.value="task")}," 数据任务 ",2)])]),columns:e(()=>[n.value==="task"?(y(),k(o,{key:0,label:"任务ID",prop:"task_id",align:"center",width:"100"})):N("",!0),l(o,{label:"数据集名称",prop:"name",align:"center"}),l(o,{label:"数据类型",align:"center",width:"110"},{default:e(({row:t})=>[l(v,{type:"primary",size:"small"},{default:e(()=>[i(p(b(P)[String(t.type).toLowerCase()]||t.type||"-"),1)]),_:2},1024)]),_:1}),l(o,{label:"存储位置",align:"center",width:"110"},{default:e(({row:t})=>[l(v,{type:"success",size:"small"},{default:e(()=>[i(p(b(S)[t.storage_type]||t.storage_type||"-"),1)]),_:2},1024)]),_:1}),l(o,{label:"大小",align:"center",width:"100"},{default:e(({row:t})=>[i(p(t.size&&t.size!=="0 B"&&t.size!=="0"?t.size:"-"),1)]),_:1}),l(o,{label:"数据条数",align:"center",width:"100"},{default:e(({row:t})=>[i(p(t.count||0),1)]),_:1}),l(o,{label:"描述",align:"center","show-overflow-tooltip":""},{default:e(({row:t})=>[i(p(t.description||"-"),1)]),_:1}),l(o,{label:"创建时间",align:"center",width:"180"},{default:e(({row:t})=>[i(p(t.create_time?new Date(t.create_time).toLocaleString("zh-CN"):"-"),1)]),_:1})]),actions:e(({row:t})=>[r("div",U,[l(m,{type:"primary",link:"",size:"small",onClick:g=>x(t)},{default:e(()=>[...a[2]||(a[2]=[r("i",{class:"fa fa-eye",style:{"margin-right":"4px"}},null,-1),i("详情 ",-1)])]),_:1},8,["onClick"]),l(m,{type:"success",link:"",size:"small",onClick:g=>z(t)},{default:e(()=>[...a[3]||(a[3]=[r("i",{class:"fa fa-download",style:{"margin-right":"4px"}},null,-1),i("下载 ",-1)])]),_:1},8,["onClick"]),l(m,{type:"danger",link:"",size:"small",onClick:g=>_(t)},{default:e(()=>[...a[4]||(a[4]=[r("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),i("删除 ",-1)])]),_:1},8,["onClick"])])]),_:1},8,["data","loading","create-text"])}}}),Tt=j(Z,[["__scopeId","data-v-75b95d11"]]);export{Tt as default};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{a as k,E as M}from"./el-form-item-DGwcZKHQ.js";import{E as q}from"./index-CoLjyrxq.js";import{E as R}from"./index-B2Z3XS2S.js";import{d as S,G as B,e as F,w as i,j as y,y as _,z as I,o as O,s as r,f as m,aB as P,x as h,aa as j,A as x,v as A,ac as L}from"./index-C8bRaOsd.js";import{P as N}from"./PageCard-BsRjYlIm.js";import{E as T,D as U}from"./DimensionFormFields-Z6GlC5an.js";import{b as z,u as G,c as H}from"./eval-DolMoghS.js";import{g as J}from"./model-CCFfanoR.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./el-card-BXAZ-Y4u.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-select-DzauTPwe.js";import"./index-BpW9Z31J.js";import"./vnode-B9WOR-0a.js";import"./el-popper-BY86ZM1h.js";import"./el-scrollbar-CMp13_RQ.js";import"./index-BVldZEzQ.js";import"./el-tag-11zBoTqA.js";import"./scroll-DL9cY7fX.js";import"./clamp-CNwRTQDt.js";import"./toNumber-Bt8UgFrr.js";import"./_baseIteratee-7-PMrTPE.js";import"./el-checkbox-Jsj5DifU.js";import"./omit-BHHw65tB.js";import"./el-radio-group-akfy4TX6.js";import"./el-input-number-HkIYFERV.js";import"./index-COFtI18L.js";import"./el-slider-DwabRetH.js";import"./debounce-BADwekKz.js";import"./el-switch-CTejI77g.js";import"./validator-DZBWmtBZ.js";import"./el-tooltip-l0sNRNKZ.js";/* empty css */const Se=S({__name:"DimensionCreateView",setup(K){const c=L(),f=A(),n=_(),p=_(!1),u=y(()=>!!c.params.id),s=y(()=>c.params.id),d=_([]);let e=I({name:"",type:"",description:"",eval_model:"",eval_method:"",eval_prompt:"",is_active:!0,is_default:!1,bleu_n:1,output_precision:3,score_min:0,score_max:5,pass_threshold:3});const b={name:[{required:!0,message:"请输入维度名称",trigger:"blur"},{max:50,message:"不超过 50 字符",trigger:"blur"}],type:[{required:!0,message:"请选择指标类型",trigger:"change"}],eval_model:[{required:!0,message:"请选择大模型",trigger:"change"}],eval_method:[{required:!0,message:"请选择评估方式",trigger:"change"}],eval_prompt:[{required:!0,message:"请填写评估 Prompt",trigger:"blur"}]};async function w(){var o,t;if(s.value)try{const a=await z(s.value);Object.assign(e,{name:a.name||"",type:a.type||"",description:a.description||"",eval_model:a.eval_model||"",eval_method:a.eval_method||(a.type?(t=(o=T[a.type])==null?void 0:o[0])==null?void 0:t.value:""),eval_prompt:a.eval_prompt||"",is_active:a.is_active!==!1,is_default:!!a.is_default,bleu_n:a.bleu_n??1,output_precision:a.output_precision??3,score_min:a.score_min??0,score_max:a.score_max??5,pass_threshold:a.pass_threshold??3})}catch{}}async function E(){try{const o=await J()||[];d.value=o.filter(t=>t.purpose==="evaluation")}catch{d.value=[]}}async function D(){n.value&&await n.value.validate(async o=>{if(o){p.value=!0;try{const t={name:e.name,type:e.type,description:e.description,eval_model:e.type==="text_similarity"?null:e.eval_model,eval_method:e.eval_method,eval_prompt:e.type==="text_similarity"?null:e.eval_prompt,is_active:e.is_active,is_default:e.is_default,create_time:new Date().toISOString()};e.type==="text_similarity"&&(t.bleu_n=e.bleu_n,t.output_precision=e.output_precision),e.type==="metric"&&(t.score_min=e.score_min,t.score_max=e.score_max,t.pass_threshold=e.pass_threshold),u.value&&s.value?(await G(s.value,t),x.success("更新成功")):(await H(t),x.success("创建成功")),f.push("/model-eval")}catch{}finally{p.value=!1}}})}function V(){f.back()}return B(()=>{E(),w()}),(o,t)=>{const a=q,v=k,g=R,C=M;return O(),F(N,{title:u.value?"编辑评测维度":"添加评测维度"},{default:i(()=>[r(C,{ref_key:"formRef",ref:n,model:m(e),rules:b,"label-width":"130px",style:{"max-width":"760px"}},{default:i(()=>[r(v,{label:"维度名称",prop:"name"},{default:i(()=>[r(a,{modelValue:m(e).name,"onUpdate:modelValue":t[0]||(t[0]=l=>m(e).name=l),placeholder:"请输入维度名称",maxlength:"50","show-word-limit":""},null,8,["modelValue"])]),_:1}),r(U,{modelValue:m(e),"onUpdate:modelValue":t[1]||(t[1]=l=>P(e)?e.value=l:e=l),"eval-models":d.value},null,8,["modelValue","eval-models"]),r(v,null,{default:i(()=>[r(g,{type:"primary",loading:p.value,onClick:D},{default:i(()=>[h(j(u.value?"保存":"创建"),1)]),_:1},8,["loading"]),r(g,{onClick:V},{default:i(()=>[...t[2]||(t[2]=[h("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["title"])}}});export{Se as default};
|
import{a as k,E as M}from"./el-form-item-Ct_zBuY0.js";import{E as q}from"./index-CbmPSBt0.js";import{E as R}from"./index-CCavIuTY.js";import{d as S,G as B,e as F,w as i,j as y,y as _,z as I,o as O,s as r,f as m,aB as P,x as h,aa as j,A as x,v as A,ac as L}from"./index-CGB0A5x_.js";import{P as N}from"./PageCard-D1lOaeEG.js";import{E as T,D as U}from"./DimensionFormFields-Dz4OI87j.js";import{b as z,u as G,c as H}from"./eval-CNlv4GHr.js";import{g as J}from"./model-xlHsHa68.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./el-card-BWcR1iD2.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-select-C59URVI0.js";import"./index-BPwPlcbL.js";import"./vnode-DFpZw5lG.js";import"./el-popper-DvBtRO32.js";import"./el-scrollbar-p6_f_LH2.js";import"./index-khuXz7sd.js";import"./el-tag-C_D80BPW.js";import"./scroll-C0BSy_Rk.js";import"./clamp-BqqU4KQ-.js";import"./toNumber-IRhFg6gN.js";import"./_baseIteratee-uVh0OyD5.js";import"./el-checkbox-Ci1DH0Aj.js";import"./omit-DaFv1hTo.js";import"./el-radio-group-B7nPUe8-.js";import"./el-input-number-VAjRO6-I.js";import"./index-CL2S8yHq.js";import"./el-slider-CM3VEvCM.js";import"./debounce-Bqww2DS8.js";import"./el-switch-ZjdGiO6T.js";import"./validator-D7tSoy2w.js";import"./el-tooltip-l0sNRNKZ.js";/* empty css */const Se=S({__name:"DimensionCreateView",setup(K){const c=L(),f=A(),n=_(),p=_(!1),u=y(()=>!!c.params.id),s=y(()=>c.params.id),d=_([]);let e=I({name:"",type:"",description:"",eval_model:"",eval_method:"",eval_prompt:"",is_active:!0,is_default:!1,bleu_n:1,output_precision:3,score_min:0,score_max:5,pass_threshold:3});const b={name:[{required:!0,message:"请输入维度名称",trigger:"blur"},{max:50,message:"不超过 50 字符",trigger:"blur"}],type:[{required:!0,message:"请选择指标类型",trigger:"change"}],eval_model:[{required:!0,message:"请选择大模型",trigger:"change"}],eval_method:[{required:!0,message:"请选择评估方式",trigger:"change"}],eval_prompt:[{required:!0,message:"请填写评估 Prompt",trigger:"blur"}]};async function w(){var o,t;if(s.value)try{const a=await z(s.value);Object.assign(e,{name:a.name||"",type:a.type||"",description:a.description||"",eval_model:a.eval_model||"",eval_method:a.eval_method||(a.type?(t=(o=T[a.type])==null?void 0:o[0])==null?void 0:t.value:""),eval_prompt:a.eval_prompt||"",is_active:a.is_active!==!1,is_default:!!a.is_default,bleu_n:a.bleu_n??1,output_precision:a.output_precision??3,score_min:a.score_min??0,score_max:a.score_max??5,pass_threshold:a.pass_threshold??3})}catch{}}async function E(){try{const o=await J()||[];d.value=o.filter(t=>t.purpose==="evaluation")}catch{d.value=[]}}async function D(){n.value&&await n.value.validate(async o=>{if(o){p.value=!0;try{const t={name:e.name,type:e.type,description:e.description,eval_model:e.type==="text_similarity"?null:e.eval_model,eval_method:e.eval_method,eval_prompt:e.type==="text_similarity"?null:e.eval_prompt,is_active:e.is_active,is_default:e.is_default,create_time:new Date().toISOString()};e.type==="text_similarity"&&(t.bleu_n=e.bleu_n,t.output_precision=e.output_precision),e.type==="metric"&&(t.score_min=e.score_min,t.score_max=e.score_max,t.pass_threshold=e.pass_threshold),u.value&&s.value?(await G(s.value,t),x.success("更新成功")):(await H(t),x.success("创建成功")),f.push("/model-eval")}catch{}finally{p.value=!1}}})}function V(){f.back()}return B(()=>{E(),w()}),(o,t)=>{const a=q,v=k,g=R,C=M;return O(),F(N,{title:u.value?"编辑评测维度":"添加评测维度"},{default:i(()=>[r(C,{ref_key:"formRef",ref:n,model:m(e),rules:b,"label-width":"130px",style:{"max-width":"760px"}},{default:i(()=>[r(v,{label:"维度名称",prop:"name"},{default:i(()=>[r(a,{modelValue:m(e).name,"onUpdate:modelValue":t[0]||(t[0]=l=>m(e).name=l),placeholder:"请输入维度名称",maxlength:"50","show-word-limit":""},null,8,["modelValue"])]),_:1}),r(U,{modelValue:m(e),"onUpdate:modelValue":t[1]||(t[1]=l=>P(e)?e.value=l:e=l),"eval-models":d.value},null,8,["modelValue","eval-models"]),r(v,null,{default:i(()=>[r(g,{type:"primary",loading:p.value,onClick:D},{default:i(()=>[h(j(u.value?"保存":"创建"),1)]),_:1},8,["loading"]),r(g,{onClick:V},{default:i(()=>[...t[2]||(t[2]=[h("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["title"])}}});export{Se as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as V}from"./index-B2Z3XS2S.js";import{E as $}from"./el-table-48yEgKcK.js";import{d as B,G as D,c as T,e as _,w as o,g as C,y as p,o as v,s as a,q as i,x as b,aa as L,n as c,v as N,A as z}from"./index-C8bRaOsd.js";import{E as M}from"./index-CKkhcTW-.js";import"./el-tag-11zBoTqA.js";import"./el-checkbox-Jsj5DifU.js";import{D as y}from"./DataTablePage-BByewB8Y.js";import{_ as A}from"./ModelStatusTag.vue_vue_type_script_setup_true_lang-hMjP8G6o.js";import{g as G,d as P}from"./eval-DolMoghS.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-CMp13_RQ.js";import"./index-DE1Gc93o.js";import"./el-popper-BY86ZM1h.js";import"./index-BpW9Z31J.js";import"./_baseClone-vUmDCUMu.js";import"./_baseIteratee-7-PMrTPE.js";import"./castArray-CJvOrS5l.js";import"./debounce-BADwekKz.js";import"./toNumber-Bt8UgFrr.js";import"./raf-BqR8BX9r.js";import"./validator-DZBWmtBZ.js";import"./index-BIY0gTx5.js";import"./clamp-CNwRTQDt.js";import"./index-CMlv-HLm.js";import"./scroll-DL9cY7fX.js";import"./index-CoLjyrxq.js";import"./index-BRf1Q2lS.js";import"./omit-BHHw65tB.js";import"./el-card-BXAZ-Y4u.js";import"./el-pagination-Ca9Xqxww.js";import"./el-select-DzauTPwe.js";import"./vnode-B9WOR-0a.js";import"./index-BVldZEzQ.js";import"./directive-D_bJoBNR.js";import"./el-tooltip-l0sNRNKZ.js";import"./status-Dl1fykxa.js";const S={class:"eval-page"},q={class:"capsule-tabs"},I={class:"capsule-tabs"},Q=B({__name:"EvalView",setup(j){const f=N(),s=p("tasks"),d=p(!1),n=p([]),w=p([{rank:1,name:"GPT-4",score:92.5},{rank:2,name:"Claude-3",score:90.1},{rank:3,name:"Qwen-Max",score:85.3}]);async function u(){d.value=!0;try{n.value=await G()||[]}catch{n.value=[]}finally{d.value=!1}}async function k(r){await M.confirm("确定要删除这个评测任务吗?","确认删除",{type:"warning"}),await P(r.id),n.value=n.value.filter(e=>e.id!==r.id),z.success("删除成功"),await u()}function E(){f.push("/model-eval/create")}function m(r){return s.value===r}function x(r){f.push({name:"model-eval-detail",params:{id:r.id}})}return D(()=>{u()}),(r,e)=>{const l=$,g=V;return v(),T("div",S,[s.value==="tasks"?(v(),_(y,{key:0,title:"",data:n.value,loading:d.value,"delete-fn":k,"create-text":"创建评测任务",onCreate:E,"row-key":"id",onRefresh:u},{title:o(()=>[i("div",q,[i("button",{class:c(["capsule-tab-item",{active:m("tasks")}]),onClick:e[0]||(e[0]=t=>s.value="tasks")},"评测任务",2),i("button",{class:c(["capsule-tab-item",{active:m("leaderboard")}]),onClick:e[1]||(e[1]=t=>s.value="leaderboard")},"排行榜",2)])]),columns:o(()=>[a(l,{label:"任务名称",prop:"eval_task_name",align:"center"}),a(l,{label:"评测模型",prop:"model_name",align:"center"}),a(l,{label:"数据集",prop:"dataset",align:"center"}),a(l,{label:"指标",prop:"metric",align:"center"}),a(l,{label:"评分",prop:"score",width:"100",align:"center"}),a(l,{label:"状态",width:"100",align:"center"},{default:o(({row:t})=>[a(A,{status:t.status},null,8,["status"])]),_:1}),a(l,{label:"创建时间",align:"center",width:"180"},{default:o(({row:t})=>[b(L(t.create_time?new Date(t.create_time).toLocaleString("zh-CN"):"-"),1)]),_:1})]),actions:o(({row:t})=>[a(g,{link:"",type:"primary",size:"small",onClick:h=>x(t)},{default:o(()=>[...e[4]||(e[4]=[i("i",{class:"fa fa-file-text-o",style:{"margin-right":"4px"}},null,-1),b("详情 ",-1)])]),_:1},8,["onClick"]),a(g,{link:"",type:"danger",size:"small",onClick:h=>k(t)},{default:o(()=>[...e[5]||(e[5]=[i("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),b("删除 ",-1)])]),_:1},8,["onClick"])]),_:1},8,["data","loading"])):C("",!0),s.value==="leaderboard"?(v(),_(y,{key:1,title:"",data:w.value,"row-key":"rank"},{title:o(()=>[i("div",I,[i("button",{class:c(["capsule-tab-item",{active:m("tasks")}]),onClick:e[2]||(e[2]=t=>s.value="tasks")},"评测任务",2),i("button",{class:c(["capsule-tab-item",{active:m("leaderboard")}]),onClick:e[3]||(e[3]=t=>s.value="leaderboard")},"排行榜",2)])]),columns:o(()=>[a(l,{label:"排名",prop:"rank",width:"80",align:"center"}),a(l,{label:"模型名称",prop:"name",align:"center"}),a(l,{label:"综合评分",prop:"score",align:"center"})]),_:1},8,["data"])):C("",!0)])}}}),Ve=R(Q,[["__scopeId","data-v-894b0bb7"]]);export{Ve as default};
|
import{E as V}from"./index-CCavIuTY.js";import{E as $}from"./el-table-DkdQ6gPU.js";import{d as B,G as D,c as T,e as _,w as o,g as C,y as p,o as v,s as a,q as i,x as b,aa as L,n as c,v as N,A as z}from"./index-CGB0A5x_.js";import{E as M}from"./index-BMrs0kLP.js";import"./el-tag-C_D80BPW.js";import"./el-checkbox-Ci1DH0Aj.js";import{D as y}from"./DataTablePage-CURtmoAI.js";import{_ as A}from"./ModelStatusTag.vue_vue_type_script_setup_true_lang-NhrqSCT2.js";import{g as G,d as P}from"./eval-CNlv4GHr.js";import{_ as R}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./el-scrollbar-p6_f_LH2.js";import"./index-DMVRI44M.js";import"./el-popper-DvBtRO32.js";import"./index-BPwPlcbL.js";import"./_baseClone-CX1E8HTZ.js";import"./_baseIteratee-uVh0OyD5.js";import"./castArray-Cgg396Sr.js";import"./debounce-Bqww2DS8.js";import"./toNumber-IRhFg6gN.js";import"./raf-CCivjDro.js";import"./validator-D7tSoy2w.js";import"./index-Coa9QRND.js";import"./clamp-BqqU4KQ-.js";import"./index-C5EKbiob.js";import"./scroll-C0BSy_Rk.js";import"./index-CbmPSBt0.js";import"./index-D2-3cnGo.js";import"./omit-DaFv1hTo.js";import"./el-card-BWcR1iD2.js";import"./el-pagination-DGQ0vO_O.js";import"./el-select-C59URVI0.js";import"./vnode-DFpZw5lG.js";import"./index-khuXz7sd.js";import"./directive-vzjADwzS.js";import"./el-tooltip-l0sNRNKZ.js";import"./status-Dl1fykxa.js";const S={class:"eval-page"},q={class:"capsule-tabs"},I={class:"capsule-tabs"},Q=B({__name:"EvalView",setup(j){const f=N(),s=p("tasks"),d=p(!1),n=p([]),w=p([{rank:1,name:"GPT-4",score:92.5},{rank:2,name:"Claude-3",score:90.1},{rank:3,name:"Qwen-Max",score:85.3}]);async function u(){d.value=!0;try{n.value=await G()||[]}catch{n.value=[]}finally{d.value=!1}}async function k(r){await M.confirm("确定要删除这个评测任务吗?","确认删除",{type:"warning"}),await P(r.id),n.value=n.value.filter(e=>e.id!==r.id),z.success("删除成功"),await u()}function E(){f.push("/model-eval/create")}function m(r){return s.value===r}function x(r){f.push({name:"model-eval-detail",params:{id:r.id}})}return D(()=>{u()}),(r,e)=>{const l=$,g=V;return v(),T("div",S,[s.value==="tasks"?(v(),_(y,{key:0,title:"",data:n.value,loading:d.value,"delete-fn":k,"create-text":"创建评测任务",onCreate:E,"row-key":"id",onRefresh:u},{title:o(()=>[i("div",q,[i("button",{class:c(["capsule-tab-item",{active:m("tasks")}]),onClick:e[0]||(e[0]=t=>s.value="tasks")},"评测任务",2),i("button",{class:c(["capsule-tab-item",{active:m("leaderboard")}]),onClick:e[1]||(e[1]=t=>s.value="leaderboard")},"排行榜",2)])]),columns:o(()=>[a(l,{label:"任务名称",prop:"eval_task_name",align:"center"}),a(l,{label:"评测模型",prop:"model_name",align:"center"}),a(l,{label:"数据集",prop:"dataset",align:"center"}),a(l,{label:"指标",prop:"metric",align:"center"}),a(l,{label:"评分",prop:"score",width:"100",align:"center"}),a(l,{label:"状态",width:"100",align:"center"},{default:o(({row:t})=>[a(A,{status:t.status},null,8,["status"])]),_:1}),a(l,{label:"创建时间",align:"center",width:"180"},{default:o(({row:t})=>[b(L(t.create_time?new Date(t.create_time).toLocaleString("zh-CN"):"-"),1)]),_:1})]),actions:o(({row:t})=>[a(g,{link:"",type:"primary",size:"small",onClick:h=>x(t)},{default:o(()=>[...e[4]||(e[4]=[i("i",{class:"fa fa-file-text-o",style:{"margin-right":"4px"}},null,-1),b("详情 ",-1)])]),_:1},8,["onClick"]),a(g,{link:"",type:"danger",size:"small",onClick:h=>k(t)},{default:o(()=>[...e[5]||(e[5]=[i("i",{class:"fa fa-trash-o",style:{"margin-right":"4px"}},null,-1),b("删除 ",-1)])]),_:1},8,["onClick"])]),_:1},8,["data","loading"])):C("",!0),s.value==="leaderboard"?(v(),_(y,{key:1,title:"",data:w.value,"row-key":"rank"},{title:o(()=>[i("div",I,[i("button",{class:c(["capsule-tab-item",{active:m("tasks")}]),onClick:e[2]||(e[2]=t=>s.value="tasks")},"评测任务",2),i("button",{class:c(["capsule-tab-item",{active:m("leaderboard")}]),onClick:e[3]||(e[3]=t=>s.value="leaderboard")},"排行榜",2)])]),columns:o(()=>[a(l,{label:"排名",prop:"rank",width:"80",align:"center"}),a(l,{label:"模型名称",prop:"name",align:"center"}),a(l,{label:"综合评分",prop:"score",align:"center"})]),_:1},8,["data"])):C("",!0)])}}}),Ve=R(Q,[["__scopeId","data-v-894b0bb7"]]);export{Ve as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c,q as o}from"./index-C8bRaOsd.js";const n={},r={class:"simple-page"};function a(_,e){return t(),c("section",r,[...e[0]||(e[0]=[o("h1",null,"使用文档",-1),o("p",null,"第一版系统已接入后端、数据集、模型、微调任务、算力节点和训练日志主链路。",-1)])])}const p=s(n,[["render",a],["__scopeId","data-v-962c8803"]]);export{p as default};
|
import{_ as s}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c,q as o}from"./index-CGB0A5x_.js";const n={},r={class:"simple-page"};function a(_,e){return t(),c("section",r,[...e[0]||(e[0]=[o("h1",null,"使用文档",-1),o("p",null,"第一版系统已接入后端、数据集、模型、微调任务、算力节点和训练日志主链路。",-1)])])}const p=s(n,[["render",a],["__scopeId","data-v-962c8803"]]);export{p as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as T}from"./el-alert-CdZFij8S.js";import{a as A,E as D}from"./el-form-item-DGwcZKHQ.js";import{E as L}from"./index-CoLjyrxq.js";import{E as j}from"./index-B2Z3XS2S.js";import{E as z,b as H,a as J}from"./el-select-DzauTPwe.js";import{E as K}from"./el-divider-sRU3cxL5.js";import{d as Q,G as W,e as i,w as o,at as X,y as u,z as Y,o as s,s as a,x as b,c as v,ad as k,M as w,g as Z,j as p,A as B,v as ee}from"./index-C8bRaOsd.js";import"./el-scrollbar-CMp13_RQ.js";import"./el-popper-BY86ZM1h.js";import"./el-tag-11zBoTqA.js";import{P as te}from"./PageCard-BsRjYlIm.js";import{g as le,a as ae}from"./model-CCFfanoR.js";import"./vnode-B9WOR-0a.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./index-BpW9Z31J.js";import"./index-BVldZEzQ.js";import"./scroll-DL9cY7fX.js";import"./clamp-CNwRTQDt.js";import"./toNumber-Bt8UgFrr.js";import"./_baseIteratee-7-PMrTPE.js";import"./el-card-BXAZ-Y4u.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const Ge=Q({__name:"InferenceCreateView",setup(oe){const E=ee(),f=u(),c=u(!1),m=u(""),V=u([]),h=u([]),_=u([]),x=p(()=>V.value.map(t=>({key:`db-${t.id}`,id:t.id,name:t.name,source:"database",model_path:t.path||""}))),M=p(()=>h.value.map(t=>({key:`trained-${t.id}`,id:t.id,name:t.name,source:"trained",model_path:t.merged_path||t.base_model_path||"",merged:t.merged,merging:t.merging,disabled:t.merged===!1}))),G=p(()=>{const t={};for(const e of[...x.value,...M.value])t[e.key]=e;return t}),n=Y({name:"",description:"",model_key:"",gpu_id:0}),I={name:[{required:!0,message:"请输入推理名称",trigger:"blur"}],model_key:[{required:!0,message:"请选择模型",trigger:"change"}]},O=p(()=>G.value[n.model_key]);async function S(){f.value&&await f.value.validate(async t=>{if(!t)return;const e=O.value;if(!e){B.warning("请选择模型");return}c.value=!0,m.value="正在启动模型服务...";try{await new Promise(r=>setTimeout(r,1200)),B.success("模型已启动"),E.push({path:"/model-inference/chat/mock",query:{model:e.name}})}finally{c.value=!1,m.value=""}})}function $(){E.back()}async function q(){try{const[t,e,r]=await Promise.all([le(),ae(),X()]);V.value=t||[],h.value=(e==null?void 0:e.models)||[],_.value=(r==null?void 0:r.gpu)||[],_.value.length>0&&(n.gpu_id=0)}catch{}}return W(q),(t,e)=>{const r=L,d=A,F=K,g=J,C=H,P=z,N=T,U=j,R=D;return s(),i(te,{title:"新建推理"},{default:o(()=>[a(R,{ref_key:"formRef",ref:f,model:n,rules:I,"label-width":"100px"},{default:o(()=>[a(d,{label:"推理名称",prop:"name"},{default:o(()=>[a(r,{modelValue:n.name,"onUpdate:modelValue":e[0]||(e[0]=l=>n.name=l),placeholder:"请输入推理名称",maxlength:"50","show-word-limit":"",style:{"max-width":"400px"}},null,8,["modelValue"])]),_:1}),a(d,{label:"描述"},{default:o(()=>[a(r,{modelValue:n.description,"onUpdate:modelValue":e[1]||(e[1]=l=>n.description=l),type:"textarea",rows:2,maxlength:"200","show-word-limit":"",style:{"max-width":"400px"}},null,8,["modelValue"])]),_:1}),a(F,{"content-position":"left"},{default:o(()=>[...e[4]||(e[4]=[b("选择模型",-1)])]),_:1}),a(d,{label:"选择模型",prop:"model_key"},{default:o(()=>[a(P,{modelValue:n.model_key,"onUpdate:modelValue":e[2]||(e[2]=l=>n.model_key=l),placeholder:"请选择模型",filterable:"",style:{width:"400px"}},{default:o(()=>[a(C,{label:"本地模型"},{default:o(()=>[(s(!0),v(w,null,k(x.value,l=>(s(),i(g,{key:l.key,label:l.name,value:l.key},null,8,["label","value"]))),128))]),_:1}),a(C,{label:"已训练模型"},{default:o(()=>[(s(!0),v(w,null,k(M.value,l=>(s(),i(g,{key:l.key,label:l.name+(l.disabled?"(未合并)":""),value:l.key,disabled:l.disabled},null,8,["label","value","disabled"]))),128))]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(d,{label:"GPU"},{default:o(()=>[a(P,{modelValue:n.gpu_id,"onUpdate:modelValue":e[3]||(e[3]=l=>n.gpu_id=l),style:{width:"400px"}},{default:o(()=>[(s(!0),v(w,null,k(_.value,(l,y)=>(s(),i(g,{key:y,label:`${l.name} (GPU${y})`,value:y},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),m.value?(s(),i(d,{key:0,label:"启动状态"},{default:o(()=>[a(N,{title:m.value,type:"info",closable:!1,"show-icon":""},null,8,["title"])]),_:1})):Z("",!0),a(d,null,{default:o(()=>[a(U,{type:"primary",loading:c.value,onClick:S},{default:o(()=>[...e[5]||(e[5]=[b("开始推理",-1)])]),_:1},8,["loading"]),a(U,{onClick:$},{default:o(()=>[...e[6]||(e[6]=[b("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})}}});export{Ge as default};
|
import{E as T}from"./el-alert-DBfM1mZE.js";import{a as A,E as D}from"./el-form-item-Ct_zBuY0.js";import{E as L}from"./index-CbmPSBt0.js";import{E as j}from"./index-CCavIuTY.js";import{E as z,b as H,a as J}from"./el-select-C59URVI0.js";import{E as K}from"./el-divider-DF2VMDw-.js";import{d as Q,G as W,e as i,w as o,at as X,y as u,z as Y,o as s,s as a,x as b,c as v,ad as k,M as w,g as Z,j as p,A as B,v as ee}from"./index-CGB0A5x_.js";import"./el-scrollbar-p6_f_LH2.js";import"./el-popper-DvBtRO32.js";import"./el-tag-C_D80BPW.js";import{P as te}from"./PageCard-D1lOaeEG.js";import{g as le,a as ae}from"./model-xlHsHa68.js";import"./vnode-DFpZw5lG.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./index-BPwPlcbL.js";import"./index-khuXz7sd.js";import"./scroll-C0BSy_Rk.js";import"./clamp-BqqU4KQ-.js";import"./toNumber-IRhFg6gN.js";import"./_baseIteratee-uVh0OyD5.js";import"./el-card-BWcR1iD2.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const Ge=Q({__name:"InferenceCreateView",setup(oe){const E=ee(),f=u(),c=u(!1),m=u(""),V=u([]),h=u([]),_=u([]),x=p(()=>V.value.map(t=>({key:`db-${t.id}`,id:t.id,name:t.name,source:"database",model_path:t.path||""}))),M=p(()=>h.value.map(t=>({key:`trained-${t.id}`,id:t.id,name:t.name,source:"trained",model_path:t.merged_path||t.base_model_path||"",merged:t.merged,merging:t.merging,disabled:t.merged===!1}))),G=p(()=>{const t={};for(const e of[...x.value,...M.value])t[e.key]=e;return t}),n=Y({name:"",description:"",model_key:"",gpu_id:0}),I={name:[{required:!0,message:"请输入推理名称",trigger:"blur"}],model_key:[{required:!0,message:"请选择模型",trigger:"change"}]},O=p(()=>G.value[n.model_key]);async function S(){f.value&&await f.value.validate(async t=>{if(!t)return;const e=O.value;if(!e){B.warning("请选择模型");return}c.value=!0,m.value="正在启动模型服务...";try{await new Promise(r=>setTimeout(r,1200)),B.success("模型已启动"),E.push({path:"/model-inference/chat/mock",query:{model:e.name}})}finally{c.value=!1,m.value=""}})}function $(){E.back()}async function q(){try{const[t,e,r]=await Promise.all([le(),ae(),X()]);V.value=t||[],h.value=(e==null?void 0:e.models)||[],_.value=(r==null?void 0:r.gpu)||[],_.value.length>0&&(n.gpu_id=0)}catch{}}return W(q),(t,e)=>{const r=L,d=A,F=K,g=J,C=H,P=z,N=T,U=j,R=D;return s(),i(te,{title:"新建推理"},{default:o(()=>[a(R,{ref_key:"formRef",ref:f,model:n,rules:I,"label-width":"100px"},{default:o(()=>[a(d,{label:"推理名称",prop:"name"},{default:o(()=>[a(r,{modelValue:n.name,"onUpdate:modelValue":e[0]||(e[0]=l=>n.name=l),placeholder:"请输入推理名称",maxlength:"50","show-word-limit":"",style:{"max-width":"400px"}},null,8,["modelValue"])]),_:1}),a(d,{label:"描述"},{default:o(()=>[a(r,{modelValue:n.description,"onUpdate:modelValue":e[1]||(e[1]=l=>n.description=l),type:"textarea",rows:2,maxlength:"200","show-word-limit":"",style:{"max-width":"400px"}},null,8,["modelValue"])]),_:1}),a(F,{"content-position":"left"},{default:o(()=>[...e[4]||(e[4]=[b("选择模型",-1)])]),_:1}),a(d,{label:"选择模型",prop:"model_key"},{default:o(()=>[a(P,{modelValue:n.model_key,"onUpdate:modelValue":e[2]||(e[2]=l=>n.model_key=l),placeholder:"请选择模型",filterable:"",style:{width:"400px"}},{default:o(()=>[a(C,{label:"本地模型"},{default:o(()=>[(s(!0),v(w,null,k(x.value,l=>(s(),i(g,{key:l.key,label:l.name,value:l.key},null,8,["label","value"]))),128))]),_:1}),a(C,{label:"已训练模型"},{default:o(()=>[(s(!0),v(w,null,k(M.value,l=>(s(),i(g,{key:l.key,label:l.name+(l.disabled?"(未合并)":""),value:l.key,disabled:l.disabled},null,8,["label","value","disabled"]))),128))]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(d,{label:"GPU"},{default:o(()=>[a(P,{modelValue:n.gpu_id,"onUpdate:modelValue":e[3]||(e[3]=l=>n.gpu_id=l),style:{width:"400px"}},{default:o(()=>[(s(!0),v(w,null,k(_.value,(l,y)=>(s(),i(g,{key:y,label:`${l.name} (GPU${y})`,value:y},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),m.value?(s(),i(d,{key:0,label:"启动状态"},{default:o(()=>[a(N,{title:m.value,type:"info",closable:!1,"show-icon":""},null,8,["title"])]),_:1})):Z("",!0),a(d,null,{default:o(()=>[a(U,{type:"primary",loading:c.value,onClick:S},{default:o(()=>[...e[5]||(e[5]=[b("开始推理",-1)])]),_:1},8,["loading"]),a(U,{onClick:$},{default:o(()=>[...e[6]||(e[6]=[b("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})}}});export{Ge as default};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as $,a as q}from"./el-form-item-DGwcZKHQ.js";import{E as z}from"./index-CoLjyrxq.js";import{u as K,E as P}from"./index-B2Z3XS2S.js";import{E as R}from"./el-checkbox-Jsj5DifU.js";import{b as T,i as U,d as N,u as A,a as D,o as u,c as k,e as h,w as t,r as M,f as w,E as j,g,n as E,h as V,j as b,k as C,l as G,m as H,p as J,q as n,s,t as O,v as Q,x as y,y as B,z as W,A as X}from"./index-C8bRaOsd.js";import{_ as S}from"./logo-CxXS7KxG.js";import{_ as Y}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./omit-BHHw65tB.js";const Z=T({type:{type:String,values:["primary","success","warning","info","danger","default"],default:void 0},underline:{type:[Boolean,String],values:[!0,!1,"always","never","hover"],default:void 0},disabled:Boolean,href:{type:String,default:""},target:{type:String,default:"_self"},icon:{type:U}}),ee={click:l=>l instanceof MouseEvent},ae=["href","target"];var ne=N({name:"ElLink",__name:"link",props:Z,emits:ee,setup(l,{emit:c}){const o=l,i=c,r=A("link");K({scope:"el-link",from:"The underline option (boolean)",replacement:"'always' | 'hover' | 'never'",version:"3.0.0",ref:"https://element-plus.org/en-US/component/link.html#underline"},b(()=>C(o.underline)));const a=D("link"),m=b(()=>{var e;return[a.b(),a.m(o.type??((e=r.value)==null?void 0:e.type)??"default"),a.is("disabled",o.disabled),a.is("underline",d.value==="always"),a.is("hover-underline",d.value==="hover"&&!o.disabled)]}),d=b(()=>{var e;return C(o.underline)?o.underline?"hover":"never":o.underline??((e=r.value)==null?void 0:e.underline)??"hover"});function p(e){o.disabled||i("click",e)}return(e,f)=>(u(),k("a",{class:E(m.value),href:l.disabled||!l.href?void 0:l.href,target:l.disabled||!l.href?void 0:l.target,onClick:p},[l.icon?(u(),h(w(j),{key:0},{default:t(()=>[(u(),h(M(l.icon)))]),_:1})):g("v-if",!0),e.$slots.default?(u(),k("span",{key:1,class:E(w(a).e("inner"))},[V(e.$slots,"default")],2)):g("v-if",!0),e.$slots.icon?V(e.$slots,"icon",{key:2}):g("v-if",!0)],10,ae))}}),le=ne;const oe=G(le),se={class:"login-page"},te={class:"login-panel"},re={class:"login-form-wrap"},ie={class:"login-options"},de=N({__name:"LoginView",setup(l){const c=Q(),o=H(),i=B(),r=B(!1),a=W({username:"",password:""}),m={username:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function d(){i.value&&await i.value.validate(async p=>{if(p){r.value=!0;try{await o.login(a.username,a.password),X.success("登录成功"),c.push("/dashboard")}catch{}finally{r.value=!1}}})}return(p,e)=>{const f=z,_=q,x=R,F=oe,I=P,L=$;return u(),k("div",se,[e[8]||(e[8]=J('<section class="login-visual" aria-labelledby="platform-title" data-v-5b789cef><div class="login-visual-content" data-v-5b789cef><div class="login-visual-copy" data-v-5b789cef><h1 id="platform-title" data-v-5b789cef>远光软件微调平台</h1><p data-v-5b789cef>大模型微调、评测与推理的一体化工作台</p></div><div class="login-visual-footer" aria-label="平台核心能力" data-v-5b789cef><span data-v-5b789cef>数据准备</span><span aria-hidden="true" data-v-5b789cef>·</span><span data-v-5b789cef>模型训练</span><span aria-hidden="true" data-v-5b789cef>·</span><span data-v-5b789cef>效果评测</span></div></div></section>',1)),n("main",te,[e[6]||(e[6]=n("div",{class:"brand-lockup",role:"img","aria-label":"远光软件"},[n("span",{class:"brand-logo-crop brand-logo-crop-mark","aria-hidden":"true"},[n("img",{src:S,alt:""})]),n("span",{class:"brand-logo-crop brand-logo-crop-wordmark","aria-hidden":"true"},[n("img",{src:S,alt:""})])],-1)),n("div",re,[e[5]||(e[5]=n("div",{class:"login-heading"},[n("span",null,"账号登录"),n("h2",null,"欢迎回来"),n("p",null,"登录后继续使用微调平台")],-1)),s(L,{ref_key:"loginFormRef",ref:i,model:a,rules:m,"label-position":"top",size:"large",onKeyup:O(d,["enter"])},{default:t(()=>[s(_,{label:"账号",prop:"username"},{default:t(()=>[s(f,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=v=>a.username=v),placeholder:"请输入账号",clearable:""},null,8,["modelValue"])]),_:1}),s(_,{label:"密码",prop:"password"},{default:t(()=>[s(f,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=v=>a.password=v),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])]),_:1}),n("div",ie,[s(x,null,{default:t(()=>[...e[2]||(e[2]=[y("记住密码",-1)])]),_:1}),s(F,{type:"primary",underline:!1},{default:t(()=>[...e[3]||(e[3]=[y("忘记密码?",-1)])]),_:1})]),s(I,{type:"primary",class:"login-btn",loading:r.value,onClick:d},{default:t(()=>[...e[4]||(e[4]=[y(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1},8,["model"])]),e[7]||(e[7]=n("footer",null,"© 2026 远光软件",-1))])])}}}),Ee=Y(de,[["__scopeId","data-v-5b789cef"]]);export{Ee as default};
|
import{E as $,a as q}from"./el-form-item-Ct_zBuY0.js";import{E as z}from"./index-CbmPSBt0.js";import{u as K,E as P}from"./index-CCavIuTY.js";import{E as R}from"./el-checkbox-Ci1DH0Aj.js";import{b as T,i as U,d as N,u as A,a as D,o as u,c as k,e as h,w as t,r as M,f as w,E as j,g,n as E,h as V,j as b,k as C,l as G,m as H,p as J,q as n,s,t as O,v as Q,x as y,y as B,z as W,A as X}from"./index-CGB0A5x_.js";import{_ as S}from"./logo-CxXS7KxG.js";import{_ as Y}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./omit-DaFv1hTo.js";const Z=T({type:{type:String,values:["primary","success","warning","info","danger","default"],default:void 0},underline:{type:[Boolean,String],values:[!0,!1,"always","never","hover"],default:void 0},disabled:Boolean,href:{type:String,default:""},target:{type:String,default:"_self"},icon:{type:U}}),ee={click:l=>l instanceof MouseEvent},ae=["href","target"];var ne=N({name:"ElLink",__name:"link",props:Z,emits:ee,setup(l,{emit:c}){const o=l,i=c,r=A("link");K({scope:"el-link",from:"The underline option (boolean)",replacement:"'always' | 'hover' | 'never'",version:"3.0.0",ref:"https://element-plus.org/en-US/component/link.html#underline"},b(()=>C(o.underline)));const a=D("link"),m=b(()=>{var e;return[a.b(),a.m(o.type??((e=r.value)==null?void 0:e.type)??"default"),a.is("disabled",o.disabled),a.is("underline",d.value==="always"),a.is("hover-underline",d.value==="hover"&&!o.disabled)]}),d=b(()=>{var e;return C(o.underline)?o.underline?"hover":"never":o.underline??((e=r.value)==null?void 0:e.underline)??"hover"});function p(e){o.disabled||i("click",e)}return(e,f)=>(u(),k("a",{class:E(m.value),href:l.disabled||!l.href?void 0:l.href,target:l.disabled||!l.href?void 0:l.target,onClick:p},[l.icon?(u(),h(w(j),{key:0},{default:t(()=>[(u(),h(M(l.icon)))]),_:1})):g("v-if",!0),e.$slots.default?(u(),k("span",{key:1,class:E(w(a).e("inner"))},[V(e.$slots,"default")],2)):g("v-if",!0),e.$slots.icon?V(e.$slots,"icon",{key:2}):g("v-if",!0)],10,ae))}}),le=ne;const oe=G(le),se={class:"login-page"},te={class:"login-panel"},re={class:"login-form-wrap"},ie={class:"login-options"},de=N({__name:"LoginView",setup(l){const c=Q(),o=H(),i=B(),r=B(!1),a=W({username:"",password:""}),m={username:[{required:!0,message:"请输入账号",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function d(){i.value&&await i.value.validate(async p=>{if(p){r.value=!0;try{await o.login(a.username,a.password),X.success("登录成功"),c.push("/dashboard")}catch{}finally{r.value=!1}}})}return(p,e)=>{const f=z,_=q,x=R,F=oe,I=P,L=$;return u(),k("div",se,[e[8]||(e[8]=J('<section class="login-visual" aria-labelledby="platform-title" data-v-5b789cef><div class="login-visual-content" data-v-5b789cef><div class="login-visual-copy" data-v-5b789cef><h1 id="platform-title" data-v-5b789cef>远光软件微调平台</h1><p data-v-5b789cef>大模型微调、评测与推理的一体化工作台</p></div><div class="login-visual-footer" aria-label="平台核心能力" data-v-5b789cef><span data-v-5b789cef>数据准备</span><span aria-hidden="true" data-v-5b789cef>·</span><span data-v-5b789cef>模型训练</span><span aria-hidden="true" data-v-5b789cef>·</span><span data-v-5b789cef>效果评测</span></div></div></section>',1)),n("main",te,[e[6]||(e[6]=n("div",{class:"brand-lockup",role:"img","aria-label":"远光软件"},[n("span",{class:"brand-logo-crop brand-logo-crop-mark","aria-hidden":"true"},[n("img",{src:S,alt:""})]),n("span",{class:"brand-logo-crop brand-logo-crop-wordmark","aria-hidden":"true"},[n("img",{src:S,alt:""})])],-1)),n("div",re,[e[5]||(e[5]=n("div",{class:"login-heading"},[n("span",null,"账号登录"),n("h2",null,"欢迎回来"),n("p",null,"登录后继续使用微调平台")],-1)),s(L,{ref_key:"loginFormRef",ref:i,model:a,rules:m,"label-position":"top",size:"large",onKeyup:O(d,["enter"])},{default:t(()=>[s(_,{label:"账号",prop:"username"},{default:t(()=>[s(f,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=v=>a.username=v),placeholder:"请输入账号",clearable:""},null,8,["modelValue"])]),_:1}),s(_,{label:"密码",prop:"password"},{default:t(()=>[s(f,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=v=>a.password=v),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])]),_:1}),n("div",ie,[s(x,null,{default:t(()=>[...e[2]||(e[2]=[y("记住密码",-1)])]),_:1}),s(F,{type:"primary",underline:!1},{default:t(()=>[...e[3]||(e[3]=[y("忘记密码?",-1)])]),_:1})]),s(I,{type:"primary",class:"login-btn",loading:r.value,onClick:d},{default:t(()=>[...e[4]||(e[4]=[y(" 登录 ",-1)])]),_:1},8,["loading"])]),_:1},8,["model"])]),e[7]||(e[7]=n("footer",null,"© 2026 远光软件",-1))])])}}}),Ee=Y(de,[["__scopeId","data-v-5b789cef"]]);export{Ee as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as A}from"./el-alert-CdZFij8S.js";import{a as N,E as T}from"./el-form-item-DGwcZKHQ.js";import{E as B}from"./index-CoLjyrxq.js";import{E as I}from"./index-B2Z3XS2S.js";import{E as R}from"./el-tag-11zBoTqA.js";import{d as P,z as q,G as D,e as r,w as t,j as y,y as E,o as n,s as a,f as F,ar as U,x as m,aa as W,c as j,g as z,A as M,v as G,ac as H}from"./index-C8bRaOsd.js";import{P as L}from"./PageCard-BsRjYlIm.js";import{a as O,m as S}from"./model-CCFfanoR.js";import{_ as J}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./vnode-B9WOR-0a.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./el-card-BXAZ-Y4u.js";const K={key:0,class:"model-status"},Q=P({__name:"MergeWeightsView",setup(X){const v=H(),b=G(),s=E(!1),u=y(()=>v.query.model||""),w=y(()=>v.query.method||"lora"),i=E([]),_=y(()=>i.value.find(l=>l.name===u.value)),o=q({model_name:u.value,train_method:w.value,base_model_path:""});async function V(){try{const l=await O();i.value=(l==null?void 0:l.models)||[];const e=i.value.find(p=>p.name===u.value);o.base_model_path=(e==null?void 0:e.base_model_path)||""}catch{}}async function k(){if(!o.model_name||!o.base_model_path){M.warning("缺少模型信息");return}s.value=!0;try{await S({model_name:o.model_name,train_method:o.train_method,base_model_path:o.base_model_path}),M.success("合并成功"),b.push("/model-manage")}catch{}finally{s.value=!1}}function x(){b.back()}return D(V),(l,e)=>{const p=A,f=B,d=N,h=I,C=T,c=R;return n(),r(L,{title:"合并权重"},{default:t(()=>[a(p,{type:"info",closable:!1,"show-icon":"",title:"将 LoRA 适配器权重合并到基座模型,合并后可直接用于推理部署。",style:{"margin-bottom":"20px"}}),a(C,{"label-width":"120px",style:{"max-width":"600px"}},{default:t(()=>[a(d,{label:"模型名称"},{default:t(()=>[a(f,{modelValue:o.model_name,"onUpdate:modelValue":e[0]||(e[0]=g=>o.model_name=g),disabled:""},null,8,["modelValue"])]),_:1}),a(d,{label:"训练方法"},{default:t(()=>[a(f,{"model-value":F(U)[o.train_method]||o.train_method,disabled:""},null,8,["model-value"])]),_:1}),a(d,{label:"基座模型路径"},{default:t(()=>[a(f,{modelValue:o.base_model_path,"onUpdate:modelValue":e[1]||(e[1]=g=>o.base_model_path=g),placeholder:"基座模型路径"},null,8,["modelValue"])]),_:1}),a(d,null,{default:t(()=>[a(h,{type:"primary",loading:s.value,onClick:k},{default:t(()=>[m(W(s.value?"合并中...":"开始合并"),1)]),_:1},8,["loading"]),a(h,{onClick:x},{default:t(()=>[...e[2]||(e[2]=[m("取消",-1)])]),_:1})]),_:1})]),_:1}),_.value?(n(),j("div",K,[_.value.merging?(n(),r(c,{key:0,type:"warning"},{default:t(()=>[...e[3]||(e[3]=[m("合并中",-1)])]),_:1})):_.value.merged?(n(),r(c,{key:1,type:"success"},{default:t(()=>[...e[4]||(e[4]=[m("已合并",-1)])]),_:1})):(n(),r(c,{key:2,type:"info"},{default:t(()=>[...e[5]||(e[5]=[m("未合并",-1)])]),_:1}))])):z("",!0)]),_:1})}}}),pe=J(Q,[["__scopeId","data-v-2d4f1cb8"]]);export{pe as default};
|
import{E as A}from"./el-alert-DBfM1mZE.js";import{a as N,E as T}from"./el-form-item-Ct_zBuY0.js";import{E as B}from"./index-CbmPSBt0.js";import{E as I}from"./index-CCavIuTY.js";import{E as R}from"./el-tag-C_D80BPW.js";import{d as P,z as q,G as D,e as r,w as t,j as y,y as E,o as n,s as a,f as F,ar as U,x as m,aa as W,c as j,g as z,A as M,v as G,ac as H}from"./index-CGB0A5x_.js";import{P as L}from"./PageCard-D1lOaeEG.js";import{a as O,m as S}from"./model-xlHsHa68.js";import{_ as J}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./vnode-DFpZw5lG.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./el-card-BWcR1iD2.js";const K={key:0,class:"model-status"},Q=P({__name:"MergeWeightsView",setup(X){const v=H(),b=G(),s=E(!1),u=y(()=>v.query.model||""),w=y(()=>v.query.method||"lora"),i=E([]),_=y(()=>i.value.find(l=>l.name===u.value)),o=q({model_name:u.value,train_method:w.value,base_model_path:""});async function V(){try{const l=await O();i.value=(l==null?void 0:l.models)||[];const e=i.value.find(p=>p.name===u.value);o.base_model_path=(e==null?void 0:e.base_model_path)||""}catch{}}async function k(){if(!o.model_name||!o.base_model_path){M.warning("缺少模型信息");return}s.value=!0;try{await S({model_name:o.model_name,train_method:o.train_method,base_model_path:o.base_model_path}),M.success("合并成功"),b.push("/model-manage")}catch{}finally{s.value=!1}}function x(){b.back()}return D(V),(l,e)=>{const p=A,f=B,d=N,h=I,C=T,c=R;return n(),r(L,{title:"合并权重"},{default:t(()=>[a(p,{type:"info",closable:!1,"show-icon":"",title:"将 LoRA 适配器权重合并到基座模型,合并后可直接用于推理部署。",style:{"margin-bottom":"20px"}}),a(C,{"label-width":"120px",style:{"max-width":"600px"}},{default:t(()=>[a(d,{label:"模型名称"},{default:t(()=>[a(f,{modelValue:o.model_name,"onUpdate:modelValue":e[0]||(e[0]=g=>o.model_name=g),disabled:""},null,8,["modelValue"])]),_:1}),a(d,{label:"训练方法"},{default:t(()=>[a(f,{"model-value":F(U)[o.train_method]||o.train_method,disabled:""},null,8,["model-value"])]),_:1}),a(d,{label:"基座模型路径"},{default:t(()=>[a(f,{modelValue:o.base_model_path,"onUpdate:modelValue":e[1]||(e[1]=g=>o.base_model_path=g),placeholder:"基座模型路径"},null,8,["modelValue"])]),_:1}),a(d,null,{default:t(()=>[a(h,{type:"primary",loading:s.value,onClick:k},{default:t(()=>[m(W(s.value?"合并中...":"开始合并"),1)]),_:1},8,["loading"]),a(h,{onClick:x},{default:t(()=>[...e[2]||(e[2]=[m("取消",-1)])]),_:1})]),_:1})]),_:1}),_.value?(n(),j("div",K,[_.value.merging?(n(),r(c,{key:0,type:"warning"},{default:t(()=>[...e[3]||(e[3]=[m("合并中",-1)])]),_:1})):_.value.merged?(n(),r(c,{key:1,type:"success"},{default:t(()=>[...e[4]||(e[4]=[m("已合并",-1)])]),_:1})):(n(),r(c,{key:2,type:"info"},{default:t(()=>[...e[5]||(e[5]=[m("未合并",-1)])]),_:1}))])):z("",!0)]),_:1})}}}),pe=J(Q,[["__scopeId","data-v-2d4f1cb8"]]);export{pe as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as o}from"./el-tag-11zBoTqA.js";import{d as p,e as n,w as r,j as c,o as l,x as u,aa as m}from"./index-C8bRaOsd.js";import{s as _,a as i}from"./status-Dl1fykxa.js";const T=p({__name:"ModelStatusTag",props:{status:{}},setup(e){const t=e,a=c(()=>({text:i(t.status),type:_(t.status)}));return(f,g)=>{const s=o;return l(),n(s,{type:a.value.type,size:"small",effect:"light"},{default:r(()=>[u(m(a.value.text),1)]),_:1},8,["type"])}}});export{T as _};
|
import{E as o}from"./el-tag-C_D80BPW.js";import{d as p,e as n,w as r,j as c,o as l,x as u,aa as m}from"./index-CGB0A5x_.js";import{s as _,a as i}from"./status-Dl1fykxa.js";const T=p({__name:"ModelStatusTag",props:{status:{}},setup(e){const t=e,a=c(()=>({text:i(t.status),type:_(t.status)}));return(f,g)=>{const s=o;return l(),n(s,{type:a.value.type,size:"small",effect:"light"},{default:r(()=>[u(m(a.value.text),1)]),_:1},8,["type"])}}});export{T as _};
|
||||||
@@ -1 +1 @@
|
|||||||
import{E as i}from"./el-card-BXAZ-Y4u.js";import{d as n,e as u,w as p,o as a,c as s,h as o,g as r,q as d,aa as l}from"./index-C8bRaOsd.js";import{_}from"./_plugin-vue_export-helper-DlAUqK2U.js";const h={key:0,class:"page-card-header"},m={class:"page-card-title"},f={key:0,class:"page-card-subtitle"},g={key:0,class:"page-card-extra"},v={class:"page-card-body"},b=n({__name:"PageCard",props:{title:{},subtitle:{},bordered:{type:Boolean,default:!1}},setup(t){return(e,k)=>{const c=i;return a(),u(c,{shadow:"never",class:"page-card"},{default:p(()=>[t.title||e.$slots.header?(a(),s("div",h,[o(e.$slots,"header",{},()=>[d("div",null,[d("h2",m,l(t.title),1),t.subtitle?(a(),s("p",f,l(t.subtitle),1)):r("",!0)])],!0),e.$slots.extra?(a(),s("div",g,[o(e.$slots,"extra",{},void 0,!0)])):r("",!0)])):r("",!0),d("div",v,[o(e.$slots,"default",{},void 0,!0)])]),_:3})}}}),$=_(b,[["__scopeId","data-v-4478be23"]]);export{$ as P};
|
import{E as i}from"./el-card-BWcR1iD2.js";import{d as n,e as u,w as p,o as a,c as s,h as o,g as r,q as d,aa as l}from"./index-CGB0A5x_.js";import{_}from"./_plugin-vue_export-helper-DlAUqK2U.js";const h={key:0,class:"page-card-header"},m={class:"page-card-title"},f={key:0,class:"page-card-subtitle"},g={key:0,class:"page-card-extra"},v={class:"page-card-body"},b=n({__name:"PageCard",props:{title:{},subtitle:{},bordered:{type:Boolean,default:!1}},setup(t){return(e,k)=>{const c=i;return a(),u(c,{shadow:"never",class:"page-card"},{default:p(()=>[t.title||e.$slots.header?(a(),s("div",h,[o(e.$slots,"header",{},()=>[d("div",null,[d("h2",m,l(t.title),1),t.subtitle?(a(),s("p",f,l(t.subtitle),1)):r("",!0)])],!0),e.$slots.extra?(a(),s("div",g,[o(e.$slots,"extra",{},void 0,!0)])):r("",!0)])):r("",!0),d("div",v,[o(e.$slots,"default",{},void 0,!0)])]),_:3})}}}),$=_(b,[["__scopeId","data-v-4478be23"]]);export{$ as P};
|
||||||
@@ -1 +1 @@
|
|||||||
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c as n,q as s}from"./index-C8bRaOsd.js";const r={},a={class:"simple-page"};function c(i,e){return t(),n("section",a,[...e[0]||(e[0]=[s("h1",null,"无权访问",-1),s("p",null,"当前账号没有访问该页面的权限,请联系管理员调整角色或页面权限。",-1)])])}const d=o(r,[["render",c],["__scopeId","data-v-9fad40f6"]]);export{d as default};
|
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c as n,q as s}from"./index-CGB0A5x_.js";const r={},a={class:"simple-page"};function c(i,e){return t(),n("section",a,[...e[0]||(e[0]=[s("h1",null,"无权访问",-1),s("p",null,"当前账号没有访问该页面的权限,请联系管理员调整角色或页面权限。",-1)])])}const d=o(r,[["render",c],["__scopeId","data-v-9fad40f6"]]);export{d as default};
|
||||||
@@ -1 +1 @@
|
|||||||
import{a as y,E as h}from"./el-form-item-DGwcZKHQ.js";import{E as B}from"./index-CoLjyrxq.js";import{E as R}from"./index-B2Z3XS2S.js";import{d as S,G as I,e as N,w as l,j as g,z as O,o as m,s as o,q as v,c as x,ad as U,n as V,f as q,bx as F,M as L,x as b,aa as M,A as w,y as j,v as z,ac as D}from"./index-C8bRaOsd.js";import{P}from"./PageCard-BsRjYlIm.js";import{u as A}from"./tools-nO4co6Fg.js";import{_ as G}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./el-card-BXAZ-Y4u.js";const $={class:"icon-grid"},H=["onClick"],J=S({__name:"ToolCreateView",setup(K){const d=D(),p=z(),n=A(),i=j(),s=g(()=>d.params.id!=null),c=g(()=>s.value?n.getTool(d.params.id):void 0),e=O({id:"",name:"",description:"",url:"",icon:"fa-cog"}),C={name:[{required:!0,message:"请输入工具名称",trigger:"blur"},{max:30,message:"不超过 30 字符",trigger:"blur"}],url:[{required:!0,message:"请输入跳转地址",trigger:"blur"}]};function k(){i.value&&i.value.validate(f=>{f&&(s.value?(n.updateTool(e.id,{...e}),w.success("更新成功")):(n.addTool({...e,id:"custom_"+Date.now()}),w.success("添加成功")),p.push("/tools"))})}function E(){p.back()}return I(()=>{c.value&&Object.assign(e,c.value)}),(f,a)=>{const u=B,r=y,_=R,T=h;return m(),N(P,{title:s.value?"编辑自定义工具":"添加自定义工具"},{default:l(()=>[o(T,{ref_key:"formRef",ref:i,model:e,rules:C,"label-width":"100px",style:{"max-width":"600px"}},{default:l(()=>[o(r,{label:"工具名称",prop:"name"},{default:l(()=>[o(u,{modelValue:e.name,"onUpdate:modelValue":a[0]||(a[0]=t=>e.name=t),placeholder:"请输入工具名称",maxlength:"30","show-word-limit":""},null,8,["modelValue"])]),_:1}),o(r,{label:"工具描述"},{default:l(()=>[o(u,{modelValue:e.description,"onUpdate:modelValue":a[1]||(a[1]=t=>e.description=t),type:"textarea",rows:2,maxlength:"100","show-word-limit":""},null,8,["modelValue"])]),_:1}),o(r,{label:"跳转地址",prop:"url"},{default:l(()=>[o(u,{modelValue:e.url,"onUpdate:modelValue":a[2]||(a[2]=t=>e.url=t),placeholder:"相对路径或完整 URL"},null,8,["modelValue"])]),_:1}),o(r,{label:"图标"},{default:l(()=>[v("div",$,[(m(!0),x(L,null,U(q(F),t=>(m(),x("div",{key:t,class:V(["icon-option",{selected:e.icon===t}]),onClick:Q=>e.icon=t},[v("i",{class:V(["fa",t])},null,2)],10,H))),128))])]),_:1}),o(r,null,{default:l(()=>[o(_,{type:"primary",onClick:k},{default:l(()=>[b(M(s.value?"保存":"添加"),1)]),_:1}),o(_,{onClick:E},{default:l(()=>[...a[3]||(a[3]=[b("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["title"])}}}),ue=G(J,[["__scopeId","data-v-249def81"]]);export{ue as default};
|
import{a as y,E as h}from"./el-form-item-Ct_zBuY0.js";import{E as B}from"./index-CbmPSBt0.js";import{E as R}from"./index-CCavIuTY.js";import{d as S,G as I,e as N,w as l,j as g,z as O,o as m,s as o,q as v,c as x,ad as U,n as V,f as q,bx as F,M as L,x as b,aa as M,A as w,y as j,v as z,ac as D}from"./index-CGB0A5x_.js";import{P}from"./PageCard-D1lOaeEG.js";import{u as A}from"./tools-XKLlGqEK.js";import{_ as G}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./el-card-BWcR1iD2.js";const $={class:"icon-grid"},H=["onClick"],J=S({__name:"ToolCreateView",setup(K){const d=D(),p=z(),n=A(),i=j(),s=g(()=>d.params.id!=null),c=g(()=>s.value?n.getTool(d.params.id):void 0),e=O({id:"",name:"",description:"",url:"",icon:"fa-cog"}),C={name:[{required:!0,message:"请输入工具名称",trigger:"blur"},{max:30,message:"不超过 30 字符",trigger:"blur"}],url:[{required:!0,message:"请输入跳转地址",trigger:"blur"}]};function k(){i.value&&i.value.validate(f=>{f&&(s.value?(n.updateTool(e.id,{...e}),w.success("更新成功")):(n.addTool({...e,id:"custom_"+Date.now()}),w.success("添加成功")),p.push("/tools"))})}function E(){p.back()}return I(()=>{c.value&&Object.assign(e,c.value)}),(f,a)=>{const u=B,r=y,_=R,T=h;return m(),N(P,{title:s.value?"编辑自定义工具":"添加自定义工具"},{default:l(()=>[o(T,{ref_key:"formRef",ref:i,model:e,rules:C,"label-width":"100px",style:{"max-width":"600px"}},{default:l(()=>[o(r,{label:"工具名称",prop:"name"},{default:l(()=>[o(u,{modelValue:e.name,"onUpdate:modelValue":a[0]||(a[0]=t=>e.name=t),placeholder:"请输入工具名称",maxlength:"30","show-word-limit":""},null,8,["modelValue"])]),_:1}),o(r,{label:"工具描述"},{default:l(()=>[o(u,{modelValue:e.description,"onUpdate:modelValue":a[1]||(a[1]=t=>e.description=t),type:"textarea",rows:2,maxlength:"100","show-word-limit":""},null,8,["modelValue"])]),_:1}),o(r,{label:"跳转地址",prop:"url"},{default:l(()=>[o(u,{modelValue:e.url,"onUpdate:modelValue":a[2]||(a[2]=t=>e.url=t),placeholder:"相对路径或完整 URL"},null,8,["modelValue"])]),_:1}),o(r,{label:"图标"},{default:l(()=>[v("div",$,[(m(!0),x(L,null,U(q(F),t=>(m(),x("div",{key:t,class:V(["icon-option",{selected:e.icon===t}]),onClick:Q=>e.icon=t},[v("i",{class:V(["fa",t])},null,2)],10,H))),128))])]),_:1}),o(r,null,{default:l(()=>[o(_,{type:"primary",onClick:k},{default:l(()=>[b(M(s.value?"保存":"添加"),1)]),_:1}),o(_,{onClick:E},{default:l(()=>[...a[3]||(a[3]=[b("取消",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["title"])}}}),ue=G(J,[["__scopeId","data-v-249def81"]]);export{ue as default};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{E as y,a as x}from"./el-form-item-DGwcZKHQ.js";import{E as k}from"./index-CoLjyrxq.js";import{E as U}from"./index-B2Z3XS2S.js";import{E as C,a as B}from"./el-select-DzauTPwe.js";import{a as F,E as I}from"./el-checkbox-Jsj5DifU.js";import{E as N,b as R}from"./el-radio-group-akfy4TX6.js";import{d as G,c as f,q as M,s as o,w as l,o as _,x as r,M as O,ad as S,aa as q,f as z,v as A,y as D,z as L,db as T,A as $}from"./index-C8bRaOsd.js";/* empty css */import"./el-scrollbar-CMp13_RQ.js";import"./el-popper-BY86ZM1h.js";import"./el-tag-11zBoTqA.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-CJvOrS5l.js";import"./_baseClone-vUmDCUMu.js";import"./raf-BqR8BX9r.js";import"./index-BRf1Q2lS.js";import"./index-DE1Gc93o.js";import"./index-BpW9Z31J.js";import"./vnode-B9WOR-0a.js";import"./index-BVldZEzQ.js";import"./scroll-DL9cY7fX.js";import"./clamp-CNwRTQDt.js";import"./toNumber-Bt8UgFrr.js";import"./_baseIteratee-7-PMrTPE.js";import"./omit-BHHw65tB.js";const H={class:"user-create"},J=G({__name:"UserCreateView",setup(K){const d=A(),n=D(!1),a=L({username:"",display_name:"",password:"platform123",role:"viewer",status:"active",permissions:["dashboard"]}),b=["dashboard","fine-tune","model-eval","model-inference","model-manage","dataset","data-process","data-convert","compute","hardware","logs","user-settings"];async function V(){n.value=!0;try{await T(a),$.success("用户已创建"),d.push("/user-settings")}finally{n.value=!1}}return(P,e)=>{const m=k,s=x,u=B,v=C,p=R,c=N,E=I,w=F,i=U,g=y;return _(),f("section",H,[e[11]||(e[11]=M("h1",null,"创建用户",-1)),o(g,{model:a,"label-width":"110px",class:"user-form"},{default:l(()=>[o(s,{label:"账号"},{default:l(()=>[o(m,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=t=>a.username=t)},null,8,["modelValue"])]),_:1}),o(s,{label:"显示名称"},{default:l(()=>[o(m,{modelValue:a.display_name,"onUpdate:modelValue":e[1]||(e[1]=t=>a.display_name=t)},null,8,["modelValue"])]),_:1}),o(s,{label:"初始密码"},{default:l(()=>[o(m,{modelValue:a.password,"onUpdate:modelValue":e[2]||(e[2]=t=>a.password=t),type:"password","show-password":""},null,8,["modelValue"])]),_:1}),o(s,{label:"角色"},{default:l(()=>[o(v,{modelValue:a.role,"onUpdate:modelValue":e[3]||(e[3]=t=>a.role=t)},{default:l(()=>[o(u,{label:"管理员",value:"admin"}),o(u,{label:"操作员",value:"operator"}),o(u,{label:"观察员",value:"viewer"})]),_:1},8,["modelValue"])]),_:1}),o(s,{label:"状态"},{default:l(()=>[o(c,{modelValue:a.status,"onUpdate:modelValue":e[4]||(e[4]=t=>a.status=t)},{default:l(()=>[o(p,{value:"active"},{default:l(()=>[...e[7]||(e[7]=[r("启用",-1)])]),_:1}),o(p,{value:"disabled"},{default:l(()=>[...e[8]||(e[8]=[r("禁用",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),o(s,{label:"页面权限"},{default:l(()=>[o(w,{modelValue:a.permissions,"onUpdate:modelValue":e[5]||(e[5]=t=>a.permissions=t)},{default:l(()=>[(_(),f(O,null,S(b,t=>o(E,{key:t,value:t},{default:l(()=>[r(q(t),1)]),_:2},1032,["value"])),64))]),_:1},8,["modelValue"])]),_:1}),o(s,null,{default:l(()=>[o(i,{onClick:e[6]||(e[6]=t=>z(d).back())},{default:l(()=>[...e[9]||(e[9]=[r("返回",-1)])]),_:1}),o(i,{type:"primary",loading:n.value,onClick:V},{default:l(()=>[...e[10]||(e[10]=[r("保存",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])}}}),Ee=j(J,[["__scopeId","data-v-af832a20"]]);export{Ee as default};
|
import{E as y,a as x}from"./el-form-item-Ct_zBuY0.js";import{E as k}from"./index-CbmPSBt0.js";import{E as U}from"./index-CCavIuTY.js";import{E as C,a as B}from"./el-select-C59URVI0.js";import{a as F,E as I}from"./el-checkbox-Ci1DH0Aj.js";import{E as N,b as R}from"./el-radio-group-B7nPUe8-.js";import{d as G,c as f,q as M,s as o,w as l,o as _,x as r,M as O,ad as S,aa as q,f as z,v as A,y as D,z as L,db as T,A as $}from"./index-CGB0A5x_.js";/* empty css */import"./el-scrollbar-p6_f_LH2.js";import"./el-popper-DvBtRO32.js";import"./el-tag-C_D80BPW.js";import{_ as j}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./castArray-Cgg396Sr.js";import"./_baseClone-CX1E8HTZ.js";import"./raf-CCivjDro.js";import"./index-D2-3cnGo.js";import"./index-DMVRI44M.js";import"./index-BPwPlcbL.js";import"./vnode-DFpZw5lG.js";import"./index-khuXz7sd.js";import"./scroll-C0BSy_Rk.js";import"./clamp-BqqU4KQ-.js";import"./toNumber-IRhFg6gN.js";import"./_baseIteratee-uVh0OyD5.js";import"./omit-DaFv1hTo.js";const H={class:"user-create"},J=G({__name:"UserCreateView",setup(K){const d=A(),n=D(!1),a=L({username:"",display_name:"",password:"platform123",role:"viewer",status:"active",permissions:["dashboard"]}),b=["dashboard","fine-tune","model-eval","model-inference","model-manage","dataset","data-process","data-convert","compute","hardware","logs","user-settings"];async function V(){n.value=!0;try{await T(a),$.success("用户已创建"),d.push("/user-settings")}finally{n.value=!1}}return(P,e)=>{const m=k,s=x,u=B,v=C,p=R,c=N,E=I,w=F,i=U,g=y;return _(),f("section",H,[e[11]||(e[11]=M("h1",null,"创建用户",-1)),o(g,{model:a,"label-width":"110px",class:"user-form"},{default:l(()=>[o(s,{label:"账号"},{default:l(()=>[o(m,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=t=>a.username=t)},null,8,["modelValue"])]),_:1}),o(s,{label:"显示名称"},{default:l(()=>[o(m,{modelValue:a.display_name,"onUpdate:modelValue":e[1]||(e[1]=t=>a.display_name=t)},null,8,["modelValue"])]),_:1}),o(s,{label:"初始密码"},{default:l(()=>[o(m,{modelValue:a.password,"onUpdate:modelValue":e[2]||(e[2]=t=>a.password=t),type:"password","show-password":""},null,8,["modelValue"])]),_:1}),o(s,{label:"角色"},{default:l(()=>[o(v,{modelValue:a.role,"onUpdate:modelValue":e[3]||(e[3]=t=>a.role=t)},{default:l(()=>[o(u,{label:"管理员",value:"admin"}),o(u,{label:"操作员",value:"operator"}),o(u,{label:"观察员",value:"viewer"})]),_:1},8,["modelValue"])]),_:1}),o(s,{label:"状态"},{default:l(()=>[o(c,{modelValue:a.status,"onUpdate:modelValue":e[4]||(e[4]=t=>a.status=t)},{default:l(()=>[o(p,{value:"active"},{default:l(()=>[...e[7]||(e[7]=[r("启用",-1)])]),_:1}),o(p,{value:"disabled"},{default:l(()=>[...e[8]||(e[8]=[r("禁用",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),o(s,{label:"页面权限"},{default:l(()=>[o(w,{modelValue:a.permissions,"onUpdate:modelValue":e[5]||(e[5]=t=>a.permissions=t)},{default:l(()=>[(_(),f(O,null,S(b,t=>o(E,{key:t,value:t},{default:l(()=>[r(q(t),1)]),_:2},1032,["value"])),64))]),_:1},8,["modelValue"])]),_:1}),o(s,null,{default:l(()=>[o(i,{onClick:e[6]||(e[6]=t=>z(d).back())},{default:l(()=>[...e[9]||(e[9]=[r("返回",-1)])]),_:1}),o(i,{type:"primary",loading:n.value,onClick:V},{default:l(()=>[...e[10]||(e[10]=[r("保存",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])])}}}),Ee=j(J,[["__scopeId","data-v-af832a20"]]);export{Ee as default};
|
||||||
@@ -1 +1 @@
|
|||||||
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c as r,q as s}from"./index-C8bRaOsd.js";const a={},c={class:"simple-page"};function n(_,e){return t(),r("section",c,[...e[0]||(e[0]=[s("h1",null,"权限设置",-1),s("p",null,"第一版已支持账号页面权限读取与保存,精细化项目/模型/数据集权限将在后续版本补齐。",-1)])])}const p=o(a,[["render",n],["__scopeId","data-v-49c3a2ea"]]);export{p as default};
|
import{_ as o}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c as r,q as s}from"./index-CGB0A5x_.js";const a={},c={class:"simple-page"};function n(_,e){return t(),r("section",c,[...e[0]||(e[0]=[s("h1",null,"权限设置",-1),s("p",null,"第一版已支持账号页面权限读取与保存,精细化项目/模型/数据集权限将在后续版本补齐。",-1)])])}const p=o(a,[["render",n],["__scopeId","data-v-49c3a2ea"]]);export{p as default};
|
||||||
@@ -1 +1 @@
|
|||||||
import{E as w}from"./index-B2Z3XS2S.js";import{E as y}from"./el-tag-11zBoTqA.js";import{a as h,E}from"./el-table-48yEgKcK.js";import{v as T}from"./directive-D_bJoBNR.js";import{d as x,G as V,K as B,c as C,q as r,s as t,w as o,y as m,da as U,o as k,x as i,f as d,aa as u}from"./index-C8bRaOsd.js";import"./el-scrollbar-CMp13_RQ.js";import"./el-popper-BY86ZM1h.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-checkbox-Jsj5DifU.js";import{s as N,a as S}from"./status-Dl1fykxa.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_baseClone-vUmDCUMu.js";import"./index-DE1Gc93o.js";import"./_baseIteratee-7-PMrTPE.js";import"./castArray-CJvOrS5l.js";import"./debounce-BADwekKz.js";import"./toNumber-Bt8UgFrr.js";import"./index-BpW9Z31J.js";import"./raf-BqR8BX9r.js";import"./omit-BHHw65tB.js";const L={class:"user-settings"},$={class:"page-header"},q=x({__name:"UserSettingsView",setup(z){const l=m(!1),n=m([]);async function _(){l.value=!0;try{n.value=await U()}finally{l.value=!1}}return V(_),(c,e)=>{const f=w,a=E,g=y,b=h,v=T;return B((k(),C("section",L,[r("header",$,[e[2]||(e[2]=r("div",null,[r("h1",null,"用户设置"),r("p",null,"管理平台账号、角色状态和页面权限。")],-1)),t(f,{type:"primary",onClick:e[0]||(e[0]=s=>c.$router.push("/user-settings/create"))},{default:o(()=>[...e[1]||(e[1]=[i("创建用户",-1)])]),_:1})]),t(b,{data:n.value},{default:o(()=>[t(a,{prop:"username",label:"账号","min-width":"140"}),t(a,{prop:"display_name",label:"显示名称","min-width":"160"}),t(a,{prop:"role",label:"角色",width:"120"}),t(a,{label:"状态",width:"120"},{default:o(({row:s})=>[t(g,{type:d(N)(s.status),size:"small"},{default:o(()=>[i(u(d(S)(s.status)),1)]),_:2},1032,["type"])]),_:1}),t(a,{label:"权限数",width:"120"},{default:o(({row:s})=>{var p;return[i(u(((p=s.permissions)==null?void 0:p.length)||0),1)]}),_:1}),t(a,{prop:"create_time",label:"创建时间","min-width":"180"})]),_:1},8,["data"])])),[[v,l.value]])}}}),st=D(q,[["__scopeId","data-v-16fa3de4"]]);export{st as default};
|
import{E as w}from"./index-CCavIuTY.js";import{E as y}from"./el-tag-C_D80BPW.js";import{a as h,E}from"./el-table-DkdQ6gPU.js";import{v as T}from"./directive-vzjADwzS.js";import{d as x,G as V,K as B,c as C,q as r,s as t,w as o,y as m,da as U,o as k,x as i,f as d,aa as u}from"./index-CGB0A5x_.js";import"./el-scrollbar-p6_f_LH2.js";import"./el-popper-DvBtRO32.js";import"./el-tooltip-l0sNRNKZ.js";import"./el-checkbox-Ci1DH0Aj.js";import{s as N,a as S}from"./status-Dl1fykxa.js";import{_ as D}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./_baseClone-CX1E8HTZ.js";import"./index-DMVRI44M.js";import"./_baseIteratee-uVh0OyD5.js";import"./castArray-Cgg396Sr.js";import"./debounce-Bqww2DS8.js";import"./toNumber-IRhFg6gN.js";import"./index-BPwPlcbL.js";import"./raf-CCivjDro.js";import"./omit-DaFv1hTo.js";const L={class:"user-settings"},$={class:"page-header"},q=x({__name:"UserSettingsView",setup(z){const l=m(!1),n=m([]);async function _(){l.value=!0;try{n.value=await U()}finally{l.value=!1}}return V(_),(c,e)=>{const f=w,a=E,g=y,b=h,v=T;return B((k(),C("section",L,[r("header",$,[e[2]||(e[2]=r("div",null,[r("h1",null,"用户设置"),r("p",null,"管理平台账号、角色状态和页面权限。")],-1)),t(f,{type:"primary",onClick:e[0]||(e[0]=s=>c.$router.push("/user-settings/create"))},{default:o(()=>[...e[1]||(e[1]=[i("创建用户",-1)])]),_:1})]),t(b,{data:n.value},{default:o(()=>[t(a,{prop:"username",label:"账号","min-width":"140"}),t(a,{prop:"display_name",label:"显示名称","min-width":"160"}),t(a,{prop:"role",label:"角色",width:"120"}),t(a,{label:"状态",width:"120"},{default:o(({row:s})=>[t(g,{type:d(N)(s.status),size:"small"},{default:o(()=>[i(u(d(S)(s.status)),1)]),_:2},1032,["type"])]),_:1}),t(a,{label:"权限数",width:"120"},{default:o(({row:s})=>{var p;return[i(u(((p=s.permissions)==null?void 0:p.length)||0),1)]}),_:1}),t(a,{prop:"create_time",label:"创建时间","min-width":"180"})]),_:1},8,["data"])])),[[v,l.value]])}}}),st=D(q,[["__scopeId","data-v-16fa3de4"]]);export{st as default};
|
||||||
@@ -1 +1 @@
|
|||||||
import{cs as T,ct as Q,cu as U,cv as B,cw as X,cx as Z,cy as M,cz as V,cA as D,cB as z,cj as k,cC as G,cD as ee,cE as m,ch as O,cF as K,cG as d,cH as N,cI as b,cJ as re,cK as te,ce as ne,cL as ae}from"./index-C8bRaOsd.js";var S=Object.create,oe=(function(){function e(){}return function(r){if(!T(r))return{};if(S)return S(r);e.prototype=r;var t=new e;return e.prototype=void 0,t}})();function se(e,r){var t=-1,a=e.length;for(r||(r=Array(a));++t<a;)r[t]=e[t];return r}function ce(e,r){for(var t=-1,a=e==null?0:e.length;++t<a&&r(e[t],t,e)!==!1;);return e}function y(e,r,t,a){var g=!t;t||(t={});for(var s=-1,o=r.length;++s<o;){var i=r[s],c=void 0;c===void 0&&(c=e[i]),g?Q(t,i,c):U(t,i,c)}return t}function ie(e){var r=[];if(e!=null)for(var t in Object(e))r.push(t);return r}var fe=Object.prototype,ue=fe.hasOwnProperty;function ge(e){if(!T(e))return ie(e);var r=B(e),t=[];for(var a in e)a=="constructor"&&(r||!ue.call(e,a))||t.push(a);return t}function A(e){return X(e)?Z(e,!0):ge(e)}function le(e,r){return e&&y(r,M(r),e)}function be(e,r){return e&&y(r,A(r),e)}var _=typeof exports=="object"&&exports&&!exports.nodeType&&exports,x=_&&typeof module=="object"&&module&&!module.nodeType&&module,ye=x&&x.exports===_,I=ye?V.Buffer:void 0,C=I?I.allocUnsafe:void 0;function pe(e,r){if(r)return e.slice();var t=e.length,a=C?C(t):new e.constructor(t);return e.copy(a),a}function Te(e,r){return y(e,D(e),r)}var de=Object.getOwnPropertySymbols,R=de?function(e){for(var r=[];e;)k(r,D(e)),e=G(e);return r}:z;function Ae(e,r){return y(e,R(e),r)}function je(e){return ee(e,A,R)}var he=Object.prototype,we=he.hasOwnProperty;function ve(e){var r=e.length,t=new e.constructor(r);return r&&typeof e[0]=="string"&&we.call(e,"index")&&(t.index=e.index,t.input=e.input),t}function j(e){var r=new e.constructor(e.byteLength);return new m(r).set(new m(e)),r}function $e(e,r){var t=r?j(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}var me=/\w*$/;function Oe(e){var r=new e.constructor(e.source,me.exec(e));return r.lastIndex=e.lastIndex,r}var E=O?O.prototype:void 0,F=E?E.valueOf:void 0;function Se(e){return F?Object(F.call(e)):{}}function xe(e,r){var t=r?j(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}var Ie="[object Boolean]",Ce="[object Date]",Ee="[object Map]",Fe="[object Number]",Le="[object RegExp]",Pe="[object Set]",Ue="[object String]",Be="[object Symbol]",Me="[object ArrayBuffer]",De="[object DataView]",Ge="[object Float32Array]",Ke="[object Float64Array]",Ne="[object Int8Array]",_e="[object Int16Array]",Re="[object Int32Array]",He="[object Uint8Array]",Je="[object Uint8ClampedArray]",We="[object Uint16Array]",Ye="[object Uint32Array]";function qe(e,r,t){var a=e.constructor;switch(r){case Me:return j(e);case Ie:case Ce:return new a(+e);case De:return $e(e,t);case Ge:case Ke:case Ne:case _e:case Re:case He:case Je:case We:case Ye:return xe(e,t);case Ee:return new a;case Fe:case Ue:return new a(e);case Le:return Oe(e);case Pe:return new a;case Be:return Se(e)}}function Qe(e){return typeof e.constructor=="function"&&!B(e)?oe(G(e)):{}}var Xe="[object Map]";function Ze(e){return K(e)&&d(e)==Xe}var L=b&&b.isMap,Ve=L?N(L):Ze,ze="[object Set]";function ke(e){return K(e)&&d(e)==ze}var P=b&&b.isSet,er=P?N(P):ke,rr=1,tr=2,nr=4,H="[object Arguments]",ar="[object Array]",or="[object Boolean]",sr="[object Date]",cr="[object Error]",J="[object Function]",ir="[object GeneratorFunction]",fr="[object Map]",ur="[object Number]",W="[object Object]",gr="[object RegExp]",lr="[object Set]",br="[object String]",yr="[object Symbol]",pr="[object WeakMap]",Tr="[object ArrayBuffer]",dr="[object DataView]",Ar="[object Float32Array]",jr="[object Float64Array]",hr="[object Int8Array]",wr="[object Int16Array]",vr="[object Int32Array]",$r="[object Uint8Array]",mr="[object Uint8ClampedArray]",Or="[object Uint16Array]",Sr="[object Uint32Array]",n={};n[H]=n[ar]=n[Tr]=n[dr]=n[or]=n[sr]=n[Ar]=n[jr]=n[hr]=n[wr]=n[vr]=n[fr]=n[ur]=n[W]=n[gr]=n[lr]=n[br]=n[yr]=n[$r]=n[mr]=n[Or]=n[Sr]=!0;n[cr]=n[J]=n[pr]=!1;function p(e,r,t,a,g,s){var o,i=r&rr,c=r&tr,Y=r&nr;if(t&&(o=g?t(e,a,g,s):t(e)),o!==void 0)return o;if(!T(e))return e;var h=ne(e);if(h){if(o=ve(e),!i)return se(e,o)}else{var l=d(e),w=l==J||l==ir;if(re(e))return pe(e,i);if(l==W||l==H||w&&!g){if(o=c||w?{}:Qe(e),!i)return c?Ae(e,be(o,e)):Te(e,le(o,e))}else{if(!n[l])return g?e:{};o=qe(e,l,i)}}s||(s=new te);var v=s.get(e);if(v)return v;s.set(e,o),er(e)?e.forEach(function(f){o.add(p(f,r,t,f,e,s))}):Ve(e)&&e.forEach(function(f,u){o.set(u,p(f,r,t,u,e,s))});var q=Y?c?je:ae:c?A:M,$=h?void 0:q(e);return ce($||e,function(f,u){$&&(u=f,f=e[u]),U(o,u,p(f,r,t,u,e,s))}),o}export{se as a,p as b,y as c,pe as d,xe as e,je as g,Qe as i,A as k};
|
import{cs as T,ct as Q,cu as U,cv as B,cw as X,cx as Z,cy as M,cz as V,cA as D,cB as z,cj as k,cC as G,cD as ee,cE as m,ch as O,cF as K,cG as d,cH as N,cI as b,cJ as re,cK as te,ce as ne,cL as ae}from"./index-CGB0A5x_.js";var S=Object.create,oe=(function(){function e(){}return function(r){if(!T(r))return{};if(S)return S(r);e.prototype=r;var t=new e;return e.prototype=void 0,t}})();function se(e,r){var t=-1,a=e.length;for(r||(r=Array(a));++t<a;)r[t]=e[t];return r}function ce(e,r){for(var t=-1,a=e==null?0:e.length;++t<a&&r(e[t],t,e)!==!1;);return e}function y(e,r,t,a){var g=!t;t||(t={});for(var s=-1,o=r.length;++s<o;){var i=r[s],c=void 0;c===void 0&&(c=e[i]),g?Q(t,i,c):U(t,i,c)}return t}function ie(e){var r=[];if(e!=null)for(var t in Object(e))r.push(t);return r}var fe=Object.prototype,ue=fe.hasOwnProperty;function ge(e){if(!T(e))return ie(e);var r=B(e),t=[];for(var a in e)a=="constructor"&&(r||!ue.call(e,a))||t.push(a);return t}function A(e){return X(e)?Z(e,!0):ge(e)}function le(e,r){return e&&y(r,M(r),e)}function be(e,r){return e&&y(r,A(r),e)}var _=typeof exports=="object"&&exports&&!exports.nodeType&&exports,x=_&&typeof module=="object"&&module&&!module.nodeType&&module,ye=x&&x.exports===_,I=ye?V.Buffer:void 0,C=I?I.allocUnsafe:void 0;function pe(e,r){if(r)return e.slice();var t=e.length,a=C?C(t):new e.constructor(t);return e.copy(a),a}function Te(e,r){return y(e,D(e),r)}var de=Object.getOwnPropertySymbols,R=de?function(e){for(var r=[];e;)k(r,D(e)),e=G(e);return r}:z;function Ae(e,r){return y(e,R(e),r)}function je(e){return ee(e,A,R)}var he=Object.prototype,we=he.hasOwnProperty;function ve(e){var r=e.length,t=new e.constructor(r);return r&&typeof e[0]=="string"&&we.call(e,"index")&&(t.index=e.index,t.input=e.input),t}function j(e){var r=new e.constructor(e.byteLength);return new m(r).set(new m(e)),r}function $e(e,r){var t=r?j(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.byteLength)}var me=/\w*$/;function Oe(e){var r=new e.constructor(e.source,me.exec(e));return r.lastIndex=e.lastIndex,r}var E=O?O.prototype:void 0,F=E?E.valueOf:void 0;function Se(e){return F?Object(F.call(e)):{}}function xe(e,r){var t=r?j(e.buffer):e.buffer;return new e.constructor(t,e.byteOffset,e.length)}var Ie="[object Boolean]",Ce="[object Date]",Ee="[object Map]",Fe="[object Number]",Le="[object RegExp]",Pe="[object Set]",Ue="[object String]",Be="[object Symbol]",Me="[object ArrayBuffer]",De="[object DataView]",Ge="[object Float32Array]",Ke="[object Float64Array]",Ne="[object Int8Array]",_e="[object Int16Array]",Re="[object Int32Array]",He="[object Uint8Array]",Je="[object Uint8ClampedArray]",We="[object Uint16Array]",Ye="[object Uint32Array]";function qe(e,r,t){var a=e.constructor;switch(r){case Me:return j(e);case Ie:case Ce:return new a(+e);case De:return $e(e,t);case Ge:case Ke:case Ne:case _e:case Re:case He:case Je:case We:case Ye:return xe(e,t);case Ee:return new a;case Fe:case Ue:return new a(e);case Le:return Oe(e);case Pe:return new a;case Be:return Se(e)}}function Qe(e){return typeof e.constructor=="function"&&!B(e)?oe(G(e)):{}}var Xe="[object Map]";function Ze(e){return K(e)&&d(e)==Xe}var L=b&&b.isMap,Ve=L?N(L):Ze,ze="[object Set]";function ke(e){return K(e)&&d(e)==ze}var P=b&&b.isSet,er=P?N(P):ke,rr=1,tr=2,nr=4,H="[object Arguments]",ar="[object Array]",or="[object Boolean]",sr="[object Date]",cr="[object Error]",J="[object Function]",ir="[object GeneratorFunction]",fr="[object Map]",ur="[object Number]",W="[object Object]",gr="[object RegExp]",lr="[object Set]",br="[object String]",yr="[object Symbol]",pr="[object WeakMap]",Tr="[object ArrayBuffer]",dr="[object DataView]",Ar="[object Float32Array]",jr="[object Float64Array]",hr="[object Int8Array]",wr="[object Int16Array]",vr="[object Int32Array]",$r="[object Uint8Array]",mr="[object Uint8ClampedArray]",Or="[object Uint16Array]",Sr="[object Uint32Array]",n={};n[H]=n[ar]=n[Tr]=n[dr]=n[or]=n[sr]=n[Ar]=n[jr]=n[hr]=n[wr]=n[vr]=n[fr]=n[ur]=n[W]=n[gr]=n[lr]=n[br]=n[yr]=n[$r]=n[mr]=n[Or]=n[Sr]=!0;n[cr]=n[J]=n[pr]=!1;function p(e,r,t,a,g,s){var o,i=r&rr,c=r&tr,Y=r&nr;if(t&&(o=g?t(e,a,g,s):t(e)),o!==void 0)return o;if(!T(e))return e;var h=ne(e);if(h){if(o=ve(e),!i)return se(e,o)}else{var l=d(e),w=l==J||l==ir;if(re(e))return pe(e,i);if(l==W||l==H||w&&!g){if(o=c||w?{}:Qe(e),!i)return c?Ae(e,be(o,e)):Te(e,le(o,e))}else{if(!n[l])return g?e:{};o=qe(e,l,i)}}s||(s=new te);var v=s.get(e);if(v)return v;s.set(e,o),er(e)?e.forEach(function(f){o.add(p(f,r,t,f,e,s))}):Ve(e)&&e.forEach(function(f,u){o.set(u,p(f,r,t,u,e,s))});var q=Y?c?je:ae:c?A:M,$=h?void 0:q(e);return ce($||e,function(f,u){$&&(u=f,f=e[u]),U(o,u,p(f,r,t,u,e,s))}),o}export{se as a,p as b,y as c,pe as d,xe as e,je as g,Qe as i,A as k};
|
||||||
@@ -1 +1 @@
|
|||||||
import{cK as O,d2 as a,cs as P,cy as p,d3 as A,cl as l,cU as M,co as _,ce as d}from"./index-C8bRaOsd.js";import{h as g,i as m}from"./index-DE1Gc93o.js";var C=1,I=2;function L(n,r,e,t){var i=e.length,u=i;if(n==null)return!u;for(n=Object(n);i--;){var f=e[i];if(f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++i<u;){f=e[i];var s=f[0],o=n[s],y=f[1];if(f[2]){if(o===void 0&&!(s in n))return!1}else{var E=new O,c;if(!(c===void 0?a(y,o,C|I,t,E):c))return!1}}return!0}function R(n){return n===n&&!P(n)}function D(n){for(var r=p(n),e=r.length;e--;){var t=r[e],i=n[t];r[e]=[t,i,R(i)]}return r}function h(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function G(n){var r=D(n);return r.length==1&&r[0][2]?h(r[0][0],r[0][1]):function(e){return e===n||L(e,n,r)}}var w=1,F=2;function b(n,r){return A(n)&&R(r)?h(l(n),r):function(e){var t=M(e,n);return t===void 0&&t===r?g(e,n):a(r,t,w|F)}}function K(n){return function(r){return r==null?void 0:r[n]}}function S(n){return function(r){return _(r,n)}}function U(n){return A(n)?K(l(n)):S(n)}function T(n){return typeof n=="function"?n:n==null?m:typeof n=="object"?d(n)?b(n[0],n[1]):G(n):U(n)}export{T as b};
|
import{cK as O,d2 as a,cs as P,cy as p,d3 as A,cl as l,cU as M,co as _,ce as d}from"./index-CGB0A5x_.js";import{h as g,i as m}from"./index-DMVRI44M.js";var C=1,I=2;function L(n,r,e,t){var i=e.length,u=i;if(n==null)return!u;for(n=Object(n);i--;){var f=e[i];if(f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++i<u;){f=e[i];var s=f[0],o=n[s],y=f[1];if(f[2]){if(o===void 0&&!(s in n))return!1}else{var E=new O,c;if(!(c===void 0?a(y,o,C|I,t,E):c))return!1}}return!0}function R(n){return n===n&&!P(n)}function D(n){for(var r=p(n),e=r.length;e--;){var t=r[e],i=n[t];r[e]=[t,i,R(i)]}return r}function h(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function G(n){var r=D(n);return r.length==1&&r[0][2]?h(r[0][0],r[0][1]):function(e){return e===n||L(e,n,r)}}var w=1,F=2;function b(n,r){return A(n)&&R(r)?h(l(n),r):function(e){var t=M(e,n);return t===void 0&&t===r?g(e,n):a(r,t,w|F)}}function K(n){return function(r){return r==null?void 0:r[n]}}function S(n){return function(r){return _(r,n)}}function U(n){return A(n)?K(l(n)):S(n)}function T(n){return typeof n=="function"?n:n==null?m:typeof n=="object"?d(n)?b(n[0],n[1]):G(n):U(n)}export{T as b};
|
||||||
@@ -1 +1 @@
|
|||||||
import{ce as a}from"./index-C8bRaOsd.js";function e(){if(!arguments.length)return[];var r=arguments[0];return a(r)?r:[r]}export{e as c};
|
import{ce as a}from"./index-CGB0A5x_.js";function e(){if(!arguments.length)return[];var r=arguments[0];return a(r)?r:[r]}export{e as c};
|
||||||
@@ -1 +1 @@
|
|||||||
import{t as n}from"./toNumber-Bt8UgFrr.js";function t(d,f,i){return d===d&&(i!==void 0&&(d=d<=i?d:i),f!==void 0&&(d=d>=f?d:f)),d}function c(d,f,i){return i===void 0&&(i=f,f=void 0),i!==void 0&&(i=n(i),i=i===i?i:0),f!==void 0&&(f=n(f),f=f===f?f:0),t(n(d),f,i)}export{c};
|
import{t as n}from"./toNumber-IRhFg6gN.js";function t(d,f,i){return d===d&&(i!==void 0&&(d=d<=i?d:i),f!==void 0&&(d=d>=f?d:f)),d}function c(d,f,i){return i===void 0&&(i=f,f=void 0),i!==void 0&&(i=n(i),i=i===i?i:0),f!==void 0&&(f=n(f),f=f===f?f:0),t(n(d),f,i)}export{c};
|
||||||
@@ -1 +1 @@
|
|||||||
import{aF as n,aG as t,aI as l}from"./index-C8bRaOsd.js";const p=()=>n("/model-compare"),i=e=>n(`/model-compare/${e}`),u=e=>l(`/model-compare/${e}`),h=e=>t("/model-compare/stop-by-pid",{pid:e}),g=e=>t(`/model-compare/${e}/load`),C=e=>t(`/model-compare/${e}/unload`),y=async e=>{const a=await t("/model-compare/stream-chat",e);return{ok:!0,body:{getReader:()=>{const o=(a==null?void 0:a.response)||"",r=new TextEncoder,s=[o.slice(0,o.length/3),o.slice(o.length/3,2*o.length/3),o.slice(2*o.length/3)];let c=0;return{read:async()=>c>=s.length?{done:!0,value:void 0}:{done:!1,value:r.encode(s[c++])}}}}}},v=e=>t("/model-compare/chat-with-port",e);export{i as a,y as b,v as c,u as d,p as g,g as l,h as s,C as u};
|
import{aF as n,aG as t,aI as l}from"./index-CGB0A5x_.js";const p=()=>n("/model-compare"),i=e=>n(`/model-compare/${e}`),u=e=>l(`/model-compare/${e}`),h=e=>t("/model-compare/stop-by-pid",{pid:e}),g=e=>t(`/model-compare/${e}/load`),C=e=>t(`/model-compare/${e}/unload`),y=async e=>{const a=await t("/model-compare/stream-chat",e);return{ok:!0,body:{getReader:()=>{const o=(a==null?void 0:a.response)||"",r=new TextEncoder,s=[o.slice(0,o.length/3),o.slice(o.length/3,2*o.length/3),o.slice(2*o.length/3)];let c=0;return{read:async()=>c>=s.length?{done:!0,value:void 0}:{done:!1,value:r.encode(s[c++])}}}}}},v=e=>t("/model-compare/chat-with-port",e);export{i as a,y as b,v as c,u as d,p as g,g as l,h as s,C as u};
|
||||||
@@ -1 +1 @@
|
|||||||
import{_ as M,ah as y,T as A,a7 as D,aS as I,aT as w}from"./install-CLK_tRrI.js";var T=(function(){function s(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0}return s})(),x=(function(s){M(r,s);function r(t){var a=s.call(this,t)||this;return a.type="sausage",a}return r.prototype.getDefaultShape=function(){return new T},r.prototype.buildPath=function(t,a){var c=a.cx,e=a.cy,o=Math.max(a.r0||0,0),u=Math.max(a.r,0),l=(u-o)*.5,v=o+l,n=a.startAngle,i=a.endAngle,h=a.clockwise,S=Math.PI*2,d=h?i-n<S:n-i<S;d||(n=i-(h?S:-S));var g=Math.cos(n),f=Math.sin(n),m=Math.cos(i),P=Math.sin(i);d?(t.moveTo(g*o+c,f*o+e),t.arc(g*v+c,f*v+e,l,-Math.PI+n,n,!h)):t.moveTo(g*u+c,f*u+e),t.arc(c,e,u,n,i,!h),t.arc(m*v+c,P*v+e,l,i-Math.PI*2,i-Math.PI,!h),o!==0&&t.arc(c,e,o,i,n,h)},r})(y);function E(s,r,t){r=A(r)&&{coordDimensions:r}||D({encodeDefine:s.getEncode()},r);var a=s.getSource(),c=I(a,r).dimensions,e=new w(c,s);return e.initData(a,t),e}export{x as S,E as c};
|
import{_ as M,ah as y,T as A,a7 as D,aS as I,aT as w}from"./install-caVZROyC.js";var T=(function(){function s(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0}return s})(),x=(function(s){M(r,s);function r(t){var a=s.call(this,t)||this;return a.type="sausage",a}return r.prototype.getDefaultShape=function(){return new T},r.prototype.buildPath=function(t,a){var c=a.cx,e=a.cy,o=Math.max(a.r0||0,0),u=Math.max(a.r,0),l=(u-o)*.5,v=o+l,n=a.startAngle,i=a.endAngle,h=a.clockwise,S=Math.PI*2,d=h?i-n<S:n-i<S;d||(n=i-(h?S:-S));var g=Math.cos(n),f=Math.sin(n),m=Math.cos(i),P=Math.sin(i);d?(t.moveTo(g*o+c,f*o+e),t.arc(g*v+c,f*v+e,l,-Math.PI+n,n,!h)):t.moveTo(g*u+c,f*u+e),t.arc(c,e,u,n,i,!h),t.arc(m*v+c,P*v+e,l,i-Math.PI*2,i-Math.PI,!h),o!==0&&t.arc(c,e,o,i,n,h)},r})(y);function E(s,r,t){r=A(r)&&{coordDimensions:r}||D({encodeDefine:s.getEncode()},r);var a=s.getSource(),c=I(a,r).dimensions,e=new w(c,s);return e.initData(a,t),e}export{x as S,E as c};
|
||||||
@@ -1 +1 @@
|
|||||||
import{aF as n,aI as r,aH as p,aG as s}from"./index-C8bRaOsd.js";function m(e={}){return n("/data-process",e)}const l=e=>n(`/data-process/${encodeURIComponent(e)}`),i=e=>s("/data-process",e),R=(e,o)=>p(`/data-process/${encodeURIComponent(e)}`,o),U=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/regenerate`,o),C=e=>r(`/data-process/${encodeURIComponent(e)}`);function I(e,o,t){const c=new FormData;return o.forEach(a=>c.append("files",a)),s(`/data-process/${encodeURIComponent(e)}/source-files`,c,{timeout:300*1e3,onUploadProgress:a=>{if(!a.total)return;const d=Math.round(a.loaded/a.total*100);t==null||t(Math.min(99,Math.max(0,d)))}})}const $=(e,o)=>r(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}`),P=(e,o,t={})=>n(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/content`,t),D=(e,o)=>`/modelTF/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/raw`,f=(e,o)=>n(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/pdf-pages`),g=(e,o)=>{const{query:t,file_name:c,...a}=o;return s(`/data-process/${encodeURIComponent(e)}/external/test`,a)},w=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/external/pull`,o),v=(e,o={})=>s(`/data-process/${encodeURIComponent(e)}/preview/build`,o,{timeout:300*1e3});function h(e,o={}){return n(`/data-process/${encodeURIComponent(e)}/preview`,o)}const k=(e,o,t)=>p(`/data-process/${encodeURIComponent(e)}/preview/${encodeURIComponent(o)}`,t),x=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/preview`,o),T=(e,o)=>r(`/data-process/${encodeURIComponent(e)}/preview/${encodeURIComponent(o)}`),S=e=>s(`/data-process/${encodeURIComponent(e)}/generate`),b=e=>s(`/data-process/${encodeURIComponent(e)}/stop`),F=e=>n(`/data-process/${encodeURIComponent(e)}/progress`);function q(e,o={}){return n(`/data-process/${encodeURIComponent(e)}/results`,o)}const y=(e,o,t)=>p(`/data-process/${encodeURIComponent(e)}/results/${encodeURIComponent(o)}`,t),E=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/results/${encodeURIComponent(o)}/restore`),M=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/publish`,o);export{D as a,f as b,S as c,C as d,F as e,q as f,m as g,v as h,I as i,P as j,l as k,U as l,h as m,k as n,R as o,i as p,w as q,E as r,b as s,g as t,y as u,$ as v,x as w,T as x,M as y};
|
import{aF as n,aI as r,aH as p,aG as s}from"./index-CGB0A5x_.js";function m(e={}){return n("/data-process",e)}const l=e=>n(`/data-process/${encodeURIComponent(e)}`),i=e=>s("/data-process",e),R=(e,o)=>p(`/data-process/${encodeURIComponent(e)}`,o),U=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/regenerate`,o),C=e=>r(`/data-process/${encodeURIComponent(e)}`);function I(e,o,t){const c=new FormData;return o.forEach(a=>c.append("files",a)),s(`/data-process/${encodeURIComponent(e)}/source-files`,c,{timeout:300*1e3,onUploadProgress:a=>{if(!a.total)return;const d=Math.round(a.loaded/a.total*100);t==null||t(Math.min(99,Math.max(0,d)))}})}const $=(e,o)=>r(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}`),P=(e,o,t={})=>n(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/content`,t),D=(e,o)=>`/modelTF/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/raw`,f=(e,o)=>n(`/data-process/${encodeURIComponent(e)}/source-files/${encodeURIComponent(o)}/pdf-pages`),g=(e,o)=>{const{query:t,file_name:c,...a}=o;return s(`/data-process/${encodeURIComponent(e)}/external/test`,a)},w=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/external/pull`,o),v=(e,o={})=>s(`/data-process/${encodeURIComponent(e)}/preview/build`,o,{timeout:300*1e3});function h(e,o={}){return n(`/data-process/${encodeURIComponent(e)}/preview`,o)}const k=(e,o,t)=>p(`/data-process/${encodeURIComponent(e)}/preview/${encodeURIComponent(o)}`,t),x=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/preview`,o),T=(e,o)=>r(`/data-process/${encodeURIComponent(e)}/preview/${encodeURIComponent(o)}`),S=e=>s(`/data-process/${encodeURIComponent(e)}/generate`),b=e=>s(`/data-process/${encodeURIComponent(e)}/stop`),F=e=>n(`/data-process/${encodeURIComponent(e)}/progress`);function q(e,o={}){return n(`/data-process/${encodeURIComponent(e)}/results`,o)}const y=(e,o,t)=>p(`/data-process/${encodeURIComponent(e)}/results/${encodeURIComponent(o)}`,t),E=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/results/${encodeURIComponent(o)}/restore`),M=(e,o)=>s(`/data-process/${encodeURIComponent(e)}/publish`,o);export{D as a,f as b,S as c,C as d,F as e,q as f,m as g,v as h,I as i,P as j,l as k,U as l,h as m,k as n,R as o,i as p,w as q,E as r,b as s,g as t,y as u,$ as v,x as w,T as x,M as y};
|
||||||
1
frontend/dist/assets/dataProcessStatus-BNY61_45.js
vendored
Normal file
1
frontend/dist/assets/dataProcessStatus-BNY61_45.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
function t(e){return e.status==="running"?{label:"生成中",type:"primary"}:e.status==="completed"?e.output_dataset_id?{label:"已发布",type:"success"}:{label:"已生成",type:"warning"}:e.status==="failed"?{label:"生成失败",type:"danger"}:e.status==="stopped"?{label:"已停止",type:"info"}:{label:"待生成",type:"info"}}export{t as d};
|
||||||
@@ -1 +1 @@
|
|||||||
import{aF as n,aH as d,aG as o,aI as r}from"./index-C8bRaOsd.js";const c=()=>n("/dataset-manage"),m=e=>n(`/dataset-manage/${e}`),l=e=>o("/dataset-manage",e),p=(e,a)=>d(`/dataset-manage/${e}`,a),g=e=>r(`/dataset-manage/${e}`),$=(e,a)=>{const t=new FormData;return a.forEach(s=>t.append("files",s)),o(`/dataset-manage/upload/${e}`,t,{headers:{"Content-Type":"multipart/form-data"}})},D=e=>n(`/dataset-manage/versions/${encodeURIComponent(e)}`),_=(e,a)=>n(`/dataset-manage/versions/${encodeURIComponent(e)}/${encodeURIComponent(a)}`),u=(e,a,t)=>o(`/dataset-manage/versions/${encodeURIComponent(e)}`,{content:a,description:t.description||"在线编辑",base_version_id:t.baseVersionId,expected_current_version_id:t.expectedCurrentVersionId}),v=(e,a,t)=>d(`/dataset-manage/versions/${encodeURIComponent(e)}/active`,{version_id:a,expected_current_version_id:t}),C=(e,a,t)=>r(`/dataset-manage/versions/${encodeURIComponent(e)}/${encodeURIComponent(a)}`,{expected_current_version_id:t}),F=(e,a,t)=>{const s=`/modelTF/dataset-manage/download/${e}/${a}`;return t?`${s}?version_id=${encodeURIComponent(t)}`:s},U=e=>`/modelTF/dataset-manage/download/${e}`;export{U as a,m as b,$ as c,g as d,l as e,D as f,c as g,_ as h,u as i,F as j,v as k,C as l,p as u};
|
import{aF as n,aH as d,aG as o,aI as r}from"./index-CGB0A5x_.js";const c=()=>n("/dataset-manage"),m=e=>n(`/dataset-manage/${e}`),l=e=>o("/dataset-manage",e),p=(e,a)=>d(`/dataset-manage/${e}`,a),g=e=>r(`/dataset-manage/${e}`),$=(e,a)=>{const t=new FormData;return a.forEach(s=>t.append("files",s)),o(`/dataset-manage/upload/${e}`,t,{headers:{"Content-Type":"multipart/form-data"}})},D=e=>n(`/dataset-manage/versions/${encodeURIComponent(e)}`),_=(e,a)=>n(`/dataset-manage/versions/${encodeURIComponent(e)}/${encodeURIComponent(a)}`),u=(e,a,t)=>o(`/dataset-manage/versions/${encodeURIComponent(e)}`,{content:a,description:t.description||"在线编辑",base_version_id:t.baseVersionId,expected_current_version_id:t.expectedCurrentVersionId}),v=(e,a,t)=>d(`/dataset-manage/versions/${encodeURIComponent(e)}/active`,{version_id:a,expected_current_version_id:t}),C=(e,a,t)=>r(`/dataset-manage/versions/${encodeURIComponent(e)}/${encodeURIComponent(a)}`,{expected_current_version_id:t}),F=(e,a,t)=>{const s=`/modelTF/dataset-manage/download/${e}/${a}`;return t?`${s}?version_id=${encodeURIComponent(t)}`:s},U=e=>`/modelTF/dataset-manage/download/${e}`;export{U as a,m as b,$ as c,g as d,l as e,D as f,c as g,_ as h,u as i,F as j,v as k,C as l,p as u};
|
||||||
@@ -1 +1 @@
|
|||||||
import{cz as S,cs as y}from"./index-C8bRaOsd.js";import{t as b}from"./toNumber-Bt8UgFrr.js";var h=function(){return S.Date.now()},R="Expected a function",A=Math.max,F=Math.min;function _(x,i,a){var u,d,m,f,n,r,o=0,E=!1,c=!1,g=!0;if(typeof x!="function")throw new TypeError(R);i=b(i)||0,y(a)&&(E=!!a.leading,c="maxWait"in a,m=c?A(b(a.maxWait)||0,i):m,g="trailing"in a?!!a.trailing:g);function v(e){var t=u,l=d;return u=d=void 0,o=e,f=x.apply(l,t),f}function p(e){return o=e,n=setTimeout(s,i),E?v(e):f}function C(e){var t=e-r,l=e-o,W=i-t;return c?F(W,m-l):W}function k(e){var t=e-r,l=e-o;return r===void 0||t>=i||t<0||c&&l>=m}function s(){var e=h();if(k(e))return I(e);n=setTimeout(s,C(e))}function I(e){return n=void 0,g&&u?v(e):(u=d=void 0,f)}function L(){n!==void 0&&clearTimeout(n),o=0,u=r=d=n=void 0}function M(){return n===void 0?f:I(h())}function T(){var e=h(),t=k(e);if(u=arguments,d=this,r=e,t){if(n===void 0)return p(r);if(c)return clearTimeout(n),n=setTimeout(s,i),v(r)}return n===void 0&&(n=setTimeout(s,i)),f}return T.cancel=L,T.flush=M,T}export{_ as d};
|
import{cz as S,cs as y}from"./index-CGB0A5x_.js";import{t as b}from"./toNumber-IRhFg6gN.js";var h=function(){return S.Date.now()},R="Expected a function",A=Math.max,F=Math.min;function _(x,i,a){var u,d,m,f,n,r,o=0,E=!1,c=!1,g=!0;if(typeof x!="function")throw new TypeError(R);i=b(i)||0,y(a)&&(E=!!a.leading,c="maxWait"in a,m=c?A(b(a.maxWait)||0,i):m,g="trailing"in a?!!a.trailing:g);function v(e){var t=u,l=d;return u=d=void 0,o=e,f=x.apply(l,t),f}function p(e){return o=e,n=setTimeout(s,i),E?v(e):f}function C(e){var t=e-r,l=e-o,W=i-t;return c?F(W,m-l):W}function k(e){var t=e-r,l=e-o;return r===void 0||t>=i||t<0||c&&l>=m}function s(){var e=h();if(k(e))return I(e);n=setTimeout(s,C(e))}function I(e){return n=void 0,g&&u?v(e):(u=d=void 0,f)}function L(){n!==void 0&&clearTimeout(n),o=0,u=r=d=n=void 0}function M(){return n===void 0?f:I(h())}function T(){var e=h(),t=k(e);if(u=arguments,d=this,r=e,t){if(n===void 0)return p(r);if(c)return clearTimeout(n),n=setTimeout(s,i),v(r)}return n===void 0&&(n=setTimeout(s,i)),f}return T.cancel=L,T.flush=M,T}export{_ as d};
|
||||||
@@ -1 +1 @@
|
|||||||
import{z as E,d7 as P,d as O,bp as z,I as g,w as j,K as R,s as K,L as Z,Z as q,aV as D,y as B,a0 as y,bt as F,P as I,J as S,bL as m,_ as k,a3 as _,aB as G,d8 as H}from"./index-C8bRaOsd.js";function J(e,s){let t;const o=B(!1),n=E({...e,originalPosition:"",originalOverflow:"",visible:!1});function r(l){n.text=l}function c(){const l=n.parent,u=f.ns;if(!l.vLoadingAddClassList){let i=l.getAttribute("loading-number");i=Number.parseInt(i)-1,i?l.setAttribute("loading-number",i.toString()):(y(l,u.bm("parent","relative")),l.removeAttribute("loading-number")),y(l,u.bm("parent","hidden"))}v(),C.unmount()}function v(){var l,u;(u=(l=f.$el)==null?void 0:l.parentNode)==null||u.removeChild(f.$el)}function x(){var l;e.beforeClose&&!e.beforeClose()||(o.value=!0,clearTimeout(t),t=setTimeout(a,400),n.visible=!1,(l=e.closed)==null||l.call(e))}function a(){if(!o.value)return;const l=n.parent;o.value=!1,l.vLoadingAddClassList=void 0,c()}const C=P(O({name:"ElLoading",setup(l,{expose:u}){const{ns:i,zIndex:N}=z("loading");return u({ns:i,zIndex:N}),()=>{const A=n.spinner||n.svg,T=g("svg",{class:"circular",viewBox:n.svgViewBox?n.svgViewBox:"0 0 50 50",...A?{innerHTML:A}:{}},[g("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})]),V=n.text?g("p",{class:i.b("text")},[n.text]):void 0;return g(q,{name:i.b("fade"),onAfterLeave:a},{default:j(()=>[R(K("div",{style:{backgroundColor:n.background||""},class:[i.b("mask"),n.customClass,i.is("fullscreen",n.fullscreen)]},[g("div",{class:i.b("spinner")},[T,V])]),[[Z,n.visible]])])})}}}));Object.assign(C._context,s??{});const f=C.mount(document.createElement("div"));return{...D(n),setText:r,removeElLoadingChild:v,close:x,handleAfterLeave:a,vm:f,get $el(){return f.$el}}}let p;const L=function(e={},s){if(!F)return;const t=M(e);if(t.fullscreen&&p)return p;const o=J({...t,closed:()=>{var r;(r=t.closed)==null||r.call(t),t.fullscreen&&(p=void 0)}},s??L._context);Y(t,t.parent,o),w(t,t.parent,o),t.parent.vLoadingAddClassList=()=>w(t,t.parent,o);let n=t.parent.getAttribute("loading-number");return n?n=`${Number.parseInt(n)+1}`:n="1",t.parent.setAttribute("loading-number",n),t.parent.appendChild(o.$el),I(()=>o.visible.value=t.visible),t.fullscreen&&(p=o),o},M=e=>{let s;return S(e.target)?s=document.querySelector(e.target)??document.body:s=e.target||document.body,{parent:s===document.body||e.body?document.body:s,background:e.background||"",svg:e.svg||"",svgViewBox:e.svgViewBox||"",spinner:e.spinner||!1,text:e.text||"",fullscreen:s===document.body&&(e.fullscreen??!0),lock:e.lock??!1,customClass:e.customClass||"",visible:e.visible??!0,beforeClose:e.beforeClose,closed:e.closed,target:s}},Y=async(e,s,t)=>{const{nextZIndex:o}=t.vm.zIndex||t.vm._.exposed.zIndex,n={};if(e.fullscreen)t.originalPosition.value=m(document.body,"position"),t.originalOverflow.value=m(document.body,"overflow"),n.zIndex=o();else if(e.parent===document.body){t.originalPosition.value=m(document.body,"position"),await I();for(const r of["top","left"]){const c=r==="top"?"scrollTop":"scrollLeft";n[r]=`${e.target.getBoundingClientRect()[r]+document.body[c]+document.documentElement[c]-Number.parseInt(m(document.body,`margin-${r}`),10)}px`}for(const r of["height","width"])n[r]=`${e.target.getBoundingClientRect()[r]}px`}else t.originalPosition.value=m(s,"position");for(const[r,c]of Object.entries(n))t.$el.style[r]=c},w=(e,s,t)=>{const o=t.vm.ns||t.vm._.exposed.ns;["absolute","fixed","sticky"].includes(t.originalPosition.value)?y(s,o.bm("parent","relative")):k(s,o.bm("parent","relative")),e.fullscreen&&e.lock?k(s,o.bm("parent","hidden")):y(s,o.bm("parent","hidden"))};L._context=null;const b=Symbol("ElLoading"),d=e=>`element-loading-${H(e)}`,h=(e,s)=>{const t=s.instance,o=a=>_(s.value)?s.value[a]:void 0,n=a=>B(S(a)&&(t==null?void 0:t[a])||a),r=a=>n(o(a)||e.getAttribute(d(a))),c=o("fullscreen")??s.modifiers.fullscreen,v={text:r("text"),svg:r("svg"),svgViewBox:r("svgViewBox"),spinner:r("spinner"),background:r("background"),customClass:r("customClass"),fullscreen:c,target:o("target")??(c?void 0:e),body:o("body")??s.modifiers.body,lock:o("lock")??s.modifiers.lock},x=L(v);x._context=$._context,e[b]={options:v,instance:x}},Q=(e,s)=>{for(const t of Object.keys(e))G(e[t])&&(e[t].value=s[t])},$={mounted(e,s){s.value&&h(e,s)},updated(e,s){const t=e[b];if(!s.value){t==null||t.instance.close(),e[b]=null;return}t?Q(t.options,_(s.value)?s.value:{text:e.getAttribute(d("text")),svg:e.getAttribute(d("svg")),svgViewBox:e.getAttribute(d("svgViewBox")),spinner:e.getAttribute(d("spinner")),background:e.getAttribute(d("background")),customClass:e.getAttribute(d("customClass"))}):h(e,s)},unmounted(e){var s;(s=e[b])==null||s.instance.close(),e[b]=null}};$._context=null;export{$ as v};
|
import{z as E,d7 as P,d as O,bp as z,I as g,w as j,K as R,s as K,L as Z,Z as q,aV as D,y as B,a0 as y,bt as F,P as I,J as S,bL as m,_ as k,a3 as _,aB as G,d8 as H}from"./index-CGB0A5x_.js";function J(e,s){let t;const o=B(!1),n=E({...e,originalPosition:"",originalOverflow:"",visible:!1});function r(l){n.text=l}function c(){const l=n.parent,u=f.ns;if(!l.vLoadingAddClassList){let i=l.getAttribute("loading-number");i=Number.parseInt(i)-1,i?l.setAttribute("loading-number",i.toString()):(y(l,u.bm("parent","relative")),l.removeAttribute("loading-number")),y(l,u.bm("parent","hidden"))}v(),C.unmount()}function v(){var l,u;(u=(l=f.$el)==null?void 0:l.parentNode)==null||u.removeChild(f.$el)}function x(){var l;e.beforeClose&&!e.beforeClose()||(o.value=!0,clearTimeout(t),t=setTimeout(a,400),n.visible=!1,(l=e.closed)==null||l.call(e))}function a(){if(!o.value)return;const l=n.parent;o.value=!1,l.vLoadingAddClassList=void 0,c()}const C=P(O({name:"ElLoading",setup(l,{expose:u}){const{ns:i,zIndex:N}=z("loading");return u({ns:i,zIndex:N}),()=>{const A=n.spinner||n.svg,T=g("svg",{class:"circular",viewBox:n.svgViewBox?n.svgViewBox:"0 0 50 50",...A?{innerHTML:A}:{}},[g("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})]),V=n.text?g("p",{class:i.b("text")},[n.text]):void 0;return g(q,{name:i.b("fade"),onAfterLeave:a},{default:j(()=>[R(K("div",{style:{backgroundColor:n.background||""},class:[i.b("mask"),n.customClass,i.is("fullscreen",n.fullscreen)]},[g("div",{class:i.b("spinner")},[T,V])]),[[Z,n.visible]])])})}}}));Object.assign(C._context,s??{});const f=C.mount(document.createElement("div"));return{...D(n),setText:r,removeElLoadingChild:v,close:x,handleAfterLeave:a,vm:f,get $el(){return f.$el}}}let p;const L=function(e={},s){if(!F)return;const t=M(e);if(t.fullscreen&&p)return p;const o=J({...t,closed:()=>{var r;(r=t.closed)==null||r.call(t),t.fullscreen&&(p=void 0)}},s??L._context);Y(t,t.parent,o),w(t,t.parent,o),t.parent.vLoadingAddClassList=()=>w(t,t.parent,o);let n=t.parent.getAttribute("loading-number");return n?n=`${Number.parseInt(n)+1}`:n="1",t.parent.setAttribute("loading-number",n),t.parent.appendChild(o.$el),I(()=>o.visible.value=t.visible),t.fullscreen&&(p=o),o},M=e=>{let s;return S(e.target)?s=document.querySelector(e.target)??document.body:s=e.target||document.body,{parent:s===document.body||e.body?document.body:s,background:e.background||"",svg:e.svg||"",svgViewBox:e.svgViewBox||"",spinner:e.spinner||!1,text:e.text||"",fullscreen:s===document.body&&(e.fullscreen??!0),lock:e.lock??!1,customClass:e.customClass||"",visible:e.visible??!0,beforeClose:e.beforeClose,closed:e.closed,target:s}},Y=async(e,s,t)=>{const{nextZIndex:o}=t.vm.zIndex||t.vm._.exposed.zIndex,n={};if(e.fullscreen)t.originalPosition.value=m(document.body,"position"),t.originalOverflow.value=m(document.body,"overflow"),n.zIndex=o();else if(e.parent===document.body){t.originalPosition.value=m(document.body,"position"),await I();for(const r of["top","left"]){const c=r==="top"?"scrollTop":"scrollLeft";n[r]=`${e.target.getBoundingClientRect()[r]+document.body[c]+document.documentElement[c]-Number.parseInt(m(document.body,`margin-${r}`),10)}px`}for(const r of["height","width"])n[r]=`${e.target.getBoundingClientRect()[r]}px`}else t.originalPosition.value=m(s,"position");for(const[r,c]of Object.entries(n))t.$el.style[r]=c},w=(e,s,t)=>{const o=t.vm.ns||t.vm._.exposed.ns;["absolute","fixed","sticky"].includes(t.originalPosition.value)?y(s,o.bm("parent","relative")):k(s,o.bm("parent","relative")),e.fullscreen&&e.lock?k(s,o.bm("parent","hidden")):y(s,o.bm("parent","hidden"))};L._context=null;const b=Symbol("ElLoading"),d=e=>`element-loading-${H(e)}`,h=(e,s)=>{const t=s.instance,o=a=>_(s.value)?s.value[a]:void 0,n=a=>B(S(a)&&(t==null?void 0:t[a])||a),r=a=>n(o(a)||e.getAttribute(d(a))),c=o("fullscreen")??s.modifiers.fullscreen,v={text:r("text"),svg:r("svg"),svgViewBox:r("svgViewBox"),spinner:r("spinner"),background:r("background"),customClass:r("customClass"),fullscreen:c,target:o("target")??(c?void 0:e),body:o("body")??s.modifiers.body,lock:o("lock")??s.modifiers.lock},x=L(v);x._context=$._context,e[b]={options:v,instance:x}},Q=(e,s)=>{for(const t of Object.keys(e))G(e[t])&&(e[t].value=s[t])},$={mounted(e,s){s.value&&h(e,s)},updated(e,s){const t=e[b];if(!s.value){t==null||t.instance.close(),e[b]=null;return}t?Q(t.options,_(s.value)?s.value:{text:e.getAttribute(d("text")),svg:e.getAttribute(d("svg")),svgViewBox:e.getAttribute(d("svgViewBox")),spinner:e.getAttribute(d("spinner")),background:e.getAttribute(d("background")),customClass:e.getAttribute(d("customClass"))}):h(e,s)},unmounted(e){var s;(s=e[b])==null||s.instance.close(),e[b]=null}};$._context=null;export{$ as v};
|
||||||
@@ -1 +1 @@
|
|||||||
import{b as p,W as o,R as e,i as a}from"./index-C8bRaOsd.js";import{u as t,r as n,b as r}from"./el-popper-BY86ZM1h.js";const d=p({trigger:{...r.trigger,type:e([String,Array])},triggerKeys:{type:e(Array),default:()=>[o.enter,o.numpadEnter,o.space,o.down]},virtualTriggering:r.virtualTriggering,virtualRef:r.virtualRef,effect:{...t.effect,default:"light"},type:{type:e(String)},placement:{type:e(String),default:"bottom"},popperOptions:{type:e(Object),default:()=>({})},id:String,size:{type:String,default:""},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showArrow:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:e([Number,String]),default:0},maxHeight:{type:e([Number,String]),default:""},popperClass:t.popperClass,popperStyle:t.popperStyle,disabled:Boolean,role:{type:String,values:n,default:"menu"},buttonProps:{type:e(Object)},teleported:t.teleported,appendTo:t.appendTo,persistent:{type:Boolean,default:!0}}),u=p({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:a}}),s=p({onKeydown:{type:e(Function)}});export{u as a,s as b,d};
|
import{b as p,W as o,R as e,i as a}from"./index-CGB0A5x_.js";import{u as t,r as n,b as r}from"./el-popper-DvBtRO32.js";const d=p({trigger:{...r.trigger,type:e([String,Array])},triggerKeys:{type:e(Array),default:()=>[o.enter,o.numpadEnter,o.space,o.down]},virtualTriggering:r.virtualTriggering,virtualRef:r.virtualRef,effect:{...t.effect,default:"light"},type:{type:e(String)},placement:{type:e(String),default:"bottom"},popperOptions:{type:e(Object),default:()=>({})},id:String,size:{type:String,default:""},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showArrow:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:e([Number,String]),default:0},maxHeight:{type:e([Number,String]),default:""},popperClass:t.popperClass,popperStyle:t.popperStyle,disabled:Boolean,role:{type:String,values:n,default:"menu"},buttonProps:{type:e(Object)},teleported:t.teleported,appendTo:t.appendTo,persistent:{type:Boolean,default:!0}}),u=p({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:a}}),s=p({onKeydown:{type:e(Function)}});export{u as a,s as b,d};
|
||||||
@@ -1 +1 @@
|
|||||||
import{b as N,bI as $,bs as S,d as D,bF as V,a as x,o as l,e as n,w as d,K as M,q as h,n as o,f as e,E as k,h as m,r as A,g as i,c,x as g,aa as v,M as F,s as P,bo as j,L as q,Z as z,y as K,j as E,l as L}from"./index-C8bRaOsd.js";import{f as O,b as Z}from"./vnode-B9WOR-0a.js";const G=["light","dark"],H=N({title:{type:String,default:""},description:{type:String,default:""},type:{type:String,values:$(S),default:"info"},closable:{type:Boolean,default:!0},closeText:{type:String,default:""},showIcon:Boolean,center:Boolean,effect:{type:String,values:G,default:"light"}}),J={close:t=>t instanceof MouseEvent};var Q=D({name:"ElAlert",__name:"alert",props:H,emits:J,setup(t,{emit:w}){const{Close:B}=j,p=t,T=w,r=V(),s=x("alert"),y=K(!0),b=E(()=>S[p.type]),u=E(()=>{var f;if(p.description)return!0;const a=(f=r.default)==null?void 0:f.call(r);return a?O(a).some(I=>!Z(I)):!1}),C=a=>{y.value=!1,T("close",a)};return(a,f)=>(l(),n(z,{name:e(s).b("fade"),persisted:""},{default:d(()=>[M(h("div",{class:o([e(s).b(),e(s).m(t.type),e(s).is("center",t.center),e(s).is(t.effect)]),role:"alert"},[t.showIcon&&(a.$slots.icon||b.value)?(l(),n(e(k),{key:0,class:o([e(s).e("icon"),e(s).is("big",u.value)])},{default:d(()=>[m(a.$slots,"icon",{},()=>[(l(),n(A(b.value)))])]),_:3},8,["class"])):i("v-if",!0),h("div",{class:o(e(s).e("content"))},[t.title||a.$slots.title?(l(),c("span",{key:0,class:o([e(s).e("title"),{"with-description":u.value}])},[m(a.$slots,"title",{},()=>[g(v(t.title),1)])],2)):i("v-if",!0),u.value?(l(),c("p",{key:1,class:o(e(s).e("description"))},[m(a.$slots,"default",{},()=>[g(v(t.description),1)])],2)):i("v-if",!0),t.closable?(l(),c(F,{key:2},[t.closeText?(l(),c("div",{key:0,class:o([e(s).e("close-btn"),e(s).is("customed")]),onClick:C},v(t.closeText),3)):(l(),n(e(k),{key:1,class:o(e(s).e("close-btn")),onClick:C},{default:d(()=>[P(e(B))]),_:1},8,["class"]))],64)):i("v-if",!0)],2)],2),[[q,y.value]])]),_:3},8,["name"]))}}),R=Q;const X=L(R);export{X as E};
|
import{b as N,bI as $,bs as S,d as D,bF as V,a as x,o as l,e as n,w as d,K as M,q as h,n as o,f as e,E as k,h as m,r as A,g as i,c,x as g,aa as v,M as F,s as P,bo as j,L as q,Z as z,y as K,j as E,l as L}from"./index-CGB0A5x_.js";import{f as O,b as Z}from"./vnode-DFpZw5lG.js";const G=["light","dark"],H=N({title:{type:String,default:""},description:{type:String,default:""},type:{type:String,values:$(S),default:"info"},closable:{type:Boolean,default:!0},closeText:{type:String,default:""},showIcon:Boolean,center:Boolean,effect:{type:String,values:G,default:"light"}}),J={close:t=>t instanceof MouseEvent};var Q=D({name:"ElAlert",__name:"alert",props:H,emits:J,setup(t,{emit:w}){const{Close:B}=j,p=t,T=w,r=V(),s=x("alert"),y=K(!0),b=E(()=>S[p.type]),u=E(()=>{var f;if(p.description)return!0;const a=(f=r.default)==null?void 0:f.call(r);return a?O(a).some(I=>!Z(I)):!1}),C=a=>{y.value=!1,T("close",a)};return(a,f)=>(l(),n(z,{name:e(s).b("fade"),persisted:""},{default:d(()=>[M(h("div",{class:o([e(s).b(),e(s).m(t.type),e(s).is("center",t.center),e(s).is(t.effect)]),role:"alert"},[t.showIcon&&(a.$slots.icon||b.value)?(l(),n(e(k),{key:0,class:o([e(s).e("icon"),e(s).is("big",u.value)])},{default:d(()=>[m(a.$slots,"icon",{},()=>[(l(),n(A(b.value)))])]),_:3},8,["class"])):i("v-if",!0),h("div",{class:o(e(s).e("content"))},[t.title||a.$slots.title?(l(),c("span",{key:0,class:o([e(s).e("title"),{"with-description":u.value}])},[m(a.$slots,"title",{},()=>[g(v(t.title),1)])],2)):i("v-if",!0),u.value?(l(),c("p",{key:1,class:o(e(s).e("description"))},[m(a.$slots,"default",{},()=>[g(v(t.description),1)])],2)):i("v-if",!0),t.closable?(l(),c(F,{key:2},[t.closeText?(l(),c("div",{key:0,class:o([e(s).e("close-btn"),e(s).is("customed")]),onClick:C},v(t.closeText),3)):(l(),n(e(k),{key:1,class:o(e(s).e("close-btn")),onClick:C},{default:d(()=>[P(e(B))]),_:1},8,["class"]))],64)):i("v-if",!0)],2)],2),[[q,y.value]])]),_:3},8,["name"]))}}),R=Q;const X=L(R);export{X as E};
|
||||||
@@ -1 +1 @@
|
|||||||
import{b as j,i as w,aj as z,R as c,ak as m,d as A,B as V,a as E,D as I,o as f,c as y,al as S,e as h,w as _,r as q,f as D,E as F,h as G,n as K,y as L,j as p,J as R,am as J,s as d,an as O,ao as U,x as $,F as H,z as M,a9 as g,l as Q,ab as W}from"./index-C8bRaOsd.js";import{f as X}from"./vnode-B9WOR-0a.js";import{u as C,a as Y,E as Z}from"./el-popper-BY86ZM1h.js";const aa=j({size:{type:[Number,String],values:z,validator:a=>m(a)},shape:{type:String,values:["circle","square"]},icon:{type:w},src:{type:String,default:""},alt:String,srcSet:String,fit:{type:c(String),default:"cover"}}),ea={error:a=>a instanceof Event},b=Symbol("avatarGroupContextKey"),ta={size:{type:c([Number,String]),values:z,validator:a=>m(a)},shape:{type:c(String),values:["circle","square"]},collapseAvatars:Boolean,collapseAvatarsTooltip:Boolean,maxCollapseAvatars:{type:Number,default:1},effect:{type:c(String),default:"light"},placement:{type:c(String),values:Y,default:"top"},popperClass:C.popperClass,popperStyle:C.popperStyle,collapseClass:String,collapseStyle:{type:c([String,Array,Object,Boolean]),default:void 0}},sa=["src","alt","srcset"];var la=A({name:"ElAvatar",__name:"avatar",props:aa,emits:ea,setup(a,{emit:n}){const t=a,r=n,e=V(b,void 0),l=E("avatar"),o=L(!1),s=p(()=>t.size??(e==null?void 0:e.size)),v=p(()=>t.shape??(e==null?void 0:e.shape)??"circle"),B=p(()=>{const{icon:i}=t,u=[l.b()];return R(s.value)&&u.push(l.m(s.value)),i&&u.push(l.m("icon")),v.value&&u.push(l.m(v.value)),u}),x=p(()=>m(s.value)?l.cssVarBlock({size:J(s.value)}):void 0),T=p(()=>({objectFit:t.fit}));I(()=>[t.src,t.srcSet],()=>o.value=!1);function P(i){o.value=!0,r("error",i)}return(i,u)=>(f(),y("span",{class:K(B.value),style:S(x.value)},[(a.src||a.srcSet)&&!o.value?(f(),y("img",{key:0,src:a.src,alt:a.alt,srcset:a.srcSet,style:S(T.value),onError:P},null,44,sa)):a.icon?(f(),h(D(F),{key:1},{default:_(()=>[(f(),h(q(a.icon)))]),_:1})):G(i.$slots,"default",{key:2})],6))}}),k=la,N=A({name:"ElAvatarGroup",props:ta,setup(a,{slots:n}){const t=E("avatar-group");return H(b,M({size:g(a,"size"),shape:g(a,"shape")})),()=>{var l;const r=X(((l=n.default)==null?void 0:l.call(n))??[]);let e=r;if(a.collapseAvatars&&r.length>a.maxCollapseAvatars){e=r.slice(0,a.maxCollapseAvatars);const o=r.slice(a.maxCollapseAvatars);e.push(d(Z,{popperClass:a.popperClass,popperStyle:a.popperStyle,placement:a.placement,effect:a.effect,disabled:!a.collapseAvatarsTooltip},{default:()=>d(k,{size:a.size,shape:a.shape,class:a.collapseClass,style:a.collapseStyle},{default:()=>[$("+ "),o.length]}),content:()=>d("div",{class:t.e("collapse-avatars")},[o.map((s,v)=>O(s)?U(s,{key:s.key??v}):s)])}))}return d("div",{class:t.b()},[e])}}});const na=Q(k,{AvatarGroup:N});W(N);export{na as E};
|
import{b as j,i as w,aj as z,R as c,ak as m,d as A,B as V,a as E,D as I,o as f,c as y,al as S,e as h,w as _,r as q,f as D,E as F,h as G,n as K,y as L,j as p,J as R,am as J,s as d,an as O,ao as U,x as $,F as H,z as M,a9 as g,l as Q,ab as W}from"./index-CGB0A5x_.js";import{f as X}from"./vnode-DFpZw5lG.js";import{u as C,a as Y,E as Z}from"./el-popper-DvBtRO32.js";const aa=j({size:{type:[Number,String],values:z,validator:a=>m(a)},shape:{type:String,values:["circle","square"]},icon:{type:w},src:{type:String,default:""},alt:String,srcSet:String,fit:{type:c(String),default:"cover"}}),ea={error:a=>a instanceof Event},b=Symbol("avatarGroupContextKey"),ta={size:{type:c([Number,String]),values:z,validator:a=>m(a)},shape:{type:c(String),values:["circle","square"]},collapseAvatars:Boolean,collapseAvatarsTooltip:Boolean,maxCollapseAvatars:{type:Number,default:1},effect:{type:c(String),default:"light"},placement:{type:c(String),values:Y,default:"top"},popperClass:C.popperClass,popperStyle:C.popperStyle,collapseClass:String,collapseStyle:{type:c([String,Array,Object,Boolean]),default:void 0}},sa=["src","alt","srcset"];var la=A({name:"ElAvatar",__name:"avatar",props:aa,emits:ea,setup(a,{emit:n}){const t=a,r=n,e=V(b,void 0),l=E("avatar"),o=L(!1),s=p(()=>t.size??(e==null?void 0:e.size)),v=p(()=>t.shape??(e==null?void 0:e.shape)??"circle"),B=p(()=>{const{icon:i}=t,u=[l.b()];return R(s.value)&&u.push(l.m(s.value)),i&&u.push(l.m("icon")),v.value&&u.push(l.m(v.value)),u}),x=p(()=>m(s.value)?l.cssVarBlock({size:J(s.value)}):void 0),T=p(()=>({objectFit:t.fit}));I(()=>[t.src,t.srcSet],()=>o.value=!1);function P(i){o.value=!0,r("error",i)}return(i,u)=>(f(),y("span",{class:K(B.value),style:S(x.value)},[(a.src||a.srcSet)&&!o.value?(f(),y("img",{key:0,src:a.src,alt:a.alt,srcset:a.srcSet,style:S(T.value),onError:P},null,44,sa)):a.icon?(f(),h(D(F),{key:1},{default:_(()=>[(f(),h(q(a.icon)))]),_:1})):G(i.$slots,"default",{key:2})],6))}}),k=la,N=A({name:"ElAvatarGroup",props:ta,setup(a,{slots:n}){const t=E("avatar-group");return H(b,M({size:g(a,"size"),shape:g(a,"shape")})),()=>{var l;const r=X(((l=n.default)==null?void 0:l.call(n))??[]);let e=r;if(a.collapseAvatars&&r.length>a.maxCollapseAvatars){e=r.slice(0,a.maxCollapseAvatars);const o=r.slice(a.maxCollapseAvatars);e.push(d(Z,{popperClass:a.popperClass,popperStyle:a.popperStyle,placement:a.placement,effect:a.effect,disabled:!a.collapseAvatarsTooltip},{default:()=>d(k,{size:a.size,shape:a.shape,class:a.collapseClass,style:a.collapseStyle},{default:()=>[$("+ "),o.length]}),content:()=>d("div",{class:t.e("collapse-avatars")},[o.map((s,v)=>O(s)?U(s,{key:s.key??v}):s)])}))}return d("div",{class:t.b()},[e])}}});const na=Q(k,{AvatarGroup:N});W(N);export{na as E};
|
||||||
@@ -1 +1 @@
|
|||||||
import{b as y,R as h,d as v,u as g,a as C,o as r,c as l,n as o,f as a,h as d,x as i,aa as f,g as c,q as S,al as b,l as m}from"./index-C8bRaOsd.js";const w=y({header:{type:String,default:""},footer:{type:String,default:""},bodyStyle:{type:h([String,Object,Array,Boolean]),default:""},headerClass:String,bodyClass:String,footerClass:String,shadow:{type:String,values:["always","hover","never"],default:void 0}});var $=v({name:"ElCard",__name:"card",props:w,setup(e){const u=g("card"),s=C("card");return(t,p)=>{var n;return r(),l("div",{class:o([a(s).b(),a(s).is(`${e.shadow||((n=a(u))==null?void 0:n.shadow)||"always"}-shadow`)])},[t.$slots.header||e.header?(r(),l("div",{key:0,class:o([a(s).e("header"),e.headerClass])},[d(t.$slots,"header",{},()=>[i(f(e.header),1)])],2)):c("v-if",!0),S("div",{class:o([a(s).e("body"),e.bodyClass]),style:b(e.bodyStyle)},[d(t.$slots,"default")],6),t.$slots.footer||e.footer?(r(),l("div",{key:1,class:o([a(s).e("footer"),e.footerClass])},[d(t.$slots,"footer",{},()=>[i(f(e.footer),1)])],2)):c("v-if",!0)],2)}}}),k=$;const E=m(k);export{E};
|
import{b as y,R as h,d as v,u as g,a as C,o as r,c as l,n as o,f as a,h as d,x as i,aa as f,g as c,q as S,al as b,l as m}from"./index-CGB0A5x_.js";const w=y({header:{type:String,default:""},footer:{type:String,default:""},bodyStyle:{type:h([String,Object,Array,Boolean]),default:""},headerClass:String,bodyClass:String,footerClass:String,shadow:{type:String,values:["always","hover","never"],default:void 0}});var $=v({name:"ElCard",__name:"card",props:w,setup(e){const u=g("card"),s=C("card");return(t,p)=>{var n;return r(),l("div",{class:o([a(s).b(),a(s).is(`${e.shadow||((n=a(u))==null?void 0:n.shadow)||"always"}-shadow`)])},[t.$slots.header||e.header?(r(),l("div",{key:0,class:o([a(s).e("header"),e.headerClass])},[d(t.$slots,"header",{},()=>[i(f(e.header),1)])],2)):c("v-if",!0),S("div",{class:o([a(s).e("body"),e.bodyClass]),style:b(e.bodyStyle)},[d(t.$slots,"default")],6),t.$slots.footer||e.footer?(r(),l("div",{key:1,class:o([a(s).e("footer"),e.footerClass])},[d(t.$slots,"footer",{},()=>[i(f(e.footer),1)])],2)):c("v-if",!0)],2)}}}),k=$;const E=m(k);export{E};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{b as B,aS as H,d as P,R as J,am as A,a as L,K as x,I as D,a8 as Q,B as q,f as d,o as c,c as f,q as v,M as g,ad as z,e as I,s as R,bF as T,n as _,h as j,x as K,aa as M,g as X,j as Y,F as Z,ab as ee,l as te}from"./index-C8bRaOsd.js";import{g as se,f as le}from"./vnode-B9WOR-0a.js";import{e as ae}from"./index-B2Z3XS2S.js";const O=["left","center","right"],re=B({border:Boolean,column:{type:Number,default:3},direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},size:H,title:{type:String,default:""},extra:{type:String,default:""},labelWidth:{type:[String,Number]}}),U="ElDescriptionsItem",ne=B({label:{type:String,default:""},span:{type:Number,default:1},rowspan:{type:Number,default:1},width:{type:[String,Number],default:""},minWidth:{type:[String,Number],default:""},labelWidth:{type:[String,Number]},align:{type:String,values:O,default:"left"},labelAlign:{type:String,values:O},className:{type:String,default:""},labelClassName:{type:String,default:""}}),G=P({name:U,props:ne}),V=Symbol("elDescriptions"),ie=B({row:{type:J(Array),default:()=>[]}});var E=P({name:"ElDescriptionsCell",props:{cell:{type:Object},tag:{type:String,default:"td"},type:{type:String}},setup(){return{descriptions:q(V,{})}},render(){var y;const e=se(this.cell),u=(((y=this.cell)==null?void 0:y.dirs)||[]).map(n=>{const{dir:a,arg:l,modifiers:W,value:$}=n;return[a,$,l,W]}),{border:m,direction:C}=this.descriptions,r=C==="vertical",h=()=>{var n,a,l;return((l=(a=(n=this.cell)==null?void 0:n.children)==null?void 0:a.label)==null?void 0:l.call(a))||e.label},k=()=>{var n,a,l;return(l=(a=(n=this.cell)==null?void 0:n.children)==null?void 0:a.default)==null?void 0:l.call(a)},S=e.span,s=e.rowspan,b=e.align?`is-${e.align}`:"",p=e.labelAlign?`is-${e.labelAlign}`:b,i=e.className,w=e.labelClassName,o={width:A(this.type==="label"?e.labelWidth??this.descriptions.labelWidth??e.width:e.width),minWidth:A(e.minWidth)},t=L("descriptions");switch(this.type){case"label":return x(D(this.tag,{style:o,class:[t.e("cell"),t.e("label"),t.is("bordered-label",m),t.is("vertical-label",r),p,w],colSpan:r?S:1,rowspan:r?1:s},h()),u);case"content":return x(D(this.tag,{style:o,class:[t.e("cell"),t.e("content"),t.is("bordered-content",m),t.is("vertical-content",r),b,i],colSpan:r?S:S*2-1,rowspan:r?s*2-1:s},k()),u);default:{const n=h(),a={},l=A(e.labelWidth??this.descriptions.labelWidth);return l&&(a.width=l,a.display="inline-block"),x(D("td",{style:o,class:[t.e("cell"),b],colSpan:S,rowspan:s},[Q(n)?void 0:D("span",{style:a,class:[t.e("label"),w]},n),D("span",{class:[t.e("content"),i]},k())]),u)}}}});const oe={key:1};var ce=P({name:"ElDescriptionsRow",__name:"descriptions-row",props:ie,setup(e){const u=q(V,{});return(m,C)=>d(u).direction==="vertical"?(c(),f(g,{key:0},[v("tr",null,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),I(d(E),{key:`tr1-${h}`,cell:r,tag:"th",type:"label"},null,8,["cell"]))),128))]),v("tr",null,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),I(d(E),{key:`tr2-${h}`,cell:r,tag:"td",type:"content"},null,8,["cell"]))),128))])],64)):(c(),f("tr",oe,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),f(g,{key:`tr3-${h}`},[d(u).border?(c(),f(g,{key:0},[R(d(E),{cell:r,tag:"td",type:"label"},null,8,["cell"]),R(d(E),{cell:r,tag:"td",type:"content"},null,8,["cell"])],64)):(c(),I(d(E),{key:1,cell:r,tag:"td",type:"both"},null,8,["cell"]))],64))),128))]))}}),pe=ce,de=P({name:"ElDescriptions",__name:"description",props:re,setup(e){const u=e,m=L("descriptions"),C=ae(),r=T();Z(V,u);const h=Y(()=>[m.b(),m.m(C.value)]),k=(s,b,p,i=!1)=>(s.props||(s.props={}),b>p&&(s.props.span=p),i&&(s.props.span=b),s),S=()=>{if(!r.default)return[];const s=le(r.default()).filter(t=>{var y;return((y=t==null?void 0:t.type)==null?void 0:y.name)===U}),b=[];let p=[],i=u.column,w=0;const o=[];return s.forEach((t,y)=>{var W,$,F;const n=((W=t.props)==null?void 0:W.span)||1,a=(($=t.props)==null?void 0:$.rowspan)||1,l=b.length;if(o[l]||(o[l]=0),a>1)for(let N=1;N<a;N++)o[F=l+N]||(o[F]=0),o[l+N]++,w++;if(o[l]>0&&(i-=o[l],o[l]=0),y<s.length-1&&(w+=n>i?i:n),y===s.length-1){const N=u.column-w%u.column;p.push(k(t,N,i,!0)),b.push(p);return}n<i?(i-=n,p.push(t)):(p.push(k(t,n,i)),b.push(p),i=u.column,p=[])}),b};return(s,b)=>(c(),f("div",{class:_(h.value)},[e.title||e.extra||s.$slots.title||s.$slots.extra?(c(),f("div",{key:0,class:_(d(m).e("header"))},[v("div",{class:_(d(m).e("title"))},[j(s.$slots,"title",{},()=>[K(M(e.title),1)])],2),v("div",{class:_(d(m).e("extra"))},[j(s.$slots,"extra",{},()=>[K(M(e.extra),1)])],2)],2)):X("v-if",!0),v("div",{class:_(d(m).e("body"))},[v("table",{class:_([d(m).e("table"),d(m).is("bordered",e.border)])},[v("tbody",null,[(c(!0),f(g,null,z(S(),(p,i)=>(c(),I(pe,{key:i,row:p},null,8,["row"]))),128))])],2)],2)],2))}}),ue=de;const fe=te(ue,{DescriptionsItem:G}),ye=ee(G);export{ye as E,fe as a};
|
import{b as B,aS as H,d as P,R as J,am as A,a as L,K as x,I as D,a8 as Q,B as q,f as d,o as c,c as f,q as v,M as g,ad as z,e as I,s as R,bF as T,n as _,h as j,x as K,aa as M,g as X,j as Y,F as Z,ab as ee,l as te}from"./index-CGB0A5x_.js";import{g as se,f as le}from"./vnode-DFpZw5lG.js";import{e as ae}from"./index-CCavIuTY.js";const O=["left","center","right"],re=B({border:Boolean,column:{type:Number,default:3},direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},size:H,title:{type:String,default:""},extra:{type:String,default:""},labelWidth:{type:[String,Number]}}),U="ElDescriptionsItem",ne=B({label:{type:String,default:""},span:{type:Number,default:1},rowspan:{type:Number,default:1},width:{type:[String,Number],default:""},minWidth:{type:[String,Number],default:""},labelWidth:{type:[String,Number]},align:{type:String,values:O,default:"left"},labelAlign:{type:String,values:O},className:{type:String,default:""},labelClassName:{type:String,default:""}}),G=P({name:U,props:ne}),V=Symbol("elDescriptions"),ie=B({row:{type:J(Array),default:()=>[]}});var E=P({name:"ElDescriptionsCell",props:{cell:{type:Object},tag:{type:String,default:"td"},type:{type:String}},setup(){return{descriptions:q(V,{})}},render(){var y;const e=se(this.cell),u=(((y=this.cell)==null?void 0:y.dirs)||[]).map(n=>{const{dir:a,arg:l,modifiers:W,value:$}=n;return[a,$,l,W]}),{border:m,direction:C}=this.descriptions,r=C==="vertical",h=()=>{var n,a,l;return((l=(a=(n=this.cell)==null?void 0:n.children)==null?void 0:a.label)==null?void 0:l.call(a))||e.label},k=()=>{var n,a,l;return(l=(a=(n=this.cell)==null?void 0:n.children)==null?void 0:a.default)==null?void 0:l.call(a)},S=e.span,s=e.rowspan,b=e.align?`is-${e.align}`:"",p=e.labelAlign?`is-${e.labelAlign}`:b,i=e.className,w=e.labelClassName,o={width:A(this.type==="label"?e.labelWidth??this.descriptions.labelWidth??e.width:e.width),minWidth:A(e.minWidth)},t=L("descriptions");switch(this.type){case"label":return x(D(this.tag,{style:o,class:[t.e("cell"),t.e("label"),t.is("bordered-label",m),t.is("vertical-label",r),p,w],colSpan:r?S:1,rowspan:r?1:s},h()),u);case"content":return x(D(this.tag,{style:o,class:[t.e("cell"),t.e("content"),t.is("bordered-content",m),t.is("vertical-content",r),b,i],colSpan:r?S:S*2-1,rowspan:r?s*2-1:s},k()),u);default:{const n=h(),a={},l=A(e.labelWidth??this.descriptions.labelWidth);return l&&(a.width=l,a.display="inline-block"),x(D("td",{style:o,class:[t.e("cell"),b],colSpan:S,rowspan:s},[Q(n)?void 0:D("span",{style:a,class:[t.e("label"),w]},n),D("span",{class:[t.e("content"),i]},k())]),u)}}}});const oe={key:1};var ce=P({name:"ElDescriptionsRow",__name:"descriptions-row",props:ie,setup(e){const u=q(V,{});return(m,C)=>d(u).direction==="vertical"?(c(),f(g,{key:0},[v("tr",null,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),I(d(E),{key:`tr1-${h}`,cell:r,tag:"th",type:"label"},null,8,["cell"]))),128))]),v("tr",null,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),I(d(E),{key:`tr2-${h}`,cell:r,tag:"td",type:"content"},null,8,["cell"]))),128))])],64)):(c(),f("tr",oe,[(c(!0),f(g,null,z(e.row,(r,h)=>(c(),f(g,{key:`tr3-${h}`},[d(u).border?(c(),f(g,{key:0},[R(d(E),{cell:r,tag:"td",type:"label"},null,8,["cell"]),R(d(E),{cell:r,tag:"td",type:"content"},null,8,["cell"])],64)):(c(),I(d(E),{key:1,cell:r,tag:"td",type:"both"},null,8,["cell"]))],64))),128))]))}}),pe=ce,de=P({name:"ElDescriptions",__name:"description",props:re,setup(e){const u=e,m=L("descriptions"),C=ae(),r=T();Z(V,u);const h=Y(()=>[m.b(),m.m(C.value)]),k=(s,b,p,i=!1)=>(s.props||(s.props={}),b>p&&(s.props.span=p),i&&(s.props.span=b),s),S=()=>{if(!r.default)return[];const s=le(r.default()).filter(t=>{var y;return((y=t==null?void 0:t.type)==null?void 0:y.name)===U}),b=[];let p=[],i=u.column,w=0;const o=[];return s.forEach((t,y)=>{var W,$,F;const n=((W=t.props)==null?void 0:W.span)||1,a=(($=t.props)==null?void 0:$.rowspan)||1,l=b.length;if(o[l]||(o[l]=0),a>1)for(let N=1;N<a;N++)o[F=l+N]||(o[F]=0),o[l+N]++,w++;if(o[l]>0&&(i-=o[l],o[l]=0),y<s.length-1&&(w+=n>i?i:n),y===s.length-1){const N=u.column-w%u.column;p.push(k(t,N,i,!0)),b.push(p);return}n<i?(i-=n,p.push(t)):(p.push(k(t,n,i)),b.push(p),i=u.column,p=[])}),b};return(s,b)=>(c(),f("div",{class:_(h.value)},[e.title||e.extra||s.$slots.title||s.$slots.extra?(c(),f("div",{key:0,class:_(d(m).e("header"))},[v("div",{class:_(d(m).e("title"))},[j(s.$slots,"title",{},()=>[K(M(e.title),1)])],2),v("div",{class:_(d(m).e("extra"))},[j(s.$slots,"extra",{},()=>[K(M(e.extra),1)])],2)],2)):X("v-if",!0),v("div",{class:_(d(m).e("body"))},[v("table",{class:_([d(m).e("table"),d(m).is("bordered",e.border)])},[v("tbody",null,[(c(!0),f(g,null,z(S(),(p,i)=>(c(),I(pe,{key:i,row:p},null,8,["row"]))),128))])],2)],2)],2))}}),ue=de;const fe=te(ue,{DescriptionsItem:G}),ye=ee(G);export{ye as E,fe as a};
|
||||||
@@ -1 +1 @@
|
|||||||
import{d as L,aW as G,B as q,o as u,c as A,q as R,h as i,n as t,f as e,aa as H,s as $,w as r,e as B,r as Q,bE as x,E as _,g as N,al as O,j as E,bF as ee,a as oe,K as se,Y as K,aX as ae,L as le,Z as te,bg as ne,y as M,F as re,l as ie}from"./index-C8bRaOsd.js";import{u as de}from"./index-B2Z3XS2S.js";import{E as ce,a as ue}from"./index-CMlv-HLm.js";import{F as fe,f as ge}from"./index-BpW9Z31J.js";import{d as me,a as ve,b as j,c as be,e as ye,u as Ce}from"./use-dialog-BFKGt-Ue.js";import{u as he}from"./index-BIY0gTx5.js";const pe=(...o)=>f=>{o.forEach(g=>{g.value=f})},we=["aria-level"],ke=["aria-label"],Re=["id"];var $e=L({name:"ElDialogContent",__name:"dialog-content",props:ve,emits:me,setup(o,{expose:f}){const{t:g}=G(),{Close:F}=x,a=o,{dialogRef:m,headerRef:y,bodyId:v,ns:s,style:C}=q(j),{focusTrapRef:h}=q(fe),D=pe(h,m),p=E(()=>!!a.draggable),{resetPosition:w,updatePosition:I,isDragging:P}=he(m,y,p,E(()=>!!a.overflow)),T=E(()=>[s.b(),s.is("fullscreen",a.fullscreen),s.is("draggable",p.value),s.is("dragging",P.value),s.is("align-center",!!a.alignCenter),{[s.m("center")]:a.center}]);return f({resetPosition:w,updatePosition:I}),(n,k)=>(u(),A("div",{ref:e(D),class:t(T.value),style:O(e(C)),tabindex:"-1"},[R("header",{ref_key:"headerRef",ref:y,class:t([e(s).e("header"),o.headerClass,{"show-close":o.showClose}])},[i(n.$slots,"header",{},()=>[R("span",{role:"heading","aria-level":o.ariaLevel,class:t(e(s).e("title"))},H(o.title),11,we)]),o.showClose?(u(),A("button",{key:0,"aria-label":e(g)("el.dialog.close"),class:t(e(s).e("headerbtn")),type:"button",onClick:k[0]||(k[0]=z=>n.$emit("close"))},[$(e(_),{class:t(e(s).e("close"))},{default:r(()=>[(u(),B(Q(o.closeIcon||e(F))))]),_:1},8,["class"])],10,ke)):N("v-if",!0)],2),R("div",{id:e(v),class:t([e(s).e("body"),o.bodyClass])},[i(n.$slots,"default")],10,Re),n.$slots.footer?(u(),A("footer",{key:0,class:t([e(s).e("footer"),o.footerClass])},[i(n.$slots,"footer")],2)):N("v-if",!0)],6))}}),Ee=$e;const Fe=["aria-label","aria-labelledby","aria-describedby"];var De=L({name:"ElDialog",inheritAttrs:!1,__name:"dialog",props:ye,emits:be,setup(o,{expose:f}){const g=o,F=ee();de({scope:"el-dialog",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/dialog.html#slots"},E(()=>!!F.title));const a=oe("dialog"),m=M(),y=M(),v=M(),{visible:s,titleId:C,bodyId:h,style:D,overlayDialogStyle:p,rendered:w,transitionConfig:I,zIndex:P,_draggable:T,_alignCenter:n,_overflow:k,penetrable:z,handleClose:S,onModalClick:V,onOpenAutoFocus:U,onCloseAutoFocus:Y,onCloseRequested:J,onFocusoutPrevented:W,bringToFront:X,closing:Z}=Ce(g,m);re(j,{dialogRef:m,headerRef:y,bodyId:h,ns:a,rendered:w,style:D});const d=ue(V);return f({visible:s,dialogContentRef:v,resetPosition:()=>{var l;(l=v.value)==null||l.resetPosition()},handleClose:S}),(l,c)=>(u(),B(ne,{to:o.appendTo,disabled:o.appendTo!=="body"?!1:!o.appendToBody},[$(te,K(e(I),{persisted:""}),{default:r(()=>[se($(e(ce),{"custom-mask-event":"",mask:o.modal,"overlay-class":[o.modalClass??"",`${e(a).namespace.value}-modal-dialog`,e(a).is("penetrable",e(z))],"z-index":e(P)},{default:r(()=>[R("div",{role:"dialog","aria-modal":"true","aria-label":o.title||void 0,"aria-labelledby":o.title?void 0:e(C),"aria-describedby":e(h),class:t([`${e(a).namespace.value}-overlay-dialog`,e(a).is("closing",e(Z))]),style:O(e(p)),onClick:c[0]||(c[0]=(...b)=>e(d).onClick&&e(d).onClick(...b)),onMousedown:c[1]||(c[1]=(...b)=>e(d).onMousedown&&e(d).onMousedown(...b)),onMouseup:c[2]||(c[2]=(...b)=>e(d).onMouseup&&e(d).onMouseup(...b))},[$(e(ge),{loop:"",trapped:e(s),"focus-start-el":"container",onFocusAfterTrapped:e(U),onFocusAfterReleased:e(Y),onFocusoutPrevented:e(W),onReleaseRequested:e(J)},{default:r(()=>[e(w)?(u(),B(Ee,K({key:0,ref_key:"dialogContentRef",ref:v},l.$attrs,{center:o.center,"align-center":e(n),"close-icon":o.closeIcon,draggable:e(T),overflow:e(k),fullscreen:o.fullscreen,"header-class":o.headerClass,"body-class":o.bodyClass,"footer-class":o.footerClass,"show-close":o.showClose,title:o.title,"aria-level":o.headerAriaLevel,onClose:e(S),onMousedown:e(X)}),ae({header:r(()=>[l.$slots.title?i(l.$slots,"title",{key:1}):i(l.$slots,"header",{key:0,close:e(S),titleId:e(C),titleClass:e(a).e("title")})]),default:r(()=>[i(l.$slots,"default")]),_:2},[l.$slots.footer?{name:"footer",fn:r(()=>[i(l.$slots,"footer")]),key:"0"}:void 0]),1040,["center","align-center","close-icon","draggable","overflow","fullscreen","header-class","body-class","footer-class","show-close","title","aria-level","onClose","onMousedown"])):N("v-if",!0)]),_:3},8,["trapped","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])],46,Fe)]),_:3},8,["mask","overlay-class","z-index"]),[[le,e(s)]])]),_:3},16)],8,["to","disabled"]))}}),Ie=De;const ze=ie(Ie);export{ze as E,pe as c};
|
import{d as L,aW as G,B as q,o as u,c as A,q as R,h as i,n as t,f as e,aa as H,s as $,w as r,e as B,r as Q,bE as x,E as _,g as N,al as O,j as E,bF as ee,a as oe,K as se,Y as K,aX as ae,L as le,Z as te,bg as ne,y as M,F as re,l as ie}from"./index-CGB0A5x_.js";import{u as de}from"./index-CCavIuTY.js";import{E as ce,a as ue}from"./index-C5EKbiob.js";import{F as fe,f as ge}from"./index-BPwPlcbL.js";import{d as me,a as ve,b as j,c as be,e as ye,u as Ce}from"./use-dialog-C7BHP2NJ.js";import{u as he}from"./index-Coa9QRND.js";const pe=(...o)=>f=>{o.forEach(g=>{g.value=f})},we=["aria-level"],ke=["aria-label"],Re=["id"];var $e=L({name:"ElDialogContent",__name:"dialog-content",props:ve,emits:me,setup(o,{expose:f}){const{t:g}=G(),{Close:F}=x,a=o,{dialogRef:m,headerRef:y,bodyId:v,ns:s,style:C}=q(j),{focusTrapRef:h}=q(fe),D=pe(h,m),p=E(()=>!!a.draggable),{resetPosition:w,updatePosition:I,isDragging:P}=he(m,y,p,E(()=>!!a.overflow)),T=E(()=>[s.b(),s.is("fullscreen",a.fullscreen),s.is("draggable",p.value),s.is("dragging",P.value),s.is("align-center",!!a.alignCenter),{[s.m("center")]:a.center}]);return f({resetPosition:w,updatePosition:I}),(n,k)=>(u(),A("div",{ref:e(D),class:t(T.value),style:O(e(C)),tabindex:"-1"},[R("header",{ref_key:"headerRef",ref:y,class:t([e(s).e("header"),o.headerClass,{"show-close":o.showClose}])},[i(n.$slots,"header",{},()=>[R("span",{role:"heading","aria-level":o.ariaLevel,class:t(e(s).e("title"))},H(o.title),11,we)]),o.showClose?(u(),A("button",{key:0,"aria-label":e(g)("el.dialog.close"),class:t(e(s).e("headerbtn")),type:"button",onClick:k[0]||(k[0]=z=>n.$emit("close"))},[$(e(_),{class:t(e(s).e("close"))},{default:r(()=>[(u(),B(Q(o.closeIcon||e(F))))]),_:1},8,["class"])],10,ke)):N("v-if",!0)],2),R("div",{id:e(v),class:t([e(s).e("body"),o.bodyClass])},[i(n.$slots,"default")],10,Re),n.$slots.footer?(u(),A("footer",{key:0,class:t([e(s).e("footer"),o.footerClass])},[i(n.$slots,"footer")],2)):N("v-if",!0)],6))}}),Ee=$e;const Fe=["aria-label","aria-labelledby","aria-describedby"];var De=L({name:"ElDialog",inheritAttrs:!1,__name:"dialog",props:ye,emits:be,setup(o,{expose:f}){const g=o,F=ee();de({scope:"el-dialog",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/dialog.html#slots"},E(()=>!!F.title));const a=oe("dialog"),m=M(),y=M(),v=M(),{visible:s,titleId:C,bodyId:h,style:D,overlayDialogStyle:p,rendered:w,transitionConfig:I,zIndex:P,_draggable:T,_alignCenter:n,_overflow:k,penetrable:z,handleClose:S,onModalClick:V,onOpenAutoFocus:U,onCloseAutoFocus:Y,onCloseRequested:J,onFocusoutPrevented:W,bringToFront:X,closing:Z}=Ce(g,m);re(j,{dialogRef:m,headerRef:y,bodyId:h,ns:a,rendered:w,style:D});const d=ue(V);return f({visible:s,dialogContentRef:v,resetPosition:()=>{var l;(l=v.value)==null||l.resetPosition()},handleClose:S}),(l,c)=>(u(),B(ne,{to:o.appendTo,disabled:o.appendTo!=="body"?!1:!o.appendToBody},[$(te,K(e(I),{persisted:""}),{default:r(()=>[se($(e(ce),{"custom-mask-event":"",mask:o.modal,"overlay-class":[o.modalClass??"",`${e(a).namespace.value}-modal-dialog`,e(a).is("penetrable",e(z))],"z-index":e(P)},{default:r(()=>[R("div",{role:"dialog","aria-modal":"true","aria-label":o.title||void 0,"aria-labelledby":o.title?void 0:e(C),"aria-describedby":e(h),class:t([`${e(a).namespace.value}-overlay-dialog`,e(a).is("closing",e(Z))]),style:O(e(p)),onClick:c[0]||(c[0]=(...b)=>e(d).onClick&&e(d).onClick(...b)),onMousedown:c[1]||(c[1]=(...b)=>e(d).onMousedown&&e(d).onMousedown(...b)),onMouseup:c[2]||(c[2]=(...b)=>e(d).onMouseup&&e(d).onMouseup(...b))},[$(e(ge),{loop:"",trapped:e(s),"focus-start-el":"container",onFocusAfterTrapped:e(U),onFocusAfterReleased:e(Y),onFocusoutPrevented:e(W),onReleaseRequested:e(J)},{default:r(()=>[e(w)?(u(),B(Ee,K({key:0,ref_key:"dialogContentRef",ref:v},l.$attrs,{center:o.center,"align-center":e(n),"close-icon":o.closeIcon,draggable:e(T),overflow:e(k),fullscreen:o.fullscreen,"header-class":o.headerClass,"body-class":o.bodyClass,"footer-class":o.footerClass,"show-close":o.showClose,title:o.title,"aria-level":o.headerAriaLevel,onClose:e(S),onMousedown:e(X)}),ae({header:r(()=>[l.$slots.title?i(l.$slots,"title",{key:1}):i(l.$slots,"header",{key:0,close:e(S),titleId:e(C),titleClass:e(a).e("title")})]),default:r(()=>[i(l.$slots,"default")]),_:2},[l.$slots.footer?{name:"footer",fn:r(()=>[i(l.$slots,"footer")]),key:"0"}:void 0]),1040,["center","align-center","close-icon","draggable","overflow","fullscreen","header-class","body-class","footer-class","show-close","title","aria-level","onClose","onMousedown"])):N("v-if",!0)]),_:3},8,["trapped","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])],46,Fe)]),_:3},8,["mask","overlay-class","z-index"]),[[le,e(s)]])]),_:3},16)],8,["to","disabled"]))}}),Ie=De;const ze=ie(Ie);export{ze as E,pe as c};
|
||||||
@@ -1 +1 @@
|
|||||||
import{b as d,R as c,d as u,a as v,o as s,c as i,n as o,f as r,h as p,g as f,al as m,j as y,l as S}from"./index-C8bRaOsd.js";const b=d({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},contentPosition:{type:String,values:["left","center","right"],default:"center"},borderStyle:{type:c(String),default:"solid"}});var g=u({name:"ElDivider",__name:"divider",props:b,setup(t){const l=t,e=v("divider"),n=y(()=>e.cssVar({"border-style":l.borderStyle}));return(a,P)=>(s(),i("div",{class:o([r(e).b(),r(e).m(t.direction)]),style:m(n.value),role:"separator"},[a.$slots.default&&t.direction!=="vertical"?(s(),i("div",{key:0,class:o([r(e).e("text"),r(e).is(t.contentPosition)])},[p(a.$slots,"default")],2)):f("v-if",!0)],6))}}),h=g;const z=S(h);export{z as E};
|
import{b as d,R as c,d as u,a as v,o as s,c as i,n as o,f as r,h as p,g as f,al as m,j as y,l as S}from"./index-CGB0A5x_.js";const b=d({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},contentPosition:{type:String,values:["left","center","right"],default:"center"},borderStyle:{type:c(String),default:"solid"}});var g=u({name:"ElDivider",__name:"divider",props:b,setup(t){const l=t,e=v("divider"),n=y(()=>e.cssVar({"border-style":l.borderStyle}));return(a,P)=>(s(),i("div",{class:o([r(e).b(),r(e).m(t.direction)]),style:m(n.value),role:"separator"},[a.$slots.default&&t.direction!=="vertical"?(s(),i("div",{key:0,class:o([r(e).e("text"),r(e).is(t.contentPosition)])},[p(a.$slots,"default")],2)):f("v-if",!0)],6))}}),h=g;const z=S(h);export{z as E};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{b as h,d as p,a as _,o as r,c as n,q as t,f as l,aW as y,h as d,s as g,al as v,n as c,aa as k,g as $,j as f,am as N,l as B}from"./index-C8bRaOsd.js";import{f as w}from"./index-B2Z3XS2S.js";const V=h({image:{type:String,default:""},imageSize:Number,description:{type:String,default:""}}),x={viewBox:"0 0 79 86",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"},S=["id"],C=["stop-color"],E=["stop-color"],b=["id"],G=["stop-color"],z=["stop-color"],I=["id"],D={stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},P={transform:"translate(-1268.000000, -535.000000)"},j={transform:"translate(1268.000000, 535.000000)"},q=["fill"],L=["fill"],M={transform:"translate(34.500000, 31.500000) scale(-1, 1) rotate(-25.000000) translate(-34.500000, -31.500000) translate(7.000000, 10.000000)"},T=["fill"],U=["fill"],W=["fill"],Z=["fill"],A=["fill"],F={transform:"translate(53.000000, 45.000000)"},H=["fill","xlink:href"],J=["fill","mask"],K=["fill"];var O=p({name:"ImgEmpty",__name:"img-empty",setup(i){const s=_("empty"),e=w();return(o,m)=>(r(),n("svg",x,[t("defs",null,[t("linearGradient",{id:`linearGradient-1-${l(e)}`,x1:"38.8503086%",y1:"0%",x2:"61.1496914%",y2:"100%"},[t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,C),t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-4")})`,offset:"100%"},null,8,E)],8,S),t("linearGradient",{id:`linearGradient-2-${l(e)}`,x1:"0%",y1:"9.5%",x2:"100%",y2:"90.5%"},[t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,G),t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-6")})`,offset:"100%"},null,8,z)],8,b),t("rect",{id:`path-3-${l(e)}`,x:"0",y:"0",width:"17",height:"36"},null,8,I)]),t("g",D,[t("g",P,[t("g",j,[t("path",{d:"M39.5,86 C61.3152476,86 79,83.9106622 79,81.3333333 C79,78.7560045 57.3152476,78 35.5,78 C13.6847524,78 0,78.7560045 0,81.3333333 C0,83.9106622 17.6847524,86 39.5,86 Z",fill:`var(${l(s).cssVarBlockName("fill-color-3")})`},null,8,q),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-7")})`,transform:"translate(27.500000, 51.500000) scale(1, -1) translate(-27.500000, -51.500000) ",points:"13 58 53 58 42 45 2 45"},null,8,L),t("g",M,[t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-7")})`,transform:"translate(11.500000, 5.000000) scale(1, -1) translate(-11.500000, -5.000000) ",points:"2.84078316e-14 3 18 3 23 7 5 7"},null,8,T),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-5")})`,points:"-3.69149156e-15 7 38 7 38 43 -3.69149156e-15 43"},null,8,U),t("rect",{fill:`url(#linearGradient-1-${l(e)})`,transform:"translate(46.500000, 25.000000) scale(-1, 1) translate(-46.500000, -25.000000) ",x:"38",y:"7",width:"17",height:"36"},null,8,W),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-2")})`,transform:"translate(39.500000, 3.500000) scale(-1, 1) translate(-39.500000, -3.500000) ",points:"24 7 41 7 55 -3.63806207e-12 38 -3.63806207e-12"},null,8,Z)]),t("rect",{fill:`url(#linearGradient-2-${l(e)})`,x:"13",y:"45",width:"40",height:"36"},null,8,A),t("g",F,[t("use",{fill:`var(${l(s).cssVarBlockName("fill-color-8")})`,transform:"translate(8.500000, 18.000000) scale(-1, 1) translate(-8.500000, -18.000000) ","xlink:href":`#path-3-${l(e)}`},null,8,H),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-9")})`,mask:`url(#mask-4-${l(e)})`,transform:"translate(12.000000, 9.000000) scale(-1, 1) translate(-12.000000, -9.000000) ",points:"7 0 24 0 20 18 7 16.5"},null,8,J)]),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-2")})`,transform:"translate(66.000000, 51.500000) scale(-1, 1) translate(-66.000000, -51.500000) ",points:"62 45 79 45 70 58 53 58"},null,8,K)])])])]))}}),Q=O;const R=["src"],X={key:1};var Y=p({name:"ElEmpty",__name:"empty",props:V,setup(i){const s=i,{t:e}=y(),o=_("empty"),m=f(()=>s.description||e("el.table.emptyText")),u=f(()=>({width:N(s.imageSize)}));return(a,l0)=>(r(),n("div",{class:c(l(o).b())},[t("div",{class:c(l(o).e("image")),style:v(u.value)},[i.image?(r(),n("img",{key:0,src:i.image,ondragstart:"return false"},null,8,R)):d(a.$slots,"image",{key:1},()=>[g(Q)])],6),t("div",{class:c(l(o).e("description"))},[a.$slots.description?d(a.$slots,"description",{key:0}):(r(),n("p",X,k(m.value),1))],2),a.$slots.default?(r(),n("div",{key:0,class:c(l(o).e("bottom"))},[d(a.$slots,"default")],2)):$("v-if",!0)],2))}}),t0=Y;const o0=B(t0);export{o0 as E};
|
import{b as h,d as p,a as _,o as r,c as n,q as t,f as l,aW as y,h as d,s as g,al as v,n as c,aa as k,g as $,j as f,am as N,l as B}from"./index-CGB0A5x_.js";import{f as w}from"./index-CCavIuTY.js";const V=h({image:{type:String,default:""},imageSize:Number,description:{type:String,default:""}}),x={viewBox:"0 0 79 86",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"},S=["id"],C=["stop-color"],E=["stop-color"],b=["id"],G=["stop-color"],z=["stop-color"],I=["id"],D={stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},P={transform:"translate(-1268.000000, -535.000000)"},j={transform:"translate(1268.000000, 535.000000)"},q=["fill"],L=["fill"],M={transform:"translate(34.500000, 31.500000) scale(-1, 1) rotate(-25.000000) translate(-34.500000, -31.500000) translate(7.000000, 10.000000)"},T=["fill"],U=["fill"],W=["fill"],Z=["fill"],A=["fill"],F={transform:"translate(53.000000, 45.000000)"},H=["fill","xlink:href"],J=["fill","mask"],K=["fill"];var O=p({name:"ImgEmpty",__name:"img-empty",setup(i){const s=_("empty"),e=w();return(o,m)=>(r(),n("svg",x,[t("defs",null,[t("linearGradient",{id:`linearGradient-1-${l(e)}`,x1:"38.8503086%",y1:"0%",x2:"61.1496914%",y2:"100%"},[t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,C),t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-4")})`,offset:"100%"},null,8,E)],8,S),t("linearGradient",{id:`linearGradient-2-${l(e)}`,x1:"0%",y1:"9.5%",x2:"100%",y2:"90.5%"},[t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,G),t("stop",{"stop-color":`var(${l(s).cssVarBlockName("fill-color-6")})`,offset:"100%"},null,8,z)],8,b),t("rect",{id:`path-3-${l(e)}`,x:"0",y:"0",width:"17",height:"36"},null,8,I)]),t("g",D,[t("g",P,[t("g",j,[t("path",{d:"M39.5,86 C61.3152476,86 79,83.9106622 79,81.3333333 C79,78.7560045 57.3152476,78 35.5,78 C13.6847524,78 0,78.7560045 0,81.3333333 C0,83.9106622 17.6847524,86 39.5,86 Z",fill:`var(${l(s).cssVarBlockName("fill-color-3")})`},null,8,q),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-7")})`,transform:"translate(27.500000, 51.500000) scale(1, -1) translate(-27.500000, -51.500000) ",points:"13 58 53 58 42 45 2 45"},null,8,L),t("g",M,[t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-7")})`,transform:"translate(11.500000, 5.000000) scale(1, -1) translate(-11.500000, -5.000000) ",points:"2.84078316e-14 3 18 3 23 7 5 7"},null,8,T),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-5")})`,points:"-3.69149156e-15 7 38 7 38 43 -3.69149156e-15 43"},null,8,U),t("rect",{fill:`url(#linearGradient-1-${l(e)})`,transform:"translate(46.500000, 25.000000) scale(-1, 1) translate(-46.500000, -25.000000) ",x:"38",y:"7",width:"17",height:"36"},null,8,W),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-2")})`,transform:"translate(39.500000, 3.500000) scale(-1, 1) translate(-39.500000, -3.500000) ",points:"24 7 41 7 55 -3.63806207e-12 38 -3.63806207e-12"},null,8,Z)]),t("rect",{fill:`url(#linearGradient-2-${l(e)})`,x:"13",y:"45",width:"40",height:"36"},null,8,A),t("g",F,[t("use",{fill:`var(${l(s).cssVarBlockName("fill-color-8")})`,transform:"translate(8.500000, 18.000000) scale(-1, 1) translate(-8.500000, -18.000000) ","xlink:href":`#path-3-${l(e)}`},null,8,H),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-9")})`,mask:`url(#mask-4-${l(e)})`,transform:"translate(12.000000, 9.000000) scale(-1, 1) translate(-12.000000, -9.000000) ",points:"7 0 24 0 20 18 7 16.5"},null,8,J)]),t("polygon",{fill:`var(${l(s).cssVarBlockName("fill-color-2")})`,transform:"translate(66.000000, 51.500000) scale(-1, 1) translate(-66.000000, -51.500000) ",points:"62 45 79 45 70 58 53 58"},null,8,K)])])])]))}}),Q=O;const R=["src"],X={key:1};var Y=p({name:"ElEmpty",__name:"empty",props:V,setup(i){const s=i,{t:e}=y(),o=_("empty"),m=f(()=>s.description||e("el.table.emptyText")),u=f(()=>({width:N(s.imageSize)}));return(a,l0)=>(r(),n("div",{class:c(l(o).b())},[t("div",{class:c(l(o).e("image")),style:v(u.value)},[i.image?(r(),n("img",{key:0,src:i.image,ondragstart:"return false"},null,8,R)):d(a.$slots,"image",{key:1},()=>[g(Q)])],6),t("div",{class:c(l(o).e("description"))},[a.$slots.description?d(a.$slots,"description",{key:0}):(r(),n("p",X,k(m.value),1))],2),a.$slots.default?(r(),n("div",{key:0,class:c(l(o).e("bottom"))},[d(a.$slots,"default")],2)):$("v-if",!0)],2))}}),t0=Y;const o0=B(t0);export{o0 as E};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
|||||||
import{b as A,R as y,d as M,a as V,o as l,c as d,n as i,f as s,q as p,al as f,h as B,aa as N,g as P,e as D,w as O,r as R,E as j,j as o,cZ as q,a$ as J,bQ as Q,b0 as U,b1 as Z,b8 as G,J as I,l as H}from"./index-C8bRaOsd.js";const K=A({type:{type:String,default:"line",values:["line","circle","dashboard"]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:"",values:["","success","exception","warning"]},indeterminate:Boolean,duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:y(String),default:"round"},textInside:Boolean,width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:y([String,Array,Function]),default:""},striped:Boolean,stripedFlow:Boolean,format:{type:y(Function),default:e=>`${e}%`}}),X=["aria-valuenow"],Y={viewBox:"0 0 100 100"},_=["d","stroke","stroke-linecap","stroke-width"],ee=["d","stroke","opacity","stroke-linecap","stroke-width"],te={key:0};var ae=M({name:"ElProgress",__name:"progress",props:K,setup(e){const k={success:"#13ce66",exception:"#ff4949",warning:"#e6a23c",default:"#20a0ff"},a=e,r=V("progress"),T=o(()=>{const t={width:`${a.percentage}%`,animationDuration:`${a.duration}s`},n=x(a.percentage);return n.includes("gradient")?t.background=n:t.backgroundColor=n,t}),v=o(()=>(a.strokeWidth/a.width*100).toFixed(1)),b=o(()=>["circle","dashboard"].includes(a.type)?Number.parseInt(`${50-Number.parseFloat(v.value)/2}`,10):0),m=o(()=>{const t=b.value,n=a.type==="dashboard";return`
|
import{b as A,R as y,d as M,a as V,o as l,c as d,n as i,f as s,q as p,al as f,h as B,aa as N,g as P,e as D,w as O,r as R,E as j,j as o,cZ as q,a$ as J,bQ as Q,b0 as U,b1 as Z,b8 as G,J as I,l as H}from"./index-CGB0A5x_.js";const K=A({type:{type:String,default:"line",values:["line","circle","dashboard"]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:"",values:["","success","exception","warning"]},indeterminate:Boolean,duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:y(String),default:"round"},textInside:Boolean,width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:y([String,Array,Function]),default:""},striped:Boolean,stripedFlow:Boolean,format:{type:y(Function),default:e=>`${e}%`}}),X=["aria-valuenow"],Y={viewBox:"0 0 100 100"},_=["d","stroke","stroke-linecap","stroke-width"],ee=["d","stroke","opacity","stroke-linecap","stroke-width"],te={key:0};var ae=M({name:"ElProgress",__name:"progress",props:K,setup(e){const k={success:"#13ce66",exception:"#ff4949",warning:"#e6a23c",default:"#20a0ff"},a=e,r=V("progress"),T=o(()=>{const t={width:`${a.percentage}%`,animationDuration:`${a.duration}s`},n=x(a.percentage);return n.includes("gradient")?t.background=n:t.backgroundColor=n,t}),v=o(()=>(a.strokeWidth/a.width*100).toFixed(1)),b=o(()=>["circle","dashboard"].includes(a.type)?Number.parseInt(`${50-Number.parseFloat(v.value)/2}`,10):0),m=o(()=>{const t=b.value,n=a.type==="dashboard";return`
|
||||||
M 50 50
|
M 50 50
|
||||||
m 0 ${n?"":"-"}${t}
|
m 0 ${n?"":"-"}${t}
|
||||||
a ${t} ${t} 0 1 1 0 ${n?"-":""}${t*2}
|
a ${t} ${t} 0 1 1 0 ${n?"-":""}${t*2}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{d as N,a as I,I as C,h as $,j as S,b as A,a1 as j,a6 as m,ak as v,y as x,s as d,an as g,x as P,by as k,aj as V,J as B,R as h,l as G}from"./index-C8bRaOsd.js";import{i as z,a as O}from"./vnode-B9WOR-0a.js";const R=A({prefixCls:{type:String}}),w=N({name:"ElSpaceItem",props:R,setup(e,{slots:u}){const f=I("space"),i=S(()=>`${e.prefixCls||f.b()}__item`);return()=>C("div",{class:i.value},$(u,"default"))}}),E={small:8,default:12,large:16};function _(e){const u=I("space"),f=S(()=>[u.b(),u.m(e.direction),e.class]),i=x(0),n=x(0),y=S(()=>[e.wrap||e.fill?{flexWrap:"wrap"}:{},{alignItems:e.alignment},{rowGap:`${n.value}px`,columnGap:`${i.value}px`},e.style]),o=S(()=>e.fill?{flexGrow:1,minWidth:`${e.fillRatio}%`}:{});return j(()=>{const{size:t="small",wrap:a,direction:r,fill:c}=e;if(m(t)){const[s=0,l=0]=t;i.value=s,n.value=l}else{let s;v(t)?s=t:s=E[t||"small"]||E.small,(a||c)&&r==="horizontal"?i.value=n.value=s:r==="horizontal"?(i.value=s,n.value=0):(n.value=s,i.value=0)}}),{classes:f,containerStyle:y,itemStyle:o}}const T=A({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},class:{type:h([String,Object,Array]),default:""},style:{type:h([String,Array,Object,Boolean]),default:""},alignment:{type:h(String),default:"center"},prefixCls:{type:String},spacer:{type:h([Object,String,Number,Array]),default:null,validator:e=>g(e)||v(e)||B(e)},wrap:Boolean,fill:Boolean,fillRatio:{type:Number,default:100},size:{type:[String,Array,Number],values:V,validator:e=>v(e)||m(e)&&e.length===2&&e.every(v)}}),W=N({name:"ElSpace",props:T,setup(e,{slots:u}){const{classes:f,containerStyle:i,itemStyle:n}=_(e);function y(o,t="",a=[]){const{prefixCls:r}=e;return o.forEach((c,s)=>{z(c)?m(c.children)&&c.children.forEach((l,p)=>{z(l)&&m(l.children)?y(l.children,`${t+p}-`,a):g(l)&&(l==null?void 0:l.type)===k?a.push(l):a.push(d(w,{style:n.value,prefixCls:r,key:`nested-${t+p}`},{default:()=>[l]},12,["style","prefixCls"]))}):O(c)&&a.push(d(w,{style:n.value,prefixCls:r,key:`LoopKey${t+s}`},{default:()=>[c]},12,["style","prefixCls"]))}),a}return()=>{const{spacer:o,direction:t}=e,a=$(u,"default",{key:0},()=>[]);if((a.children??[]).length===0)return null;if(m(a.children)){let r=y(a.children);if(o){const c=r.length-1;r=r.reduce((s,l,p)=>{const b=[...s,l];return p!==c&&b.push(d("span",{style:[n.value,t==="vertical"?"width: 100%":null],key:p},[g(o)?o:P(o,1)],4)),b},[])}return d("div",{class:f.value,style:i.value},r,6)}return a.children}}}),L=G(W);export{L as E};
|
import{d as N,a as I,I as C,h as $,j as S,b as A,a1 as j,a6 as m,ak as v,y as x,s as d,an as g,x as P,by as k,aj as V,J as B,R as h,l as G}from"./index-CGB0A5x_.js";import{i as z,a as O}from"./vnode-DFpZw5lG.js";const R=A({prefixCls:{type:String}}),w=N({name:"ElSpaceItem",props:R,setup(e,{slots:u}){const f=I("space"),i=S(()=>`${e.prefixCls||f.b()}__item`);return()=>C("div",{class:i.value},$(u,"default"))}}),E={small:8,default:12,large:16};function _(e){const u=I("space"),f=S(()=>[u.b(),u.m(e.direction),e.class]),i=x(0),n=x(0),y=S(()=>[e.wrap||e.fill?{flexWrap:"wrap"}:{},{alignItems:e.alignment},{rowGap:`${n.value}px`,columnGap:`${i.value}px`},e.style]),o=S(()=>e.fill?{flexGrow:1,minWidth:`${e.fillRatio}%`}:{});return j(()=>{const{size:t="small",wrap:a,direction:r,fill:c}=e;if(m(t)){const[s=0,l=0]=t;i.value=s,n.value=l}else{let s;v(t)?s=t:s=E[t||"small"]||E.small,(a||c)&&r==="horizontal"?i.value=n.value=s:r==="horizontal"?(i.value=s,n.value=0):(n.value=s,i.value=0)}}),{classes:f,containerStyle:y,itemStyle:o}}const T=A({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},class:{type:h([String,Object,Array]),default:""},style:{type:h([String,Array,Object,Boolean]),default:""},alignment:{type:h(String),default:"center"},prefixCls:{type:String},spacer:{type:h([Object,String,Number,Array]),default:null,validator:e=>g(e)||v(e)||B(e)},wrap:Boolean,fill:Boolean,fillRatio:{type:Number,default:100},size:{type:[String,Array,Number],values:V,validator:e=>v(e)||m(e)&&e.length===2&&e.every(v)}}),W=N({name:"ElSpace",props:T,setup(e,{slots:u}){const{classes:f,containerStyle:i,itemStyle:n}=_(e);function y(o,t="",a=[]){const{prefixCls:r}=e;return o.forEach((c,s)=>{z(c)?m(c.children)&&c.children.forEach((l,p)=>{z(l)&&m(l.children)?y(l.children,`${t+p}-`,a):g(l)&&(l==null?void 0:l.type)===k?a.push(l):a.push(d(w,{style:n.value,prefixCls:r,key:`nested-${t+p}`},{default:()=>[l]},12,["style","prefixCls"]))}):O(c)&&a.push(d(w,{style:n.value,prefixCls:r,key:`LoopKey${t+s}`},{default:()=>[c]},12,["style","prefixCls"]))}),a}return()=>{const{spacer:o,direction:t}=e,a=$(u,"default",{key:0},()=>[]);if((a.children??[]).length===0)return null;if(m(a.children)){let r=y(a.children);if(o){const c=r.length-1;r=r.reduce((s,l,p)=>{const b=[...s,l];return p!==c&&b.push(d("span",{style:[n.value,t==="vertical"?"width: 100%":null],key:p},[g(o)?o:P(o,1)],4)),b},[])}return d("div",{class:f.value,style:i.value},r,6)}return a.children}}}),L=G(W);export{L as E};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{b as M,aj as N,d as V,aW as $,a as j,o as i,c as u,q as m,h as k,n as o,f as t,aL as h,s as r,w as d,b1 as C,E as v,g as E,al as S,e as I,Z as L,j as P,l as q}from"./index-C8bRaOsd.js";import{e as x}from"./index-B2Z3XS2S.js";const F=M({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:N},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),K={close:s=>s instanceof MouseEvent,click:s=>s instanceof MouseEvent},W=["aria-label"],Z=["aria-label"];var A=V({name:"ElTag",__name:"tag",props:F,emits:K,setup(s,{emit:_}){const B=s,p=_,z=x(),{t:f}=$(),a=j("tag"),b=P(()=>{const{type:e,hit:l,effect:n,closable:c,round:w}=B;return[a.b(),a.is("closable",c),a.m(e||"primary"),a.m(z.value),a.m(n),a.is("hit",l),a.is("round",w)]}),g=e=>{p("close",e)},y=e=>{p("click",e)},T=e=>{var l,n,c;(c=(n=(l=e==null?void 0:e.component)==null?void 0:l.subTree)==null?void 0:n.component)!=null&&c.bum&&(e.component.subTree.component.bum=null)};return(e,l)=>s.disableTransitions?(i(),u("span",{key:0,class:o(b.value),style:S({backgroundColor:s.color}),onClick:y},[m("span",{class:o(t(a).e("content"))},[k(e.$slots,"default")],2),s.closable?(i(),u("button",{key:0,"aria-label":t(f)("el.tag.close"),class:o(t(a).e("close")),type:"button",onClick:h(g,["stop"])},[r(t(v),null,{default:d(()=>[r(t(C))]),_:1})],10,W)):E("v-if",!0)],6)):(i(),I(L,{key:1,name:`${t(a).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:T},{default:d(()=>[m("span",{class:o(b.value),style:S({backgroundColor:s.color}),onClick:y},[m("span",{class:o(t(a).e("content"))},[k(e.$slots,"default")],2),s.closable?(i(),u("button",{key:0,"aria-label":t(f)("el.tag.close"),class:o(t(a).e("close")),type:"button",onClick:h(g,["stop"])},[r(t(v),null,{default:d(()=>[r(t(C))]),_:1})],10,Z)):E("v-if",!0)],6)]),_:3},8,["name"]))}}),D=A;const J=q(D);export{J as E,F as t};
|
import{b as M,aj as N,d as V,aW as $,a as j,o as i,c as u,q as m,h as k,n as o,f as t,aL as h,s as r,w as d,b1 as C,E as v,g as E,al as S,e as I,Z as L,j as P,l as q}from"./index-CGB0A5x_.js";import{e as x}from"./index-CCavIuTY.js";const F=M({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:N},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),K={close:s=>s instanceof MouseEvent,click:s=>s instanceof MouseEvent},W=["aria-label"],Z=["aria-label"];var A=V({name:"ElTag",__name:"tag",props:F,emits:K,setup(s,{emit:_}){const B=s,p=_,z=x(),{t:f}=$(),a=j("tag"),b=P(()=>{const{type:e,hit:l,effect:n,closable:c,round:w}=B;return[a.b(),a.is("closable",c),a.m(e||"primary"),a.m(z.value),a.m(n),a.is("hit",l),a.is("round",w)]}),g=e=>{p("close",e)},y=e=>{p("click",e)},T=e=>{var l,n,c;(c=(n=(l=e==null?void 0:e.component)==null?void 0:l.subTree)==null?void 0:n.component)!=null&&c.bum&&(e.component.subTree.component.bum=null)};return(e,l)=>s.disableTransitions?(i(),u("span",{key:0,class:o(b.value),style:S({backgroundColor:s.color}),onClick:y},[m("span",{class:o(t(a).e("content"))},[k(e.$slots,"default")],2),s.closable?(i(),u("button",{key:0,"aria-label":t(f)("el.tag.close"),class:o(t(a).e("close")),type:"button",onClick:h(g,["stop"])},[r(t(v),null,{default:d(()=>[r(t(C))]),_:1})],10,W)):E("v-if",!0)],6)):(i(),I(L,{key:1,name:`${t(a).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:T},{default:d(()=>[m("span",{class:o(b.value),style:S({backgroundColor:s.color}),onClick:y},[m("span",{class:o(t(a).e("content"))},[k(e.$slots,"default")],2),s.closable?(i(),u("button",{key:0,"aria-label":t(f)("el.tag.close"),class:o(t(a).e("close")),type:"button",onClick:h(g,["stop"])},[r(t(v),null,{default:d(()=>[r(t(C))]),_:1})],10,Z)):E("v-if",!0)],6)]),_:3},8,["name"]))}}),D=A;const J=q(D);export{J as E,F as t};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{aF as s,aG as e,aH as o,aI as n}from"./index-C8bRaOsd.js";const l=()=>s("/model-eval"),m=a=>s(`/model-eval/${a}`),d=a=>n(`/model-eval/${a}`),c=a=>e("/model-eval/start",a),v=a=>s(`/dimension/${a}`),r=a=>e("/dimension",a),g=(a,t)=>o(`/dimension/${a}`,t);export{m as a,v as b,r as c,d,l as g,c as s,g as u};
|
import{aF as s,aG as e,aH as o,aI as n}from"./index-CGB0A5x_.js";const l=()=>s("/model-eval"),m=a=>s(`/model-eval/${a}`),d=a=>n(`/model-eval/${a}`),c=a=>e("/model-eval/start",a),v=a=>s(`/dimension/${a}`),r=a=>e("/dimension",a),g=(a,t)=>o(`/dimension/${a}`,t);export{m as a,v as b,r as c,d,l as g,c as s,g as u};
|
||||||
@@ -1 +1 @@
|
|||||||
import{aF as n,aG as t,aH as i,aI as a}from"./index-C8bRaOsd.js";const o=()=>n("/fine-tune"),c=e=>n(`/fine-tune/${e}`),f=e=>n("/fine-tune/check-name",{name:e}),g=e=>t("/fine-tune",e),F=e=>t("/fine-tune/start",e),r=e=>t("/fine-tune/preflight",e),T=e=>n(`/fine-tune/${e}/diagnostics`),p=(e,s)=>i(`/fine-tune/${e}`,s),$=e=>t(`/fine-tune/stop/${e}`),d=e=>a(`/fine-tune/${e}`),h=e=>n(`/fine-tune/progress/${e}`),l=(e,s={})=>n(`/fine-tune/${e}/logs`,s);export{h as a,c as b,f as c,d,g as e,F as f,o as g,l as h,T as i,r as p,$ as s,p as u};
|
import{aF as n,aG as t,aH as i,aI as a}from"./index-CGB0A5x_.js";const o=()=>n("/fine-tune"),c=e=>n(`/fine-tune/${e}`),f=e=>n("/fine-tune/check-name",{name:e}),g=e=>t("/fine-tune",e),F=e=>t("/fine-tune/start",e),r=e=>t("/fine-tune/preflight",e),T=e=>n(`/fine-tune/${e}/diagnostics`),p=(e,s)=>i(`/fine-tune/${e}`,s),$=e=>t(`/fine-tune/stop/${e}`),d=e=>a(`/fine-tune/${e}`),h=e=>n(`/fine-tune/progress/${e}`),l=(e,s={})=>n(`/fine-tune/${e}/logs`,s);export{h as a,c as b,f as c,d,g as e,F as f,o as g,l as h,T as i,r as p,$ as s,p as u};
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user