## 新增功能 - 文件管理模块:分类树 + 文件上传/下载/删除 - 文件上传支持拖拽(Dragger)+ 手动上传(customRequest 模式) ## 页面布局统一(参照评测执行页) - 仪表盘/评测对象/评测场景/评测报告 全部改为全高 flex 布局 - 统一内联页头样式(h2 + 竖线分隔 + 描述) - 表格撑满高度、overflow 处理 - 每页添加刷新按钮 ## Bug 修复 - 分类树操作按钮 hover 不可见(CSS 规则缺失) - 文件上传失败(multipart boundary 缺失) - LLM API 响应 content blocks 数组格式支持(_extract_content_from_api_response) - response_time_max_ms 被静默忽略(隐式规则传空 params) - 空 messages 导致 IndexError 崩溃 - poll_reply 异常中止整个 run(缺 try/catch) - engine finally 未关闭 session - 3 个页面 UTC 时间戳解析偏差 8 小时 ## 后端 - EvalEngine: poll_reply 异常保护、空 dialog 保护、session 关闭 - LLM API 响应解析支持 content-block-array 格式 - 隐式 response_time 规则正确传递 max_ms 参数 ## 前端 - api.ts: 移除手动 Content-Type(让浏览器自动添加 boundary) - Files.tsx: customRequest 替代 beforeUpload、布局优化 - index.css: 分类树 hover 规则 - Targets/Scenarios/Home/Reports: 全高布局改造 - 3 个页面时间戳改用 formatDateTime()(修复 UTC 偏差) Co-Authored-By: Claude <noreply@anthropic.com>
150 lines
4.9 KiB
INI
150 lines
4.9 KiB
INI
# A generic, single database configuration.
|
|
|
|
[alembic]
|
|
# path to migration scripts.
|
|
# this is typically a path given in POSIX (e.g. forward slashes)
|
|
# format, relative to the token %(here)s which refers to the location of this
|
|
# ini file
|
|
script_location = %(here)s/migrations
|
|
|
|
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
|
|
# Uncomment the line below if you want the files to be prepended with date and time
|
|
# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
|
|
# for all available tokens
|
|
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
|
|
# Or organize into date-based subdirectories (requires recursive_version_locations = true)
|
|
# file_template = %%(year)d/%%(month).2d/%%(day).2d_%%(hour).2d%%(minute).2d_%%(second).2d_%%(rev)s_%%(slug)s
|
|
|
|
# sys.path path, will be prepended to sys.path if present.
|
|
# defaults to the current working directory. for multiple paths, see
|
|
# path_separator below.
|
|
prepend_sys_path = .:backend
|
|
|
|
|
|
# timezone to use when rendering the date within the migration file
|
|
# as well as the filename.
|
|
# If specified, requires the tzdata library which can be installed by adding
|
|
# `alembic[tz]` to the pip requirements.
|
|
# string value is passed to ZoneInfo()
|
|
# leave blank for localtime
|
|
# timezone =
|
|
|
|
# max length of characters to apply to the "slug" field
|
|
# truncate_slug_length = 40
|
|
|
|
# set to 'true' to run the environment during
|
|
# the 'revision' command, regardless of autogenerate
|
|
# revision_environment = false
|
|
|
|
# set to 'true' to allow .pyc and .pyo files without
|
|
# a source .py file to be detected as revisions in the
|
|
# versions/ directory
|
|
# sourceless = false
|
|
|
|
# version location specification; This defaults
|
|
# to <script_location>/versions. When using multiple version
|
|
# directories, initial revisions must be specified with --version-path.
|
|
# The path separator used here should be the separator specified by "path_separator"
|
|
# below.
|
|
# version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions
|
|
|
|
# path_separator; This indicates what character is used to split lists of file
|
|
# paths, including version_locations and prepend_sys_path within configparser
|
|
# files such as alembic.ini.
|
|
# The default rendered in new alembic.ini files is "os", which uses os.pathsep
|
|
# to provide os-dependent path splitting.
|
|
#
|
|
# Note that in order to support legacy alembic.ini files, this default does NOT
|
|
# take place if path_separator is not present in alembic.ini. If this
|
|
# option is omitted entirely, fallback logic is as follows:
|
|
#
|
|
# 1. Parsing of the version_locations option falls back to using the legacy
|
|
# "version_path_separator" key, which if absent then falls back to the legacy
|
|
# behavior of splitting on spaces and/or commas.
|
|
# 2. Parsing of the prepend_sys_path option falls back to the legacy
|
|
# behavior of splitting on spaces, commas, or colons.
|
|
#
|
|
# Valid values for path_separator are:
|
|
#
|
|
# path_separator = :
|
|
# path_separator = ;
|
|
# path_separator = space
|
|
# path_separator = newline
|
|
#
|
|
# Use os.pathsep. Default configuration used for new projects.
|
|
path_separator = os
|
|
|
|
# set to 'true' to search source files recursively
|
|
# in each "version_locations" directory
|
|
# new in Alembic version 1.10
|
|
# recursive_version_locations = false
|
|
|
|
# the output encoding used when revision files
|
|
# are written from script.py.mako
|
|
# output_encoding = utf-8
|
|
|
|
# database URL. This is consumed by the user-maintained env.py script only.
|
|
# other means of configuring database URLs may be customized within the env.py
|
|
# file.
|
|
sqlalchemy.url = driver://user:pass@localhost/dbname
|
|
|
|
|
|
[post_write_hooks]
|
|
# post_write_hooks defines scripts or Python functions that are run
|
|
# on newly generated revision scripts. See the documentation for further
|
|
# detail and examples
|
|
|
|
# format using "black" - use the console_scripts runner, against the "black" entrypoint
|
|
# hooks = black
|
|
# black.type = console_scripts
|
|
# black.entrypoint = black
|
|
# black.options = -l 79 REVISION_SCRIPT_FILENAME
|
|
|
|
# lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module
|
|
# hooks = ruff
|
|
# ruff.type = module
|
|
# ruff.module = ruff
|
|
# ruff.options = check --fix REVISION_SCRIPT_FILENAME
|
|
|
|
# Alternatively, use the exec runner to execute a binary found on your PATH
|
|
# hooks = ruff
|
|
# ruff.type = exec
|
|
# ruff.executable = ruff
|
|
# ruff.options = check --fix REVISION_SCRIPT_FILENAME
|
|
|
|
# Logging configuration. This is also consumed by the user-maintained
|
|
# env.py script only.
|
|
[loggers]
|
|
keys = root,sqlalchemy,alembic
|
|
|
|
[handlers]
|
|
keys = console
|
|
|
|
[formatters]
|
|
keys = generic
|
|
|
|
[logger_root]
|
|
level = WARNING
|
|
handlers = console
|
|
qualname =
|
|
|
|
[logger_sqlalchemy]
|
|
level = WARNING
|
|
handlers =
|
|
qualname = sqlalchemy.engine
|
|
|
|
[logger_alembic]
|
|
level = INFO
|
|
handlers =
|
|
qualname = alembic
|
|
|
|
[handler_console]
|
|
class = StreamHandler
|
|
args = (sys.stderr,)
|
|
level = NOTSET
|
|
formatter = generic
|
|
|
|
[formatter_generic]
|
|
format = %(levelname)-5.5s [%(name)s] %(message)s
|
|
datefmt = %H:%M:%S
|